/* * 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; } }