/*
* 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.core.databinding.transformers;
import static org.apache.tuscany.spi.databinding.DataBinding.IDL_INPUT;
import static org.apache.tuscany.spi.databinding.DataBinding.IDL_OUTPUT;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import junit.framework.TestCase;
import org.apache.tuscany.databinding.impl.DataBindingRegistryImpl;
import org.apache.tuscany.databinding.impl.MediatorImpl;
import org.apache.tuscany.databinding.impl.TransformationContextImpl;
import org.apache.tuscany.databinding.impl.TransformerRegistryImpl;
import org.apache.tuscany.databinding.javabeans.DOMNode2JavaBeanTransformer;
import org.apache.tuscany.databinding.javabeans.JavaBean2DOMNodeTransformer;
import org.apache.tuscany.databinding.xml.DOMDataBinding;
import org.apache.tuscany.databinding.xml.Node2String;
import org.apache.tuscany.databinding.xml.String2Node;
import org.apache.tuscany.interfacedef.DataType;
import org.apache.tuscany.interfacedef.Operation;
import org.apache.tuscany.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.interfacedef.impl.OperationImpl;
import org.apache.tuscany.interfacedef.util.ElementInfo;
import org.apache.tuscany.interfacedef.util.TypeInfo;
import org.apache.tuscany.interfacedef.util.WrapperInfo;
import org.apache.tuscany.interfacedef.util.XMLType;
import org.apache.tuscany.spi.databinding.DataBindingRegistry;
import org.apache.tuscany.spi.databinding.TransformationContext;
import org.apache.tuscany.spi.databinding.extension.DOMHelper;
import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class IDLTransformerTestCase extends TestCase {
private static final String IPO_XML = "" + ""
+ " "
+ " Helen Zoe"
+ " 47 Eden Street"
+ " Cambridge"
+ " CB1 1JR"
+ " "
+ " "
+ " Robert Smith"
+ " 8 Oak Avenue"
+ " Old Town"
+ " PA"
+ " 95819"
+ " "
+ " "
+ " - "
+ " Lapis necklace"
+ " 1"
+ " 99.95"
+ " Want this for the holidays"
+ " 1999-12-05"
+ "
"
+ " "
+ "";
private static final String URI_ORDER_XSD = "http://example.com/order.xsd";
/**
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
}
public void testTransform() throws Exception {
List types0 = new ArrayList();
DataType wrapperType = new DataTypeImpl(null, Object.class,
new XMLType(new QName(URI_ORDER_XSD,
"checkOrderStatus"), null));
types0.add(wrapperType);
DataType> inputType0 = new DataTypeImpl>(IDL_INPUT,
Object[].class, types0);
List types1 = new ArrayList();
DataType customerIdType = new DataTypeImpl(
null,
Object.class,
new XMLType(
new QName(URI_ORDER_XSD, "customerId"),
null));
DataType orderType = new DataTypeImpl(null, Object.class,
new XMLType(new QName(URI_ORDER_XSD, "order"), null));
DataType flagType = new DataTypeImpl(null, Object.class, new XMLType(new QName(URI_ORDER_XSD,
"flag"), null));
types1.add(customerIdType);
types1.add(orderType);
types1.add(flagType);
DataType statusType = new DataTypeImpl(null, Object.class,
new XMLType(new QName(URI_ORDER_XSD, "status"), null));
DataType responseType = new DataTypeImpl(null, Object.class,
new XMLType(new QName(URI_ORDER_XSD,
"checkOrderStatusResponse"),
null));
Operation op = new OperationImpl("checkOrderStatus");
op.setInputType(inputType0);
op.setOutputType(responseType);
// op.setDataBinding(DOMDataBinding.NAME);
//
// inputType0.setOperation(op);
op.setWrapperStyle(true);
ElementInfo inputElement = new ElementInfo(new QName(URI_ORDER_XSD, "checkOrderStatus"), new TypeInfo(null,
false,
null));
// wrapperType.setMetadata(ElementInfo.class.getName(), inputElement);
ElementInfo customerId = new ElementInfo(new QName("", "customerId"),
SimpleTypeMapperExtension.XSD_SIMPLE_TYPES.get("string"));
ElementInfo order = new ElementInfo(new QName("", "order"), new TypeInfo(new QName(URI_ORDER_XSD), false, null));
ElementInfo flag = new ElementInfo(new QName("", "flag"), SimpleTypeMapperExtension.XSD_SIMPLE_TYPES.get("int"));
// customerIdType.setMetadata(ElementInfo.class.getName(), customerId);
// orderType.setMetadata(ElementInfo.class.getName(), order);
// flagType.setMetadata(ElementInfo.class.getName(), flag);
//
// customerIdType.setOperation(op);
// orderType.setOperation(op);
// flagType.setOperation(op);
List inputElements = new ArrayList();
inputElements.add(customerId);
inputElements.add(order);
inputElements.add(flag);
ElementInfo statusElement = new ElementInfo(new QName("", "status"), SimpleTypeMapperExtension.XSD_SIMPLE_TYPES
.get("string"));
// statusType.setMetadata(ElementInfo.class.getName(), statusElement);
// statusType.setOperation(op);
List outputElements = new ArrayList();
outputElements.add(statusElement);
ElementInfo outputElement = new ElementInfo(new QName(URI_ORDER_XSD, "checkOrderStatusResponse"),
new TypeInfo(null, false, null));
// responseType.setMetadata(ElementInfo.class.getName(), inputElement);
// responseType.setOperation(op);
WrapperInfo wrapperInfo = new WrapperInfo(DOMDataBinding.NAME, inputElement, outputElement, inputElements,
outputElements);
op.setWrapper(wrapperInfo);
// op.setDataBinding(DOMDataBinding.NAME);
MediatorImpl m = new MediatorImpl();
TransformerRegistryImpl tr = new TransformerRegistryImpl();
tr.registerTransformer(new String2Node());
tr.registerTransformer(new Node2String());
tr.registerTransformer(new DOMNode2JavaBeanTransformer());
tr.registerTransformer(new JavaBean2DOMNodeTransformer());
m.setTransformerRegistry(tr);
DataBindingRegistry dataBindingRegistry = new DataBindingRegistryImpl();
dataBindingRegistry.register(new DOMDataBinding());
m.setDataBindingRegistry(dataBindingRegistry);
Object[] source = new Object[] {"cust001", IPO_XML, Integer.valueOf(1)};
Input2InputTransformer t = new Input2InputTransformer();
t.setMediator(m);
TransformationContext context = new TransformationContextImpl();
context.setSourceOperation(op);
List> types = new ArrayList>();
types.add(new DataTypeImpl(Object.class.getName(), String.class, String.class));
types.add(new DataTypeImpl("java.lang.String", String.class, String.class));
types.add(new DataTypeImpl(Object.class.getName(), int.class, int.class));
DataType>> inputType1 = new DataTypeImpl>>(IDL_INPUT, Object[].class,
types);
context.setSourceDataType(inputType1);
context.setTargetDataType(op.getInputType());
Object[] results = t.transform(source, context);
assertEquals(1, results.length);
assertTrue(results[0] instanceof Element);
Element element = (Element)results[0];
assertEquals("http://example.com/order.xsd", element.getNamespaceURI());
assertEquals("checkOrderStatus", element.getLocalName());
TransformationContext context1 = new TransformationContextImpl();
DataType sourceType = new DataTypeImpl(IDL_OUTPUT, Object.class, op.getOutputType());
context1.setSourceDataType(sourceType);
DataType targetType = new DataTypeImpl(IDL_OUTPUT, Object.class,
new DataTypeImpl("java.lang.Object",
String.class, String.class));
context1.setTargetDataType(targetType);
Document factory = DOMHelper.newDocument();
Element responseElement = factory
.createElementNS("http://example.com/order.wsdl", "p:checkOrderStatusResponse");
Element status = factory.createElement("status");
responseElement.appendChild(status);
status.appendChild(factory.createTextNode("shipped"));
Output2OutputTransformer t2 = new Output2OutputTransformer();
t2.setMediator(m);
Object st = t2.transform(responseElement, context1);
assertEquals("shipped", st);
}
}