You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yoko-commits@incubator.apache.org by dm...@apache.org on 2006/09/25 14:23:39 UTC

svn commit: r449687 - in /incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba: CorbaBindingImpl.java CorbaUtils.java types/CorbaHandlerUtils.java

Author: dmiddlem
Date: Mon Sep 25 07:23:39 2006
New Revision: 449687

URL: http://svn.apache.org/viewvc?view=rev&rev=449687
Log:
Adding support for CORBA typedefs in the binding. (YOKO-173)

Modified:
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaUtils.java
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java?view=diff&rev=449687&r1=449686&r2=449687
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java Mon Sep 25 07:23:39 2006
@@ -52,10 +52,9 @@
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.handler.MessageContext;
 
+import org.apache.schemas.yoko.bindings.corba.Alias;
 import org.apache.schemas.yoko.bindings.corba.Anonarray;
 import org.apache.schemas.yoko.bindings.corba.Anonsequence;
-//import org.apache.schemas.yoko.bindings.corba.Anonstring;
-//import org.apache.schemas.yoko.bindings.corba.Anonwstring;
 import org.apache.schemas.yoko.bindings.corba.Array;
 import org.apache.schemas.yoko.bindings.corba.CaseType;
 import org.apache.schemas.yoko.bindings.corba.Enum;
@@ -137,8 +136,8 @@
             // now check for type maps in any imports
             Map wsdlImports = wsdlDef.getImports();
             Collection importValues = wsdlImports.values();
-            for (Iterator importIterator = importValues.iterator(); importIterator.hasNext();) {
-                List impList = (List)importIterator.next();
+            for (Iterator iter = importValues.iterator(); iter.hasNext();) {
+                List impList = (List)iter.next();
                 for (Iterator it = impList.iterator(); it.hasNext();) {
                     Import imp = (Import)it.next();
                     Definition impDef = imp.getDefinition();
@@ -251,8 +250,8 @@
         }
 
         int cbParamCount = 0;
-        for (Iterator<ParamType> paramIter = params.iterator(); paramIter.hasNext();) {
-            ParamType param = paramIter.next();
+        for (Iterator<ParamType> iter = params.iterator(); iter.hasNext();) {
+            ParamType param = iter.next();
             QName elName = null;
             Object partValue = null;
             if (param.getMode().equals(ModeType.OUT) && hasOutParamReturn) {
@@ -347,10 +346,10 @@
             
             QName exIdlType = null;
             List<RaisesType> exList = opElement.getRaises();
-            for (Iterator<RaisesType> i = exList.iterator(); i.hasNext();) {
+            for (Iterator<RaisesType> iter = exList.iterator(); iter.hasNext();) {
                 // REVISIT: Note that this assumes that exception names need to be unique.  We should make
                 // sure that this is really the case.
-                RaisesType raises = i.next();
+                RaisesType raises = iter.next();
                 if (raises.getException().getLocalPart().equals(elName.getLocalPart())) {
                     exIdlType = raises.getException();
                 }
@@ -596,6 +595,10 @@
             obj = readPrimitiveFromStax(reader, idlType, tc);
         } else {
             switch(tc.kind().value()) {
+            case TCKind._tk_alias:
+                LOG.log(Level.INFO, "Reading alias type from XML reader");
+                obj = readAliasFromStax(reader, idlType, tc);
+                break;
             case TCKind._tk_array:
                 LOG.log(Level.INFO, "Reading array type from XML reader");
                 obj = readArrayFromStax(reader, idlType, tc);
@@ -680,6 +683,7 @@
                 writer.add(startEl);
 
                 switch(tc.kind().value()) {
+                // Aliases should never get to this point so we don't need a special alias writer
                 case TCKind._tk_array:
                     LOG.log(Level.INFO, "Writing array type to XML writer");
                     writeArrayToStax(obj, writer, factory);
@@ -738,10 +742,10 @@
             Characters charEl = reader.nextEvent().asCharacters();
             reader.nextEvent().asEndElement();
             if (tc.kind().value() == TCKind._tk_any) {
-                Iterator attrIter = startEl.getAttributes();
+                Iterator iter = startEl.getAttributes();
                 String anySchemaType = null;
-                while (attrIter.hasNext()) {
-                    Attribute attr = (Attribute)attrIter.next();
+                while (iter.hasNext()) {
+                    Attribute attr = (Attribute)iter.next();
                     QName attrName = attr.getName();
                     if (attrName.getNamespaceURI().equals(XSI_NAMESPACE_URI)
                         && attrName.getLocalPart().equals("type")) {
@@ -776,6 +780,23 @@
         writer.add(charEvt);
     }
 
+    public CorbaObjectHandler readAliasFromStax(XMLEventReader reader, QName idlType, TypeCode tc) {
+        CorbaObjectHandler obj = null;
+        CorbaTypeImpl typeDefinition = CorbaUtils.getCorbaType(idlType, typeMaps);
+
+        // We need to create an ObjectHandler from the base type of the typedef.  So we recursively call
+        // the readObjectFromStax call.  However, this is not a true nested read so still pass false as the 
+        // nested flag.
+        try {
+            Alias aliasType = (Alias)typeDefinition;
+            obj = readObjectFromStax(reader, aliasType.getBasetype(), false);
+        } catch (java.lang.Exception ex) {
+            LOG.log(Level.SEVERE, "Received exception while reading object of type " + idlType);
+            throw new CorbaBindingException("Error while reading alias corba type", ex);
+        }
+        return obj;
+    }
+    
     public CorbaObjectHandler readAnonStringsFromStax(XMLEventReader reader, QName idlType, TypeCode tc) {
         CorbaPrimitiveHandler obj = null;
         
@@ -838,8 +859,8 @@
         throws XMLStreamException {
         CorbaArrayHandler arrayHandler = (CorbaArrayHandler)obj;
         List<CorbaObjectHandler> elements = arrayHandler.getElements();
-        for (Iterator<CorbaObjectHandler> elementsIter = elements.iterator(); elementsIter.hasNext();) {
-            writeObjectToStax(elementsIter.next(), writer, factory, true);
+        for (Iterator<CorbaObjectHandler> iter = elements.iterator(); iter.hasNext();) {
+            writeObjectToStax(iter.next(), writer, factory, true);
         }
     }
     
@@ -880,8 +901,9 @@
             StartElement exStartEl = reader.nextEvent().asStartElement();
             obj = new CorbaExceptionHandler(exStartEl.getName(), idlType, tc, exType);
             List<MemberType> exMembers = exType.getMember();
-            for (int i = 0; i < exMembers.size(); ++i) {
-                CorbaObjectHandler member = readObjectFromStax(reader, exMembers.get(i).getIdltype(), true);
+            for (Iterator<MemberType> iter = exMembers.iterator(); iter.hasNext();) {
+                MemberType m = iter.next();
+                CorbaObjectHandler member = readObjectFromStax(reader, m.getIdltype(), true);
                 obj.addMember(member);
             }
             reader.nextEvent().asEndElement();
@@ -897,8 +919,8 @@
         throws XMLStreamException {
         CorbaExceptionHandler exObj = (CorbaExceptionHandler)obj;
         List<CorbaObjectHandler> elements = exObj.getMembers();
-        for (Iterator<CorbaObjectHandler> elementsIter = elements.iterator(); elementsIter.hasNext();) {
-            writeObjectToStax(elementsIter.next(), writer, factory, true);
+        for (Iterator<CorbaObjectHandler> iter = elements.iterator(); iter.hasNext();) {
+            writeObjectToStax(iter.next(), writer, factory, true);
         }
     }
 
@@ -947,8 +969,8 @@
         throws XMLStreamException {
         CorbaSequenceHandler seqHandler = (CorbaSequenceHandler)obj;
         List<CorbaObjectHandler> elements = seqHandler.getElements();
-        for (Iterator<CorbaObjectHandler> elementsIter = elements.iterator(); elementsIter.hasNext();) {
-            writeObjectToStax(elementsIter.next(), writer, factory, true);
+        for (Iterator<CorbaObjectHandler> iter = elements.iterator(); iter.hasNext();) {
+            writeObjectToStax(iter.next(), writer, factory, true);
         }
     }
 
@@ -962,10 +984,9 @@
             StartElement structStartEl = reader.nextEvent().asStartElement();
             obj = new CorbaStructHandler(structStartEl.getName(), idlType, tc, structType);
             List<MemberType> structMembers = structType.getMember();
-            for (int i = 0; i < structMembers.size(); ++i) {
-                CorbaObjectHandler member = readObjectFromStax(reader, 
-                                                               structMembers.get(i).getIdltype(), 
-                                                               true);
+            for (Iterator<MemberType> iter = structMembers.iterator(); iter.hasNext();) {
+                MemberType m = iter.next();
+                CorbaObjectHandler member = readObjectFromStax(reader, m.getIdltype(), true);
                 obj.addMember(member);
             }
             reader.nextEvent().asEndElement();
@@ -981,8 +1002,8 @@
         throws XMLStreamException {
         CorbaStructHandler structHandler = (CorbaStructHandler)obj;
         List<CorbaObjectHandler> elements = structHandler.getMembers();
-        for (Iterator<CorbaObjectHandler> elementsIter = elements.iterator(); elementsIter.hasNext();) {
-            writeObjectToStax(elementsIter.next(), writer, factory, true);
+        for (Iterator<CorbaObjectHandler> iter = elements.iterator(); iter.hasNext();) {
+            writeObjectToStax(iter.next(), writer, factory, true);
         }
     }
 
@@ -1010,8 +1031,8 @@
             StartElement branchElement = reader.peek().asStartElement();
             String branchName = branchElement.getName().getLocalPart();
             List<Unionbranch> branches = unionType.getUnionbranch();
-            for (Iterator<Unionbranch> branchesIter = branches.iterator(); branchesIter.hasNext();) {
-                Unionbranch branch = branchesIter.next();
+            for (Iterator<Unionbranch> iter = branches.iterator(); iter.hasNext();) {
+                Unionbranch branch = iter.next();
                 CorbaObjectHandler branchObj = null;
                 if (branch.getName().equals(branchName)) {
                     branchObj = readObjectFromStax(reader, branch.getIdltype(), true);

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaUtils.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaUtils.java?view=diff&rev=449687&r1=449686&r2=449687
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaUtils.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaUtils.java Mon Sep 25 07:23:39 2006
@@ -51,7 +51,6 @@
 import org.apache.schemas.yoko.bindings.corba.Exception;
 import org.apache.schemas.yoko.bindings.corba.Fixed;
 import org.apache.schemas.yoko.bindings.corba.MemberType;
-import org.apache.schemas.yoko.bindings.corba.NamedType;
 import org.apache.schemas.yoko.bindings.corba.OperationType;
 import org.apache.schemas.yoko.bindings.corba.Sequence;
 import org.apache.schemas.yoko.bindings.corba.Struct;
@@ -114,10 +113,8 @@
             return orb.get_primitive_tc(kind);
         }
 
-        // There is a possiblitity that the idl type will not have its namespace
-        // URI set if it has
-        // been read directly from the WSDL file as a string. Try with the
-        // standard corba namespace URI.
+        // There is a possiblitity that the idl type will not have its namespace URI set if it has
+        // been read directly from the WSDL file as a string. Try with the standard corba namespace URI.
         if (type.getNamespaceURI() == null) {
             QName uriIdltype = new QName(CorbaConstants.NU_WSDL_CORBA, type.getLocalPart(), type.getPrefix());
 
@@ -137,7 +134,9 @@
         // rules
         if (obj instanceof Alias) {
             Alias aliasType = (Alias)obj;
-            tc = getTypeCode(orb, aliasType.getBasetype(), typeMaps);
+            tc = orb.create_alias_tc(aliasType.getRepositoryID(), 
+                                     aliasType.getName(), 
+                                     getTypeCode(orb, aliasType.getBasetype(), typeMaps));
         } else if (obj instanceof Anonarray) {
             Anonarray anonArrayType = (Anonarray)obj;
             tc = orb.create_array_tc((int) anonArrayType.getBound(), 
@@ -264,8 +263,7 @@
                     // TODO: Throw exception since this is an unsupported discriminator type
                 }
                 // Yoko orb is strict on how the case labels are stored for each member.  So we can't
-                // simply insert the labels as strings
-                //member.label.insert_string(cs.getLabel());
+                // simply insert the labels as strings 
                 members.put(cs.getLabel(), member);
             }
         }
@@ -295,38 +293,6 @@
         return false;
     }
 
-    public static QName getMemberIdlType(NamedType obj, QName name) {
-        // NOTE: Does this really only apply to structs, exceptions, and unions?
-
-        if (obj instanceof Struct) {
-            Struct structType = (Struct)obj;
-            List<MemberType> members = structType.getMember();
-            for (int i = 0; i < members.size(); ++i) {
-                MemberType m = members.get(i);
-                if (m.getName().equals(name)) {
-                    return m.getIdltype();
-                }
-            }
-        } else if (obj instanceof Exception) {
-            Exception exceptType = (Exception)obj;
-            List<MemberType> members = exceptType.getMember();
-            for (int i = 0; i < members.size(); ++i) {
-                MemberType m = members.get(i);
-                if (m.getName().equals(name)) {
-                    return m.getIdltype();
-                }
-            }
-        } else if (obj instanceof Union) {
-            // TODO
-        } else if (obj instanceof Sequence) {
-            // TODO
-        } else if (obj instanceof Array) {
-            Array arrayType = (Array)obj;
-            return arrayType.getElemtype();
-        }
-        return null;
-    }
-
     public static CorbaTypeImpl getCorbaType(QName idlType, List<CorbaTypeMap> typeMaps) {
         CorbaTypeMap currentMap = null;
         for (int i = 0; i < typeMaps.size(); ++i) {
@@ -339,66 +305,6 @@
         return null;
     }
 
-    public static NamedType getMemberCorbaType(NamedType obj, QName name, List<CorbaTypeMap> typeMaps) {
-        NamedType type = null;
-
-        if (obj instanceof Struct) {
-            Struct structType = (Struct) obj;
-            List<MemberType> members = structType.getMember();
-            QName memberType = null;
-            for (int i = 0; i < members.size(); ++i) {
-                if (members.get(i).getName().equals(name)) {
-                    memberType = members.get(i).getIdltype();
-                    break;
-                }
-            }
-
-            if (!isPrimitiveIdlType(memberType) && memberType != null) {
-                for (int i = 0; i < typeMaps.size(); ++i) {
-                    if (typeMaps.get(i).getTargetNamespace().equals(memberType.getNamespaceURI())) {
-                        type = (NamedType) typeMaps.get(i).getType(memberType.getLocalPart());
-                        break;
-                    }
-                }
-            }
-        } else if (obj instanceof Exception) {
-            Exception exceptType = (Exception) obj;
-            List<MemberType> members = exceptType.getMember();
-            QName memberType = null;
-            for (int i = 0; i < members.size(); ++i) {
-                if (members.get(i).getName().equals(name)) {
-                    memberType = members.get(i).getIdltype();
-                    break;
-                }
-            }
-
-            if (!isPrimitiveIdlType(memberType) && memberType != null) {
-                for (int i = 0; i < typeMaps.size(); ++i) {
-                    if (typeMaps.get(i).getTargetNamespace().equals(memberType.getNamespaceURI())) {
-                        type = (NamedType)typeMaps.get(i).getType(memberType.getLocalPart());
-                        break;
-                    }
-                }
-            }
-        } else if (obj instanceof Union) {
-            // TODO: Exception for the current milestone
-        } else if (obj instanceof Array) {
-            Array arrayType = (Array)obj;
-            QName arrayIdlType = arrayType.getElemtype();
-
-            if (!isPrimitiveIdlType(arrayIdlType) && arrayIdlType != null) {
-                for (int i = 0; i < typeMaps.size(); ++i) {
-                    if (typeMaps.get(i).getTargetNamespace().equals(arrayIdlType.getNamespaceURI())) {
-                        type = (NamedType)typeMaps.get(i).getType(arrayIdlType.getLocalPart());
-                        break;
-                    }
-                }
-            }
-        }
-
-        return type;
-    }
-
     public static AddressType getCorbaAddressType(Bus bus, EndpointReferenceType endpointRef) {
         AddressType addrType = null;
         try {
@@ -466,14 +372,14 @@
     public static void getTypeMapFromDefinition(List<CorbaTypeMap> typeMaps, Definition wsdlDef) {
         List extElements = wsdlDef.getExtensibilityElements();
 
-        for (int i = 0; i < extElements.size(); ++i) {
-            Object e = extElements.get(i);
+        for (Iterator iter = extElements.iterator(); iter.hasNext();) {
+            Object e = iter.next();
             if (e instanceof TypeMappingType) {
                 TypeMappingType tmType = (TypeMappingType) e;
 
                 CorbaTypeMap map = null;
-                for (Iterator iter = typeMaps.iterator(); iter.hasNext();) {
-                    CorbaTypeMap tm = (CorbaTypeMap)iter.next();
+                for (Iterator<CorbaTypeMap> it = typeMaps.iterator(); it.hasNext();) {
+                    CorbaTypeMap tm = it.next();
                     if (tm.getTargetNamespace().equals(tmType.getTargetNamespace())) {
                         LOG.info("Found an existing typemap with the same namespace");
                         map = tm;
@@ -487,15 +393,13 @@
                     typeMaps.add(map);
                 }
                 
-                LOG.info("Found typemap in WSDL (Namespace: "
-                         + tmType.getTargetNamespace()
-                         + ", Prefix: "
-                         + wsdlDef.getPrefix(tmType.getTargetNamespace()));
+                LOG.info("Found typemap in WSDL (Namespace: " + tmType.getTargetNamespace()
+                         + ", Prefix: " + wsdlDef.getPrefix(tmType.getTargetNamespace()));
 
-                List types = tmType.getStructOrExceptionOrUnion();
+                List<CorbaTypeImpl> types = tmType.getStructOrExceptionOrUnion();
                 LOG.info("Found " + types.size() + " types defined in the typemap");
-                for (int j = 0; j < types.size(); ++j) {
-                    CorbaTypeImpl corbaType = (CorbaTypeImpl)types.get(j);
+                for (Iterator<CorbaTypeImpl> it = types.iterator(); it.hasNext();) {
+                    CorbaTypeImpl corbaType = it.next();
                     map.addType(corbaType.getName(), corbaType);
                     LOG.info("Adding type " + corbaType.getName());
                 }
@@ -539,9 +443,7 @@
         try {
             java.io.File file = new java.io.File(url);
             if (!file.exists()) {
-                throw new RuntimeException("Could not find file "
-                                           + url
-                                           + " to read the object reference");
+                throw new RuntimeException("Could not find file " + url + " to read the object reference");
             }
             java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.FileReader(file));
             String ior = reader.readLine();
@@ -549,7 +451,7 @@
                 throw new RuntimeException("Invalid object reference found in file " + url);
             }
             result = orb.string_to_object(ior.trim());
-        } catch (java.lang.Exception ex) {
+        } catch (java.io.IOException ex) {
             throw new RuntimeException(ex);
         }
         return result;

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java?view=diff&rev=449687&r1=449686&r2=449687
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java Mon Sep 25 07:23:39 2006
@@ -23,6 +23,7 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.schemas.yoko.bindings.corba.Alias;
 import org.apache.schemas.yoko.bindings.corba.Anonarray;
 import org.apache.schemas.yoko.bindings.corba.Anonsequence;
 import org.apache.schemas.yoko.bindings.corba.Array;
@@ -59,6 +60,13 @@
             CorbaTypeImpl type = CorbaUtils.getCorbaType(idlType, typeMaps);
 
             switch (tc.kind().value()) {
+            case TCKind._tk_alias:
+                // For typedefs, we'll create the handler for the Object that is typedef'd.  Reading and
+                // writing will use an Alias object and typecode, find the correct base type and then use
+                // this handler to marshal/unmarshal data
+                Alias aliasType = (Alias)type;
+                handler = createTypeHandler(orb, name, aliasType.getBasetype(), typeMaps);
+                break;
             case TCKind._tk_array:
                 handler = new CorbaArrayHandler(name, idlType, tc, type);
                 break;