/*
* (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.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.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 WsdlImporter2Test extends TestCase {
public WsdlImporter2Test(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 "/Users/dvanvyve/Documents/Projects/FlexoWS/I6DocWSimport.wsdl";
// return "/Users/dvanvyve/Documents/Projects/FlexoWS/I6DocWSNoArray.wsdl";
// return "/Users/dvanvyve/Documents/Projects/FlexoWS/test.wsdl";
return new FileResource("getJoke.asmx.xml").getCanonicalPath();
}
//
// public void testImportSoapEncoding(){
// System.out.println("**** TEST testImportSoapEncoding");
// try{
// SchemaTypeLoader schemaTypeLoader = null;
//
//
// XmlObject[] schemaArray = new XmlObject[]{ XmlObject.Factory.parse(new
// File("/Users/dvanvyve/Documents/Projects/FlexoWS/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());}
//
// }
// NOT COMPILING ANYMORE, because of Modif of XMLTypeMapper.
// Keeping it for archives
private void exploreTypeSystem(SchemaTypeSystem schemaTypeSystem, SchemaTypeLoader schemaTypeLoader) {
// try{
//
//
// List allAnonymousTypes = new ArrayList();
// List documentTypes = new ArrayList();
// documentTypes.addAll(Arrays.asList(schemaTypeSystem.documentTypes()));
// for (int i = 0; i < documentTypes.size(); i++)
// {
// SchemaType sType = (SchemaType)documentTypes.get(i);
// System.out.println("documentType:"+sType.toString());
// allAnonymousTypes.addAll(Arrays.asList(sType.getAnonymousTypes()));
//
// }
// System.out.println("list of Document types:"+allAnonymousTypes);
// for(int i=0; i< allAnonymousTypes.size();i++){
// SchemaType sType = (SchemaType)allAnonymousTypes.get(i);
// System.out.println("Visiting " + sType.toString());
// System.out.println("ElementType:"+sType.getName() +" java:"+sType.getFullJavaName());
// String className = sType.getShortJavaName();
// List list = Arrays.asList(sType.getElementProperties());
// for (int ii=0; ii<list.size(); ii++){
// SchemaProperty prop = (SchemaProperty)list.get(ii);
//
//
// // if isAtomicType => getPrimitiveType
//
// String attributeName = prop.getName().getLocalPart();
// String attributeType =
// XMLTypeMapper.getFullJavaNameForType(prop.getType());//getJavaTypeForBuiltInType(prop.getType().getPrimitiveType().getBuiltinTypeCode());
// System.out.println("property:"+prop.getName()+" type"+prop.getType()+" Java type:"+attributeType);
//
//
// //prop.setDescription(attrib.getDocumentation());
// }
//
// }
//
//
//
// List 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());}
//
}
public void testImport() {
System.out.println("**** TEST testImport");
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);
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("**** OPERATIONS ******");
Map portTypes = webServiceDefinition.getPortTypes();
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()output.get
System.out.println("outp:" + output.getName() + " " + output.getTypeName());
SchemaType outType = schemaTypeLoader.findType(output.getTypeName());
System.out.println("outType:" + outType);
System.out.println("attributeModel:" + outType.getAttributeModel());
System.out.println("base Type: " + outType.getBaseType());
SchemaType baseType = outType.getBaseType();
if (baseType != null && baseType.getName().getLocalPart().equals("Array")
&& baseType.getName().getNamespaceURI().equals("http://schemas.xmlsoap.org/soap/encoding/")) {
System.out.println("This is an array");
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
fail("Exception occured:" + e.getMessage());
}
}
}