Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   * 
  *   http://www.apache.org/licenses/LICENSE-2.0
  * 
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.    
  */
 
 package org.apache.tuscany.sca.core.databinding.transformers;
 
 import java.util.List;
 
 import static org.apache.tuscany.sca.interfacedef.Operation.IDL_INPUT;
This is a special transformer to transform the input from one IDL to the other one

Version:
$Rev: 1061329 $ $Date: 2011-01-20 16:57:06 +0200 (Thu, 20 Jan 2011) $
 
 public class Input2InputTransformer extends BaseTransformer<Object[], Object[]> implements
     PullTransformer<Object[], Object[]> {
     protected Mediator mediator;
 
     public Input2InputTransformer(ExtensionPointRegistry registry) {
         super();
         this. = registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(Mediator.class);
     }
 
     @Override
     public String getSourceDataBinding() {
         return ;
     }
 
     @Override
     public String getTargetDataBinding() {
         return ;
     }

    
 
     @Override
     protected Class<Object[]> getSourceType() {
         return Object[].class;
     }

    
 
     @Override
     protected Class<Object[]> getTargetType() {
         return Object[].class;
     }

    
 
     @Override
     public int getWeight() {
         return 10000;
     }

    
Match the structure of the wrapper element. If it matches, then we can do wrapper to wrapper transformation. Otherwise, we do child to child.

Parameters:
w1
w2
Returns:
 
     private boolean matches(WrapperInfo w1WrapperInfo w2) {
         if (w1 == null || w2 == null) {
             return false;
         }
        if (!w1.getInputWrapperElement().equals(w2.getInputWrapperElement())) {
            return false;
        }
        // Compare the child elements
        List<ElementInfolist1 = w1.getInputChildElements();
        List<ElementInfolist2 = w2.getInputChildElements();
        if (list1.size() != list2.size()) {
            return false;
        }
        // FXIME: [rfeng] At this point, the J2W generates local elments under the namespace
        // of the interface instead of "". We only compare the local parts only to work around
        // the namespace mismatch
        for (int i = 0; i < list1.size(); i++) {
            String n1 = list1.get(i).getQName().getLocalPart();
            String n2 = list2.get(i).getQName().getLocalPart();
            if (!n1.equals(n2)) {
                return false;
            }
        }
        return true;
    }
    @SuppressWarnings("unchecked")
    public Object[] transform(Object[] sourceTransformationContext context) {
        // Check if the source operation is wrapped
        DataType<List<DataType>> sourceType = context.getSourceDataType();
        Operation sourceOp = context.getSourceOperation();
        boolean sourceWrapped = sourceOp != null && sourceOp.isWrapperStyle() && sourceOp.getWrapper() != null;
        boolean sourceBare = sourceOp != null && !sourceOp.isWrapperStyle() && sourceOp.getWrapper() == null;
        // Find the wrapper handler for source data
        WrapperHandler sourceWrapperHandler = null;
        String sourceDataBinding = getDataBinding(sourceOp);
        sourceWrapperHandler = getWrapperHandler(sourceDataBindingsourceWrapped);
        // Check if the target operation is wrapped
        DataType<List<DataType>> targetType = context.getTargetDataType();
        Operation targetOp = (Operation)context.getTargetOperation();
        boolean targetWrapped = targetOp != null && targetOp.isWrapperStyle() && targetOp.getWrapper() != null;
        boolean targetBare = targetOp != null && !targetOp.isWrapperStyle() && targetOp.getWrapper() == null;
        // Find the wrapper handler for target data
        WrapperHandler targetWrapperHandler = null;
        String targetDataBinding = getDataBinding(targetOp);
        targetWrapperHandler = getWrapperHandler(targetDataBindingtargetWrapped);
        if ((!sourceWrapped && !sourceBare) && targetWrapped) {
            // Unwrapped --> Wrapped
            WrapperInfo wrapper = targetOp.getWrapper();
            // ElementInfo wrapperElement = wrapper.getInputWrapperElement();
            // Class<?> targetWrapperClass = wrapper != null ? wrapper.getInputWrapperClass() : null;
            if (source == null) {
                // Empty child elements
                Object targetWrapper = targetWrapperHandler.create(targetOptrue);
                return new Object[] {targetWrapper};
            }
            // If the source can be wrapped, wrapped it first
            if (sourceWrapperHandler != null) {
                WrapperInfo sourceWrapperInfo = sourceOp.getWrapper();
                DataType sourceWrapperType = sourceWrapperInfo != null ? sourceWrapperInfo.getInputWrapperType() : null;
                // We only do wrapper to wrapper transformation if the source has a wrapper and both sides
                // match by XML structure
                if (sourceWrapperType != null && matches(sourceOp.getWrapper(), targetOp.getWrapper())) {
                    Class<?> sourceWrapperClass = sourceWrapperType.getPhysical();
                    // Create the source wrapper
                    Object sourceWrapper = sourceWrapperHandler.create(sourceOptrue);
                    // Populate the source wrapper
                    if (sourceWrapper != null) {
                        sourceWrapperHandler.setChildren(sourceWrapper,
                                                         source,
                                                         sourceOp,
                                                         true);
                        // Transform the data from source wrapper to target wrapper
                        Object targetWrapper =
                            .mediate(sourceWrappersourceWrapperTypetargetType.getLogical().get(0), context
                                .getMetadata());
                        return new Object[] {targetWrapper};
                    }
                }
            }
            // Fall back to child by child transformation
            Object targetWrapper = targetWrapperHandler.create(targetOptrue);
            List<DataTypeargTypes = wrapper.getUnwrappedInputType().getLogical();
            Object[] targetChildren = new Object[source.length];
            for (int i = 0; i < source.lengthi++) {
                // ElementInfo argElement = wrapper.getInputChildElements().get(i);
                DataType<XMLTypeargType = argTypes.get(i);
                targetChildren[i] =
                    .mediate(source[i], sourceType.getLogical().get(i), argTypecontext.getMetadata());
            }
            targetWrapperHandler.setChildren(targetWrapper,
                                             targetChildren,
                                             targetOp,
                                             true);
            return new Object[] {targetWrapper};
        } else if (sourceWrapped && (!targetWrapped && !targetBare)) {
            // Wrapped to Unwrapped
            Object sourceWrapper = source[0];
            Object[] target = null;
            // List<ElementInfo> childElements = sourceOp.getWrapper().getInputChildElements();
            if (targetWrapperHandler != null) {
                // ElementInfo wrapperElement = sourceOp.getWrapper().getInputWrapperElement();
                // 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(sourceWrappersourceOptrue)) {
                    WrapperInfo targetWrapperInfo = targetOp.getWrapper();
                    DataType targetWrapperType =
                        targetWrapperInfo != null ? targetWrapperInfo.getInputWrapperType() : null;
                    if (targetWrapperType != null && matches(sourceOp.getWrapper(), targetOp.getWrapper())) {
                        Object targetWrapper =
                            .mediate(sourceWrappersourceType.getLogical().get(0), targetWrapperTypecontext
                                .getMetadata());
                        target = targetWrapperHandler.getChildren(targetWrappertargetOptrue).toArray();
                        return target;
                    }
                }
            }
            Object[] sourceChildren = sourceWrapperHandler.getChildren(sourceWrappersourceOptrue).toArray();
            target = new Object[sourceChildren.length];
            for (int i = 0; i < sourceChildren.lengthi++) {
                DataType<XMLTypechildType = sourceOp.getWrapper().getUnwrappedInputType().getLogical().get(i);
                target[i] =
                    .mediate(sourceChildren[i], childTypetargetType.getLogical().get(i), context
                        .getMetadata());
            }
            return target;
        } else {
            // Assuming wrapper to wrapper conversion can be handled here as well
            Object[] newArgs = new Object[source.length];
            for (int i = 0; i < source.lengthi++) {
                Object child =
                    .mediate(source[i], sourceType.getLogical().get(i), targetType.getLogical().get(i), context
                        .getMetadata());
                newArgs[i] = child;
            }
            return newArgs;
        }
    }
    private WrapperHandler getWrapperHandler(String dataBindingIdboolean required) {
        WrapperHandler wrapperHandler = null;
        if (dataBindingId != null) {
            DataBinding dataBinding = .getDataBindings().getDataBinding(dataBindingId);
            wrapperHandler = dataBinding == null ? null : dataBinding.getWrapperHandler();
        }
        if (wrapperHandler == null && required) {
            throw new TransformationException("No wrapper handler is provided for databinding: " + dataBindingId);
        }
        return wrapperHandler;
    }
    private String getDataBinding(Operation operation) {
        WrapperInfo wrapper = operation.getWrapper();
        if (wrapper != null) {
            return wrapper.getDataBinding();
        } else {
            return null;
        }
    }
New to GrepCode? Check out our FAQ X