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);