/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.wsdl;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.wsdl.Definition;
import javax.wsdl.Operation;
import javax.wsdl.Part;
import javax.wsdl.PortType;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import junit.framework.TestCase;
import org.apache.xmlbeans.SchemaGlobalElement;
import org.apache.xmlbeans.SchemaProperty;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.SchemaTypeSystem;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.impl.schema.MySchemaTypeSystemCompiler;
import org.openflexo.toolbox.FileResource;
public class WsdlImportTest extends TestCase {
public WsdlImportTest(String arg0) {
super(arg0);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public String fileName() throws IOException {
return new FileResource("I6DocWSimport.wsdl").getCanonicalPath();
// return "/Users/dvanvyve/Documents/Projects/FlexoWS/I6DocWSNoArray.wsdl";
// return "/Users/dvanvyve/Documents/Projects/FlexoWS/test.wsdl";
}
public void testImportSoapEncoding() {
System.out.println("**** TEST testImportSoapEncoding");
try {
SchemaTypeLoader schemaTypeLoader = null;
XmlObject[] schemaArray = new XmlObject[] { XmlObject.Factory.parse(new FileResource("Resources/soapEncoding.xml")) };
XmlOptions opts = new XmlOptions();
opts.setCompileDownloadUrls();
// opts.setCompileNoUpaRule();
// opts.setCompileNoPvrRule();
// opts.setCompileNoAnnotations();
// opts.setCompileMdefNamespaces(mdefNamespaces);
opts.setCompileNoValidation(); // already validated here
//
WSDL2Java.MyResolver entityResolver = new WSDL2Java.MyResolver();
opts.setEntityResolver(entityResolver);
// opts.setGenerateJavaVersion(javasource);
/** this is another CORRECT but from modified source way to do it WITH java-ized types **/
SchemaTypeSystem soapsts = MySchemaTypeSystemCompiler.compile(null, null, schemaArray, null, XmlBeans.getBuiltinTypeSystem(),
null, opts);
System.out.println("soap System:" + soapsts);
/** this works but generates sources files...boring */
// schemaTypeSystem = XmlBeans.compileXmlBeans(null,null, new XmlObject[]{ XmlObject.Factory.parse(schema)
// },null,XmlBeans.getBuiltinTypeSystem(),new FilerImpl(null,null,null,false,false), null);
schemaTypeLoader = XmlBeans.typeLoaderUnion(new SchemaTypeLoader[] { soapsts, XmlBeans.getBuiltinTypeSystem() });
WSDL2Java wsdl2Java = new WSDL2Java();
List schemas = wsdl2Java.generate(null, null, null, fileName());
System.out.println("Schemas:" + schemas);
Iterator it = schemas.iterator();
schemaArray = new XmlObject[schemas.size()];
int l = 0;
while (it.hasNext()) {
XmlObject schema = (XmlObject) it.next();
schemaArray[l] = schema;
l++;
}
opts = new XmlOptions();
opts.setCompileDownloadUrls();
opts.setCompileNoValidation(); // already validated here
//
opts.setEntityResolver(entityResolver);
// opts.setGenerateJavaVersion(javasource);
/** this is another CORRECT but from modified source way to do it WITH java-ized types **/
SchemaTypeSystem i6ts = MySchemaTypeSystemCompiler.compile(null, null, schemaArray, null, schemaTypeLoader, null, opts);
System.out.println("i6Ts:" + i6ts);
schemaTypeLoader = XmlBeans.typeLoaderUnion(new SchemaTypeLoader[] { i6ts, schemaTypeLoader });
exploreTypeSystem(i6ts, schemaTypeLoader);
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
fail("Error:" + e.toString());
}
}
public void testImportWSDLSchemaWithModifiedSchemaCompiler() {
System.out.println("**** TEST testImportWSDLSchemaWithModifiedSchemaCompiler");
try {
String wsdlFileName = fileName();
// String wsdlFileName="/Users/dvanvyve/Documents/Projects/FlexoWS/I6DocWSimport.wsdl";
// String wsdlFileName="/Users/dvanvyve/Documents/Projects/FlexoWS/test.wsdl";
SchemaTypeSystem sts = WSDL2Java.loadTypeSystem(null, new File(wsdlFileName), true);
System.out.println("sts:" + sts);
exploreSchema(null, sts);
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
fail("Error:" + e.toString());
}
}
public void testImportWSDLSchemaWithJeffHanson() throws IOException {
System.out.println("**** TEST testImportWSDLSchemaWithJeffHanson");
String wsdlFileName = fileName();
// String wsdlFileName="/Users/dvanvyve/Documents/Projects/FlexoWS/I6DocWSimport.wsdl";
// String wsdlFileName="/Users/dvanvyve/Documents/Projects/FlexoWS/test.wsdl";
WSDL2Java wsdl2Java = new WSDL2Java();
List schemas = wsdl2Java.generate(null, null, null, wsdlFileName);
System.out.println("Schemas:" + schemas);
// List list = SchemaUtils.getSchemas(wsdl.toURI().toString());
// System.out.println("list:"+list);
exploreSchema(schemas, null);
}
public void testImport() {
System.out.println("**** TEST testImport");
try {
WSDLFactory wsdlFactory = WSDLFactory.newInstance();
WSDLReader wsdlReader = wsdlFactory.newWSDLReader();
// File wsdl = new File("/Users/dvanvyve/Documents/Projects/FlexoWS/I6DocWSimport.wsdl");
File wsdl = new File(fileName());
Definition webServiceDefinition = wsdlReader.readWSDL(wsdl.getAbsolutePath());
// FlexoController.notify("A new WSDL definition has been read.\nIt still to include it properly in the Flexo model.\n" +
// "It's a developper job... and it can be done starting in class : org.openflexo.wsdl.Importer");
// TODO : explore the webServiceDefinition to insert valuable information in FlexoModel
// BMA: I suggest to use xmlBeans (http://xmlbeans.apache.org/)
// to transform the <types> section of the wsdl
// This will produce some java classes that can be packaged in a jar
// and then importing the jar in Flexo will do the trick
// Other sections are specific wsdl can be handeled with the wsdl api.
// When handeling the other sections keep in mind that we can use entities
// we have just create with the importation of the jar.
System.out.println("**** TYPES ******");
// list of XMLObjects
List list = SchemaUtils.getSchemas(wsdl.toURI().toString());
System.out.println("list:" + list);
exploreSchema(list, null);
System.out.println("**** OPERATIONS ******");
Map portTypes = webServiceDefinition.getPortTypes();
Iterator it = portTypes.values().iterator();
while (it.hasNext()) {
PortType pt = (PortType) it.next();
System.out.println("PortType:" + pt.getQName());
List operations = pt.getOperations();
Iterator it2 = operations.iterator();
while (it2.hasNext()) {
Operation op = (Operation) it2.next();
System.out.println("Operation" + op.getName());
System.out.println("input:" + op.getInput().getName());
Iterator it3 = op.getInput().getMessage().getParts().values().iterator();
while (it3.hasNext()) {
Part input = (Part) it3.next();
System.out.println("arg: " + input.getName() + " " + input.getTypeName());
}
it3 = op.getOutput().getMessage().getParts().values().iterator();
while (it3.hasNext()) {
Part output = (Part) it3.next();
System.out.println("outp:" + output.getName() + " " + output.getTypeName());
}
}
}
} catch (Exception e) {
e.printStackTrace();
fail("Exception occured:" + e.getMessage());
}
}
private void exploreSchema(List schemas, SchemaTypeSystem schemaTypeSystem) {
// Create Schema Type System
// SchemaTypeSystem schemaTypeSystem = null;
try {
SchemaTypeLoader schemaTypeLoader = null;
if (schemaTypeSystem == null) {
Iterator it = schemas.iterator();
XmlObject[] schemaArray = new XmlObject[schemas.size()];
int l = 0;
while (it.hasNext()) {
XmlObject schema = (XmlObject) it.next();
schemaArray[l] = schema;
l++;
}
XmlOptions opts = new XmlOptions();
opts.setCompileDownloadUrls();
// opts.setCompileNoUpaRule();
// opts.setCompileNoPvrRule();
// opts.setCompileNoAnnotations();
// opts.setCompileMdefNamespaces(mdefNamespaces);
opts.setCompileNoValidation(); // already validated here
//
WSDL2Java.MyResolver entityResolver = new WSDL2Java.MyResolver();
opts.setEntityResolver(entityResolver);
// opts.setGenerateJavaVersion(javasource);
/** this is another CORRECT but from modified source way to do it WITH java-ized types **/
schemaTypeSystem = MySchemaTypeSystemCompiler.compile(null, null, schemaArray, null, XmlBeans.getBuiltinTypeSystem(), null,
opts);
/** this works but generates sources files...boring */
// schemaTypeSystem = XmlBeans.compileXmlBeans(null,null, new XmlObject[]{ XmlObject.Factory.parse(schema)
// },null,XmlBeans.getBuiltinTypeSystem(),new FilerImpl(null,null,null,false,false), null);
}// end IF
schemaTypeLoader = XmlBeans.typeLoaderUnion(new SchemaTypeLoader[] { schemaTypeSystem, XmlBeans.getBuiltinTypeSystem() });
List allSeenTypes = new ArrayList();
allSeenTypes.addAll(Arrays.asList(schemaTypeSystem.documentTypes()));
for (int i = 0; i < allSeenTypes.size(); i++) {
SchemaType sType = (SchemaType) allSeenTypes.get(i);
System.out.println("Visiting " + sType.toString());
allSeenTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
}
System.out.println("list of Document types:" + allSeenTypes);
allSeenTypes = new ArrayList();
allSeenTypes.addAll(Arrays.asList(schemaTypeSystem.attributeTypes()));
for (int i = 0; i < allSeenTypes.size(); i++) {
SchemaType sType = (SchemaType) allSeenTypes.get(i);
System.out.println("Visiting " + sType.toString());
allSeenTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
}
System.out.println("list of attribute types:" + allSeenTypes);
allSeenTypes = new ArrayList();
allSeenTypes.addAll(Arrays.asList(schemaTypeSystem.globalTypes()));
for (int i = 0; i < allSeenTypes.size(); i++) {
SchemaType sType = (SchemaType) allSeenTypes.get(i);
System.out.println("Visiting " + sType.toString());
System.out.println("GlobalType:" + sType.getName() + " java:" + sType.getFullJavaName());
// SchemaTypeLoader loader = XmlBeans.getContextTypeLoader();
SchemaTypeLoader loader = schemaTypeLoader;
SchemaType type = loader.findType(sType.getName());
System.out.println("loader:" + loader + " Found type:" + type);
SchemaTypeSystem sys = sType.getTypeSystem();
System.out.println("Sys:" + sys + " foundtype:" + sys.findType(sType.getName()));
System.out
.println("Loader Java:" + type.getFullJavaName() + " Java Sys:" + sys.findType(sType.getName()).getFullJavaName());
List list = Arrays.asList(sType.getElementProperties());
for (int ii = 0; ii < list.size(); ii++) {
SchemaProperty prop = (SchemaProperty) list.get(ii);
// if isAtomicType => getPrimitiveType
// System.out.println("property:"+prop.getName()+" type:"+prop.getType().getPrimitiveType().getShortJavaName());
// System.out.println("property:"+prop.getName()+" type:"+prop.getType().getPrimitiveType().getName().getLocalPart());
System.out.println("property:" + prop.getName() + " type:"
+ XMLTypeMapper.getJavaTypeForBuiltInType(prop.getType().getPrimitiveType().getBuiltinTypeCode()));
// SchemaType primitive = BuiltinSchemaTypeSystem.get().findType(prop.getType().getPrimitiveType().getName());
// System.out.println("primitive:"+ primitive
// +" typeCode:"+primitive.getBuiltinTypeCode()+" isBuiltin "+primitive.isBuiltinType()+" isPrimitive:"+primitive.isPrimitiveType()+
// "isSimple:"+primitive.isSimpleType()+" isDocument"+primitive.isDocumentType());
}
allSeenTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
}
System.out.println("list of Global types:" + allSeenTypes);
System.out.println("schema:" + schemaTypeSystem.toString());
List types = new ArrayList();
types.addAll(Arrays.asList(schemaTypeSystem.globalTypes()));
types.addAll(Arrays.asList(schemaTypeSystem.documentTypes()));
types.addAll(Arrays.asList(schemaTypeSystem.attributeTypes()));
for (Iterator ig = Arrays.asList(schemaTypeSystem.globalElements()).iterator(); ig.hasNext();) {
SchemaGlobalElement element = (SchemaGlobalElement) ig.next();
System.out.println("elemnt:" + element.getName());
}
System.out.println("globalTypes:" + Arrays.asList(schemaTypeSystem.globalTypes()));
System.out.println("globalAttributes:" + Arrays.asList(schemaTypeSystem.globalAttributes()));
System.out.println("list:" + types);
for (Iterator i = types.iterator(); i.hasNext();) {
SchemaType type = (SchemaType) i.next();
// if (type.isBuiltinType())
// continue;
// if (type.getFullJavaName() == null)
// continue;
String fjn = type.getFullJavaName();
System.out.println("type:" + fjn);
}
} catch (Exception e) {
e.printStackTrace();
fail("exception:" + e.toString());
}
}
private void exploreTypeSystem(SchemaTypeSystem schemaTypeSystem, SchemaTypeLoader schemaTypeLoader) {
try {
List allSeenTypes = new ArrayList();
allSeenTypes.addAll(Arrays.asList(schemaTypeSystem.documentTypes()));
for (int i = 0; i < allSeenTypes.size(); i++) {
SchemaType sType = (SchemaType) allSeenTypes.get(i);
allSeenTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
}
System.out.println("list of Document types:" + allSeenTypes);
allSeenTypes = new ArrayList();
allSeenTypes.addAll(Arrays.asList(schemaTypeSystem.attributeTypes()));
for (int i = 0; i < allSeenTypes.size(); i++) {
SchemaType sType = (SchemaType) allSeenTypes.get(i);
allSeenTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
}
System.out.println("list of attribute types:" + allSeenTypes);
allSeenTypes = new ArrayList();
allSeenTypes.addAll(Arrays.asList(schemaTypeSystem.globalTypes()));
for (int i = 0; i < allSeenTypes.size(); i++) {
SchemaType sType = (SchemaType) allSeenTypes.get(i);
System.out.println("Visiting " + sType.toString());
System.out.println("GlobalType:" + sType.getName() + " java:" + sType.getFullJavaName());
/*
SchemaTypeLoader loader = schemaTypeLoader;
SchemaType type = loader.findType(sType.getName());
System.out.println("Loader Java:"+type.getFullJavaName()+" Java Sys:"+sys.findType(sType.getName()).getFullJavaName());
*/
List list = Arrays.asList(sType.getElementProperties());
for (int ii = 0; ii < list.size(); ii++) {
SchemaProperty prop = (SchemaProperty) list.get(ii);
// if isAtomicType => getPrimitiveType
// System.out.println("property:"+prop.getName()+" type:"+prop.getType().getPrimitiveType().getShortJavaName());
// System.out.println("property:"+prop.getName()+" type:"+prop.getType().getPrimitiveType().getName().getLocalPart());
System.out.println("property:" + prop.getName() + " type:"
+ XMLTypeMapper.getJavaTypeForBuiltInType(prop.getType().getPrimitiveType().getBuiltinTypeCode()));
// SchemaType primitive = BuiltinSchemaTypeSystem.get().findType(prop.getType().getPrimitiveType().getName());
// System.out.println("primitive:"+ primitive
// +" typeCode:"+primitive.getBuiltinTypeCode()+" isBuiltin "+primitive.isBuiltinType()+" isPrimitive:"+primitive.isPrimitiveType()+
// "isSimple:"+primitive.isSimpleType()+" isDocument"+primitive.isDocumentType());
}
allSeenTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
}
System.out.println("list of Global types:" + allSeenTypes);
/*
System.out.println("schema:"+schemaTypeSystem.toString());
List types = new ArrayList();
types.addAll(Arrays.asList(schemaTypeSystem.globalTypes()));
types.addAll(Arrays.asList(schemaTypeSystem.documentTypes()));
types.addAll(Arrays.asList(schemaTypeSystem.attributeTypes()));
for (Iterator ig = Arrays.asList(schemaTypeSystem.globalElements()).iterator(); ig.hasNext(); )
{
SchemaGlobalElement element = (SchemaGlobalElement)ig.next();
System.out.println("elemnt:"+element.getName());
}
System.out.println("globalTypes:"+Arrays.asList(schemaTypeSystem.globalTypes()));
System.out.println("globalAttributes:"+Arrays.asList(schemaTypeSystem.globalAttributes()));
System.out.println("list:"+types);
for (Iterator i = types.iterator(); i.hasNext(); )
{
SchemaType type = (SchemaType)i.next();
//if (type.isBuiltinType())
// continue;
//if (type.getFullJavaName() == null)
// continue;
String fjn = type.getFullJavaName();
System.out.println("type:"+fjn);
}
*/
} catch (Exception e) {
e.printStackTrace();
fail("exception:" + e.toString());
}
}
}