You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sc...@apache.org on 2008/07/22 20:20:31 UTC

svn commit: r678844 - in /tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire: DataTransformationInterceptor.java FaultTransformHelper.java

Author: scottkurz
Date: Tue Jul 22 11:20:31 2008
New Revision: 678844

URL: http://svn.apache.org/viewvc?rev=678844&view=rev
Log:
Undoing change committed to 1.3 branch by mistake

Removed:
    tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/FaultTransformHelper.java
Modified:
    tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java

Modified: tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java?rev=678844&r1=678843&r2=678844&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java (original)
+++ tuscany/branches/sca-java-1.3/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java Tue Jul 22 11:20:31 2008
@@ -54,7 +54,6 @@
     private RuntimeWire wire;
     private Mediator mediator;
     private FaultExceptionMapper faultExceptionMapper;
-    private FaultTransformHelper faultTransformHelper;
 
     public DataTransformationInterceptor(RuntimeWire wire,
                                          Operation sourceOperation,
@@ -67,7 +66,6 @@
         this.mediator = mediator;
         this.wire = wire;
         this.faultExceptionMapper = faultExceptionMapper;
-        this.faultTransformHelper = new FaultTransformHelper(mediator);
     }
 
     public Invoker getNext() {
@@ -93,20 +91,86 @@
             new DataTypeImpl<DataType>(DataBinding.IDL_OUTPUT, Object.class, sourceOperation.getOutputType());
 
         if (resultMsg.isFault()) {
-            Object transformedFault = null;
+
+            // FIXME: We need to figure out what fault type it is and then
+            // transform it
+            // back the source fault type
+            // throw new InvocationRuntimeException((Throwable) result);
+
             if ((result instanceof Exception) && !(result instanceof RuntimeException)) {
-                transformedFault = faultTransformHelper.transformFault(result, sourceOperation, targetOperation, wire);
-            } 
-            // Otherwise, we leave it to another layer to actually throw the RuntimeException which constitutes
-            // the message body.  We don't throw it here.
-            if (transformedFault != result) {
-                resultMsg.setFaultBody(transformedFault);
+                // FIXME: How to match fault data to a fault type for the
+                // operation?
+
+                // If the result is from an InvocationTargetException look at
+                // the actual cause.
+                if (result instanceof InvocationTargetException) {
+                    result = ((InvocationTargetException)result).getCause();
+                }
+                DataType targetDataType = null;
+                for (DataType exType : targetOperation.getFaultTypes()) {
+                    if (((Class)exType.getPhysical()).isInstance(result)) {
+                        if (result instanceof FaultException) {
+                            DataType faultType = (DataType)exType.getLogical();
+                            if (((FaultException)result).isMatchingType(faultType.getLogical())) {
+                                targetDataType = exType;
+                                break;
+                            }
+                        } else {
+                            targetDataType = exType;
+                            break;
+                        }
+                    }
+                }
+
+                /*
+                if (targetDataType == null) {
+                    // Not a business exception
+                    return resultMsg;
+                }
+                */
+
+                DataType targetFaultType = getFaultType(targetDataType);
+                if (targetFaultType == null) {
+                    // No matching fault type, it's a system exception
+                    Throwable cause = (Throwable) result;
+                    throw new ServiceRuntimeException(cause);
+                }
+
+                // FIXME: How to match a source fault type to a target fault
+                // type?
+                DataType sourceDataType = null;
+                DataType sourceFaultType = null;
+                for (DataType exType : sourceOperation.getFaultTypes()) {
+                    DataType faultType = getFaultType(exType);
+                    // Match by the QName (XSD element) of the fault type
+                    if (faultType != null && typesMatch(targetFaultType.getLogical(), faultType.getLogical())) {
+                        sourceDataType = exType;
+                        sourceFaultType = faultType;
+                        break;
+                    }
+                }
+
+                if (sourceFaultType == null) {
+                    // No matching fault type, it's a system exception
+                    Throwable cause = (Throwable) result;
+                    throw new ServiceRuntimeException(cause);
+                }
+
+                Object newResult =
+                    transformException(result, targetDataType, sourceDataType, targetFaultType, sourceFaultType);
+                if (newResult != result) {
+                    resultMsg.setFaultBody(newResult);
+                }
             }
+
         } else {
             assert !(result instanceof Throwable) : "Expected messages that are not throwable " + result;
+
             Object newResult = transform(result, targetType, sourceType, true);
-            resultMsg.setBody(newResult);
-        }        
+            if (newResult != result) {
+                resultMsg.setBody(newResult);
+            }
+        }
 
         return resultMsg;
     }
@@ -122,6 +186,73 @@
         return mediator.mediate(source, sourceType, targetType, metadata);
     }
 
+    private DataType getFaultType(DataType exceptionType) {
+        return exceptionType == null ? null : (DataType)exceptionType.getLogical();
+    }
+
+    private boolean typesMatch(Object first, Object second) {
+        if (first.equals(second)) {
+            return true;
+        }
+        if (first instanceof XMLType && second instanceof XMLType) {
+            XMLType t1 = (XMLType)first;
+            XMLType t2 = (XMLType)second;
+            // TUSCANY-2113, we should compare element names only
+            return matches(t1.getElementName(), t2.getElementName());
+        }
+        return false;
+    }
+
+    /**
+     * @param qn1
+     * @param qn2
+     */
+    private boolean matches(QName qn1, QName qn2) {
+        if (qn1 == qn2) {
+            return true;
+        }
+        if (qn1 == null || qn2 == null) {
+            return false;
+        }
+        String ns1 = qn1.getNamespaceURI();
+        String ns2 = qn2.getNamespaceURI();
+        String e1 = qn1.getLocalPart();
+        String e2 = qn2.getLocalPart();
+        if (e1.equals(e2) && (ns1.equals(ns2) || ns1.equals(ns2 + "/") || ns2.equals(ns1 + "/"))) {
+            // Tolerating the trailing / which is required by JAX-WS java package --> xml ns mapping
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @param source The source exception
+     * @param sourceExType The data type for the source exception
+     * @param targetExType The data type for the target exception
+     * @param sourceType The fault type for the source
+     * @param targetType The fault type for the target
+     * @return
+     */
+    private Object transformException(Object source,
+                                      DataType sourceExType,
+                                      DataType targetExType,
+                                      DataType sourceType,
+                                      DataType targetType) {
+        if (sourceType == targetType || (sourceType != null && sourceType.equals(targetType))) {
+            return source;
+        }
+        Map<String, Object> metadata = new HashMap<String, Object>();
+        metadata.put("source.operation", targetOperation);
+        metadata.put("target.operation", sourceOperation);
+        metadata.put("wire", wire);
+        DataType<DataType> eSourceDataType =
+            new DataTypeImpl<DataType>("idl:fault", sourceExType.getPhysical(), sourceType);
+        DataType<DataType> eTargetDataType =
+            new DataTypeImpl<DataType>("idl:fault", targetExType.getPhysical(), targetType);
+
+        return mediator.mediate(source, eSourceDataType, eTargetDataType, metadata);
+    }
+
     public void setNext(Invoker next) {
         this.next = next;
     }