Author: dims Date: Thu Feb 7 05:36:48 2008 New Revision: 619407 URL: http://svn.apache.org/viewvc?rev=619407&view=rev Log: Fix for AXIS2-3493 - Plugin in JAXWS RI's wsgen to generate the dynamic wsdl/xsd's
Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/SchemaSupplier.java webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/JAXWSRIWSDLGenerator.java Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/WSDLSupplier.java webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/ListingAgent.java webservices/axis2/trunk/java/modules/metadata/pom.xml webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/DescriptionFactory.java webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/ClassLoaderUtils.java webservices/axis2/trunk/java/modules/parent/pom.xml Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/SchemaSupplier.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/SchemaSupplier.java?rev=619407&view=auto ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/SchemaSupplier.java (added) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/SchemaSupplier.java Thu Feb 7 05:36:48 2008 @@ -0,0 +1,34 @@ +/* + * 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.axis2.dataretrieval; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.description.AxisService; +import org.apache.ws.commons.schema.XmlSchema; + +/** + * Return a XMLSchema as an OMElement. This is used by any AxisService that wishes + * to override the standard AxisService2WSDL (see the org.apache.axis2.description + * package) method of getting XSD. If one of these is present in the AxisService + * Parameters under the name "SchemaSupplier", it will be queried. + */ +public interface SchemaSupplier { + XmlSchema getSchema(AxisService service, String xsd) throws AxisFault; +} Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/WSDLSupplier.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/WSDLSupplier.java?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/WSDLSupplier.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/dataretrieval/WSDLSupplier.java Thu Feb 7 05:36:48 2008 @@ -1,9 +1,7 @@ package org.apache.axis2.dataretrieval; -import org.apache.axiom.om.OMElement; import org.apache.axis2.AxisFault; import org.apache.axis2.description.AxisService; -import org.apache.axis2.context.MessageContext; import javax.wsdl.Definition; /* Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java Thu Feb 7 05:36:48 2008 @@ -25,6 +25,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; +import java.io.OutputStreamWriter; import java.net.SocketException; import java.net.URL; import java.security.PrivilegedAction; @@ -58,6 +59,7 @@ import javax.xml.parsers.ParserConfigurationException; import org.apache.axiom.om.OMElement; +import org.apache.axiom.attachments.utils.IOUtils; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants; import org.apache.axis2.addressing.AddressingHelper; @@ -73,6 +75,7 @@ import org.apache.axis2.dataretrieval.LocatorType; import org.apache.axis2.dataretrieval.OutputForm; import org.apache.axis2.dataretrieval.WSDLSupplier; +import org.apache.axis2.dataretrieval.SchemaSupplier; import org.apache.axis2.deployment.DeploymentConstants; import org.apache.axis2.deployment.util.ExcludeInfo; import org.apache.axis2.deployment.util.PhasesInfo; @@ -952,10 +955,10 @@ return eprs; } - private void printDefinitionObject(Definition definition, OutputStream out) + private void printDefinitionObject(Definition definition, OutputStream out, String requestIP) throws AxisFault, WSDLException { if (isModifyUserWSDLPortAddress()) { - setPortAddress(definition); + setPortAddress(definition, requestIP); } if (!wsdlImportLocationAdjusted){ changeImportAndIncludeLocations(definition); @@ -976,7 +979,7 @@ if (definition != null) { try { - printDefinitionObject(getWSDLDefinition(definition, wsdlName), out); + printDefinitionObject(getWSDLDefinition(definition, wsdlName), out, null); } catch (WSDLException e) { throw AxisFault.makeFault(e); } @@ -1090,6 +1093,90 @@ } /** + * Produces a XSD for this AxisService and prints it to the specified OutputStream. + * + * @param out destination stream. + * @param xsd schema name + * @return -1 implies not found, 0 implies redirect to root, 1 implies found/printed a schema + * @throws IOException + */ + public int printXSD(OutputStream out, String xsd) throws IOException { + + // If we find a SchemaSupplier, use that + SchemaSupplier supplier = (SchemaSupplier)getParameterValue("SchemaSupplier"); + if (supplier != null) { + XmlSchema schema = supplier.getSchema(this, xsd); + if (schema != null) { + schema.write(new OutputStreamWriter(out, "UTF8")); + out.flush(); + out.close(); + return 1; + } + } + + //call the populator + populateSchemaMappings(); + Map schemaMappingtable = + getSchemaMappingTable(); + ArrayList schemas = getSchema(); + + //a name is present - try to pump the requested schema + if (!"".equals(xsd)) { + XmlSchema schema = + (XmlSchema) schemaMappingtable.get(xsd); + if (schema == null) { + int dotIndex = xsd.indexOf('.'); + if (dotIndex > 0) { + String schemaKey = xsd.substring(0,dotIndex); + schema = (XmlSchema) schemaMappingtable.get(schemaKey); + } + } + if (schema != null) { + //schema is there - pump it outs + schema.write(new OutputStreamWriter(out, "UTF8")); + out.flush(); + out.close(); + } else { + InputStream in = getClassLoader() + .getResourceAsStream(DeploymentConstants.META_INF + "/" + xsd); + if (in != null) { + out.write(IOUtils.getStreamAsByteArray(in)); + out.flush(); + out.close(); + } else { + // Can't find the schema + return -1; + } + } + } else if (schemas.size() > 1) { + //multiple schemas are present and the user specified + //no name - in this case we cannot possibly pump a schema + //so redirect to the service root + return 0; + } else { + //user specified no name and there is only one schema + //so pump that out + ArrayList list = getSchema(); + if (list.size() > 0) { + XmlSchema schema = getSchema(0); + if (schema != null) { + schema.write(new OutputStreamWriter(out, "UTF8")); + out.flush(); + out.close(); + } + } else { + String xsdNotFound = "<error>" + + "<description>Unable to access schema for this service</description>" + + "</error>"; + out.write(xsdNotFound.getBytes()); + out.flush(); + out.close(); + } + } + return 1; + } + + /** * Produces a WSDL for this AxisService and prints it to the specified OutputStream. * * @param out destination stream. The WSDL will be sent here. @@ -1110,7 +1197,7 @@ try { Definition definition = supplier.getWSDL(this); if (definition != null) { - printDefinitionObject(getWSDLDefinition(definition, null), out); + printDefinitionObject(getWSDLDefinition(definition, null), out, requestIP); } } catch (Exception e) { printWSDLError(out, e); @@ -1150,13 +1237,18 @@ Object extensibilityEle = list.get(i); if (extensibilityEle instanceof SOAPAddress) { SOAPAddress soapAddress = (SOAPAddress) extensibilityEle; - String exsistingAddress = soapAddress.getLocationURI(); - if (requestIP == null) { + String existingAddress = soapAddress.getLocationURI(); + if (existingAddress == null || existingAddress.equals("REPLACE_WITH_ACTUAL_URL")) { ((SOAPAddress) extensibilityEle).setLocationURI( - getLocationURI(getEPRs(), exsistingAddress)); + getEPRs()[0]); } else { - ((SOAPAddress) extensibilityEle).setLocationURI( - getLocationURI(calculateEPRs(requestIP), exsistingAddress)); + if (requestIP == null) { + ((SOAPAddress) extensibilityEle).setLocationURI( + getLocationURI(getEPRs(), existingAddress)); + } else { + ((SOAPAddress) extensibilityEle).setLocationURI( + getLocationURI(calculateEPRs(requestIP), existingAddress)); + } } } else if (extensibilityEle instanceof SOAP12Address){ SOAP12Address soapAddress = (SOAP12Address) extensibilityEle; Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/ListingAgent.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/ListingAgent.java?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/ListingAgent.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/http/ListingAgent.java Thu Feb 7 05:36:48 2008 @@ -284,71 +284,14 @@ return; } else if (xsd >= 0) { res.setContentType("text/xml"); - AxisService axisService = (AxisService) serviceObj; - //call the populator - axisService.populateSchemaMappings(); - Map schemaMappingtable = - axisService.getSchemaMappingTable(); - ArrayList schemas = axisService.getSchema(); - - //a name is present - try to pump the requested schema - String xsds = req.getParameter("xsd"); - if (!"".equals(xsds)) { - XmlSchema schema = - (XmlSchema) schemaMappingtable.get(xsds); - if (schema == null) { - int dotIndex = xsds.indexOf('.'); - if (dotIndex > 0) { - String schemaKey = xsds.substring(0,dotIndex); - schema = (XmlSchema) schemaMappingtable.get(schemaKey); - } - } - if (schema != null) { - //schema is there - pump it outs - OutputStream out = res.getOutputStream(); - schema.write(new OutputStreamWriter(out, "UTF8")); - out.flush(); - out.close(); - } else { - InputStream in = axisService.getClassLoader() - .getResourceAsStream(DeploymentConstants.META_INF + "/" + xsds); - if (in != null) { - OutputStream out = res.getOutputStream(); - out.write(IOUtils.getStreamAsByteArray(in)); - out.flush(); - out.close(); - } else { - res.sendError(HttpServletResponse.SC_NOT_FOUND); - } - } - + int ret = ((AxisService) serviceObj).printXSD(res.getOutputStream(), req.getParameter("xsd")); + if (ret == 0) { //multiple schemas are present and the user specified //no name - in this case we cannot possibly pump a schema //so redirect to the service root - } else if (schemas.size() > 1) { res.sendRedirect(""); - //user specified no name and there is only one schema - //so pump that out - } else { - ArrayList list = axisService.getSchema(); - if (list.size() > 0) { - XmlSchema schema = axisService.getSchema(0); - if (schema != null) { - OutputStream out = res.getOutputStream(); - schema.write(new OutputStreamWriter(out, "UTF8")); - out.flush(); - out.close(); - } - } else { - res.setContentType("text/xml"); - String xsdNotFound = "<error>" + - "<description>Unable to access schema for this service</description>" + - "</error>"; - OutputStream out = res.getOutputStream(); - out.write(xsdNotFound.getBytes()); - out.flush(); - out.close(); - } + } else if (ret == -1) { + res.sendError(HttpServletResponse.SC_NOT_FOUND); } return; } else if (policy >= 0) { Modified: webservices/axis2/trunk/java/modules/metadata/pom.xml URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/pom.xml?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/metadata/pom.xml (original) +++ webservices/axis2/trunk/java/modules/metadata/pom.xml Thu Feb 7 05:36:48 2008 @@ -77,6 +77,16 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-rt</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-tools</artifactId> + <scope>provided</scope> + </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> @@ -154,16 +164,6 @@ </execution> </executions> - <dependencies> - <!--<dependency> - <groupId>org.apache.ant</groupId> - <artifactId>ant-antlr</artifactId> - </dependency> - <dependency> - <groupId>antlr</groupId> - <artifactId>antlrall</artifactId> - </dependency>--> - </dependencies> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/DescriptionFactory.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/DescriptionFactory.java?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/DescriptionFactory.java (original) +++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/DescriptionFactory.java Thu Feb 7 05:36:48 2008 @@ -22,7 +22,11 @@ import org.apache.axis2.description.AxisService; import org.apache.axis2.jaxws.ClientConfigurationFactory; import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite; +import org.apache.axis2.jaxws.description.builder.JAXWSRIWSDLGenerator; import org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl; +import org.apache.axis2.AxisFault; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import javax.xml.namespace.QName; @@ -35,6 +39,8 @@ * information including annotations, and (in the future) deployment descriptors. */ public class DescriptionFactory { + private static final Log log = LogFactory.getLog(DescriptionFactory.class); + /** * The type of update being done for a particular Port. This is used by the JAX-WS service * delegate on the CLIENT side. This is used as a parameter to the updateEndpoint factory @@ -311,6 +317,13 @@ ServiceDescription serviceDescription = createServiceDescription(serviceImplClass); EndpointDescription[] edArray = serviceDescription.getEndpointDescriptions(); AxisService axisService = edArray[0].getAxisService(); + try { + JAXWSRIWSDLGenerator value = new JAXWSRIWSDLGenerator(axisService); + axisService.addParameter("WSDLSupplier", value); + axisService.addParameter("SchemaSupplier", value); + } catch (Exception ex) { + log.info("Unable to set the WSDLSupplier", ex); + } return axisService; } Added: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/JAXWSRIWSDLGenerator.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/JAXWSRIWSDLGenerator.java?rev=619407&view=auto ============================================================================== --- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/JAXWSRIWSDLGenerator.java (added) +++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/builder/JAXWSRIWSDLGenerator.java Thu Feb 7 05:36:48 2008 @@ -0,0 +1,314 @@ +package org.apache.axis2.jaxws.description.builder; + +import com.sun.tools.ws.spi.WSToolsObjectFactory; +import org.apache.axis2.AxisFault; +import org.apache.axis2.Constants; +import org.apache.axis2.dataretrieval.SchemaSupplier; +import org.apache.axis2.dataretrieval.WSDLSupplier; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.Parameter; +import org.apache.axis2.engine.AxisConfiguration; +import org.apache.axis2.jaxws.util.ClassLoaderUtils; +import org.apache.axis2.transport.http.HTTPConstants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.ws.commons.schema.XmlSchema; +import org.apache.ws.commons.schema.XmlSchemaCollection; +import org.xml.sax.InputSource; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.soap.SOAPBinding; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * This class will implement an interface that is defined by the + * MDQ code. It will be registered within the MDQ framework, and the + * MDQ code will call this when it finds an application that was + * deployed without WSDL. This class will use the WsGen tool to + * generate a WSDL Definition based on the Java source for the application. + */ +public class JAXWSRIWSDLGenerator implements SchemaSupplier, WSDLSupplier { + + private static final Log log = LogFactory.getLog(JAXWSRIWSDLGenerator.class); + + private String classPath; + + private AxisService axisService; + private boolean init = false; + private HashMap<String, XmlSchema> docMap; + private HashMap<String, Definition> wsdlDefMap; + + public JAXWSRIWSDLGenerator(AxisService axisService) { + this.axisService = axisService; + } + + /** + * This method will drive the call to WsGen to generate a WSDL file for + * applications deployed without WSDL. We will then read this file in from + * disk and create a Definition. After we are done with the file we will + * remove it from disk. + */ + public void generateWsdl(String className, String bindingType) throws + WebServiceException { + + AxisConfiguration axisConfiguration = axisService.getAxisConfiguration(); + File tempFile = (File) axisConfiguration.getParameterValue( + Constants.Configuration.ARTIFACTS_TEMP_DIR); + if (tempFile == null) { + tempFile = new File(System.getProperty("java.io.tmpdir"), "_axis2"); + } + + Parameter servletConfigParam = axisConfiguration + .getParameter(HTTPConstants.HTTP_SERVLETCONFIG); + + if (servletConfigParam == null) { + throw new WebServiceException("Axis2 Can't find ServletConfigParameter"); + } + Object obj = servletConfigParam.getValue(); + ServletContext servletContext; + String webBase = null; + + if (obj instanceof ServletConfig) { + ServletConfig servletConfig = (ServletConfig) obj; + servletContext = servletConfig.getServletContext(); + webBase = servletContext.getRealPath("/WEB-INF"); + } else { + throw new WebServiceException("Axis2 Can't find ServletConfig"); + } + + this.classPath = ClassLoaderUtils.getDefaultClasspath(webBase); + if (log.isDebugEnabled()) { + log.debug("For implementation class " + className + + " WsGen classpath: " + + classPath); + } + String localOutputDirectory = tempFile.getAbsolutePath() + className; + if (log.isDebugEnabled()) { + log.debug("Output directory for generated WSDL file: " + localOutputDirectory); + } + boolean errorOnRead = false; + try { + + if (log.isDebugEnabled()) { + log.debug("Generating new WSDL Definition"); + } + + createOutputDirectory(localOutputDirectory); + WSToolsObjectFactory factory = WSToolsObjectFactory.newInstance(); + String[] arguments = getWsGenArguments(className, bindingType, localOutputDirectory); + OutputStream os = new ByteArrayOutputStream(); + factory.wsgen(os, arguments); + os.close(); + wsdlDefMap = readInWSDL(localOutputDirectory); + if (wsdlDefMap.isEmpty()) { + throw new Exception("A WSDL Definition could not be generated for " + + "the implementation class: " + className); + } + docMap = readInSchema(localOutputDirectory); + } + catch (Throwable t) { + String msg = + "Error occurred generating WSDL file for Web service implementation class " + + "{" + className + "}: {" + t + "}"; + log.error(msg); + throw new WebServiceException(msg, t); + } + } + + /** + * This will set up the arguments that will be used by the WsGen tool. + */ + private String[] getWsGenArguments(String className, String bindingType, String localOutputDirectory) throws + WebServiceException { + String[] arguments = null; + if (bindingType == null || bindingType.equals("") || bindingType.equals( + SOAPBinding.SOAP11HTTP_BINDING) || bindingType.equals( + SOAPBinding.SOAP11HTTP_MTOM_BINDING)) { + if (log.isDebugEnabled()) { + log.debug("Generating WSDL with SOAP 1.1 binding type"); + } + arguments = new String[]{"-cp", classPath, className, "-keep", "-wsdl:soap1.1", "-d", + localOutputDirectory}; + } else if (bindingType.equals(SOAPBinding.SOAP12HTTP_BINDING) || bindingType.equals( + SOAPBinding.SOAP12HTTP_MTOM_BINDING)) { + if (log.isDebugEnabled()) { + log.debug("Generating WSDL with SOAP 1.2 binding type"); + } + arguments = new String[]{"-cp", classPath, className, "-keep", "-extension", + "-wsdl:Xsoap1.2", "-d", localOutputDirectory}; + } else { + throw new WebServiceException("The binding " + bindingType + " specified by the " + + "class " + className + " cannot be used to generate a WSDL. Please choose " + + "a supported binding type."); + } + return arguments; + } + + /** + * This method will be used to create a Definition based on the + * WSDL file generated by WsGen. + */ + private HashMap<String, Definition> readInWSDL(String localOutputDirectory) throws Exception { + List<File> wsdlFiles = getWSDLFiles(localOutputDirectory); + HashMap<String, Definition> wsdlDefMap = new HashMap<String, Definition>(); + for (File wsdlFile : wsdlFiles) { + if (wsdlFile != null) { + try { + WSDLFactory wsdlFactory = WSDLFactory.newInstance(); + WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); + InputStream is = wsdlFile.toURL().openStream(); + Definition definition = wsdlReader.readWSDL(localOutputDirectory, + new InputSource(is)); + try { + definition.setDocumentBaseURI(wsdlFile.toURI().toString()); + if (log.isDebugEnabled()) { + log.debug("Set base document URI for generated WSDL: " + + wsdlFile.toURI().toString()); + } + } + catch (Throwable t) { + if (log.isDebugEnabled()) { + log.debug("Could not set base document URI for generated " + + "WSDL: " + wsdlFile.getAbsolutePath() + " : " + + t.toString()); + } + } + wsdlDefMap.put(wsdlFile.getName().toLowerCase(), definition); + } + catch (WSDLException e) { + String msg = "Error occurred while attempting to create Definition from " + + "generated WSDL file {" + wsdlFile.getName() + "}: {" + e + "}"; + log.error(msg); + throw new Exception(msg); + } + catch (IOException e) { + String msg = "Error occurred while attempting to create Definition from " + + "generated WSDL file {" + wsdlFile.getName() + "}: {" + e + "}"; + log.error(msg); + throw new Exception(msg); + } + } + } + return wsdlDefMap; + } + + /** + * This method will be used to locate the WSDL file that was + * generated by WsGen. There should be only one file with the + * ".wsdl" extension in this directory. + */ + private List<File> getWSDLFiles(String localOutputDirectory) { + File classDirectory = new File(localOutputDirectory); + ArrayList<File> wsdlFiles = new ArrayList<File>(); + if (classDirectory.isDirectory()) { + File[] files = classDirectory.listFiles(); + for (File file : files) { + String fileName = file.getName(); + if (fileName.endsWith(".wsdl")) { + if (log.isDebugEnabled()) { + log.debug("Located generated WSDL file: " + fileName); + } + wsdlFiles.add(file); + } + } + } + return wsdlFiles; + } + + /** + * This file will create the directory we will use as the output + * directory argument in our call to WsGen. + */ + private void createOutputDirectory(String localOutputDirectory) { + File directory = new File(localOutputDirectory); + if (!directory.isDirectory()) { + directory.mkdirs(); + } + } + + /** + * This method will read in all of the schema files that were generated + * for a given application. + */ + private HashMap<String, XmlSchema> readInSchema(String localOutputDirectory) throws Exception { + try { + + XmlSchemaCollection schemaCollection = new XmlSchemaCollection(); + schemaCollection.setBaseUri(new File(localOutputDirectory).getAbsolutePath()); + + + HashMap<String, XmlSchema> docMap = new HashMap<String, XmlSchema>(); + List<File> schemaFiles = getSchemaFiles(localOutputDirectory); + for (File schemaFile : schemaFiles) { + XmlSchema doc = schemaCollection.read(new InputSource(schemaFile.toURL().toString()), null); + if (log.isDebugEnabled()) { + log.debug("Read in schema file: " + schemaFile.getName()); + } + docMap.put(schemaFile.getName(), doc); + } + return docMap; + } + catch (Exception e) { + String msg = + "Error occurred while attempting to read generated schema file {" + e + "}"; + log.error(msg); + throw new Exception(msg); + } + } + + /** + * This method will return a list of file objects that represent all the + * schema files in the current directory. + */ + private List<File> getSchemaFiles(String localOutputDirectory) { + ArrayList<File> schemaFiles = new ArrayList<File>(); + File classDirectory = new File(localOutputDirectory); + if (classDirectory.isDirectory()) { + File[] files = classDirectory.listFiles(); + for (File file : files) { + String fileName = file.getName(); + if (fileName.endsWith(".xsd")) { + if (log.isDebugEnabled()) { + log.debug("Located generated schema file: " + fileName); + } + schemaFiles.add(file); + } + } + } + return schemaFiles; + } + + public Definition getWSDL(AxisService service) throws AxisFault { + initialize(); + return wsdlDefMap.values().iterator().next(); + } + + private synchronized void initialize() { + String className = (String) axisService.getParameter(Constants.SERVICE_CLASS).getValue(); + if (!init) { + generateWsdl(className, SOAPBinding.SOAP11HTTP_BINDING); + init = true; + } + } + + public XmlSchema getSchema(AxisService service, String xsd) throws AxisFault { + XmlSchema schema = docMap.get(xsd); + if (schema == null) { + docMap.values().iterator().next(); + } + return schema; + } +} \ No newline at end of file Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/ClassLoaderUtils.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/ClassLoaderUtils.java?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/ClassLoaderUtils.java (original) +++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/util/ClassLoaderUtils.java Thu Feb 7 05:36:48 2008 @@ -19,26 +19,40 @@ package org.apache.axis2.jaxws.util; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - import org.apache.axis2.java.security.AccessController; import org.apache.axis2.jaxws.ExceptionFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.URLDecoder; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.HashSet; +import java.util.StringTokenizer; +import java.util.Iterator; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.jar.Manifest; + public class ClassLoaderUtils { private static final Log log = LogFactory.getLog(ClassLoaderUtils.class); - - private ClassLoaderUtils() { - } - - /** @return ClassLoader */ + + /** + * @return ClassLoader + */ public static ClassLoader getClassLoader(final Class cls) { ClassLoader cl = null; try { - cl = (ClassLoader)AccessController.doPrivileged( + cl = (ClassLoader) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws ClassNotFoundException { return cls.getClassLoader(); @@ -54,12 +68,14 @@ return cl; } - - /** @return ClassLoader */ + + /** + * @return ClassLoader + */ public static ClassLoader getContextClassLoader(final ClassLoader classLoader) { ClassLoader cl; try { - cl = (ClassLoader)AccessController.doPrivileged( + cl = (ClassLoader) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws ClassNotFoundException { return classLoader != null ? classLoader : Thread.currentThread().getContextClassLoader(); @@ -85,7 +101,7 @@ final ClassLoader classloader) throws ClassNotFoundException { Class cl = null; try { - cl = (Class)AccessController.doPrivileged( + cl = (Class) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws ClassNotFoundException { return Class.forName(className, initialize, classloader); @@ -96,7 +112,7 @@ if (log.isDebugEnabled()) { log.debug("Exception thrown from AccessController: " + e.getMessage(), e); } - throw (ClassNotFoundException)e.getException(); + throw (ClassNotFoundException) e.getException(); } return cl; @@ -110,7 +126,7 @@ public static Class forName(final String className) throws ClassNotFoundException { Class cl = null; try { - cl = (Class)AccessController.doPrivileged( + cl = (Class) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws ClassNotFoundException { return Class.forName(className); @@ -121,10 +137,222 @@ if (log.isDebugEnabled()) { log.debug("Exception thrown from AccessController: " + e.getMessage(), e); } - throw (ClassNotFoundException)e.getException(); + throw (ClassNotFoundException) e.getException(); } return cl; } + /** + * Expand a directory path or list of directory paths (File.pathSeparator + * delimited) into a list of file paths of all the jar files in those + * directories. + * + * @param dirPaths The string containing the directory path or list of + * directory paths. + * @return The file paths of the jar files in the directories. This is an + * empty string if no files were found, and is terminated by an + * additional pathSeparator in all other cases. + */ + public static String expandDirs(String dirPaths) { + StringTokenizer st = new StringTokenizer(dirPaths, File.pathSeparator); + StringBuffer buffer = new StringBuffer(); + while (st.hasMoreTokens()) { + String d = st.nextToken(); + File dir = new File(d); + if (dir.isDirectory()) { + File[] files = dir.listFiles(new JavaArchiveFilter()); + for (int i = 0; i < files.length; i++) { + buffer.append(files[i]).append(File.pathSeparator); + } + } + } + return buffer.toString(); + } + + /** + * Check if this inputstream is a jar/zip + * + * @param is + * @return true if inputstream is a jar + */ + public static boolean isJar(InputStream is) { + try { + JarInputStream jis = new JarInputStream(is); + if (jis.getNextEntry() != null) { + return true; + } + } catch (IOException ioe) { + } + return false; + } + + /** + * Get the default classpath from various thingies in the message context + * + * @param msgContext + * @return default classpath + */ + public static String getDefaultClasspath(String webBase) { + HashSet classpath = new HashSet(); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + fillClassPath(cl, classpath); + + // Just to be safe (the above doesn't seem to return the webapp + // classpath in all cases), manually do this: + if (webBase != null) { + addPath(classpath, webBase + File.separatorChar + "classes"); + try { + String libBase = webBase + File.separatorChar + "lib"; + File libDir = new File(libBase); + String[] jarFiles = libDir.list(); + for (int i = 0; i < jarFiles.length; i++) { + String jarFile = jarFiles[i]; + if (jarFile.endsWith(".jar")) { + addPath(classpath, libBase + + File.separatorChar + + jarFile); + } + } + } catch (Exception e) { + // Oh well. No big deal. + } + } + + // axis.ext.dirs can be used in any appserver + getClassPathFromDirectoryProperty(classpath, "axis.ext.dirs"); + + // classpath used by Jasper + getClassPathFromProperty(classpath, "org.apache.catalina.jsp_classpath"); + + // websphere stuff. + getClassPathFromProperty(classpath, "ws.ext.dirs"); + getClassPathFromProperty(classpath, "com.ibm.websphere.servlet.application.classpath"); + + // java class path + getClassPathFromProperty(classpath, "java.class.path"); + + // Load jars from java external directory + getClassPathFromDirectoryProperty(classpath, "java.ext.dirs"); + + // boot classpath isn't found in above search + getClassPathFromProperty(classpath, "sun.boot.class.path"); + + StringBuffer path = new StringBuffer(); + for (Iterator iterator = classpath.iterator(); iterator.hasNext();) { + String s = (String) iterator.next(); + path.append(s); + path.append(File.pathSeparatorChar); + } + log.info(path); + return path.toString(); + } + + private static void addPath(HashSet classpath, String s) { + String path = s.replace(((File.separatorChar == '/') ? '\\' : '/'), File.separatorChar).trim(); + File file = new File(path); + if (file.exists()) { + path = file.getAbsolutePath(); + classpath.add(path); + } + } + + /** + * Add all files in the specified directory to the classpath + * + * @param classpath + * @param property + */ + private static void getClassPathFromDirectoryProperty(HashSet classpath, String property) { + String dirs = System.getProperty(property); + String path = null; + try { + path = expandDirs(dirs); + } catch (Exception e) { + // Oh well. No big deal. + } + if (path != null) { + addPath(classpath, path); + } + } + + /** + * Add a classpath stored in a property. + * + * @param classpath + * @param property + */ + private static void getClassPathFromProperty(HashSet classpath, String property) { + String path = System.getProperty(property); + if (path != null) { + addPath(classpath, path); + } + } + + /** + * Walk the classloader hierarchy and add to the classpath + * + * @param cl + * @param classpath + */ + private static void fillClassPath(ClassLoader cl, HashSet classpath) { + while (cl != null) { + if (cl instanceof URLClassLoader) { + URL[] urls = ((URLClassLoader) cl).getURLs(); + for (int i = 0; (urls != null) && i < urls.length; i++) { + String path = urls[i].getPath(); + //If it is a drive letter, adjust accordingly. + if (path.length() >= 3 && path.charAt(0) == '/' && path.charAt(2) == ':') + path = path.substring(1); + addPath(classpath, URLDecoder.decode(path)); + + // if its a jar extract Class-Path entries from manifest + File file = new File(urls[i].getFile()); + if (file.isFile()) { + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + if (isJar(fis)) { + JarFile jar = new JarFile(file); + Manifest manifest = jar.getManifest(); + if (manifest != null) { + Attributes attributes = manifest.getMainAttributes(); + if (attributes != null) { + String s = attributes.getValue(Attributes.Name.CLASS_PATH); + String base = file.getParent(); + if (s != null) { + StringTokenizer st = new StringTokenizer(s, " "); + while (st.hasMoreTokens()) { + String t = st.nextToken(); + addPath(classpath, base + File.separatorChar + t); + } + } + } + } + } + } catch (IOException ioe) { + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException ioe2) { + } + } + } + } + } + } + cl = cl.getParent(); + } + } + + /** + * Filter for zip/jar + */ + private static class JavaArchiveFilter implements FileFilter { + public boolean accept(File file) { + String name = file.getName().toLowerCase(); + return (name.endsWith(".jar") || name.endsWith(".zip")); + } + } } Modified: webservices/axis2/trunk/java/modules/parent/pom.xml URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/parent/pom.xml?rev=619407&r1=619406&r2=619407&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/parent/pom.xml (original) +++ webservices/axis2/trunk/java/modules/parent/pom.xml Thu Feb 7 05:36:48 2008 @@ -115,9 +115,10 @@ <intellij.version>5.0</intellij.version> <jalopy.version>1.5rc3</jalopy.version> <jaxb.api.version>2.1</jaxb.api.version> - <jaxbri.version>2.1</jaxbri.version> + <jaxbri.version>2.1.6</jaxbri.version> <jaxen.version>1.1.1</jaxen.version> <jaxme2.version>0.5.2</jaxme2.version> + <jaxws.ri.version>2.1.3</jaxws.ri.version> <jettison.version>1.0-RC2</jettison.version> <jibx.version>1.1.5</jibx.version> <junit.version-jdk1.4>3.8.2</junit.version-jdk1.4> @@ -504,7 +505,7 @@ </repository> <repository> <id>java.net</id> - <url>http://download.java.net/maven/1/</url> + <url>https://maven-repository.dev.java.net/nonav/repository/</url> <layout>legacy</layout> <snapshots> <enabled>false</enabled> @@ -932,6 +933,61 @@ <artifactId>xercesImpl</artifactId> <version>${xerces.version}</version> </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-rt</artifactId> + <version>${jaxws.ri.version}</version> + <exclusions> + <exclusion> + <groupId>javax.xml.ws</groupId> + <artifactId>jaxws-api</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-impl</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.xml.messaging.saaj</groupId> + <artifactId>saaj-impl</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.xml.stream.buffer</groupId> + <artifactId>streambuffer</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.xml.stream</groupId> + <artifactId>sjsxp</artifactId> + </exclusion> + <exclusion> + <groupId>org.jvnet.staxex</groupId> + <artifactId>stax-ex</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.org.apache.xml.internal</groupId> + <artifactId>resolver</artifactId> + </exclusion> + <exclusion> + <groupId>org.jvnet</groupId> + <artifactId>mimepull</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-tools</artifactId> + <version>${jaxws.ri.version}</version> + <scope>provided</scope> + <exclusions> + <exclusion> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-rt</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-xjc</artifactId> + </exclusion> + </exclusions> + </dependency> </dependencies> </dependencyManagement> <!-- Top level dependencies that will be needed in all sub mvn modules --> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]