Author: rfeng
Date: Tue Nov 28 14:36:05 2006
New Revision: 480258

URL: http://svn.apache.org/viewvc?view=rev&rev=480258
Log:
Add clone support for ServiceContract/Operation/DataType
Refactor the operation from DataType.metadata to a field

Modified:
    
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingInteceptor.java
    
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java
    
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java
    
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java
    
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java
    
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java
    
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java
    
incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java
    
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
    
incubator/tuscany/java/sca/services/idl/wsdl/src/main/java/org/apache/tuscany/idl/wsdl/WSDLOperation.java

Modified: 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingInteceptor.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingInteceptor.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingInteceptor.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/DataBindingInteceptor.java
 Tue Nov 28 14:36:05 2006
@@ -79,12 +79,10 @@
             DataType<DataType> targetType =
                 new DataType<DataType>("idl:output", Object.class, 
targetOperation.getOutputType());
 
-            targetType.setMetadata(Operation.class.getName(), 
targetOperation.getOutputType().getMetadata(
-                Operation.class.getName()));
+            
targetType.setOperation(targetOperation.getOutputType().getOperation());
             DataType<DataType> sourceType =
                 new DataType<DataType>("idl:output", Object.class, 
sourceOperation.getOutputType());
-            sourceType.setMetadata(Operation.class.getName(), 
sourceOperation.getOutputType().getMetadata(
-                Operation.class.getName()));
+            
sourceType.setOperation(sourceOperation.getOutputType().getOperation());
 
             result = transform(result, targetType, sourceType);
             resultMsg.setBody(result);

Modified: 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Input2InputTransformer.java
 Tue Nov 28 14:36:05 2006
@@ -109,7 +109,7 @@
     @SuppressWarnings("unchecked")
     public Object[] transform(Object[] source, TransformationContext context) {
         DataType<List<DataType<?>>> sourceType = context.getSourceDataType();
-        Operation<?> sourceOp = 
(Operation<?>)sourceType.getMetadata(Operation.class.getName());
+        Operation<?> sourceOp = (Operation<?>)sourceType.getOperation();
         boolean sourceWrapped = sourceOp != null && sourceOp.isWrapperStyle();
 
         WrapperHandler sourceWrapperHandler = null;
@@ -118,7 +118,7 @@
         }
 
         DataType<List<DataType<QName>>> targetType = 
context.getTargetDataType();
-        Operation<?> targetOp = 
(Operation<?>)targetType.getMetadata(Operation.class.getName());
+        Operation<?> targetOp = (Operation<?>)targetType.getOperation();
         boolean targetWrapped = targetOp != null && targetOp.isWrapperStyle();
         WrapperHandler targetWrapperHandler = null;
         if (targetWrapped) {

Modified: 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/impl/Output2OutputTransformer.java
 Tue Nov 28 14:36:05 2006
@@ -129,7 +129,7 @@
     public Object transform(Object response, TransformationContext context) {
         try {
             DataType<DataType> sourceType = context.getSourceDataType();
-            Operation<?> sourceOp = 
(Operation<?>)sourceType.getMetadata(Operation.class.getName());
+            Operation<?> sourceOp = (Operation<?>)sourceType.getOperation();
             boolean sourceWrapped = sourceOp != null && 
sourceOp.isWrapperStyle();
             WrapperHandler sourceWrapperHandler = null;
             if (sourceWrapped) {
@@ -137,7 +137,7 @@
             }
 
             DataType<DataType> targetType = context.getTargetDataType();
-            Operation<?> targetOp = 
(Operation<?>)targetType.getMetadata(Operation.class.getName());
+            Operation<?> targetOp = (Operation<?>)targetType.getOperation();
             boolean targetWrapped = targetOp != null && 
targetOp.isWrapperStyle();
             WrapperHandler targetWrapperHandler = null;
             if (targetWrapped) {

Modified: 
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/impl/IDLTransformerTestCase.java
 Tue Nov 28 14:36:05 2006
@@ -72,8 +72,6 @@
             + "  </items>"
             + "</order1>";
 
-    private static final String OPERATION_KEY = 
org.apache.tuscany.spi.model.Operation.class.getName();
-
     private static final String URI_ORDER_XSD = "http://example.com/order.xsd";;
 
     /**
@@ -113,7 +111,7 @@
                                                               null);
         op.setDataBinding(DOMDataBinding.NAME);
 
-        inputType0.setMetadata(OPERATION_KEY, op);
+        inputType0.setOperation(op);
         op.setWrapperStyle(true);
         ElementInfo inputElement =
             new ElementInfo(new QName(URI_ORDER_XSD, "checkOrderStatus"), new 
TypeInfo(null, false, null));
@@ -131,9 +129,9 @@
         orderType.setMetadata(ElementInfo.class.getName(), order);
         flagType.setMetadata(ElementInfo.class.getName(), flag);
 
-        customerIdType.setMetadata(OPERATION_KEY, op);
-        orderType.setMetadata(OPERATION_KEY, op);
-        flagType.setMetadata(OPERATION_KEY, op);
+        customerIdType.setOperation(op);
+        orderType.setOperation(op);
+        flagType.setOperation(op);
 
         List<ElementInfo> inputElements = new ArrayList<ElementInfo>();
         inputElements.add(customerId);
@@ -144,7 +142,7 @@
             new ElementInfo(new QName("", "status"), 
SimpleTypeMapperExtension.XSD_SIMPLE_TYPES.get("string"));
 
         statusType.setMetadata(ElementInfo.class.getName(), statusElement);
-        statusType.setMetadata(OPERATION_KEY, op);
+        statusType.setOperation(op);
 
         List<ElementInfo> outputElements = new ArrayList<ElementInfo>();
         outputElements.add(statusElement);
@@ -154,7 +152,7 @@
                                                                                
                null));
 
         responseType.setMetadata(ElementInfo.class.getName(), inputElement);
-        responseType.setMetadata(OPERATION_KEY, op);
+        responseType.setOperation(op);
 
         WrapperInfo wrapperInfo =
             new WrapperInfo(inputElement, outputElement, inputElements, 
outputElements, inputType, statusType);
@@ -196,7 +194,7 @@
         TransformationContext context1 = new TransformationContextImpl();
         DataType<DataType> sourceType =
             new DataType<DataType>("idl:output", Object.class, 
op.getOutputType());
-        sourceType.setMetadata(OPERATION_KEY, 
op.getOutputType().getMetadata(OPERATION_KEY));
+        sourceType.setOperation(op.getOutputType().getOperation());
 
         context1.setSourceDataType(sourceType);
         DataType<DataType> targetType =

Modified: 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java
 Tue Nov 28 14:36:05 2006
@@ -34,14 +34,16 @@
  *
  * @version $Rev$ $Date$
  */
-public class DataType<L> extends ModelObject {
+public class DataType<L> extends ModelObject implements Cloneable {
     private String dataBinding = Object.class.getName();
 
     private final Type physical;
 
     private final L logical;
 
-    private final Map<String, Object> metadata = new HashMap<String, Object>();
+    private HashMap<String, Object> metadata = new HashMap<String, Object>();
+    
+    private Operation operation;
 
     /**
      * Construct a data type specifying the physical and logical types.
@@ -122,7 +124,7 @@
     public String getDataBinding() {
         if (dataBinding == null) {
             // databinding is not set at the DataType level, check the 
operation
-            Operation<?> operation = (Operation<?>) 
getMetadata(Operation.class.getName());
+            Operation<?> operation = (Operation<?>) getOperation();
             if (operation != null) {
                 return operation.getDataBinding();
             }
@@ -218,6 +220,22 @@
         StringBuffer sb = new StringBuffer();
         sb.append(physical).append(" ").append(dataBinding).append(" 
").append(logical);
         return sb.toString();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected Object clone() throws CloneNotSupportedException {
+        DataType<L> copy = (DataType<L>)super.clone();
+        copy.metadata = (HashMap<String, Object>)this.metadata.clone();
+        return copy;
+    }
+
+    public Operation getOperation() {
+        return operation;
+    }
+
+    public void setOperation(Operation operation) {
+        this.operation = operation;
     }
 
 }

Modified: 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java
 Tue Nov 28 14:36:05 2006
@@ -18,6 +18,7 @@
  */
 package org.apache.tuscany.spi.model;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -31,13 +32,12 @@
  *
  * @version $Rev$ $Date$
  */
-public class Operation<T> {
+public class Operation<T> extends ModelObject implements Cloneable {
     public static final int NO_CONVERSATION = -1;
     public static final int CONVERSATION_CONTINUE = 1;
     public static final int CONVERSATION_END = 2;
 
-    private static final String NAME = Operation.class.getName();
-    protected Map<String, Object> metaData;
+    protected HashMap<String, Object> metaData;
     private final String name;
     private ServiceContract<T> contract;
     private final DataType<T> outputType;
@@ -94,12 +94,13 @@
         this.dataBinding = dataBinding;
         this.conversationSequence = sequence;
         // Register the operation with the types
+        this.inputType.setOperation(this);
         for (DataType<?> d : this.inputType.getLogical()) {
-            d.setMetadata(NAME, this);
+            d.setOperation(this);
         }
-        this.outputType.setMetadata(NAME, this);
+        this.outputType.setOperation(this);
         for (DataType<?> d : this.faultTypes) {
-            d.setMetadata(NAME, this);
+            d.setOperation(this);
         }
     }
 
@@ -363,6 +364,39 @@
      */
     public void setWrapperStyle(boolean wrapperStyle) {
         this.wrapperStyle = wrapperStyle;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected Object clone() throws CloneNotSupportedException {
+        final List<DataType<T>> clonedFaultTypes = new 
ArrayList<DataType<T>>(this.faultTypes.size());
+        for (DataType<T> t : this.faultTypes) {
+            clonedFaultTypes.add((DataType<T>)t.clone());
+        }
+
+        List<DataType<T>> clonedTypes = new ArrayList<DataType<T>>();
+        for (DataType<T> t : inputType.getLogical()) {
+            DataType<T> type = (DataType<T>)t.clone();
+            clonedTypes.add(type);
+        }
+
+        DataType<List<DataType<T>>> clonedInputType =
+            new DataType<List<DataType<T>>>(inputType.getPhysical(), 
clonedTypes);
+        clonedInputType.setDataBinding(inputType.getDataBinding());
+
+        Operation<T> copy =
+            new Operation<T>(name, clonedInputType, 
(DataType<T>)outputType.clone(), clonedFaultTypes, nonBlocking,
+                             dataBinding, conversationSequence);
+
+        copy.callback = this.callback;
+        copy.contract = this.contract;
+        copy.wrapper = this.wrapper;
+        copy.wrapperStyle = this.wrapperStyle;
+
+        if (this.metaData != null) {
+            copy.metaData = (HashMap)this.metaData.clone();
+        }
+        return copy;
     }
 
 

Modified: 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java
 Tue Nov 28 14:36:05 2006
@@ -27,7 +27,7 @@
  *
  * @version $Rev$ $Date$
  */
-public abstract class ServiceContract<T> extends ModelObject {
+public abstract class ServiceContract<T> extends ModelObject implements 
Cloneable {
     protected InteractionScope interactionScope;
     protected boolean remotable;
     protected Class<?> interfaceClass;
@@ -37,7 +37,7 @@
     protected Map<String, Operation<T>> operations;
     protected Map<String, Operation<T>> callbackOperations;
     protected String dataBinding;
-    protected Map<String, Object> metaData;
+    protected HashMap<String, Object> metaData;
 
     protected ServiceContract() {
     }
@@ -242,5 +242,33 @@
             return super.toString();
         }
 
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected Object clone() throws CloneNotSupportedException {
+        ServiceContract<T> copy = (ServiceContract<T>)super.clone();
+
+        if (operations != null) {
+            Map<String, Operation<T>> clonedOperations = new HashMap<String, 
Operation<T>>();
+            for (Operation<T> o : operations.values()) {
+                clonedOperations.put(o.getName(), o);
+            }
+            copy.setOperations(clonedOperations);
+        }
+
+        if (callbackOperations != null) {
+            Map<String, Operation<T>> clonedCallbackOperations = new 
HashMap<String, Operation<T>>();
+            for (Operation<T> o : callbackOperations.values()) {
+                clonedCallbackOperations.put(o.getName(), 
(Operation<T>)o.clone());
+            }
+            copy.setCallbackOperations(clonedCallbackOperations);
+        }
+        
+        if (this.metaData != null) {
+            copy.metaData = (HashMap)this.metaData.clone();
+        }
+        
+        return copy;
     }
 }

Modified: 
incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java
 (original)
+++ 
incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java
 Tue Nov 28 14:36:05 2006
@@ -51,6 +51,23 @@
         assertEquals(contract, operation.getServiceContract());
         assertTrue(operation.isCallback());
     }
+    
+    @SuppressWarnings("unchecked")
+    public void testClone() throws Exception {
+        ServiceContract<Type> contract = new TestContract();
+        Operation<Type> operation = new Operation<Type>("foo", null, null, 
null, false, null, NO_CONVERSATION);
+        Map<String, Operation<Type>> ops = new HashMap<String, 
Operation<Type>>();
+        ops.put("foo", operation);
+        contract.setOperations(ops);        
+
+        operation = new Operation<Type>("bar", null, null, null, false, null, 
NO_CONVERSATION);
+        Map<String, Operation<Type>> callbackOps = new HashMap<String, 
Operation<Type>>();
+        ops.put("bar", operation);
+        contract.setCallbackOperations(callbackOps);
+        
+        ServiceContract<Type> copy = (ServiceContract<Type>) contract.clone();
+        assertEquals(contract, copy);
+    }
 
 
     private class TestContract extends ServiceContract<Type> {

Modified: 
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
 (original)
+++ 
incubator/tuscany/java/sca/services/databinding/databinding-jaxb/src/main/java/org/apache/tuscany/databinding/jaxb/JAXBContextHelper.java
 Tue Nov 28 14:36:05 2006
@@ -51,7 +51,7 @@
         DataType<?> bindingContext = source ? tContext.getSourceDataType() : 
tContext.getTargetDataType();
         String contextPath = 
(String)bindingContext.getMetadata(JAXB_CONTEXT_PATH);
         if (contextPath == null) {
-            Operation op = 
(Operation)bindingContext.getMetadata(Operation.class.getName());
+            Operation op = (Operation)bindingContext.getOperation();
             contextPath = op != null ? 
(String)op.getMetaData().get(JAXB_CONTEXT_PATH) : null;
         }
         JAXBContext context = null;

Modified: 
incubator/tuscany/java/sca/services/idl/wsdl/src/main/java/org/apache/tuscany/idl/wsdl/WSDLOperation.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/idl/wsdl/src/main/java/org/apache/tuscany/idl/wsdl/WSDLOperation.java?view=diff&rev=480258&r1=480257&r2=480258
==============================================================================
--- 
incubator/tuscany/java/sca/services/idl/wsdl/src/main/java/org/apache/tuscany/idl/wsdl/WSDLOperation.java
 (original)
+++ 
incubator/tuscany/java/sca/services/idl/wsdl/src/main/java/org/apache/tuscany/idl/wsdl/WSDLOperation.java
 Tue Nov 28 14:36:05 2006
@@ -50,7 +50,6 @@
  * Metadata for a WSDL operation
  */
 public class WSDLOperation {
-    private static final String OPERATION_KEY = 
org.apache.tuscany.spi.model.Operation.class.getName();
 
     protected XMLSchemaRegistry schemaRegistry;
 
@@ -199,16 +198,16 @@
                 operationModel.setWrapper(getWrapper().getWrapperInfo());
                 // Register the operation with the types
                 for (DataType<?> d : 
wrapper.getUnwrappedInputType().getLogical()) {
-                    d.setMetadata(OPERATION_KEY, operationModel);
+                    d.setOperation(operationModel);
                 }
                 if (wrapper.getUnwrappedOutputType() != null) {
-                    
wrapper.getUnwrappedOutputType().setMetadata(OPERATION_KEY, operationModel);
+                    
wrapper.getUnwrappedOutputType().setOperation(operationModel);
                 }
             }
         }
-        inputType.setMetadata(OPERATION_KEY, operationModel);
+        inputType.setOperation(operationModel);
         if (outputType != null) {
-            outputType.setMetadata(OPERATION_KEY, operationModel);
+            outputType.setOperation(operationModel);
         }
         return operationModel;
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to