src/share/jaxws_classes/com/sun/tools/internal/ws/wscompile/WsgenOptions.java

changeset 0
373ffda63c9a
child 637
9c07ef4934dd
equal deleted inserted replaced
-1:000000000000 0:373ffda63c9a
1 /*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.tools.internal.ws.wscompile;
27
28 import com.sun.tools.internal.ws.api.WsgenExtension;
29 import com.sun.tools.internal.ws.api.WsgenProtocol;
30 import com.sun.tools.internal.ws.resources.WscompileMessages;
31 import com.sun.xml.internal.ws.api.BindingID;
32 import com.sun.xml.internal.ws.binding.SOAPBindingImpl;
33 import com.sun.xml.internal.ws.util.ServiceFinder;
34
35 import javax.jws.WebService;
36 import javax.xml.namespace.QName;
37 import java.io.File;
38 import java.util.ArrayList;
39 import java.util.LinkedHashMap;
40 import java.util.LinkedHashSet;
41 import java.util.List;
42 import java.util.Map;
43 import java.util.Set;
44
45 /**
46 * @author Vivek Pandey
47 */
48 public class WsgenOptions extends Options {
49 /**
50 * -servicename
51 */
52 public QName serviceName;
53
54 /**
55 * -portname
56 */
57 public QName portName;
58
59 /**
60 * -r
61 */
62 public File nonclassDestDir;
63
64
65 /**
66 * -wsdl
67 */
68 public boolean genWsdl;
69
70 /**
71 * -inlineSchemas
72 */
73 public boolean inlineSchemas;
74
75 /**
76 * protocol value
77 */
78 public String protocol = "soap1.1";
79
80 public Set<String> protocols = new LinkedHashSet<String>();
81 public Map<String, String> nonstdProtocols = new LinkedHashMap<String, String>();
82
83 /**
84 * -XwsgenReport
85 */
86 public File wsgenReport;
87
88 /**
89 * -Xdonotoverwrite
90 */
91 public boolean doNotOverWrite;
92
93 /**
94 * Tells if user specified a specific protocol
95 */
96 public boolean protocolSet = false;
97
98 /**
99 * <code>-x file1 -x file2 ...<code/><br />
100 * Files to be parsed to get classes' metadata in addition/instead of using annotations and reflection API
101 */
102 public List<String> externalMetadataFiles = new ArrayList<String>();
103
104 private static final String SERVICENAME_OPTION = "-servicename";
105 private static final String PORTNAME_OPTION = "-portname";
106 private static final String HTTP = "http";
107 private static final String SOAP11 = "soap1.1";
108 public static final String X_SOAP12 = "Xsoap1.2";
109
110 public WsgenOptions() {
111 protocols.add(SOAP11);
112 protocols.add(X_SOAP12);
113 nonstdProtocols.put(X_SOAP12, SOAPBindingImpl.X_SOAP12HTTP_BINDING);
114 ServiceFinder<WsgenExtension> extn = ServiceFinder.find(WsgenExtension.class);
115 for(WsgenExtension ext : extn) {
116 Class clazz = ext.getClass();
117 WsgenProtocol pro = (WsgenProtocol)clazz.getAnnotation(WsgenProtocol.class);
118 protocols.add(pro.token());
119 nonstdProtocols.put(pro.token(), pro.lexical());
120 }
121 }
122
123 @Override
124 protected int parseArguments(String[] args, int i) throws BadCommandLineException {
125
126 int j = super.parseArguments(args, i);
127 if (args[i].equals(SERVICENAME_OPTION)) {
128 serviceName = QName.valueOf(requireArgument(SERVICENAME_OPTION, args, ++i));
129 if (serviceName.getNamespaceURI() == null || serviceName.getNamespaceURI().length() == 0) {
130 throw new BadCommandLineException(WscompileMessages.WSGEN_SERVICENAME_MISSING_NAMESPACE(args[i]));
131 }
132 if (serviceName.getLocalPart() == null || serviceName.getLocalPart().length() == 0) {
133 throw new BadCommandLineException(WscompileMessages.WSGEN_SERVICENAME_MISSING_LOCALNAME(args[i]));
134 }
135 return 2;
136 } else if (args[i].equals(PORTNAME_OPTION)) {
137 portName = QName.valueOf(requireArgument(PORTNAME_OPTION, args, ++i));
138 if (portName.getNamespaceURI() == null || portName.getNamespaceURI().length() == 0) {
139 throw new BadCommandLineException(WscompileMessages.WSGEN_PORTNAME_MISSING_NAMESPACE(args[i]));
140 }
141 if (portName.getLocalPart() == null || portName.getLocalPart().length() == 0) {
142 throw new BadCommandLineException(WscompileMessages.WSGEN_PORTNAME_MISSING_LOCALNAME(args[i]));
143 }
144 return 2;
145 } else if (args[i].equals("-r")) {
146 nonclassDestDir = new File(requireArgument("-r", args, ++i));
147 if (!nonclassDestDir.exists()) {
148 throw new BadCommandLineException(WscompileMessages.WSCOMPILE_NO_SUCH_DIRECTORY(nonclassDestDir.getPath()));
149 }
150 return 2;
151 } else if (args[i].startsWith("-wsdl")) {
152 genWsdl = true;
153 //String value = requireArgument("-wsdl", args, ++i).substring(5);
154 String value = args[i].substring(5);
155 int index = value.indexOf(':');
156 if (index == 0) {
157 value = value.substring(1);
158 index = value.indexOf('/');
159 if (index == -1) {
160 protocol = value;
161 } else {
162 protocol = value.substring(0, index);
163 }
164 protocolSet = true;
165 }
166 return 1;
167 } else if (args[i].equals("-XwsgenReport")) {
168 // undocumented switch for the test harness
169 wsgenReport = new File(requireArgument("-XwsgenReport", args, ++i));
170 return 2;
171 } else if (args[i].equals("-Xdonotoverwrite")) {
172 doNotOverWrite = true;
173 return 1;
174 } else if (args[i].equals("-inlineSchemas")) {
175 inlineSchemas = true;
176 return 1;
177 } else if ("-x".equals(args[i])) {
178 externalMetadataFiles.add(requireArgument("-x", args, ++i));
179 return 1;
180 }
181
182 return j;
183 }
184
185
186 @Override
187 protected void addFile(String arg) {
188 endpoints.add(arg);
189 }
190
191 List<String> endpoints = new ArrayList<String>();
192
193 public Class endpoint;
194
195
196 private boolean isImplClass;
197
198 public void validate() throws BadCommandLineException {
199 if(nonclassDestDir == null)
200 nonclassDestDir = destDir;
201
202 if (!protocols.contains(protocol)) {
203 throw new BadCommandLineException(WscompileMessages.WSGEN_INVALID_PROTOCOL(protocol, protocols));
204 }
205
206 if (endpoints.isEmpty()) {
207 throw new BadCommandLineException(WscompileMessages.WSGEN_MISSING_FILE());
208 }
209 if (protocol == null || protocol.equalsIgnoreCase(X_SOAP12) && !isExtensionMode()) {
210 throw new BadCommandLineException(WscompileMessages.WSGEN_SOAP_12_WITHOUT_EXTENSION());
211 }
212
213 if (nonstdProtocols.containsKey(protocol) && !isExtensionMode()) {
214 throw new BadCommandLineException(WscompileMessages.WSGEN_PROTOCOL_WITHOUT_EXTENSION(protocol));
215 }
216 if (inlineSchemas && !genWsdl) {
217 throw new BadCommandLineException(WscompileMessages.WSGEN_INLINE_SCHEMAS_ONLY_WITH_WSDL());
218 }
219
220 validateEndpointClass();
221 validateArguments();
222 }
223 /**
224 * Get an implementation class annotated with @WebService annotation.
225 */
226 private void validateEndpointClass() throws BadCommandLineException {
227 Class clazz = null;
228 for(String cls : endpoints){
229 clazz = getClass(cls);
230 if (clazz == null)
231 continue;
232
233 if (clazz.isEnum() || clazz.isInterface() ||
234 clazz.isPrimitive()) {
235 continue;
236 }
237 isImplClass = true;
238 WebService webService = (WebService) clazz.getAnnotation(WebService.class);
239 if(webService == null)
240 continue;
241 break;
242 }
243 if(clazz == null){
244 throw new BadCommandLineException(WscompileMessages.WSGEN_CLASS_NOT_FOUND(endpoints.get(0)));
245 }
246 if(!isImplClass){
247 throw new BadCommandLineException(WscompileMessages.WSGEN_CLASS_MUST_BE_IMPLEMENTATION_CLASS(clazz.getName()));
248 }
249 endpoint = clazz;
250 validateBinding();
251 }
252
253 private void validateBinding() throws BadCommandLineException {
254 if (genWsdl) {
255 BindingID binding = BindingID.parse(endpoint);
256 if ((binding.equals(BindingID.SOAP12_HTTP) ||
257 binding.equals(BindingID.SOAP12_HTTP_MTOM)) &&
258 !(protocol.equals(X_SOAP12) && isExtensionMode())) {
259 throw new BadCommandLineException(WscompileMessages.WSGEN_CANNOT_GEN_WSDL_FOR_SOAP_12_BINDING(binding.toString(), endpoint.getName()));
260 }
261 if (binding.equals(BindingID.XML_HTTP)) {
262 throw new BadCommandLineException(WscompileMessages.WSGEN_CANNOT_GEN_WSDL_FOR_NON_SOAP_BINDING(binding.toString(), endpoint.getName()));
263 }
264 }
265 }
266
267 private void validateArguments() throws BadCommandLineException {
268 if (!genWsdl) {
269 if (serviceName != null) {
270 throw new BadCommandLineException(WscompileMessages.WSGEN_WSDL_ARG_NO_GENWSDL(SERVICENAME_OPTION));
271 }
272 if (portName != null) {
273 throw new BadCommandLineException(WscompileMessages.WSGEN_WSDL_ARG_NO_GENWSDL(PORTNAME_OPTION));
274 }
275 }
276 }
277
278 BindingID getBindingID(String protocol) {
279 if (protocol.equals(SOAP11))
280 return BindingID.SOAP11_HTTP;
281 if (protocol.equals(X_SOAP12))
282 return BindingID.SOAP12_HTTP;
283 String lexical = nonstdProtocols.get(protocol);
284 return (lexical != null) ? BindingID.parse(lexical) : null;
285 }
286
287
288 private Class getClass(String className) {
289 try {
290 return getClassLoader().loadClass(className);
291 } catch (ClassNotFoundException e) {
292 return null;
293 }
294 }
295
296 }

mercurial