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/14 18:28:25 UTC

svn commit: r443433 - in /incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba: CorbaBindingImpl.java CorbaObjectReader.java CorbaObjectWriter.java types/CorbaAnyHandler.java types/CorbaHandlerUtils.java

Author: dmiddlem
Date: Thu Sep 14 11:28:24 2006
New Revision: 443433

URL: http://svn.apache.org/viewvc?view=rev&rev=443433
Log:
Updates to the CORBA Anys support to use xsi:type information from a
Stax StartElement attribute for determining stored object type. (YOKO-156).

Added:
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java   (with props)
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/CorbaObjectReader.java
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectWriter.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=443433&r1=443432&r2=443433
==============================================================================
--- 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 Thu Sep 14 11:28:24 2006
@@ -43,6 +43,7 @@
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.Attribute;
 import javax.xml.stream.events.Characters;
 import javax.xml.stream.events.EndElement;
 import javax.xml.stream.events.StartElement;
@@ -68,6 +69,7 @@
 import org.apache.schemas.yoko.bindings.corba.Struct;
 import org.apache.schemas.yoko.bindings.corba.Union;
 import org.apache.schemas.yoko.bindings.corba.Unionbranch;
+import org.apache.yoko.bindings.corba.types.CorbaAnyHandler;
 import org.apache.yoko.bindings.corba.types.CorbaArrayHandler;
 import org.apache.yoko.bindings.corba.types.CorbaEnumHandler;
 import org.apache.yoko.bindings.corba.types.CorbaExceptionHandler;
@@ -94,7 +96,6 @@
 import org.objectweb.celtix.ws.addressing.EndpointReferenceType;
 import org.objectweb.celtix.wsdl.EndpointReferenceUtils;
 
-import org.omg.CORBA.Any;
 import org.omg.CORBA.ORB;
 import org.omg.CORBA.TCKind;
 import org.omg.CORBA.TypeCode;
@@ -103,6 +104,11 @@
 
     private static final Logger LOG = LogUtils.getL7dLogger(CorbaBindingImpl.class);
 
+    private static final String XSI_NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema-instance";
+    private static final String XSI_PREFIX = "xsi";
+    private static final String XMLSCHEMA_NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema";
+    private static final String XMLSCHEMA_PREFIX = "xs";
+    
     protected final boolean isServer;
     private Bus bus;
     private EndpointReferenceType endpointRef;
@@ -176,7 +182,7 @@
             if (writer == null) {
                 throw new CorbaBindingException("Unable to create data writer");
             }
-
+            
             XMLInputFactory inputFactory = XMLInputFactory.newInstance();
             XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
             outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
@@ -393,7 +399,7 @@
             XMLInputFactory inputFactory = XMLInputFactory.newInstance();
             XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
             outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-
+            
             boolean hasOutParamReturn = 
                 addUnmarshalParams(callback, params, corbaCtx, objContext, 
                                    inputFactory, outputFactory, reader);
@@ -641,14 +647,37 @@
                 objName = obj.getName();
             }
 
-            StartElement startEl = factory.createStartElement(objName, null, null);
-            writer.add(startEl);
-
-            TypeCode tc = obj.getTypeCode();
+            StartElement startEl = null;
+            TypeCode tc = obj.getTypeCode();            
             if (CorbaUtils.isPrimitiveIdlType(obj.getIdlType())) {
                 LOG.log(Level.INFO, "Writing primitive type to XML writer");
+                
+                if (obj.getTypeCodeKind().value() == TCKind._tk_any) {
+                    // Any is a special case.  Create an attribute called xsi:type which identifies the type
+                    // of object stored in the Any.  Also create a 'dummy' attribute to get the XML schema 
+                    // namespace included in the Stax event.  createNamespace() doesn't work for some reason.
+                    // TODO: Revisit this.
+                    String schemaType = ((CorbaAnyHandler)obj).getSchemaType();
+                    QName attrName = new QName(XSI_NAMESPACE_URI, "type", XSI_PREFIX);
+                    Attribute attr = factory.createAttribute(attrName, schemaType); 
+                    QName nsName = new QName(XMLSCHEMA_NAMESPACE_URI, "namespace", XMLSCHEMA_PREFIX);
+                    Attribute ns = factory.createAttribute(nsName, "");
+                    List<Attribute> attributes = new ArrayList<Attribute>();
+                    attributes.add(attr);
+                    attributes.add(ns);
+                    
+                    startEl = 
+                        factory.createStartElement(objName, attributes.iterator(), null);
+                } else {
+                    startEl = factory.createStartElement(objName, null, null);
+                }
+
+                writer.add(startEl);
                 writePrimitiveToStax(obj, writer, factory);
             } else {
+                startEl = factory.createStartElement(objName, null, null);
+                writer.add(startEl);
+
                 switch(tc.kind().value()) {
                 case TCKind._tk_array:
                     LOG.log(Level.INFO, "Writing array type to XML writer");
@@ -703,100 +732,49 @@
 
     public CorbaObjectHandler readPrimitiveFromStax(XMLEventReader reader, QName idlType, TypeCode tc) 
         throws CorbaBindingException {
-        CorbaPrimitiveHandler obj = null;
         try {
             StartElement startEl = reader.nextEvent().asStartElement();
             Characters charEl = reader.nextEvent().asCharacters();
             reader.nextEvent().asEndElement();
-            obj = new CorbaPrimitiveHandler(startEl.getName(), idlType, tc, null);
             if (tc.kind().value() == TCKind._tk_any) {
-                Any a = orb.create_any();
+                Iterator attrIter = startEl.getAttributes();
+                String anySchemaType = null;
+                while (attrIter.hasNext()) {
+                    Attribute attr = (Attribute)attrIter.next();
+                    QName attrName = attr.getName();
+                    if (attrName.getNamespaceURI().equals(XSI_NAMESPACE_URI)
+                        && attrName.getLocalPart().equals("type")) {
+                        anySchemaType = attr.getValue();
+                        break;
+                    }
+                }
+                           
+                CorbaAnyHandler obj = new CorbaAnyHandler(startEl.getName(), idlType, tc, null);
+                obj.setValueFromData(orb, charEl.getData(), anySchemaType);
+                return obj;
                 
-                // TODO: Revisit.  Right now we insert the data as a string.  This needs to be updated to 
-                // insert the appropriate type.  However, where do we get this type information from?
-                // Since STAX only gives us character data, where do we pick up the objects original 
-                // type and how do we determine which insert to use if a two types map to the same 
-                // java object?
-                a.insert_string(charEl.getData());
-                obj.setValue(a);
             } else {
+                CorbaPrimitiveHandler obj = new CorbaPrimitiveHandler(startEl.getName(), idlType, tc, null);
                 obj.setValueFromData(charEl.getData());
+                return obj;
             }
         } catch (java.lang.Exception ex) {
             LOG.log(Level.SEVERE, "Error: Object not correctly defined in the XML reader");
             throw new CorbaBindingException("Invalid XML event read", ex);
         }
-        
-        return obj;
     }
     
     public void writePrimitiveToStax(CorbaObjectHandler obj, XMLEventWriter writer, XMLEventFactory factory) 
         throws XMLStreamException {
-        CorbaPrimitiveHandler primitiveHandler = (CorbaPrimitiveHandler)obj;
         Characters charEvt = null;
-        if (primitiveHandler.getTypeCodeKind() == TCKind.tk_any) {
-            Any a = (Any)primitiveHandler.getValue();
-            charEvt = factory.createCharacters(convertAnyToString(a));
+        if (obj.getTypeCodeKind() == TCKind.tk_any) {
+            charEvt = factory.createCharacters(((CorbaAnyHandler)obj).getValueData());
         } else {
-            charEvt = factory.createCharacters(primitiveHandler.getValueData());
+            charEvt = factory.createCharacters(((CorbaPrimitiveHandler)obj).getValueData());
         }
         writer.add(charEvt);
     }
-    
-    public String convertAnyToString(Any a) throws CorbaBindingException {
-        String result = null;
-        
-        switch (a.type().kind().value()) {
-        case TCKind._tk_boolean:
-            result = Boolean.toString(a.extract_boolean());
-            break;
-        case TCKind._tk_char:
-            result = Character.toString(a.extract_char());
-            break;
-        case TCKind._tk_wchar:
-            result = Character.toString(a.extract_wchar());
-            break;
-        case TCKind._tk_octet:
-            result = Byte.toString(a.extract_octet());
-            break;
-        case TCKind._tk_short:
-            result = Short.toString(a.extract_short());
-            break;
-        case TCKind._tk_ushort:
-            result = Short.toString(a.extract_ushort());
-            break;
-        case TCKind._tk_long:
-            result = Integer.toString(a.extract_long());
-            break;
-        case TCKind._tk_ulong:
-            result = Integer.toString(a.extract_ulong());
-            break;
-        case TCKind._tk_longlong:
-            result = Long.toString(a.extract_longlong());
-            break;
-        case TCKind._tk_ulonglong:
-            result = Long.toString(a.extract_ulonglong());
-            break;
-        case TCKind._tk_double:
-            result = Double.toString(a.extract_double());
-            break;
-        case TCKind._tk_float:
-            result = Float.toString(a.extract_float());
-            break;
-        case TCKind._tk_string:
-            result = a.extract_string();
-            break;
-        case TCKind._tk_wstring:
-            result = a.extract_wstring();
-            break;
-        // TODO: Add support for any non-primitive types
-        default:
-            throw new CorbaBindingException("Unsupported type in CORBA Any");
-        }
-        
-        return result;
-    }
-    
+
     public CorbaObjectHandler readAnonStringsFromStax(XMLEventReader reader, QName idlType, TypeCode tc) {
         CorbaPrimitiveHandler obj = null;
         

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectReader.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectReader.java?view=diff&rev=443433&r1=443432&r2=443433
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectReader.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectReader.java Thu Sep 14 11:28:24 2006
@@ -32,6 +32,7 @@
 import org.apache.schemas.yoko.bindings.corba.Enumerator;
 import org.apache.schemas.yoko.bindings.corba.Union;
 import org.apache.schemas.yoko.bindings.corba.Unionbranch;
+import org.apache.yoko.bindings.corba.types.CorbaAnyHandler;
 import org.apache.yoko.bindings.corba.types.CorbaArrayHandler;
 import org.apache.yoko.bindings.corba.types.CorbaEnumHandler;
 import org.apache.yoko.bindings.corba.types.CorbaExceptionHandler;
@@ -106,7 +107,7 @@
             ((CorbaPrimitiveHandler)obj).setValue(this.readWString());
             break;
         case TCKind._tk_any:
-            ((CorbaPrimitiveHandler)obj).setValue(this.readAny());
+            ((CorbaAnyHandler)obj).setValue(this.readAny());
             break;
         
         // Now for the complex types

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectWriter.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectWriter.java?view=diff&rev=443433&r1=443432&r2=443433
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectWriter.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectWriter.java Thu Sep 14 11:28:24 2006
@@ -24,6 +24,7 @@
 import org.apache.schemas.yoko.bindings.corba.Enum;
 import org.apache.schemas.yoko.bindings.corba.Enumerator;
 import org.apache.schemas.yoko.bindings.corba.Exception;
+import org.apache.yoko.bindings.corba.types.CorbaAnyHandler;
 import org.apache.yoko.bindings.corba.types.CorbaArrayHandler;
 import org.apache.yoko.bindings.corba.types.CorbaEnumHandler;
 import org.apache.yoko.bindings.corba.types.CorbaExceptionHandler;
@@ -93,7 +94,7 @@
             this.writeWString((String)((CorbaPrimitiveHandler)obj).getValue());
             break;
         case TCKind._tk_any:
-            this.writeAny((Any)((CorbaPrimitiveHandler)obj).getValue());
+            this.writeAny(((CorbaAnyHandler)obj).getValue());
             break;
 
         // Now for the complex types

Added: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java?view=auto&rev=443433
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java (added)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java Thu Sep 14 11:28:24 2006
@@ -0,0 +1,200 @@
+/**
+ * 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.yoko.bindings.corba.types;
+
+import javax.xml.namespace.QName;
+
+import org.apache.yoko.bindings.corba.CorbaBindingException;
+
+import org.omg.CORBA.Any;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
+
+public class CorbaAnyHandler extends CorbaObjectHandler {
+
+    private Any value;
+    private String schemaType;
+    
+    public CorbaAnyHandler(QName anyName, QName anyIdlType, TypeCode anyTC, Object anyType) {
+        super(anyName, anyIdlType, anyTC, anyType);
+        
+        schemaType = null;
+        value = null;
+    }
+    
+    public String getSchemaType() {
+        return schemaType;
+    }
+    
+    public void setSchemaType(String type) {
+        schemaType = type;
+    }
+    
+    public Any getValue() {
+        return value;
+    }
+    
+    public void setValue(Any v) throws CorbaBindingException {
+        value = v;
+
+        // Need to find the appropriate xsi:type for the any
+        // TODO: See the comment in setValueFromData regarding the xs: prefix.  We'll also need
+        //       to make a similar change here.
+        switch (value.type().kind().value()) {
+        case TCKind._tk_boolean:
+            schemaType = "xs:boolean";
+            break;
+        case TCKind._tk_char:
+            schemaType = "xs:byte";
+            break;
+        case TCKind._tk_wchar:
+            schemaType = "xs:string";
+            break;
+        case TCKind._tk_octet:
+            schemaType = "xs:unsignedByte";
+            break;
+        case TCKind._tk_short:
+            schemaType = "xs:short";
+            break;
+        case TCKind._tk_ushort:
+            schemaType = "xs:unsignedShort";
+            break;
+        case TCKind._tk_long:
+            schemaType = "xs:int";
+            break;
+        case TCKind._tk_ulong:
+            schemaType = "xs:unsignedInt";
+            break;
+        case TCKind._tk_longlong:
+            schemaType = "xs:long";
+            break;
+        case TCKind._tk_ulonglong:
+            schemaType = "xs:unsignedLong";
+            break;
+        case TCKind._tk_double:
+            schemaType = "xs:double";
+            break;
+        case TCKind._tk_float:
+            schemaType = "xs:float";
+            break;
+        case TCKind._tk_string:
+            schemaType = "xs:string";
+            break;
+        case TCKind._tk_wstring:
+            schemaType = "xs:string";
+            break;
+        default:
+            throw new CorbaBindingException("Unsupported type in CORBA Any");
+        }
+    }
+    
+    public String getValueData() throws CorbaBindingException {
+        String result = null;
+        
+        switch (value.type().kind().value()) {
+        case TCKind._tk_boolean:
+            result = Boolean.toString(value.extract_boolean());
+            break;
+        case TCKind._tk_char:
+            result = Character.toString(value.extract_char());
+            break;
+        case TCKind._tk_wchar:
+            result = Character.toString(value.extract_wchar());
+            break;
+        case TCKind._tk_octet:
+            result = Byte.toString(value.extract_octet());
+            break;
+        case TCKind._tk_short:
+            result = Short.toString(value.extract_short());
+            break;
+        case TCKind._tk_ushort:
+            result = Short.toString(value.extract_ushort());
+            break;
+        case TCKind._tk_long:
+            result = Integer.toString(value.extract_long());
+            break;
+        case TCKind._tk_ulong:
+            result = Integer.toString(value.extract_ulong());
+            break;
+        case TCKind._tk_longlong:
+            result = Long.toString(value.extract_longlong());
+            break;
+        case TCKind._tk_ulonglong:
+            result = Long.toString(value.extract_ulonglong());
+            break;
+        case TCKind._tk_double:
+            result = Double.toString(value.extract_double());
+            break;
+        case TCKind._tk_float:
+            result = Float.toString(value.extract_float());
+            break;
+        case TCKind._tk_string:
+            result = value.extract_string();
+            break;
+        case TCKind._tk_wstring:
+            result = value.extract_wstring();
+            break;
+        default:
+            throw new CorbaBindingException("Unsupported type in CORBA Any");
+        }
+        
+        return result;
+    }
+    
+    public void setValueFromData(ORB orb, String data, String type) 
+        throws CorbaBindingException {
+        value = orb.create_any();
+        
+        // TODO: For now, the xs: is hard coded because the namespace for xs: is not included in the 
+        // STAX element where we get the type information from.  This will need to be changed so that
+        // it does not depend on the XML Schema namespace using the xs: prefix.
+        if (type.equals("xs:boolean")) {
+            value.insert_boolean(Boolean.parseBoolean(data));
+        } else if (type.equals("xs:byte")) {
+            value.insert_char((char)Byte.valueOf(data).byteValue());
+        } else if (type.equals("xs:double")) {
+            value.insert_double(Double.parseDouble(data));
+        } else if (type.equals("xs:float")) {
+            value.insert_float(Float.parseFloat(data));
+        } else if (type.equals("xs:int")) {
+            value.insert_long(Integer.parseInt(data));
+        } else if (type.equals("xs:long")) {
+            value.insert_longlong(Long.parseLong(data));
+        } else if (type.equals("xs:short")) {
+            value.insert_short(Short.parseShort(data));
+        } else if (type.equals("xs:string")) {
+            // NOTE: CORBA wchar, string, and wstrings will all be inserted as strings since they all
+            //       map to the same XML Schema type.  There is no way in Celtix of differentiating 
+            //       between the three when used in an any.
+            value.insert_string(data);
+        } else if (type.equals("xs:unsignedByte")) {
+            value.insert_octet(Byte.parseByte(data));
+        } else if (type.equals("xs:unsignedInt")) {
+            value.insert_ulong(Integer.parseInt(data));
+        } else if (type.equals("xs:unsignedLong")) {
+            value.insert_ulonglong(Long.parseLong(data));
+        } else if (type.equals("xs:unsignedShort")) {
+            value.insert_ushort(Short.parseShort(data));
+        } else {
+            throw new CorbaBindingException("Unsupported XML Schema type");
+        }
+        schemaType = type;
+    }
+}

Propchange: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/types/CorbaAnyHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

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=443433&r1=443432&r2=443433
==============================================================================
--- 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 Thu Sep 14 11:28:24 2006
@@ -32,6 +32,7 @@
 import org.apache.schemas.yoko.bindings.corba.Struct;
 import org.apache.schemas.yoko.bindings.corba.Union;
 import org.apache.schemas.yoko.bindings.corba.Unionbranch;
+//import org.apache.yoko.bindings.corba.CorbaConstants;
 import org.apache.yoko.bindings.corba.CorbaTypeMap;
 import org.apache.yoko.bindings.corba.CorbaUtils;
 import org.apache.yoko.wsdl.CorbaTypeImpl;
@@ -48,7 +49,12 @@
 
         TypeCode tc = CorbaUtils.getTypeCode(orb, idlType, typeMaps);
         if (CorbaUtils.isPrimitiveIdlType(idlType)) {
-            handler = new CorbaPrimitiveHandler(name, idlType, tc, null);
+            // Any is a special primitive
+            if (tc.kind().value() == TCKind._tk_any) {
+                handler = new CorbaAnyHandler(name, idlType, tc, null);                
+            } else {
+                handler = new CorbaPrimitiveHandler(name, idlType, tc, null);
+            }
         } else {
             CorbaTypeImpl type = CorbaUtils.getCorbaType(idlType, typeMaps);