/** * * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. * * Licensed 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.tools.wsdl2java.generate; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.wsdl.Binding; import javax.wsdl.Definition; import javax.wsdl.Port; import javax.wsdl.PortType; import javax.wsdl.Service; import javax.wsdl.WSDLException; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; import javax.xml.namespace.QName; import javax.xml.parsers.ParserConfigurationException; import org.apache.axis2.AxisFault; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.WSDL2AxisServiceBuilder; import org.apache.axis2.util.XMLUtils; import org.apache.axis2.wsdl.codegen.CodeGenConfiguration; import org.apache.axis2.wsdl.codegen.CodeGenerationException; import org.apache.axis2.wsdl.codegen.extension.CodeGenExtension; import org.apache.axis2.wsdl.codegen.extension.DefaultDatabindingExtension; import org.apache.axis2.wsdl.codegen.extension.PackageFinder; import org.apache.axis2.wsdl.codegen.extension.WSDLValidatorExtension; import org.apache.axis2.wsdl.databinding.JavaTypeMapper; import org.apache.tuscany.model.util.XMLNameUtil; import org.w3c.dom.Document; import org.xml.sax.SAXException; public class JavaInterfaceGenerator { private List codegenExtensions = new ArrayList(); private List codegenConfigurations= new LinkedList(); public JavaInterfaceGenerator(String uri, String ports[], String outputLocation, String packageName, Map typeMapping) throws CodeGenerationException { Definition definition; try { definition = readWSDL(uri); } catch (WSDLException e) { throw new CodeGenerationException(e); } HashSet interestedPorts= ports == null ? null : new HashSet(Arrays.asList(ports)); // Service service=(Service)definition.getServices().values().().next(); HashSet donePortTypes= new HashSet(); for (Iterator sIter = definition.getServices().values().iterator(); sIter.hasNext(); ) { Service service = (Service) sIter.next(); QName serviceQname = service.getQName(); for (Iterator pIter= service.getPorts().values().iterator(); pIter.hasNext(); ) { Port port= (Port) pIter.next(); if(interestedPorts != null && ! interestedPorts.contains(port.getName())) continue;//not iterested. PortType portType= getPortType(port); if(null == portType) continue; // not connected. QName pQName= portType.getQName(); if(donePortTypes.contains(pQName)) continue; //allready did it. donePortTypes.add(pQName); if (packageName == null) { packageName = XMLNameUtil.getPackageNameFromNamespace(definition.getTargetNamespace()); } JavaTypeMapper typeMapper = new JavaTypeMapper(); for (Map.Entry e : typeMapping.entrySet()) { typeMapper.addTypeMappingObject(e.getKey(), e.getValue()); } AxisService axisService; try { axisService = new WSDL2AxisServiceBuilder(definition, serviceQname, port.getName()).populateService(); } catch (AxisFault e) { throw new CodeGenerationException(e); } axisService.setName(port.getBinding().getPortType().getQName().getLocalPart()); CodeGenConfiguration codegenConfiguration = new CodeGenConfiguration(Collections.EMPTY_MAP); codegenConfigurations.add(codegenConfiguration); codegenConfiguration.setAxisService(axisService); codegenConfiguration.setAdvancedCodeGenEnabled(false); codegenConfiguration.setAsyncOn(false); codegenConfiguration.setDatabindingType("sdo"); codegenConfiguration.setGenerateAll(true); codegenConfiguration.setGenerateDeployementDescriptor(false); codegenConfiguration.setOutputLanguage("java"); codegenConfiguration.setOutputLocation(new File(outputLocation)); codegenConfiguration.setPackageName(packageName); codegenConfiguration.setPackClasses(false); codegenConfiguration.setPolicyMap(Collections.EMPTY_MAP); codegenConfiguration.setPortName(port.getName()); codegenConfiguration.setServerSide(false); codegenConfiguration.setServiceName(service.getQName().getLocalPart()); codegenConfiguration.setSyncOn(true); codegenConfiguration.setTypeMapper(typeMapper); codegenConfiguration.setWriteMessageReceiver(false); codegenConfiguration.setWriteTestCase(false); addExtension(new WSDLValidatorExtension(), codegenConfiguration); addExtension(new PackageFinder(), codegenConfiguration); addExtension(new SDODataBindingCodegenExtension(typeMapper), codegenConfiguration); addExtension(new DefaultDatabindingExtension(), codegenConfiguration); } } } private PortType getPortType(Port port) { Binding binding = port.getBinding(); if(null != binding){ return binding.getPortType(); } return null; } @SuppressWarnings("unchecked") private void addExtension(CodeGenExtension ext, CodeGenConfiguration codegenConfiguration) { ext.init(codegenConfiguration); codegenExtensions.add(ext); } public void generate() throws CodeGenerationException { try { for (int i = 0; i < codegenExtensions.size(); i++) { ((CodeGenExtension)codegenExtensions.get(i)).engage(); } for(CodeGenConfiguration codegenConfiguration : codegenConfigurations){ JavaInterfaceEmitter emitter = new JavaInterfaceEmitter(); emitter.setCodeGenConfiguration(codegenConfiguration); emitter.setMapper(codegenConfiguration.getTypeMapper()); emitter.writeInterface(false); } } catch (Exception e) { throw new CodeGenerationException(e); } } /** * Read the WSDL file * @param uri * @return * @throws WSDLException */ private Definition readWSDL(String uri) throws WSDLException { WSDLReader reader = WSDLFactory.newInstance().newWSDLReader(); reader.setFeature("javax.wsdl.importDocuments", true); File file = new File(uri); String baseURI; if (uri.startsWith("http://")){ baseURI = uri; } else{ if(file.getParentFile() == null){ try { baseURI = new File(".").getCanonicalFile().toURI().toString(); } catch (IOException e) { throw new RuntimeException(e); } } else { baseURI = file.getParentFile().toURI().toString(); } } Document doc; try { doc = XMLUtils.newDocument(uri); } catch (ParserConfigurationException e) { throw new WSDLException(WSDLException.PARSER_ERROR, "Parser Configuration Error", e); } catch (SAXException e) { throw new WSDLException(WSDLException.PARSER_ERROR, "Parser SAX Error", e); } catch (IOException e) { throw new WSDLException(WSDLException.INVALID_WSDL, "IO Error", e); } return reader.readWSDL(baseURI, doc); } }