use of si.ijs.acs.objectexplorer.engine.RemoteException in project ACS by ACS-Community.
the class BACIRemoteAccess method internalInvokeInvocation.
/**
* Insert the method's description here.
* Creation date: (2.11.2000 18:08:47)
* @return si.ijs.acs.objectexplorer.engine.Invocation
* @param target si.ijs.acs.objectexplorer.engine.BACI.BACIRemoteNode
* @param op si.ijs.acs.objectexplorer.engine.Operation
*/
private Invocation internalInvokeInvocation(//TODO update secondary tree???
BACIRemote target, BACIOperation op, java.lang.Object[] params, RemoteResponseCallback cb) {
int callbackIndex = baciIntrospector.getCallbackLocation(op);
if (callbackIndex == -1)
throw new IntrospectionInconsistentException("Asynchronous operation '" + op + "' must take exactly one callback parameter.");
/* create callback */
CallbackImpl cbImpl = null;
try {
cbImpl = new CallbackImpl(op.getOperationDesc().parameters[callbackIndex].type.id(), cb);
} catch (org.omg.CORBA.TypeCodePackage.BadKind bk) {
throw new RemoteException("Error while trying to analyze typecode: " + bk);
}
org.omg.CORBA.Object cbIF = cbImpl._this_object(orb);
notifier.reportDebug("BACIRemoteAccess::internalInvokeInvocation", "Activated callback object for '" + op + "'.");
DataStruct desc = new DataStruct("IDL:alma/ACS/CBDescIn:1.0");
desc.add("normal_timeout", new Long(1000000));
desc.add("negotiable_timeout", new Long(5000000));
desc.add("id_tag", new Integer(0));
params[callbackIndex] = cbIF;
if (callbackIndex == params.length - 1) {
if (!isStrict())
notifier.reportDebug("BACIRemoteAccess::internalInvokeInvocation", "Non-strict BACI invocation signature: callback is not followed by a descriptor.");
else
throw new IntrospectionInconsistentException("Callback cannot be the last argument, because it must be followed by the descriptor.");
} else
params[callbackIndex + 1] = desc;
BACIInvocation invoc = new BACIInvocation(TRANSIENT, op.getName(), null, cb, parent.getTree(), this);
cbImpl.setInvocation(invoc);
invoc.setRemoteCall(internalInvokeTrivial(target, op, params));
synchronized (invocations) {
invocations.add(invoc);
}
notifier.reportDebug("BACIRemoteAccess::internalInvokeInvocation", "Remote call ended, constructed Invocation. Returning...");
return invoc;
}
use of si.ijs.acs.objectexplorer.engine.RemoteException in project ACS by ACS-Community.
the class BACIIntrospector method getOperations.
/**
* Insert the method's description here.
* Creation date: (2.11.2000 0:44:52)
*/
public BACIOperation[] getOperations(BACIRemote target) {
if (target == null)
throw new NullPointerException("target");
OperationDescription[] operations = target.getIFDesc().operations;
ArrayList<BACIOperation> tempList = new ArrayList<BACIOperation>();
for (int i = 0; i < operations.length; i++) {
ra.getNotifier().reportDebug("BACIIntrospector::getOperations", "Analysing operation '" + operations[i].name + "'.");
ParameterDescription[] ps = operations[i].parameters;
String[] names = new String[ps.length];
//Class[] types = new Class[ps.length];
DataType[] types = new DataType[ps.length];
boolean[] mask = new boolean[ps.length];
int cb = -1;
boolean unsupportedOperation = false;
for (int j = 0; j < ps.length; j++) {
try {
names[j] = ps[j].name;
types[j] = new BACIDataType(getClassType(ps[j].type));
types[j].setElement(getDef(ps[j].type));
types[j].setArrayType(getArrayType(ps[j].type));
if (isOfType(ps[j].type, ID_CALLBACK)) {
if (cb != -1)
throw new IntrospectionInconsistentException("Operation '" + operations[i].name + "' declares more than one callback parameter.");
cb = j;
if (cb == ps.length - 1 && ra.isStrict())
throw new IntrospectionInconsistentException("A callback parameter for operation '" + operations[i].name + "' must be followed by a 'CBDescIn' parameter.");
}
if (ps[j].mode == ParameterMode.PARAM_OUT || cb == j) {
mask[j] = false;
} else
mask[j] = true;
if (cb != -1 && j == cb + 1) {
try {
if (ID_CBDESCIN.equals(ps[j].type.id())) {
mask[j] = false;
} else if (ra.isStrict())
throw new IntrospectionInconsistentException("A callback parameter for opration '" + operations[i].name + "' must be followed by a 'CBDescIn' parameter.");
} catch (Exception bk) {
throw new RemoteException("Exception while analyzing typecode (getting typecode name raises exception). Exception: " + bk);
}
}
} catch (Exception e) {
ra.getNotifier().reportDebug("BACIIntrospector::getOperations", "Failed to analyse parameter '" + ps[j].name + "' for operation '" + operations[i].name + "'. Removing it from operation list... Exception:" + e);
e.printStackTrace();
unsupportedOperation = true;
break;
}
}
if (!unsupportedOperation)
tempList.add(new BACIOperation(ra, operations[i], target, names, types, mask, !(cb == -1), false));
}
BACIOperation[] retVal = new BACIOperation[tempList.size()];
tempList.toArray(retVal);
return retVal;
}
Aggregations