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]

Reply via email to