Java tutorial
/* * 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.axiom.om.OMElement; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPFactory; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.corba.deployer.CorbaConstants; import org.apache.axis2.corba.exceptions.CorbaException; import org.apache.axis2.corba.exceptions.CorbaInvocationException; import org.apache.axis2.corba.idl.IDLProcessor; import org.apache.axis2.corba.idl.PreProcessorInputStream; import org.apache.axis2.corba.idl.types.AbstractCollectionType; import org.apache.axis2.corba.idl.types.ArrayType; import org.apache.axis2.corba.idl.types.CompositeDataType; import org.apache.axis2.corba.idl.types.DataType; import org.apache.axis2.corba.idl.types.EnumType; import org.apache.axis2.corba.idl.types.ExceptionType; import org.apache.axis2.corba.idl.types.IDL; import org.apache.axis2.corba.idl.types.Member; import org.apache.axis2.corba.idl.types.PrimitiveDataType; import org.apache.axis2.corba.idl.types.SequenceType; import org.apache.axis2.corba.idl.types.Struct; import org.apache.axis2.corba.idl.types.Typedef; import org.apache.axis2.corba.idl.types.UnionMember; import org.apache.axis2.corba.idl.types.UnionType; import org.apache.axis2.corba.idl.types.ValueType; import org.apache.axis2.corba.idl.values.AbstractCollectionValue; import org.apache.axis2.corba.idl.values.AbstractValue; import org.apache.axis2.corba.idl.values.AliasValue; import org.apache.axis2.corba.idl.values.ArrayValue; import org.apache.axis2.corba.idl.values.EnumValue; import org.apache.axis2.corba.idl.values.ExceptionValue; import org.apache.axis2.corba.idl.values.ObjectByValue; import org.apache.axis2.corba.idl.values.SequenceValue; import org.apache.axis2.corba.idl.values.StreamableValueFactory; import org.apache.axis2.corba.idl.values.StructValue; import org.apache.axis2.corba.idl.values.UnionValue; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.Parameter; import org.apache.axis2.description.java2wsdl.TypeTable; import org.apache.axis2.namespace.Constants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.omg.CORBA.Any; import org.omg.CORBA.TCKind; import org.omg.CORBA.TypeCode; import org.omg.CORBA_2_3.ORB; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.InvalidName; import org.omg.CosNaming.NamingContextPackage.NotFound; import javax.xml.namespace.QName; import java.io.File; //import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; //import java.util.zip.ZipEntry; //import java.util.zip.ZipInputStream; public class CorbaUtil implements CorbaConstants { private static Map IDL_CACHE = new HashMap(); private static final Log log = LogFactory.getLog(CorbaUtil.class); public static org.omg.CORBA_2_3.ORB getORB(AxisService service) { Parameter orbClass = service.getParameter(ORB_CLASS); Parameter orbSingletonClass = service.getParameter(ORB_SINGLETON_CLASS); Properties props = System.getProperties(); if (orbClass != null) props.put(ORG_OMG_CORBA_ORBCLASS, ((String) orbClass.getValue()).trim()); else props.put(ORG_OMG_CORBA_ORBCLASS, DEFAULR_ORB_CLASS); if (orbSingletonClass != null) props.put(ORG_OMG_CORBA_ORBSINGLETON_CLASS, ((String) orbSingletonClass.getValue()).trim()); else props.put(ORG_OMG_CORBA_ORBSINGLETON_CLASS, DEFAULT_ORBSINGLETON_CLASS); return (ORB) ORB.init(new String[] {}, props); } public static org.omg.CORBA.Object resolveObject(AxisService service, org.omg.CORBA_2_3.ORB orb) throws CorbaInvocationException { org.omg.CORBA.Object obj; try { Parameter namingServiceUrl = service.getParameter(NAMING_SERVICE_URL); Parameter objectName = service.getParameter(OBJECT_NAME); Parameter iorFilePath = service.getParameter(IOR_FILE_PATH); Parameter iorString = service.getParameter(IOR_STRING); if (namingServiceUrl != null && objectName != null) { obj = orb.string_to_object(((String) namingServiceUrl.getValue()).trim()); NamingContextExt nc = NamingContextExtHelper.narrow(obj); obj = nc.resolve(nc.to_name(((String) objectName.getValue()).trim())); } else if (iorFilePath != null) { FileReader fileReader = new FileReader(((String) iorFilePath.getValue()).trim()); char[] buf = new char[1000]; fileReader.read(buf); obj = orb.string_to_object((new String(buf)).trim()); fileReader.close(); } else if (iorString != null) { obj = orb.string_to_object(((String) iorString.getValue()).trim()); } else { throw new CorbaInvocationException("cannot resolve object"); } } catch (NotFound notFound) { throw new CorbaInvocationException("cannot resolve object", notFound); } catch (CannotProceed cannotProceed) { throw new CorbaInvocationException("cannot resolve object", cannotProceed); } catch (InvalidName invalidName) { throw new CorbaInvocationException("cannot resolve object", invalidName); } catch (IOException e) { throw new CorbaInvocationException("cannot resolve object", e); } return obj; } public static IDL getIDL(AxisService service, ORB orb, String dirName) throws CorbaException { Parameter idlFile = service.getParameter(IDL_FILE); if (idlFile == null) { throw new CorbaInvocationException("Please specify the IDL file"); } String idlFileName = ((String) idlFile.getValue()).trim(); String cacheKey = dirName + File.separator + idlFileName; IDL idl = (IDL) IDL_CACHE.get(cacheKey); if (idl == null) { try { /*File file = new File(dirName); InputStream stream; if (file.isDirectory()) { stream = new FileInputStream(cacheKey); } else { ZipInputStream zin = new ZipInputStream(new FileInputStream(file)); ZipEntry entry; boolean found = false; while ((entry = zin.getNextEntry()) != null) { if (entry.getName().equalsIgnoreCase(idlFileName)) { found = true; break; } } if (!found) new CorbaInvocationException("cannot find " + idlFileName + " in " + file.getPath()); stream = zin; }*/ InputStream stream = new PreProcessorInputStream(dirName, idlFileName); //TODO: Set pre-processor system and user input paths IDLProcessor idlProcessor = new IDLProcessor(stream); idl = idlProcessor.process(); stream.close(); IDL_CACHE.put(cacheKey, idl); } catch (IOException e) { throw new CorbaInvocationException("cannot process idl file", e); } } Map types = idl.getCompositeDataTypes(); if (types != null) { Iterator iter = types.values().iterator(); while (iter.hasNext()) { DataType type = (DataType) iter.next(); if (type instanceof ValueType) { StreamableValueFactory.register(orb, (ValueType) type); } } } return idl; } public static Invoker getInvoker(AxisService service, org.omg.CORBA.Object obj, IDL idl, String methodName) throws CorbaInvocationException { InvokerFactory invokerFactory = new CorbaInvokerFactory(idl); Parameter interfaceName = service.getParameter(INTERFACE_NAME); if (interfaceName == null) throw new CorbaInvocationException("interfaceName cannot be null"); return invokerFactory.newInvoker(((String) interfaceName.getValue()).trim(), methodName, obj); } public static Object[] extractParameters(OMElement methodElement, Member[] parameterMembers) throws CorbaInvocationException { if (parameterMembers == null) return new Object[0]; Object[] retObjs = new Object[parameterMembers.length]; if (methodElement == null) return retObjs; Iterator paramsIter = methodElement.getChildElements(); Map paramsMap = new HashMap(); String localName; while (paramsIter != null && paramsIter.hasNext()) { OMElement param = (OMElement) paramsIter.next(); localName = param.getLocalName(); if (paramsMap.containsKey(localName)) { Object value = paramsMap.get(localName); if (value instanceof List) { ((List) value).add(param); } else { List valueList = new ArrayList(); valueList.add(value); valueList.add(param); paramsMap.put(localName, valueList); } } else { paramsMap.put(localName, param); } } String paramName; for (int i = 0; i < parameterMembers.length; i++) { paramName = parameterMembers[i].getName(); retObjs[i] = extractValue(parameterMembers[i].getDataType(), paramsMap.get(paramName)); } return retObjs; } private static Object extractValue(DataType dataType, Object param) throws CorbaInvocationException { if (dataType instanceof Typedef) { Typedef typedef = (Typedef) dataType; AliasValue aliasValue = new AliasValue(typedef); OMElement paramElement; if (param instanceof OMElement) paramElement = (OMElement) param; else return null; DataType aliasType = typedef.getDataType(); if (!(aliasType instanceof AbstractCollectionType)) { paramElement = paramElement.getFirstElement(); if (paramElement == null || !ARRAY_ITEM.equals(paramElement.getLocalName())) return null; } aliasValue.setValue(extractValue(aliasType, paramElement)); return aliasValue; } else if (dataType instanceof PrimitiveDataType) { if (param != null) return parseValue(dataType, ((OMElement) param).getText()); } else if (dataType instanceof AbstractCollectionType) { AbstractCollectionType collectionType = (AbstractCollectionType) dataType; OMElement paramElement; if (param instanceof OMElement) paramElement = (OMElement) param; else return null; Iterator paramsIter = paramElement.getChildElements(); List children = new ArrayList(); while (paramsIter.hasNext()) { children.add(extractValue(collectionType.getDataType(), paramsIter.next())); } AbstractCollectionValue collectionValue; if (collectionType.isArray()) { collectionValue = new ArrayValue((ArrayType) collectionType); } else if (collectionType.isSequence()) { collectionValue = new SequenceValue((SequenceType) collectionType); } else { return null; } collectionValue.setValues(children.toArray()); return collectionValue; } else if (dataType instanceof EnumType) { EnumType enumType = (EnumType) dataType; String enumText = ((OMElement) param).getText(); int index = enumType.getEnumMembers().indexOf(enumText); if (index >= 0) { EnumValue enumValue = new EnumValue(enumType); enumValue.setValue(index); return enumValue; } } else if (dataType instanceof UnionType) { UnionType unionType = (UnionType) dataType; OMElement unElement = ((OMElement) param).getFirstElement(); String unionMemberName = unElement.getLocalName(); UnionValue unionValue = new UnionValue(unionType); unionValue.setMemberName(unionMemberName); Member[] members = unionType.getMembers(); UnionMember member = null; for (int i = 0; i < members.length; i++) { member = (UnionMember) members[i]; if (member.getName().equals(unionMemberName)) { break; } } if (member != null) { unionValue.setMemberValue(extractValue(member.getDataType(), unElement)); } return unionValue; } else if (dataType instanceof CompositeDataType) { CompositeDataType compositeType = (CompositeDataType) dataType; Member[] compositeMembers = compositeType.getMembers(); Object[] compositeValues = extractParameters(((OMElement) param), compositeMembers); AbstractValue value; if (compositeType instanceof ValueType) value = new ObjectByValue((ValueType) compositeType); else if (compositeType instanceof Struct) value = new StructValue((Struct) compositeType); else throw new CorbaInvocationException("Parameter type not supported"); value.setMemberValues(compositeValues); return value; } return null; } public static void processResponse(Object resObject, Member[] params, Object[] outParamValues, DataType dataType, AxisService service, String methodName, SOAPFactory fac, String messageNameSpace, MessageContext outMessage) throws AxisFault { boolean qualified = service.isElementFormDefault(); OMNamespace ns = fac.createOMNamespace(messageNameSpace, service.getSchemaTargetNamespacePrefix()); OMElement bodyContent = fac.createOMElement(methodName + RESPONSE, ns); OMElement child; if (qualified) { child = fac.createOMElement(RETURN_WRAPPER, ns); } else { child = fac.createOMElement(RETURN_WRAPPER, null); } bodyContent.addChild(child); if (dataType != null && !getQualifiedName(dataType).equals(VOID) && resObject != null) { processResponse(child, bodyContent, resObject, dataType, fac, ns, qualified, service); } else { child.addAttribute("nil", "true", fac.createOMNamespace(Constants.URI_2001_SCHEMA_XSI, Constants.NS_PREFIX_SCHEMA_XSI)); } Member param; List outParamList = Arrays.asList(outParamValues); Iterator paramsIter = outParamList.iterator(); for (int i = 0; i < params.length; i++) { param = params[i]; if (Member.MODE_INOUT.equals(param.getMode()) || Member.MODE_OUT.equals(param.getMode())) { if (qualified) { child = fac.createOMElement(param.getName(), ns); } else { child = fac.createOMElement(param.getName(), null); } bodyContent.addChild(child); processResponse(child, bodyContent, paramsIter.next(), param.getDataType(), fac, ns, qualified, service); } } SOAPEnvelope envelope = fac.getDefaultEnvelope(); envelope.getBody().addChild(bodyContent); outMessage.setEnvelope(envelope); } private static void processResponse(OMElement child, OMElement bodyContent, Object resObject, DataType dataType, SOAPFactory fac, OMNamespace defaultNS, boolean qualified, AxisService service) { if (dataType instanceof PrimitiveDataType) { child.addChild(fac.createOMText(child, resObject.toString())); } else if (dataType instanceof Typedef) { Typedef typedef = (Typedef) dataType; AliasValue aliasValue = (AliasValue) resObject; OMNamespace ns = getNameSpaceForType(fac, service, typedef); OMElement item = fac.createOMElement(ARRAY_ITEM, ns, child); processResponse(item, child, aliasValue.getValue(), typedef.getDataType(), fac, ns, qualified, service); } else if (dataType instanceof AbstractCollectionType) { AbstractCollectionType collectionType = (AbstractCollectionType) dataType; AbstractCollectionValue collectionValue = (AbstractCollectionValue) resObject; Object[] values = collectionValue.getValues(); int length = values.length; for (int i = 0; i < length; i++) { OMElement outer = bodyContent; if (collectionType.getDataType() instanceof AbstractCollectionType) { outer = child; if (qualified) { child = fac.createOMElement(ARRAY_ITEM, defaultNS); } else { child = fac.createOMElement(ARRAY_ITEM, null); } outer.addChild(child); } processResponse(child, outer, values[i], collectionType.getDataType(), fac, defaultNS, qualified, service); if (i < (length - 1)) { if (qualified) { child = fac.createOMElement(ARRAY_ITEM, defaultNS); } else { child = fac.createOMElement(ARRAY_ITEM, null); } bodyContent.addChild(child); } } } else if (dataType instanceof ValueType || dataType instanceof Struct) { AbstractValue resValue = (AbstractValue) resObject; Member[] members = resValue.getMembers(); Object[] memberValues = resValue.getMemberValues(); OMNamespace ns = getNameSpaceForType(fac, service, (CompositeDataType) dataType); for (int i = 0; i < memberValues.length; i++) { OMElement memberElement = fac.createOMElement(members[i].getName(), ns); processResponse(memberElement, bodyContent, memberValues[i], members[i].getDataType(), fac, ns, qualified, service); child.addChild(memberElement); } } else if (dataType instanceof UnionType) { UnionValue unionValue = (UnionValue) resObject; OMElement unMember; OMNamespace ns = getNameSpaceForType(fac, service, (CompositeDataType) dataType); if (qualified) { unMember = fac.createOMElement(unionValue.getMemberName(), ns); } else { unMember = fac.createOMElement(unionValue.getMemberName(), null); } processResponse(unMember, child, unionValue.getMemberValue(), unionValue.getMemberType(), fac, ns, qualified, service); child.addChild(unMember); } else if (dataType instanceof EnumType) { EnumValue enumValue = (EnumValue) resObject; child.addChild(fac.createOMText(child, enumValue.getValueAsString())); } } private static OMNamespace getNameSpaceForType(SOAPFactory fac, AxisService service, CompositeDataType dataType) { TypeTable typeTable = service.getTypeTable(); String fullname = (dataType.getModule() != null) ? dataType.getModule() + dataType.getName() : dataType.getName(); fullname = fullname.replaceAll(CompositeDataType.MODULE_SEPERATOR, "."); QName qname = typeTable.getQNamefortheType(fullname); if (qname == null) return null; return fac.createOMNamespace(qname.getNamespaceURI(), qname.getPrefix()); } public static String getQualifiedName(DataType type) { if (type instanceof CompositeDataType) { CompositeDataType compositeType = (CompositeDataType) type; String module = compositeType.getModule(); module = (module == null) ? "" : module.replaceAll("::", "."); return module + compositeType.getName(); } else if (type instanceof PrimitiveDataType) { PrimitiveDataType primitiveDataType = (PrimitiveDataType) type; return primitiveDataType.getTypeName(); } return null; } public static void insertValue(Any arg, DataType type, Object value) { switch (type.getTypeCode().kind().value()) { case TCKind._tk_long: arg.insert_long(((Integer) value).intValue()); break; case TCKind._tk_ulong: arg.insert_ulong(((Integer) value).intValue()); break; case TCKind._tk_longlong: arg.insert_longlong(((Long) value).longValue()); break; case TCKind._tk_ulonglong: arg.insert_ulonglong(((Long) value).longValue()); break; case TCKind._tk_short: arg.insert_short(((Short) value).shortValue()); break; case TCKind._tk_ushort: arg.insert_ushort(((Short) value).shortValue()); break; case TCKind._tk_float: arg.insert_float(((Float) value).floatValue()); break; case TCKind._tk_double: arg.insert_double(((Double) value).floatValue()); break; case TCKind._tk_char: arg.insert_char(((Character) value).charValue()); break; case TCKind._tk_wchar: arg.insert_wchar(((Character) value).charValue()); break; case TCKind._tk_boolean: arg.insert_boolean(((Boolean) value).booleanValue()); break; case TCKind._tk_octet: arg.insert_octet(((Byte) value).byteValue()); break; case TCKind._tk_string: arg.insert_string((String) value); break; case TCKind._tk_wstring: arg.insert_wstring((String) value); break; case TCKind._tk_any: arg.insert_any((Any) value); break; case TCKind._tk_value: arg.insert_Value((Serializable) value); break; case TCKind._tk_objref: arg.insert_Object((org.omg.CORBA.Object) value); break; case TCKind._tk_struct: StructValue structValue = (StructValue) value; org.omg.CORBA_2_3.portable.OutputStream outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg .create_output_stream(); arg.type(structValue.getTypeCode()); structValue.write(outputStream); arg.read_value(outputStream.create_input_stream(), structValue.getTypeCode()); break; case TCKind._tk_enum: EnumValue enumValue = (EnumValue) value; outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg.create_output_stream(); arg.type(enumValue.getTypeCode()); enumValue.write(outputStream); arg.read_value(outputStream.create_input_stream(), enumValue.getTypeCode()); break; case TCKind._tk_union: UnionValue unionValue = (UnionValue) value; outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg.create_output_stream(); arg.type(unionValue.getTypeCode()); unionValue.write(outputStream); arg.read_value(outputStream.create_input_stream(), unionValue.getTypeCode()); break; case TCKind._tk_alias: AliasValue aliasValue = (AliasValue) value; outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg.create_output_stream(); arg.type(aliasValue.getTypeCode()); aliasValue.write(outputStream); arg.read_value(outputStream.create_input_stream(), aliasValue.getTypeCode()); break; case TCKind._tk_sequence: SequenceValue sequenceValue = (SequenceValue) value; outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg.create_output_stream(); arg.type(sequenceValue.getTypeCode()); sequenceValue.write(outputStream); arg.read_value(outputStream.create_input_stream(), sequenceValue.getTypeCode()); break; case TCKind._tk_array: ArrayValue arrayValue = (ArrayValue) value; outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg.create_output_stream(); arg.type(arrayValue.getTypeCode()); arrayValue.write(outputStream); arg.read_value(outputStream.create_input_stream(), arrayValue.getTypeCode()); break; default: log.error("ERROR! Invalid dataType"); break; } } public static Object extractValue(DataType returnType, Any returned) { Object returnValue = null; TypeCode typeCode = returnType.getTypeCode(); switch (typeCode.kind().value()) { case TCKind._tk_void: returnValue = null; break; case TCKind._tk_long: returnValue = new Integer(returned.extract_long()); break; case TCKind._tk_ulong: returnValue = new Integer(returned.extract_ulong()); break; case TCKind._tk_longlong: returnValue = new Long(returned.extract_longlong()); break; case TCKind._tk_ulonglong: returnValue = new Long(returned.extract_ulonglong()); break; case TCKind._tk_short: returnValue = new Short(returned.extract_short()); break; case TCKind._tk_ushort: returnValue = new Short(returned.extract_ushort()); break; case TCKind._tk_float: returnValue = new Float(returned.extract_float()); break; case TCKind._tk_double: returnValue = new Double(returned.extract_double()); break; case TCKind._tk_char: returnValue = new Character(returned.extract_char()); break; case TCKind._tk_wchar: returnValue = new Character(returned.extract_wchar()); break; case TCKind._tk_boolean: returnValue = Boolean.valueOf(returned.extract_boolean()); break; case TCKind._tk_octet: returnValue = new Byte(returned.extract_octet()); break; case TCKind._tk_string: returnValue = returned.extract_string(); break; case TCKind._tk_wstring: returnValue = returned.extract_wstring(); break; case TCKind._tk_any: returnValue = returned.extract_any(); break; case TCKind._tk_value: returnValue = returned.extract_Value(); break; case TCKind._tk_objref: returnValue = returned.extract_Object(); break; //case TCKind._tk_longdouble : case TCKind._tk_struct: Struct struct = (Struct) returnType; StructValue structValue = new StructValue(struct); org.omg.CORBA_2_3.portable.InputStream inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned .create_input_stream(); structValue.read(inputStream); returnValue = structValue; break; case TCKind._tk_except: ExceptionType exceptionType = (ExceptionType) returnType; ExceptionValue exceptionValue = new ExceptionValue(exceptionType); inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned.create_input_stream(); exceptionValue.read(inputStream); returnValue = exceptionValue; break; case TCKind._tk_enum: EnumType enumType = (EnumType) returnType; EnumValue enumValue = new EnumValue(enumType); inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned.create_input_stream(); enumValue.read(inputStream); returnValue = enumValue; break; case TCKind._tk_union: UnionType unionType = (UnionType) returnType; inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned.create_input_stream(); UnionValue unionValue = new UnionValue(unionType); unionValue.read(inputStream); returnValue = unionValue; break; case TCKind._tk_alias: Typedef typedef = (Typedef) returnType; inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned.create_input_stream(); AliasValue aliasValue = new AliasValue(typedef); aliasValue.read(inputStream); returnValue = aliasValue; break; case TCKind._tk_sequence: SequenceType sequenceType = (SequenceType) returnType; inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned.create_input_stream(); SequenceValue sequenceValue = new SequenceValue(sequenceType); sequenceValue.read(inputStream); returnValue = sequenceValue; break; case TCKind._tk_array: ArrayType arrayType = (ArrayType) returnType; inputStream = (org.omg.CORBA_2_3.portable.InputStream) returned.create_input_stream(); ArrayValue arrayValue = new ArrayValue(arrayType); arrayValue.read(inputStream); returnValue = arrayValue; break; default: log.error("ERROR! Invalid dataType"); break; } return returnValue; } public static Object parseValue(DataType type, String value) { if (value == null) return null; value = value.trim(); Object ret = null; switch (type.getTypeCode().kind().value()) { case TCKind._tk_long: ret = Integer.valueOf(value); break; case TCKind._tk_ulong: ret = Integer.valueOf(value); break; case TCKind._tk_longlong: ret = Long.valueOf(value); break; case TCKind._tk_ulonglong: ret = Long.valueOf(value); break; case TCKind._tk_short: ret = Short.valueOf(value); break; case TCKind._tk_ushort: ret = Short.valueOf(value); break; case TCKind._tk_float: ret = Float.valueOf(value); break; case TCKind._tk_double: ret = Double.valueOf(value); break; case TCKind._tk_char: ret = Character.valueOf(value.charAt(0)); break; case TCKind._tk_wchar: ret = Character.valueOf(value.charAt(0)); break; case TCKind._tk_boolean: ret = Boolean.valueOf(value); break; case TCKind._tk_octet: ret = Byte.valueOf(value); break; case TCKind._tk_string: ret = value; break; case TCKind._tk_wstring: ret = value; break; case TCKind._tk_enum: EnumType enumType = (EnumType) type; EnumValue enumValue = new EnumValue(enumType); int i = enumType.getEnumMembers().indexOf(value); enumValue.setValue(i); ret = enumValue; break; default: log.error("ERROR! Invalid dataType"); break; } return ret; } public static Object getEmptyValue(DataType type) { switch (type.getTypeCode().kind().value()) { case TCKind._tk_long: return new Integer(0); case TCKind._tk_ulong: return new Integer(0); case TCKind._tk_longlong: return new Long(0); case TCKind._tk_ulonglong: return new Long(0); case TCKind._tk_short: return new Short("0"); case TCKind._tk_ushort: return new Short("0"); case TCKind._tk_float: return new Float(0f); case TCKind._tk_double: return new Double(0d); case TCKind._tk_char: return new Character('0'); case TCKind._tk_wchar: return new Character('0'); case TCKind._tk_boolean: return Boolean.FALSE; case TCKind._tk_octet: return new Byte("0"); case TCKind._tk_string: return ""; case TCKind._tk_wstring: return ""; //case TCKind._tk_any: return new Any(); case TCKind._tk_value: return ""; //case TCKind._tk_objref: return new org.omg.CORBA.Object(); case TCKind._tk_struct: Struct struct = (Struct) type; StructValue value = new StructValue(struct); Member[] members = struct.getMembers(); Object[] memberValues = new Object[members.length]; for (int i = 0; i < members.length; i++) { memberValues[i] = getEmptyValue(members[i].getDataType()); } value.setMemberValues(memberValues); return value; case TCKind._tk_enum: return new EnumValue((EnumType) type); case TCKind._tk_union: UnionType unionType = (UnionType) type; UnionValue unionValue = new UnionValue(unionType); members = unionType.getMembers(); unionValue.setMemberName(members[0].getName()); unionValue.setMemberType(members[0].getDataType()); unionValue.setMemberValue(getEmptyValue(members[0].getDataType())); return unionValue; case TCKind._tk_alias: Typedef typedef = (Typedef) type; AliasValue aliasValue = new AliasValue(typedef); aliasValue.setValue(getEmptyValue(typedef.getDataType())); return aliasValue; case TCKind._tk_sequence: SequenceType sequenceType = (SequenceType) type; SequenceValue sequenceValue = new SequenceValue(sequenceType); sequenceValue.setValues(new Object[0]); return sequenceValue; case TCKind._tk_array: ArrayType arrayType = (ArrayType) type; ArrayValue arrayValue = new ArrayValue(arrayType); Object[] objects = new Object[arrayType.getElementCount()]; DataType arrayDataType = arrayType.getDataType(); for (int i = 0; i < objects.length; i++) { objects[i] = getEmptyValue(arrayDataType); } arrayValue.setValues(objects); return arrayValue; default: log.error("ERROR! Invalid dataType"); } return null; } }