at.spardat.xma.rpc.RemoteData Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH .
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* s IT Solutions AT Spardat GmbH - initial API and implementation
*******************************************************************************/
// @(#) $Id: RemoteData.java 7307 2011-03-07 09:35:22Z blichtl $
package at.spardat.xma.rpc;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import at.spardat.xma.serializer.XmaInput;
import at.spardat.xma.serializer.XmaOutput;
/**
* This class acts as value object for data to be transferred between
* XMA client and XMA server in RPCs.
*
* @author YSD, 26.05.2003 10:39:58
*/
class RemoteData {
/**
* The version of the XMA runtime that produces an serialized output stream
* via externalize (excluding the bootstrap runtime).
* This must be the second attribute serialized to react on different
* versions when deserializing.
*/
protected int runtimeVersion_ = at.spardat.xma.util.Version.getVersionNumber();
/**
* The serial change number. See class {@link at.spardat.xma.component.Component}.
* -1 means that the SCN is unknown. An unknown SCN may be sent from server to client
* in the case of some early time processing errors.
*/
protected short serverChangeNumber_ = -1;
/**
* The stream of page modifications. Never null if this is a RemoteCallData.
* May be null if this is a RemoteReplyData.
*/
protected byte[] pageDeltas_;
/**
* Collection of parameters. Keys are Shorts (ids) and values are objects.
* May be null if no parameters are provided. The ids of programmer supplied
* parameters must be greater than or equal to zero. XMA runtime parameters
* have a negative id.
*/
private HashMap parameters_;
/**
* Write all except the parameters to the XmaOutput.
*/
protected void externalizeExclParameter (XmaOutput o) throws IOException {
o.writeInt ("rtversion", runtimeVersion_);
o.writeShort ("scn", serverChangeNumber_);
o.writeBoolean ("ynModels", pageDeltas_ != null);
if (pageDeltas_ != null) {
o.writeSerializedBytes("models", pageDeltas_);
}
}
/**
* Write the parameters to the ObjectOutput.
*/
protected void externalizeParameters (XmaOutput o) throws IOException {
short numParameters = (parameters_ == null ? 0 : (short) parameters_.size());
o.writeShort ("numParams", numParameters);
if (numParameters > 0) {
Iterator iter = parameters_.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry e = (Map.Entry) iter.next();
short id = ((Short)e.getKey()).shortValue();
o.writeShort ("pId", id);
// warning: the following line will throw IOExceptions if there is something
// that cannot be serialized. This may be a common exception if user supplied
// parameters are used and they are not Serializable.
o.writeObject ("pValue", e.getValue());
}
}
}
/**
* Reads data as written by externalizeExclParameter
*/
protected void internalizeExclParameter (XmaInput in) throws IOException {
runtimeVersion_ = in.readInt();
serverChangeNumber_ = in.readShort();
boolean ynModels = in.readBoolean();
if (ynModels) {
pageDeltas_ = in.readSerializedBytes();
}
}
/**
* Reads parameters as written by externalizeParameters.
*/
protected void internalizeParameters (XmaInput in) throws IOException, ClassNotFoundException {
parameters_ = new HashMap();
short numParameters = in.readShort();
for (int i=0; ijava.io.Serializable
* and must be successfully be serialized. Setting it null removes the current
* value of the given parameter.
* @throws IllegalArgumentException if any before mentioned condition is violated.
*/
public void setParameter (int id, Object parameter) {
if (id < 0 || id > 127) {
throw new IllegalArgumentException();
}
setParameterInternal (id, parameter);
}
/**
* For package internal usage without range checks on the ids.
*/
void setParameterInternal (int id, Object parameter) {
if (parameters_ == null) {
if (parameter == null) {
return; // nothing there and nothing to do
}
parameters_ = new HashMap();
}
if (parameter == null) {
// remove if already exists
parameters_.remove(new Short((short)id));
if (parameters_.isEmpty()) {
parameters_ = null;
}
} else {
parameters_.put(new Short((short)id), parameter);
}
}
/**
* Retrieves a parameter for a given id.
*
* @param id the id that has been used in setParameter.
* @return the same object set via setParameter or null if there
* is no parameter with the given id.
*/
public Object getParameter (int id) {
if (parameters_ == null) {
return null;
}
return parameters_.get(new Short((short)id));
}
/**
* Returns the number of parameters
*/
public int getParameterCount () {
if (parameters_ == null) {
return 0;
}
return parameters_.size();
}
}