antelder 2003/03/25 02:07:17
Added: java/src/org/apache/wsif/tools WSDL2WSDL.java Log: First cut at a tool to add new bindings to a WSDL document Revision Changes Path 1.1 xml-axis-wsif/java/src/org/apache/wsif/tools/WSDL2WSDL.java Index: WSDL2WSDL.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "WSIF" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 2001, 2002, International * Business Machines, Inc., http://www.apache.org. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.wsif.tools; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import javax.wsdl.Definition; import javax.wsdl.WSDLException; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLWriter; import org.apache.axis.utils.CLArgsParser; import org.apache.axis.utils.CLOption; import org.apache.axis.utils.CLOptionDescriptor; import org.apache.axis.utils.CLUtil; import org.apache.wsif.WSIFException; import org.apache.wsif.tools.tojava.JavaBindingGenerator; import org.apache.wsif.util.WSIFUtils; /** * WSIF WSDL2WSDL Utility program * * Add new WSDL bindings to a WSDL file * * TODO: Support bindings for all WSIF providers, ideally * by designing a way for each provider to add its * own binding. * * Based on the Apache AXIS Java2WSDL class by Ravi Kumar and Rich Scheuerle * * @author <a href="mailto:[EMAIL PROTECTED]">Ant Elder</a> */ public class WSDL2WSDL { // input WSDL to read protected String wsdlURI; // new WSDL file to be written protected String outputWSDLName; // where to write the output WSDL protected String outputDirectory; // the binding types to be added to the WSDL protected ArrayList requestedBindings; protected static final String JAVA_BINDING = "java"; protected static final ArrayList AVAILABLE_BINDINGS = new ArrayList(Arrays.asList(new Object[] { JAVA_BINDING })); // Define the short one-letter option identifiers. protected static final int HELP_OPT = 'h'; protected static final int BINDINGS_OPT = 'b'; protected static final int OUTPUT_DIR_OPT = 'o'; protected static final int OUTPUT_WSDL_OPT = 'n'; /** * Define the understood options. Each CLOptionDescriptor contains: * - The "long" version of the option. Eg, "help" means that "--help" will * be recognised. * - The option flags, governing the option's argument(s). * - The "short" version of the option. Eg, 'h' means that "-h" will be * recognised. * - A description of the option for the usage message */ protected CLOptionDescriptor[] options = new CLOptionDescriptor[] { new CLOptionDescriptor( "help", CLOptionDescriptor.ARGUMENT_DISALLOWED, HELP_OPT, "print usage information"), new CLOptionDescriptor( "outputWSDL", CLOptionDescriptor.ARGUMENT_REQUIRED, OUTPUT_WSDL_OPT, "the name of the new WSDL file"), new CLOptionDescriptor( "bindings", CLOptionDescriptor.ARGUMENT_REQUIRED, BINDINGS_OPT, "comma seperated list of binding types to add to the WSDL"), new CLOptionDescriptor( "output", CLOptionDescriptor.ARGUMENT_REQUIRED, OUTPUT_DIR_OPT, "output directory for the updated WSDL")}; /** * WSDL2WSDL constructor */ public WSDL2WSDL() { requestedBindings = new ArrayList(); } /** * Add all the requested bindings to the WSDL */ protected void addBindings(Definition def) { if (requestedBindings.contains(JAVA_BINDING)) { JavaBindingGenerator.addJAVABinding(def); } } /** * Parse an option * @param option CLOption is the option */ protected boolean parseOption(CLOption option) { String value; boolean status = true; switch (option.getId()) { case CLOption.TEXT_ARGUMENT : if (wsdlURI != null) { System.out.println( "duplicate WSDL specified:" + option.getArgument()); printUsage(); status = false; // error } wsdlURI = option.getArgument(); break; case HELP_OPT : printUsage(); status = false; break; case OUTPUT_WSDL_OPT : outputWSDLName = option.getArgument(); break; case OUTPUT_DIR_OPT : outputDirectory = option.getArgument(); break; case BINDINGS_OPT : if (!parseBindingOptions(option)) { printUsage(); status = false; // error } break; default : break; } return status; } /** * Extracts the binding types to be added from the CLOption string */ protected boolean parseBindingOptions(CLOption option) { boolean ok = true; String bindings = option.getArgument(); StringTokenizer st = new StringTokenizer(bindings, ","); while (st.hasMoreTokens()) { String binding = st.nextToken(); if (!AVAILABLE_BINDINGS.contains(binding.toLowerCase())) { System.err.println("invalid binding: " + binding); ok = false; } else if (requestedBindings.contains(binding.toLowerCase())) { System.err.println("duplicate binding: " + binding); ok = false; } else { requestedBindings.add(binding.toLowerCase()); } } return ok; } /** * validateOptions * This method is invoked after the options are set to validate * the option settings. */ protected boolean validateOptions() { boolean ok = true; if (wsdlURI == null || wsdlURI.length() < 1) { System.err.println("must specify a WSDL URI"); ok = false; } if (requestedBindings.size() < 1) { System.err.println("must specify atleast one binding to add"); ok = false; } if (ok) { if (outputWSDLName == null || outputWSDLName.length() < 1) { int i = wsdlURI.lastIndexOf(File.separatorChar); if (i > -1) { outputWSDLName = wsdlURI.substring(i + 1); } else { outputWSDLName = wsdlURI; } } } return ok; } /** * run * checks the command-line arguments and runs the tool. * @param args String[] command-line arguments. */ protected int run(String[] args) { // Parse the arguments CLArgsParser argsParser = new CLArgsParser(args, options); // Print parser errors, if any if (null != argsParser.getErrorString()) { System.err.println(argsParser.getErrorString()); printUsage(); return (1); } // Get a list of parsed options List clOptions = argsParser.getArguments(); // Parse the options and configure as appropriate. for (int i = 0; i < clOptions.size(); i++) { if (parseOption((CLOption) clOptions.get(i)) == false) { printUsage(); return (1); } } // validate argument combinations if (validateOptions() == false) { printUsage(); return (1); } // read in the existing WSDL file Definition def = null; try { def = readWSDL(wsdlURI); } catch (WSIFException e) { System.err.println("Exception reading WSDL file: " + e); e.printStackTrace(); System.exit(1); } // do the work of adding new bindings addBindings(def); // write out the new WSDL file try { writeWSDL(def, outputDirectory, outputWSDLName); } catch (WSIFException e) { System.err.println("Exception writing WSDL file: " + e); e.printStackTrace(); System.exit(1); } // everything is good return (0); } // run /** * Utility Class to get the current class name */ protected static class FindThisClassName extends SecurityManager { public String getName() { return getClassContext()[1].getName(); } } /** * Reads a WSDL file into a WSDL4J Definition object */ protected Definition readWSDL(String wsdlFileURI) throws WSIFException { System.out.println("reading WSDL: " + wsdlFileURI); Definition def = null; try { def = WSIFUtils.readWSDL(null, wsdlFileURI); } catch (WSDLException e) { throw new WSIFException( "exception reading WSDL '" + wsdlFileURI + "'", e); } return def; } /** * Writes a WSDL Definition object to a file */ private void writeWSDL(Definition def, String dir, String fileName) throws WSIFException { try { WSDLFactory factory = WSDLFactory.newInstance(); WSDLWriter wsdlWriter = factory.newWSDLWriter(); File file; if (dir != null && dir.length() > 0) { file = new File(dir.replace('.', '/')); file.mkdirs(); file = new File(file, fileName); } else { file = new File(fileName); } try { file.createNewFile(); } catch (IOException e) { // ignored, writeWSDL call below will report any error } System.out.println("writing WSDL: " + file); FileWriter out = new FileWriter(file); wsdlWriter.writeWSDL(def, out); out.close(); } catch (Exception e) { throw new WSIFException("exception writing WSDL", e); } } /** * Prints help on how to use this */ private void printUsage() { String thisClassName = new FindThisClassName().getName(); System.err.println( "Usage: java " + thisClassName + " <options>" + " inputWSDLURI"); System.err.println("where posible options include:"); System.err.println(CLUtil.describeOptions(options).toString()); System.err.print("available binding types to add are: "); for (Iterator i = AVAILABLE_BINDINGS.iterator(); i.hasNext();) { System.err.print(i.next()); if (i.hasNext()) { System.err.print(", "); } } System.exit(1); } /** * Front end for the WSIF WSDL utilities */ public static void main(String[] args) { WSDL2WSDL wsdl2wsdl = new WSDL2WSDL(); System.exit(wsdl2wsdl.run(args)); } }
