blob: 3061b726923233c0e0e1fde346859734c72fe4fb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.corba.receivers;
import org.apache.axis2.corba.exceptions.CorbaInvocationException;
import org.apache.axis2.corba.idl.types.DataType;
import org.apache.axis2.corba.idl.types.ExceptionType;
import org.apache.axis2.corba.idl.types.Interface;
import org.apache.axis2.corba.idl.types.Member;
import org.apache.axis2.corba.idl.types.Operation;
import org.apache.axis2.corba.idl.values.ExceptionValue;
import org.omg.CORBA.Any;
import org.omg.CORBA.ExceptionList;
import org.omg.CORBA.Request;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.UnknownUserException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class CorbaInvoker implements Invoker {
private Operation operation;
private Interface intf;
//private Map compositeDataTypes;
private org.omg.CORBA.Object object;
private Object[] parameters;
private List parameterTypeList = new ArrayList();
private List returnedParams;
protected CorbaInvoker(Operation operation, Interface intf, org.omg.CORBA.Object object) {
this.operation = operation;
this.intf = intf;
this.object = object;
List params = operation.getParams();
if (params!=null) {
for (int i = 0; i < params.size(); i++) {
Member member = (Member) params.get(i);
parameterTypeList.add(member);
}
}
}
public Object invoke() throws CorbaInvocationException {
// Create request
Request request = object._request(operation.getName());
// Set parameters
Any arg = null;
List memArgs = new ArrayList();
if (parameters!=null) {
List patamList = new LinkedList(Arrays.asList(parameters));
Iterator paramsIter = patamList.iterator();
for (int i = 0; i < parameterTypeList.size(); i++) {
Member member = (Member) parameterTypeList.get(i);
DataType type = member.getDataType();
Object value = null;
String mode = member.getMode();
if (mode.equals(Member.MODE_IN)) {
arg = request.add_in_arg();
value = paramsIter.next();
}else if (mode.equals(Member.MODE_INOUT)) {
arg = request.add_inout_arg();
value = paramsIter.next();
} else if (mode.equals(Member.MODE_OUT)) {
arg = request.add_out_arg();
value = CorbaUtil.getEmptyValue(type);
}
memArgs.add(arg);
CorbaUtil.insertValue(arg, type, value);
}
}
// Set return type
DataType returnType = operation.getReturnType();
if (returnType!=null) {
TypeCode typeCode = returnType.getTypeCode();
request.set_return_type(typeCode);
}
// Set exceptions
List exceptions = operation.getRaises();
if (exceptions!=null && !exceptions.isEmpty()) {
ExceptionList exceptionList = request.exceptions();
for (int i = 0; i < exceptions.size(); i++) {
ExceptionType exType = (ExceptionType) exceptions.get(i);
exceptionList.add(exType.getTypeCode());
}
}
// Invoke
request.invoke();
// Get exception
Object returnValue = null;
Exception exception = request.env().exception();
if (exception == null) {
// Extract the return value
if (returnType != null) {
Any returned = request.return_value();
returnValue = CorbaUtil.extractValue(returnType, returned);
}
// Extract the values of inout and out parameters
returnedParams = new ArrayList();
for (int i = 0; i < parameterTypeList.size(); i++) {
Member member = (Member) parameterTypeList.get(i);
String mode = member.getMode();
if (mode.equals(Member.MODE_INOUT) || mode.equals(Member.MODE_OUT)) {
returnedParams.add(CorbaUtil.extractValue(member.getDataType(), (Any) memArgs.get(i)));
}
}
} else {
if(exception instanceof UnknownUserException) {
UnknownUserException userException = (UnknownUserException) exception;
TypeCode exTypeCode = userException.except.type();
ExceptionType exceptionType = null;
if (exceptions!=null && !exceptions.isEmpty()) {
for (int i = 0; i < exceptions.size(); i++) {
ExceptionType exType = (ExceptionType) exceptions.get(i);
if (exTypeCode.equal(exType.getTypeCode())) {
exceptionType = exType;
break;
}
}
}
if (exceptionType==null) {
throw new CorbaInvocationException(exception);
} else {
ExceptionValue exceptionValue = (ExceptionValue) CorbaUtil.extractValue(exceptionType, userException.except);
if (exceptionValue!=null)
throw exceptionValue.getException();
}
} else {
throw new CorbaInvocationException(exception);
}
}
return returnValue;
}
public void setParameters(Object[] parameters){
this.parameters = parameters;
}
public String getInterfaceName(){
return intf.getName();
}
public String getOperationName(){
return operation.getName();
}
public DataType getReturnType() {
return operation.getReturnType();
}
public Object[] getOutParameterValuess() {
if (returnedParams == null)
return null;
else
return returnedParams.toArray();
}
public Member[] getParameterMembers() {
Member[] membersArray = new Member[parameterTypeList.size()];
for (int i = 0; i < parameterTypeList.size(); i++) {
membersArray[i] = (Member) parameterTypeList.get(i);
}
return membersArray;
}
}