001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.ws.java2wsdl;
020:
021: import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOption;
022: import org.apache.axis2.description.java2wsdl.Java2WSDLConstants;
023: import org.apache.axis2.description.java2wsdl.Java2WSDLUtils;
024:
025: import java.io.File;
026: import java.io.FileOutputStream;
027: import java.io.IOException;
028: import java.net.MalformedURLException;
029: import java.net.URL;
030: import java.net.URLClassLoader;
031: import java.util.ArrayList;
032: import java.util.Hashtable;
033: import java.util.Map;
034:
035: public class Java2WSDLCodegenEngine implements Java2WSDLConstants {
036: private Java2WSDLBuilder java2WsdlBuilder;
037: public static final String WSDL_FILENAME_SUFFIX = ".wsdl";
038: public static final String COMMA = ",";
039:
040: public Java2WSDLCodegenEngine(Map optionsMap) throws Exception {
041: //create a new Java2WSDLBuilder and populate it
042: Java2WSDLCommandLineOption option = loadOption(
043: Java2WSDLConstants.CLASSNAME_OPTION,
044: Java2WSDLConstants.CLASSNAME_OPTION_LONG, optionsMap);
045: String className = option == null ? null : option
046: .getOptionValue();
047:
048: if (className == null || className.length() == 0) {
049: throw new Exception("class name must be present!");
050: }
051:
052: //Now we are done with loading the basic values - time to create the builder
053: java2WsdlBuilder = new Java2WSDLBuilder(resolveOutputStream(
054: className, optionsMap), className,
055: resolveClassLoader(optionsMap));
056:
057: configureJava2WSDLBuilder(optionsMap, className);
058: }
059:
060: public void generate() throws Exception {
061: try {
062: java2WsdlBuilder.generateWSDL();
063: } catch (Exception e) {
064: throw new Exception(e);
065: }
066: }
067:
068: private FileOutputStream resolveOutputStream(String className,
069: Map optionsMap) throws Exception {
070: Java2WSDLCommandLineOption option = loadOption(
071: Java2WSDLConstants.OUTPUT_LOCATION_OPTION,
072: Java2WSDLConstants.OUTPUT_LOCATION_OPTION_LONG,
073: optionsMap);
074: String outputFolderName = option == null ? System
075: .getProperty("user.dir") : option.getOptionValue();
076:
077: File outputFolder;
078: outputFolder = new File(outputFolderName);
079: if (!outputFolder.exists()) {
080: outputFolder.mkdirs();
081: } else if (!outputFolder.isDirectory()) {
082: throw new Exception("The specivied location "
083: + outputFolderName + "is not a folder");
084: }
085:
086: option = loadOption(Java2WSDLConstants.OUTPUT_FILENAME_OPTION,
087: Java2WSDLConstants.OUTPUT_FILENAME_OPTION_LONG,
088: optionsMap);
089: String outputFileName = option == null ? null : option
090: .getOptionValue();
091: //derive a file name from the class name if the filename is not specified
092: if (outputFileName == null) {
093: outputFileName = Java2WSDLUtils
094: .getSimpleClassName(className)
095: + WSDL_FILENAME_SUFFIX;
096: }
097:
098: //first create a file in the given location
099: File outputFile = new File(outputFolder, outputFileName);
100: FileOutputStream out;
101: try {
102: if (!outputFile.exists()) {
103: outputFile.createNewFile();
104: }
105: out = new FileOutputStream(outputFile);
106: } catch (IOException e) {
107: throw new Exception(e);
108: }
109:
110: return out;
111: }
112:
113: private ClassLoader resolveClassLoader(Map optionsMap)
114: throws Exception {
115: // if the class path is present, create a URL class loader with those
116: //class path entries present. if not just take the TCCL
117: Java2WSDLCommandLineOption option = loadOption(
118: Java2WSDLConstants.CLASSPATH_OPTION,
119: Java2WSDLConstants.CLASSPATH_OPTION_LONG, optionsMap);
120:
121: ClassLoader classLoader;
122:
123: if (option != null) {
124: ArrayList optionValues = option.getOptionValues();
125: URL[] urls = new URL[optionValues.size()];
126: String[] classPathEntries = (String[]) optionValues
127: .toArray(new String[optionValues.size()]);
128:
129: try {
130: for (int i = 0; i < classPathEntries.length; i++) {
131: String classPathEntry = classPathEntries[i];
132: //this should be a file(or a URL)
133: if (Java2WSDLUtils.isURL(classPathEntry)) {
134: urls[i] = new URL(classPathEntry);
135: } else {
136: urls[i] = new File(classPathEntry).toURL();
137: }
138: }
139: } catch (MalformedURLException e) {
140: throw new Exception(e);
141: }
142:
143: classLoader = new URLClassLoader(urls, Thread
144: .currentThread().getContextClassLoader());
145:
146: } else {
147: classLoader = Thread.currentThread()
148: .getContextClassLoader();
149: }
150:
151: return classLoader;
152: }
153:
154: private void configureJava2WSDLBuilder(Map optionsMap,
155: String className) throws Exception {
156: //set the other parameters to the builder
157: Java2WSDLCommandLineOption option = loadOption(
158: Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_OPTION,
159: Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_OPTION_LONG,
160: optionsMap);
161: java2WsdlBuilder.setSchemaTargetNamespace(option == null ? null
162: : option.getOptionValue());
163:
164: option = loadOption(
165: Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_PREFIX_OPTION,
166: Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_PREFIX_OPTION_LONG,
167: optionsMap);
168: java2WsdlBuilder
169: .setSchemaTargetNamespacePrefix(option == null ? null
170: : option.getOptionValue());
171:
172: option = loadOption(Java2WSDLConstants.TARGET_NAMESPACE_OPTION,
173: Java2WSDLConstants.TARGET_NAMESPACE_OPTION_LONG,
174: optionsMap);
175: java2WsdlBuilder.setTargetNamespace(option == null ? null
176: : option.getOptionValue());
177:
178: option = loadOption(
179: Java2WSDLConstants.TARGET_NAMESPACE_PREFIX_OPTION,
180: Java2WSDLConstants.TARGET_NAMESPACE_PREFIX_OPTION_LONG,
181: optionsMap);
182: java2WsdlBuilder.setTargetNamespacePrefix(option == null ? null
183: : option.getOptionValue());
184:
185: option = loadOption(Java2WSDLConstants.SERVICE_NAME_OPTION,
186: Java2WSDLConstants.SERVICE_NAME_OPTION_LONG, optionsMap);
187: java2WsdlBuilder.setServiceName(option == null ? Java2WSDLUtils
188: .getSimpleClassName(className) : option
189: .getOptionValue());
190:
191: option = loadOption(Java2WSDLConstants.STYLE_OPTION,
192: Java2WSDLConstants.STYLE_OPTION, optionsMap);
193: if (option != null) {
194: java2WsdlBuilder.setStyle(option.getOptionValue());
195: }
196:
197: option = loadOption(Java2WSDLConstants.LOCATION_OPTION,
198: Java2WSDLConstants.LOCATION_OPTION, optionsMap);
199: if (option != null) {
200: java2WsdlBuilder.setLocationUri(option.getOptionValue());
201: }
202:
203: option = loadOption(Java2WSDLConstants.USE_OPTION,
204: Java2WSDLConstants.USE_OPTION, optionsMap);
205: if (option != null) {
206: java2WsdlBuilder.setUse(option.getOptionValue());
207: }
208:
209: option = loadOption(
210: Java2WSDLConstants.ATTR_FORM_DEFAULT_OPTION,
211: Java2WSDLConstants.ATTR_FORM_DEFAULT_OPTION_LONG,
212: optionsMap);
213: java2WsdlBuilder.setAttrFormDefault(option == null ? null
214: : option.getOptionValue());
215:
216: option = loadOption(
217: Java2WSDLConstants.ELEMENT_FORM_DEFAULT_OPTION,
218: Java2WSDLConstants.ELEMENT_FORM_DEFAULT_OPTION_LONG,
219: optionsMap);
220: java2WsdlBuilder.setElementFormDefault(option == null ? null
221: : option.getOptionValue());
222:
223: option = loadOption(
224: Java2WSDLConstants.EXTRA_CLASSES_DEFAULT_OPTION,
225: Java2WSDLConstants.EXTRA_CLASSES_DEFAULT_OPTION_LONG,
226: optionsMap);
227: java2WsdlBuilder
228: .setExtraClasses(option == null ? new ArrayList()
229: : option.getOptionValues());
230:
231: option = loadOption(
232: Java2WSDLConstants.NAMESPACE_GENERATOR_OPTION,
233: Java2WSDLConstants.NAMESPACE_GENERATOR_OPTION_LONG,
234: optionsMap);
235: if (option != null) {
236: java2WsdlBuilder.setNsGenClassName(option.getOptionValue());
237: }
238:
239: option = loadOption(Java2WSDLConstants.SCHEMA_GENERATOR_OPTION,
240: Java2WSDLConstants.SCHEMA_GENERATOR_OPTION_LONG,
241: optionsMap);
242: if (option != null) {
243: java2WsdlBuilder.setSchemaGenClassName(option
244: .getOptionValue());
245: }
246:
247: option = loadOption(Java2WSDLConstants.JAVA_PKG_2_NSMAP_OPTION,
248: Java2WSDLConstants.JAVA_PKG_2_NSMAP_OPTION_LONG,
249: optionsMap);
250: java2WsdlBuilder.setPkg2nsMap(loadJavaPkg2NamespaceMap(option));
251:
252: option = loadOption(Java2WSDLConstants.WSDL_VERSION_OPTION,
253: Java2WSDLConstants.WSDL_VERSION_OPTION_LONG, optionsMap);
254: if (option != null) {
255: String optionValue = option.getOptionValue();
256: if (Java2WSDLConstants.WSDL_VERSION_2.equals(optionValue)
257: || Java2WSDLConstants.WSDL_VERSION_2_OPTIONAL
258: .equals(optionValue)) {
259: //users can say either 2.0 or 2 - we just set it to the constant
260: java2WsdlBuilder
261: .setWSDLVersion(Java2WSDLConstants.WSDL_VERSION_2);
262: } //ignore the other cases - they'll be taken as 1.1
263: }
264:
265: option = loadOption(Java2WSDLConstants.DOC_LIT_BARE,
266: Java2WSDLConstants.DOC_LIT_BARE_LONG, optionsMap);
267: if (option != null) {
268: java2WsdlBuilder.setGenerateDocLitBare(true);
269: }
270: }
271:
272: private Java2WSDLCommandLineOption loadOption(String shortOption,
273: String longOption, Map options) {
274: //short option gets precedence
275: Java2WSDLCommandLineOption option = null;
276: if (longOption != null) {
277: option = (Java2WSDLCommandLineOption) options
278: .get(longOption);
279: if (option != null) {
280: return option;
281: }
282: }
283: if (shortOption != null) {
284: option = (Java2WSDLCommandLineOption) options
285: .get(shortOption);
286: }
287:
288: return option;
289: }
290:
291: protected void addToSchemaLocationMap(String optionValue)
292: throws Exception {
293:
294: }
295:
296: protected Map loadJavaPkg2NamespaceMap(
297: Java2WSDLCommandLineOption option) {
298: Map pkg2nsMap = new Hashtable();
299: if (option != null) {
300: ArrayList optionValues = option.getOptionValues();
301: String anOptionValue;
302: for (int count = 0; count < optionValues.size(); ++count) {
303: anOptionValue = ((String) optionValues.get(count))
304: .trim();
305:
306: //an option value will be of the form [java package, namespace]
307: //hence we take the two substrings starting after '[' and upto ',' and
308: //starting after ',' and upto ']'
309: pkg2nsMap.put(anOptionValue.substring(1,
310: anOptionValue.indexOf(COMMA)).trim(),
311: anOptionValue.substring(
312: anOptionValue.indexOf(COMMA) + 1,
313: anOptionValue.length() - 1).trim());
314: }
315: }
316: return pkg2nsMap;
317: }
318: }
|