Java tutorial
/* * Copyright (c) 2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * 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.wso2.carbon.java2wsdl; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ws.java2wsdl.Java2WSDLCodegenEngine; import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOptionParser; import org.apache.ws.java2wsdl.utils.Java2WSDLOptionsValidator; import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOption; import org.wso2.carbon.utils.WSO2Constants; import java.io.File; import java.io.FileFilter; import java.net.URL; import java.net.URLClassLoader; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Hashtable; /** * This class will generate a WSDL, either version 1.1 or 2.0 for a given java bytecode. Underline * implementation uses org.apache.ws.java2wsdl.Java2WSDLCodegenEngine. */ public class Java2WSDL { private static Log log = LogFactory.getLog(Java2WSDL.class); /** * This will generate the WSDL document and output a Id. User has to send this Id to the * filedownload hadler to extract the wsdl document. * * @param options array of options * @return String id * @throws AxisFault will be thrown */ private String java2wsdl(String[] options) throws AxisFault { String uuid = String.valueOf(System.currentTimeMillis() + Math.random()); String wsdlOutputDir = MessageContext.getCurrentMessageContext().getConfigurationContext() .getProperty(WSO2Constants.WORK_DIR) + File.separator + "tools_wsdlview" + File.separator + uuid + File.separator; ArrayList<String> optionsList = new ArrayList<String>(); boolean isXCAvailable = false; String xcValue = ""; for (String option : options) { if (option.equalsIgnoreCase("-xc")) { isXCAvailable = true; continue; } if (isXCAvailable) { xcValue = option; isXCAvailable = false; continue; } optionsList.add(option); } optionsList.add("-o"); optionsList.add(wsdlOutputDir); optionsList.add("-of"); optionsList.add(uuid + ".xml"); parseXC(xcValue, optionsList); String[] args = optionsList.toArray(new String[optionsList.size()]); Java2WSDLCommandLineOptionParser commandLineOptionParser = new Java2WSDLCommandLineOptionParser(args); try { Map allOptions = commandLineOptionParser.getAllOptions(); List list = commandLineOptionParser.getInvalidOptions(new Java2WSDLOptionsValidator()); if (list.size() > 0) { String faultOptions = ""; for (Object aList : list) { Java2WSDLCommandLineOption commandLineOption = (Java2WSDLCommandLineOption) aList; String optionValue = commandLineOption.getOptionValue(); faultOptions += "Invalid input for [ " + commandLineOption.getOptionType() + (optionValue != null ? " : " + optionValue + " ]" : " ]") + "\n"; } log.error(faultOptions); throw new AxisFault(faultOptions); } new Java2WSDLCodegenEngine(allOptions).generate(); } catch (Exception e) { String rootMsg = Java2WSDL.class.getName() + " Exception has occured."; Throwable throwable = e.getCause(); if (throwable != null) { String tmpMsg = throwable.toString(); if (tmpMsg.indexOf("org.apache.axis2.AxisFault") > -1) { tmpMsg = "Please provide the correct inputs to either -p2n or -xc"; log.error(tmpMsg, throwable); throw new AxisFault(tmpMsg); } log.error(rootMsg, throwable); throw new AxisFault(throwable.toString()); } String tmpMsg = e.toString(); if (tmpMsg.indexOf("java.lang.StringIndexOutOfBoundsException") > -1) { tmpMsg = "Please provide the correct inputs to either -p2n or -xc"; log.error(tmpMsg, e); throw new AxisFault(tmpMsg); } log.error(rootMsg, e); throw AxisFault.makeFault(e); } Map fileResourcesMap = (Map) MessageContext.getCurrentMessageContext().getConfigurationContext() .getProperty(WSO2Constants.FILE_RESOURCE_MAP); if (fileResourcesMap == null) { fileResourcesMap = new Hashtable(); MessageContext.getCurrentMessageContext().getConfigurationContext() .setProperty(WSO2Constants.FILE_RESOURCE_MAP, fileResourcesMap); } File[] files = new File(wsdlOutputDir).listFiles(new FileFilter() { public boolean accept(File f) { return f.getName().endsWith(".xml"); } }); if ((files != null) && (files[0] != null) && (files[0].getAbsoluteFile() != null)) { fileResourcesMap.put(uuid, files[0].getAbsoluteFile().getAbsolutePath()); } return "../../filedownload?id=" + uuid; } /** * This is the fall though method for wsdlview. This will check for required resources. * * @param options options array * @param uuids uuid array * @return String id * @throws AxisFault will be thrown. */ public String java2wsdlWithResources(String[] options, String[] uuids) throws AxisFault { ClassLoader prevCl = Thread.currentThread().getContextClassLoader(); try { URL[] urls = new URL[uuids.length]; for (int i = 0; i < uuids.length; i++) { urls[i] = new File(uuids[i]).toURL(); } ClassLoader newCl = URLClassLoader.newInstance(urls, prevCl); Thread.currentThread().setContextClassLoader(newCl); return java2wsdl(options); } catch (MalformedURLException e) { throw AxisFault.makeFault(e); } finally { Thread.currentThread().setContextClassLoader(prevCl); } } private void parseXC(String value, ArrayList<String> options) { if (value == null || value.length() == 0) { return; } String[] tokens = value.split(","); for (String token : tokens) { if (token != null && token.length() != 0) { options.add("-xc"); options.add(token); } } } }