Author: rfeng
Date: Sun Sep 16 00:49:13 2007
New Revision: 576058
URL: http://svn.apache.org/viewvc?rev=576058&view=rev
Log:
Improve the databinding for better wrapping/unwrapping to bring up the
XQuery/SDO/WS integration
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessor.java
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Input2InputTransformer.java
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Output2OutputTransformer.java
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElementWrapperHandler.java
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBWrapperHandler.java
incubator/tuscany/java/sca/modules/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOContextHelper.java
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandler.java
incubator/tuscany/java/sca/modules/databinding-sdo/src/test/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandlerTestCase.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/WrapperHandler.java
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMWrapperHandler.java
incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessor.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessor.java
(original)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessor.java
Sun Sep 16 00:49:13 2007
@@ -27,6 +27,7 @@
import java.util.Map;
import org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;
+import org.apache.tuscany.sca.databinding.javabeans.SimpleJavaDataBinding;
import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
import org.apache.tuscany.sca.databinding.annotation.DataBinding;
import org.apache.tuscany.sca.interfacedef.DataType;
@@ -158,7 +159,8 @@
if (d != null) {
String dataBinding = d.getDataBinding();
// Assumes JavaBeans DB is default
- if (dataBinding != null &&
!dataBinding.equals(JavaBeansDataBinding.NAME)) {
+ if (dataBinding != null &&
!dataBinding.equals(JavaBeansDataBinding.NAME)
+ && !dataBinding.equals(SimpleJavaDataBinding.NAME)) {
if (nonDefaultDataBindingName != null) {
if (!nonDefaultDataBindingName.equals(dataBinding)) {
// We've seen two different non-default DBs, e.g.
SDO and JAXB
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Input2InputTransformer.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Input2InputTransformer.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Input2InputTransformer.java
(original)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Input2InputTransformer.java
Sun Sep 16 00:49:13 2007
@@ -20,6 +20,7 @@
package org.apache.tuscany.sca.core.databinding.transformers;
import java.util.List;
+import java.util.logging.Logger;
import org.apache.tuscany.sca.databinding.DataBinding;
import org.apache.tuscany.sca.databinding.Mediator;
@@ -31,7 +32,6 @@
import org.apache.tuscany.sca.databinding.impl.BaseTransformer;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
@@ -45,6 +45,7 @@
@Service(Transformer.class)
public class Input2InputTransformer extends BaseTransformer<Object[],
Object[]> implements
PullTransformer<Object[], Object[]> {
+ private static final Logger logger =
Logger.getLogger(Input2InputTransformer.class.getName());
protected Mediator mediator;
@@ -102,19 +103,14 @@
WrapperHandler sourceWrapperHandler = null;
String sourceDataBinding = getDataBinding(sourceOp);
- if (sourceWrapped) {
- sourceWrapperHandler = getWrapperHandler(sourceDataBinding, true);
- }
+ sourceWrapperHandler = getWrapperHandler(sourceDataBinding,
sourceWrapped);
DataType<List<DataType>> targetType = context.getTargetDataType();
Operation targetOp = (Operation)context.getTargetOperation();
boolean targetWrapped = targetOp != null && targetOp.isWrapperStyle();
WrapperHandler targetWrapperHandler = null;
- String targetDataBinding = null;
- if (targetWrapped) {
- targetDataBinding = getDataBinding(targetOp);
- targetWrapperHandler = getWrapperHandler(targetDataBinding, true);
- }
+ String targetDataBinding = getDataBinding(targetOp);
+ targetWrapperHandler = getWrapperHandler(targetDataBinding,
targetWrapped);
if ((!sourceWrapped) && targetWrapped) {
// Unwrapped --> Wrapped
@@ -123,12 +119,23 @@
// If the source can be wrapped, wrapped it first
if (sourceWrapperHandler != null) {
- Object sourceWrapper =
sourceWrapperHandler.create(wrapperElement, context);
- for (int i = 0; i < source.length; i++) {
- ElementInfo argElement =
wrapper.getInputChildElements().get(i);
- sourceWrapperHandler.setChild(sourceWrapper, i,
argElement, source[0]);
+ DataType sourceWrapperType =
+ sourceWrapperHandler.getWrapperType(wrapperElement,
wrapper.getInputChildElements(), context);
+ if (sourceWrapperType != null) {
+ Object sourceWrapper =
sourceWrapperHandler.create(wrapperElement, context);
+ if (sourceWrapper != null) {
+ for (int i = 0; i < source.length; i++) {
+ ElementInfo argElement =
wrapper.getInputChildElements().get(i);
+ sourceWrapperHandler.setChild(sourceWrapper, i,
argElement, source[i]);
+ }
+ Object targetWrapper =
+ mediator.mediate(sourceWrapper, sourceWrapperType,
targetType.getLogical().get(0), context
+ .getMetadata());
+ return new Object[] {targetWrapper};
+ }
}
}
+ // Fall back to child by child transformation
Object targetWrapper = targetWrapperHandler.create(wrapperElement,
context);
if (source == null) {
return new Object[] {targetWrapper};
@@ -143,43 +150,45 @@
targetWrapperHandler.setChild(targetWrapper, i, argElement,
child);
}
return new Object[] {targetWrapper};
+
} else if (sourceWrapped && (!targetWrapped)) {
// Wrapped to Unwrapped
Object sourceWrapper = source[0];
- // List<ElementInfo> childElements =
- // sourceOp.getWrapper().getInputChildElements();
Object[] target = null;
- targetDataBinding = getDataBinding(targetOp);
- targetWrapperHandler = getWrapperHandler(targetDataBinding, false);
+ List<ElementInfo> childElements =
sourceOp.getWrapper().getInputChildElements();
if (targetWrapperHandler != null) {
ElementInfo wrapperElement =
sourceOp.getWrapper().getInputWrapperElement();
- // Object targetWrapper =
- // targetWrapperHandler.create(wrapperElement, context);
- DataType<XMLType> targetWrapperType = new
DataTypeImpl<XMLType>(targetDataBinding, Object.class,
-
new XMLType(wrapperElement));
- Object targetWrapper = mediator.mediate(sourceWrapper,
-
sourceType.getLogical().get(0),
- targetWrapperType,
- context.getMetadata());
- target =
targetWrapperHandler.getChildren(targetWrapper).toArray();
- } else {
- Object[] sourceChildren =
sourceWrapperHandler.getChildren(sourceWrapper).toArray();
- target = new Object[sourceChildren.length];
- for (int i = 0; i < sourceChildren.length; i++) {
- DataType<XMLType> childType =
sourceOp.getWrapper().getUnwrappedInputType().getLogical().get(i);
- target[i] = mediator.mediate(sourceChildren[i], childType,
targetType.getLogical().get(i), context
- .getMetadata());
+ // FIXME: This is a workaround for the wsdless support as it
passes in child elements
+ // under the wrapper that only matches by position
+ if (sourceWrapperHandler.isInstance(sourceWrapper,
wrapperElement, childElements, context)) {
+ DataType targetWrapperType =
+ targetWrapperHandler.getWrapperType(wrapperElement,
childElements, context);
+ if (targetWrapperType != null) {
+ Object targetWrapper =
+ mediator.mediate(sourceWrapper,
sourceType.getLogical().get(0), targetWrapperType, context
+ .getMetadata());
+ target =
targetWrapperHandler.getChildren(targetWrapper, childElements,
context).toArray();
+ return target;
+ }
}
}
+ Object[] sourceChildren =
sourceWrapperHandler.getChildren(sourceWrapper, childElements,
context).toArray();
+ target = new Object[sourceChildren.length];
+ for (int i = 0; i < sourceChildren.length; i++) {
+ DataType<XMLType> childType =
sourceOp.getWrapper().getUnwrappedInputType().getLogical().get(i);
+ target[i] =
+ mediator.mediate(sourceChildren[i], childType,
targetType.getLogical().get(i), context
+ .getMetadata());
+ }
return target;
} else {
- // Assuming wrapper to wrapper conversion can be handled here as
- // well
+ // Assuming wrapper to wrapper conversion can be handled here as
well
Object[] newArgs = new Object[source.length];
for (int i = 0; i < source.length; i++) {
- Object child = mediator.mediate(source[i],
sourceType.getLogical().get(i), targetType.getLogical()
- .get(i), context.getMetadata());
+ Object child =
+ mediator.mediate(source[i],
sourceType.getLogical().get(i), targetType.getLogical().get(i), context
+ .getMetadata());
newArgs[i] = child;
}
return newArgs;
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Output2OutputTransformer.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Output2OutputTransformer.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Output2OutputTransformer.java
(original)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/Output2OutputTransformer.java
Sun Sep 16 00:49:13 2007
@@ -30,7 +30,6 @@
import org.apache.tuscany.sca.databinding.impl.BaseTransformer;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
@@ -118,25 +117,45 @@
DataType<DataType> sourceType = context.getSourceDataType();
Operation sourceOp = context.getSourceOperation();
boolean sourceWrapped = sourceOp != null &&
sourceOp.isWrapperStyle();
+
WrapperHandler sourceWrapperHandler = null;
- if (sourceWrapped) {
- sourceWrapperHandler =
getWrapperHandler(getDataBinding(sourceOp), true);
- }
+ String sourceDataBinding = getDataBinding(sourceOp);
+ sourceWrapperHandler = getWrapperHandler(sourceDataBinding,
sourceWrapped);
DataType<DataType> targetType = context.getTargetDataType();
- Operation targetOp = context.getTargetOperation();
+ Operation targetOp = (Operation)context.getTargetOperation();
boolean targetWrapped = targetOp != null &&
targetOp.isWrapperStyle();
WrapperHandler targetWrapperHandler = null;
- if (targetWrapped) {
- targetWrapperHandler =
getWrapperHandler(getDataBinding(targetOp), true);
- }
+ String targetDataBinding = getDataBinding(targetOp);
+ targetWrapperHandler = getWrapperHandler(targetDataBinding,
targetWrapped);
if ((!sourceWrapped) && targetWrapped) {
// Unwrapped --> Wrapped
WrapperInfo wrapper = targetOp.getWrapper();
+ ElementInfo wrapperElement = wrapper.getOutputWrapperElement();
+ List<ElementInfo> childElements =
wrapper.getOutputChildElements();
+
+ // If the source can be wrapped, wrapped it first
+ if (sourceWrapperHandler != null) {
+ DataType sourceWrapperType =
+ sourceWrapperHandler.getWrapperType(wrapperElement,
childElements, context);
+ if (sourceWrapperType != null) {
+ Object sourceWrapper =
sourceWrapperHandler.create(wrapperElement, context);
+ if (sourceWrapper != null) {
+ if (!childElements.isEmpty()) {
+ // Set the return value
+ ElementInfo returnElement =
wrapper.getOutputChildElements().get(0);
+ sourceWrapperHandler.setChild(sourceWrapper,
0, returnElement, response);
+ }
+ Object targetWrapper =
+ mediator.mediate(sourceWrapper,
sourceWrapperType, targetType.getLogical(), context
+ .getMetadata());
+ return targetWrapper;
+ }
+ }
+ }
Object targetWrapper =
targetWrapperHandler.create(wrapper.getOutputWrapperElement(), context);
- List<ElementInfo> childElements =
wrapper.getOutputChildElements();
if (childElements.isEmpty()) {
// void output
return targetWrapper;
@@ -155,24 +174,25 @@
// The void output
return null;
}
- targetWrapperHandler =
getWrapperHandler(getDataBinding(targetOp), false);
if (targetWrapperHandler != null) {
ElementInfo wrapperElement =
sourceOp.getWrapper().getOutputWrapperElement();
- // Object targetWrapper =
- // targetWrapperHandler.create(wrapperElement, context);
-
- // use operation DB not output type DB
- DataType<XMLType> targetWrapperType = new
DataTypeImpl<XMLType>(getDataBinding(targetOp), Object.class, new
XMLType(wrapperElement));
- Object targetWrapper = mediator.mediate(sourceWrapper,
-
sourceType.getLogical(),
- targetWrapperType,
-
context.getMetadata());
- return
targetWrapperHandler.getChildren(targetWrapper).get(0);
- } else {
- Object child =
sourceWrapperHandler.getChildren(sourceWrapper).get(0);
- DataType<?> childType =
sourceOp.getWrapper().getUnwrappedOutputType();
- return mediator.mediate(child, childType,
targetType.getLogical(), context.getMetadata());
+
+ // FIXME: This is a workaround for the wsdless support as
it passes in child elements
+ // under the wrapper that only matches by position
+ if (sourceWrapperHandler.isInstance(sourceWrapper,
wrapperElement, childElements, context)) {
+ DataType targetWrapperType =
+
targetWrapperHandler.getWrapperType(wrapperElement, childElements, context);
+ if (targetWrapperType != null) {
+ Object targetWrapper =
+ mediator.mediate(sourceWrapper,
sourceType.getLogical(), targetWrapperType, context
+ .getMetadata());
+ return
targetWrapperHandler.getChildren(targetWrapper, childElements, context).get(0);
+ }
+ }
}
+ Object child = sourceWrapperHandler.getChildren(sourceWrapper,
childElements, context).get(0);
+ DataType<?> childType =
sourceOp.getWrapper().getUnwrappedOutputType();
+ return mediator.mediate(child, childType,
targetType.getLogical(), context.getMetadata());
} else {
// FIXME: Do we want to handle wrapped to wrapped?
return mediator.mediate(response, sourceType.getLogical(),
targetType.getLogical(), context
Modified:
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElementWrapperHandler.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElementWrapperHandler.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElementWrapperHandler.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding-axiom/src/main/java/org/apache/tuscany/sca/databinding/axiom/OMElementWrapperHandler.java
Sun Sep 16 00:49:13 2007
@@ -20,18 +20,25 @@
package org.apache.tuscany.sca.databinding.axiom;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.tuscany.sca.databinding.TransformationContext;
import org.apache.tuscany.sca.databinding.WrapperHandler;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
+import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
/**
* OMElement wrapper handler implementation
@@ -59,12 +66,75 @@
wrapper.addChild((OMElement)value);
}
- public List getChildren(OMElement wrapper) {
+ public List getChildren(OMElement wrapper, List<ElementInfo>
childElements, TransformationContext context) {
List<Object> elements = new ArrayList<Object>();
- for (Iterator i = wrapper.getChildElements(); i.hasNext();) {
- elements.add(i.next());
+ int i = 0;
+ for (ElementInfo e : childElements) {
+ elements.add(getChild(wrapper, e, i, context));
+ i++;
}
return elements;
}
+ /**
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#getWrapperType(org.apache.tuscany.sca.interfacedef.util.ElementInfo,
List, org.apache.tuscany.sca.databinding.TransformationContext)
+ */
+ public DataType getWrapperType(ElementInfo element, List<ElementInfo>
childElements, TransformationContext context) {
+ DataType<XMLType> wrapperType =
+ new DataTypeImpl<XMLType>(AxiomDataBinding.NAME, OMElement.class,
new XMLType(element));
+ return wrapperType;
+ }
+
+ public boolean isInstance(Object wrapperObj,
+ ElementInfo element,
+ List<ElementInfo> childElements,
+ TransformationContext context) {
+ OMElement wrapper = (OMElement)wrapperObj;
+ if (!element.getQName().equals(wrapper.getQName())) {
+ return false;
+ }
+ Set<QName> names = new HashSet<QName>();
+ for (ElementInfo e : childElements) {
+ names.add(e.getQName());
+ }
+ for (Iterator i = wrapper.getChildElements(); i.hasNext();) {
+ OMElement child = (OMElement)i.next();
+ if (!names.contains(child.getQName())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static final QName XSI_TYPE_QNAME = new
QName("http://www.w3.org/2001/XMLSchema-instance", "type", "xsi");
+
+ public Object getChild(OMElement wrapper, ElementInfo childElement, int
index, TransformationContext context) {
+ int pos = 0;
+ for (Iterator i = wrapper.getChildElements(); i.hasNext();) {
+ OMElement e = (OMElement)i.next();
+ if (pos == index) {
+ TypeInfo type = childElement.getType();
+ if (type != null) {
+ OMAttribute attr = e.getAttribute(XSI_TYPE_QNAME);
+ if (attr == null) {
+ OMNamespace ns =
+
e.getOMFactory().createOMNamespace(type.getQName().getNamespaceURI(),
"_typens_");
+ e.declareNamespace(ns);
+ OMNamespace xsiNS =
+
e.getOMFactory().createOMNamespace(XSI_TYPE_QNAME.getNamespaceURI(),
+
XSI_TYPE_QNAME.getPrefix());
+ e.declareNamespace(xsiNS);
+ attr =
+ e.getOMFactory().createOMAttribute("type",
+ xsiNS,
+ "_typens_:" +
type.getQName().getLocalPart());
+ e.addAttribute(attr);
+ }
+ }
+ return e;
+ }
+ pos++;
+ }
+ return null;
+ }
}
Modified:
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBWrapperHandler.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBWrapperHandler.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBWrapperHandler.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBWrapperHandler.java
Sun Sep 16 00:49:13 2007
@@ -32,7 +32,10 @@
import org.apache.tuscany.sca.databinding.TransformationContext;
import org.apache.tuscany.sca.databinding.TransformationException;
import org.apache.tuscany.sca.databinding.WrapperHandler;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
/**
* JAXB WrapperHandler implementation
@@ -100,9 +103,9 @@
}
/**
- * @see
org.apache.tuscany.sca.databinding.WrapperHandler#getChildren(java.lang.Object)
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#getChildren(java.lang.Object,
List, TransformationContext)
*/
- public List getChildren(JAXBElement<?> wrapper) {
+ public List getChildren(JAXBElement<?> wrapper, List<ElementInfo>
childElements, TransformationContext context) {
Object wrapperValue = wrapper.getValue();
Class<?> wrapperClass = wrapperValue.getClass();
@@ -121,4 +124,52 @@
return elements;
}
+ /**
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#getWrapperType(org.apache.tuscany.sca.interfacedef.util.ElementInfo,
List, org.apache.tuscany.sca.databinding.TransformationContext)
+ */
+ public DataType getWrapperType(ElementInfo element, List<ElementInfo>
childElements, TransformationContext context) {
+ try {
+ // FIXME: How do we map the global element to a factory?
+ String packageName = null;
+ String factoryClassName = packageName + ".ObjectFactory";
+ ClassLoader classLoader = context != null ?
context.getClassLoader() : null;
+ if (classLoader == null) {
+ //FIXME Understand why we need this, the classloader should be
passed in
+ classLoader = Thread.currentThread().getContextClassLoader();
+ }
+ Class<?> factoryClass = Class.forName(factoryClassName, true,
classLoader);
+ assert factoryClass.isAnnotationPresent(XmlRegistry.class);
+ QName elementName = element.getQName();
+ Method method = null;
+ for (Method m : factoryClass.getMethods()) {
+ XmlElementDecl xmlElement =
m.getAnnotation(XmlElementDecl.class);
+ QName name = new QName(xmlElement.namespace(),
xmlElement.name());
+ if (xmlElement != null && name.equals(elementName)) {
+ method = m;
+ break;
+ }
+ }
+ if (method != null) {
+ Class typeClass = method.getParameterTypes()[0];
+ DataType<XMLType> wrapperType =
+ new DataTypeImpl<XMLType>(JAXBDataBinding.NAME, typeClass,
new XMLType(element));
+ return wrapperType;
+ }
+
+ return null;
+ } catch (Throwable e) {
+ return null;
+ }
+ }
+
+ /**
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#isInstance(java.lang.Object,
org.apache.tuscany.sca.interfacedef.util.ElementInfo, java.util.List,
org.apache.tuscany.sca.databinding.TransformationContext)
+ */
+ public boolean isInstance(Object wrapper,
+ ElementInfo element,
+ List<ElementInfo> childElements,
+ TransformationContext context) {
+ // TODO: Implement the logic
+ return true;
+ }
}
Modified:
incubator/tuscany/java/sca/modules/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding-jaxb/src/test/java/org/apache/tuscany/databinding/jaxb/JAXBWrapperHandlerTestCase.java
Sun Sep 16 00:49:13 2007
@@ -63,7 +63,7 @@
PurchaseOrderType po = factory.createPurchaseOrderType();
po.setComment("Comment");
JAXBElement<PurchaseOrderType> wrapper =
factory.createPurchaseOrder(po);
- List children = handler.getChildren(wrapper);
+ List children = handler.getChildren(wrapper, null, null);
assertNotNull(children);
assertEquals(4, children.size());
assertEquals("Comment", children.get(2));
Modified:
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOContextHelper.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOContextHelper.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOContextHelper.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOContextHelper.java
Sun Sep 16 00:49:13 2007
@@ -28,6 +28,7 @@
import org.apache.tuscany.sca.databinding.TransformationContext;
import org.apache.tuscany.sca.databinding.TransformationException;
import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
import org.apache.tuscany.sdo.api.SDOUtil;
@@ -46,15 +47,36 @@
if (context == null) {
return getDefaultHelperContext();
}
- HelperContext helperContext = SDOUtil.createHelperContext();
- boolean found = register(helperContext, context.getTargetDataType());
- found = register(helperContext, context.getSourceDataType()) || found;
- if (found) {
+ HelperContext helperContext =
(HelperContext)context.getMetadata().get(HelperContext.class.getName());
+ if (helperContext != null) {
return helperContext;
+ }
+ helperContext = SDOUtil.createHelperContext();
+
+ boolean found = false;
+ Operation op = context.getSourceOperation();
+ if (op != null) {
+ found = register(helperContext, op.getInputType()) || found;
+ found = register(helperContext, op.getOutputType()) || found;
} else {
- return getDefaultHelperContext();
+ found = register(helperContext, context.getSourceDataType()) ||
found;
}
+
+ op = context.getTargetOperation();
+ if (op != null) {
+ found = register(helperContext, op.getInputType()) || found;
+ found = register(helperContext, op.getOutputType()) || found;
+ } else {
+ found = register(helperContext, context.getTargetDataType()) ||
found;
+ }
+
+ if (!found) {
+ helperContext = getDefaultHelperContext();
+ }
+
+ context.getMetadata().put(HelperContext.class.getName(),
helperContext);
+ return helperContext;
}
Modified:
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandler.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandler.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandler.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding-sdo/src/main/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandler.java
Sun Sep 16 00:49:13 2007
@@ -27,8 +27,11 @@
import org.apache.tuscany.sca.databinding.TransformationContext;
import org.apache.tuscany.sca.databinding.WrapperHandler;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
@@ -50,23 +53,12 @@
public Object create(ElementInfo element, TransformationContext context) {
DataObject wrapper = null;
HelperContext helperContext =
SDOContextHelper.getHelperContext(context);
- DataFactory dataFactory = helperContext.getDataFactory();
- XSDHelper xsdHelper = helperContext.getXSDHelper();
- Property prop =
- xsdHelper.getGlobalProperty(element.getQName().getNamespaceURI(),
element.getQName().getLocalPart(), true);
- if (prop != null) {
- wrapper = dataFactory.create(prop.getType());
- } else {
- TypeInfo type = element.getType();
- QName typeName = type != null ? type.getQName() : null;
- if (typeName != null) {
- wrapper = dataFactory.create(typeName.getNamespaceURI(),
typeName.getLocalPart());
- }
+ Type sdoType = getSDOType(helperContext, element);
+ if (sdoType != null) {
+ DataFactory dataFactory = helperContext.getDataFactory();
+ return dataFactory.create(sdoType);
}
- return wrapper;
-// XMLHelper xmlHelper = helperContext.getXMLHelper();
-// return xmlHelper.createDocument(wrapper,
element.getQName().getNamespaceURI(), element.getQName()
-// .getLocalPart());
+ return null;
}
/**
@@ -80,7 +72,7 @@
}
@SuppressWarnings("unchecked")
- public List getChildren(Object wrapper) {
+ public List getChildren(Object wrapper, List<ElementInfo> childElements,
TransformationContext context) {
DataObject wrapperDO =
(wrapper instanceof XMLDocument) ?
((XMLDocument)wrapper).getRootObject() : (DataObject)wrapper;
List<Property> properties = wrapperDO.getInstanceProperties();
@@ -108,5 +100,69 @@
}
}
return elements;
+ }
+
+ /**
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#getWrapperType(org.apache.tuscany.sca.interfacedef.util.ElementInfo,
List, org.apache.tuscany.sca.databinding.TransformationContext)
+ */
+ public DataType getWrapperType(ElementInfo element, List<ElementInfo>
childElements, TransformationContext context) {
+ // FIXME: [rfeng] Temporarily disable the wrapping support for SDO to
work around a few issues
+ // in the WSDL-less story
+ if (true) {
+ return null;
+ }
+ HelperContext helperContext =
SDOContextHelper.getHelperContext(context);
+ Type sdoType = getSDOType(helperContext, element);
+ if (sdoType != null) {
+ // Check if child elements matches
+ for (ElementInfo child : childElements) {
+ if (sdoType.getProperty(child.getQName().getLocalPart()) ==
null) {
+ return null;
+ }
+ }
+ Class physical = sdoType.getInstanceClass();
+ DataType<XMLType> wrapperType =
+ new DataTypeImpl<XMLType>(SDODataBinding.NAME, physical, new
XMLType(element));
+ return wrapperType;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @param helperContext
+ * @param element
+ * @return
+ */
+ private Type getSDOType(HelperContext helperContext, ElementInfo element) {
+ XSDHelper xsdHelper = helperContext.getXSDHelper();
+ Type sdoType = null;
+ Property prop =
+ xsdHelper.getGlobalProperty(element.getQName().getNamespaceURI(),
element.getQName().getLocalPart(), true);
+ if (prop != null) {
+ sdoType = prop.getType();
+ } else {
+ TypeInfo type = element.getType();
+ QName typeName = type != null ? type.getQName() : null;
+ if (typeName != null) {
+ sdoType =
helperContext.getTypeHelper().getType(typeName.getNamespaceURI(),
typeName.getLocalPart());
+ }
+ }
+ return sdoType;
+ }
+
+ /**
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#isInstance(java.lang.Object,
org.apache.tuscany.sca.interfacedef.util.ElementInfo, java.util.List,
org.apache.tuscany.sca.databinding.TransformationContext)
+ */
+ public boolean isInstance(Object wrapper,
+ ElementInfo element,
+ List<ElementInfo> childElements,
+ TransformationContext context) {
+ HelperContext helperContext =
SDOContextHelper.getHelperContext(context);
+ Type sdoType = getSDOType(helperContext, element);
+ if (sdoType != null) {
+ return sdoType.isInstance(wrapper);
+ }
+ return false;
}
}
Modified:
incubator/tuscany/java/sca/modules/databinding-sdo/src/test/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandlerTestCase.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-sdo/src/test/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandlerTestCase.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding-sdo/src/test/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandlerTestCase.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding-sdo/src/test/java/org/apache/tuscany/sca/databinding/sdo/SDOWrapperHandlerTestCase.java
Sun Sep 16 00:49:13 2007
@@ -50,7 +50,7 @@
public void testWrapperAnyType() throws Exception {
XMLHelper xmlHelper = context.getXMLHelper();
XMLDocument document =
xmlHelper.load(getClass().getResourceAsStream("/wrapper.xml"));
- List children = handler.getChildren(document);
+ List children = handler.getChildren(document, null, null);
assertEquals(5, children.size());
}
@@ -59,7 +59,7 @@
xsdHelper.define(getClass().getResourceAsStream("/wrapper.xsd"), null);
XMLHelper xmlHelper = context.getXMLHelper();
XMLDocument document =
xmlHelper.load(getClass().getResourceAsStream("/wrapper.xml"));
- List children = handler.getChildren(document);
+ List children = handler.getChildren(document, null, null);
assertEquals(5, children.size());
}
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/WrapperHandler.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/WrapperHandler.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/WrapperHandler.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/WrapperHandler.java
Sun Sep 16 00:49:13 2007
@@ -21,6 +21,7 @@
import java.util.List;
+import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
/**
@@ -37,6 +38,28 @@
T create(ElementInfo element, TransformationContext context);
/**
+ * Get the data type for the wrapper
+ * @param element The wrapper element
+ * @param childElements A list of child elements
+ * @param context The transformation context
+ * @return The data type of the wrapper, null if it's not a wrapper type
+ */
+ DataType getWrapperType(ElementInfo element, List<ElementInfo>
childElements, TransformationContext context);
+
+ /**
+ * Check if the given data is an instance of the wrapper
+ * @param wrapper
+ * @param element
+ * @param childElements
+ * @param context
+ * @return
+ */
+ boolean isInstance(Object wrapper,
+ ElementInfo element,
+ List<ElementInfo> childElements,
+ TransformationContext context);
+
+ /**
* Set child element for the wrapper
*
* @param wrapper The wrapper
@@ -49,7 +72,11 @@
/**
* Get a list of child elements from the wrapper
* @param wrapper
+ * @param childElements
+ * @param context
* @return child elements under the wrapper
*/
- List getChildren(T wrapper);
+ List getChildren(T wrapper, List<ElementInfo> childElements,
TransformationContext context);
+
+ // Object getChild(T wrapper, ElementInfo childElement,
TransformationContext context);
}
Modified:
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMWrapperHandler.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMWrapperHandler.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMWrapperHandler.java
(original)
+++
incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMWrapperHandler.java
Sun Sep 16 00:49:13 2007
@@ -20,7 +20,9 @@
package org.apache.tuscany.sca.databinding.xml;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
@@ -29,7 +31,10 @@
import org.apache.tuscany.sca.databinding.TransformationException;
import org.apache.tuscany.sca.databinding.WrapperHandler;
import org.apache.tuscany.sca.databinding.impl.DOMHelper;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.util.ElementInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -58,7 +63,7 @@
wrapper.appendChild(wrapper.getOwnerDocument().importNode(node, true));
}
- public List getChildren(Node wrapper) {
+ public List getChildren(Node wrapper, List<ElementInfo> childElements,
TransformationContext context) {
assert wrapper != null;
if (wrapper.getNodeType() == Node.DOCUMENT_NODE) {
wrapper = ((Document)wrapper).getDocumentElement();
@@ -73,4 +78,43 @@
}
return elements;
}
+
+ /**
+ * @see
org.apache.tuscany.sca.databinding.WrapperHandler#getWrapperType(org.apache.tuscany.sca.interfacedef.util.ElementInfo,
List, org.apache.tuscany.sca.databinding.TransformationContext)
+ */
+ public DataType getWrapperType(ElementInfo element, List<ElementInfo>
childElements, TransformationContext context) {
+ DataType<XMLType> wrapperType =
+ new DataTypeImpl<XMLType>(DOMDataBinding.NAME, Node.class, new
XMLType(element));
+ return wrapperType;
+ }
+
+ public boolean isInstance(Object wrapperObj,
+ ElementInfo element,
+ List<ElementInfo> childElements,
+ TransformationContext context) {
+ Node wrapper = (Node)wrapperObj;
+ if (wrapper.getNodeType() == Node.DOCUMENT_NODE) {
+ wrapper = ((Document)wrapper).getDocumentElement();
+ }
+ QName elementName = new QName(wrapper.getNamespaceURI(),
wrapper.getLocalName());
+ if (!element.getQName().equals(elementName)) {
+ return false;
+ }
+ Set<QName> names = new HashSet<QName>();
+ for (ElementInfo e : childElements) {
+ names.add(e.getQName());
+ }
+ NodeList nodes = wrapper.getChildNodes();
+ for (int j = 0; j < nodes.getLength(); j++) {
+ Node node = nodes.item(j);
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ elementName = new QName(wrapper.getNamespaceURI(),
wrapper.getLocalName());
+ if (!names.contains(elementName)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
}
Modified:
incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java?rev=576058&r1=576057&r2=576058&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
(original)
+++
incubator/tuscany/java/sca/modules/interface-wsdl-xml/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
Sun Sep 16 00:49:13 2007
@@ -48,7 +48,11 @@
import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
import org.apache.ws.commons.schema.XmlSchemaCollection;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
import org.xml.sax.InputSource;
/**
@@ -59,20 +63,20 @@
public class WSDLModelResolver implements ModelResolver {
private Contribution contribution;
private Map<String, List<WSDLDefinition>> map = new HashMap<String,
List<WSDLDefinition>>();
-
+
private ExtensionRegistry wsdlExtensionRegistry;
-
+
private WSDLFactory wsdlFactory;
private javax.wsdl.factory.WSDLFactory wsdl4jFactory;
private ContributionFactory contributionFactory;
public WSDLModelResolver(Contribution contribution,
ModelFactoryExtensionPoint modelFactories) {
this.contribution = contribution;
-
+
this.wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
this.wsdl4jFactory =
modelFactories.getFactory(javax.wsdl.factory.WSDLFactory.class);
this.contributionFactory =
modelFactories.getFactory(ContributionFactory.class);
-
+
wsdlExtensionRegistry =
this.wsdl4jFactory.newPopulatedExtensionRegistry();
}
@@ -122,10 +126,11 @@
DeployedArtifact proxyArtifact =
contributionFactory.createDeployedArtifact();
proxyArtifact.setURI(uri);
-
+
//use contribution resolution (this supports import/export)
- DeployedArtifact importedArtifact =
contribution.getModelResolver().resolveModel(DeployedArtifact.class,
proxyArtifact);
- if(importedArtifact.getLocation() != null) {
+ DeployedArtifact importedArtifact =
+
contribution.getModelResolver().resolveModel(DeployedArtifact.class,
proxyArtifact);
+ if (importedArtifact.getLocation() != null) {
//get the artifact URL
url = new URL(importedArtifact.getLocation());
}
@@ -300,11 +305,33 @@
Types types = definition.getTypes();
if (types != null) {
schemaCollection.setSchemaResolver(new
XSDModelResolver.URIResolverImpl(contribution));
+ int index = 0;
for (Object ext : types.getExtensibilityElements()) {
if (ext instanceof Schema) {
Element element = ((Schema)ext).getElement();
-
schemaCollection.setBaseUri(((Schema)ext).getDocumentBaseURI());
- schemaCollection.read(element, element.getBaseURI());
+ Document doc = (Document)
element.getOwnerDocument().cloneNode(false);
+ Element schema = (Element)doc.importNode(element, true);
+ doc.appendChild(schema);
+ Node parent = element.getParentNode();
+ while (parent instanceof Element) {
+ Element root = (Element)parent;
+ NamedNodeMap nodeMap = root.getAttributes();
+ for (int i = 0; i < nodeMap.getLength(); i++) {
+ Attr attr = (Attr)nodeMap.item(i);
+ String name = attr.getName();
+ if ("xmlns".equals(name) ||
name.startsWith("xmlns:")) {
+ if (schema.getAttributeNode(name) == null) {
+
schema.setAttributeNodeNS((Attr)doc.importNode(attr, true));
+ }
+ }
+ }
+ parent = parent.getParentNode();
+ }
+ String baseURI = ((Schema)ext).getDocumentBaseURI();
+ doc.setDocumentURI(baseURI);
+ schemaCollection.setBaseUri(baseURI);
+ schemaCollection.read(doc, baseURI + "#" + index, null);
+ index++;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]