1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.iface.tools.wscompile;
14
15 import java.io.File;
16 import java.io.IOException;
17
18 import com.eviware.soapui.SoapUI;
19 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
20 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder;
21 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ProcessToolRunner;
22 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ShowConfigFileAction;
23 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
24 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
25 import com.eviware.soapui.model.iface.Interface;
26 import com.eviware.soapui.settings.ToolsSettings;
27 import com.eviware.soapui.support.Tools;
28 import com.eviware.soapui.support.UISupport;
29 import com.eviware.soapui.support.action.swing.ActionList;
30 import com.eviware.soapui.support.types.StringToStringMap;
31 import com.eviware.x.form.XForm;
32 import com.eviware.x.form.XFormDialog;
33 import com.eviware.x.form.XFormDialogBuilder;
34 import com.eviware.x.form.XFormFactory;
35 import com.sun.java.xml.ns.jaxRpc.ri.config.ConfigurationDocument;
36 import com.sun.java.xml.ns.jaxRpc.ri.config.NamespaceMappingRegistryType;
37 import com.sun.java.xml.ns.jaxRpc.ri.config.NamespaceMappingType;
38 import com.sun.java.xml.ns.jaxRpc.ri.config.WsdlType;
39 import com.sun.java.xml.ns.jaxRpc.ri.config.ConfigurationDocument.Configuration;
40
41 /***
42 * Invokes JWSDP wscompile
43 *
44 * @author Ole.Matzura
45 */
46
47 public class WSCompileAction extends AbstractToolsAction<Interface>
48 {
49 private final class WSCompileShowConfigFileAction extends ShowConfigFileAction
50 {
51 private final Interface modelItem;
52
53 private WSCompileShowConfigFileAction( String title, String description, Interface modelItem )
54 {
55 super( title, description );
56 this.modelItem = modelItem;
57 }
58
59 protected String getConfigFile()
60 {
61 ConfigurationDocument configDocument = createConfigFile(dialog.getValues(), modelItem);
62 return configDocument.toString();
63 }
64 }
65
66 private static final String OUTPUT = "directory";
67 private static final String DATAHANDLERONLY = "datahandleronly";
68 private static final String DONOTUNWRAP = "donotunwrap";
69 private static final String PACKAGE = "package";
70 private static final String KEEP = "keep";
71 private static final String MAPPING = "mapping";
72 private static final String SOURCE = "source";
73 private static final String OPTIMIZE = "optimize";
74 private static final String SOURCE_VERSION = "source version";
75 private static final String MODEL = "model";
76 private static final String NONCLASS = "non-class";
77 private static final String SECURITY = "security";
78 private static final String DEBUG = "debug";
79 private static final String EXPLICITCONTEXT = "explicitcontext";
80 private static final String JAXBENUMTYPE = "jaxbenumtype";
81 private static final String NODATABINDING = "nodatabinding";
82 private static final String NOENCODEDTYPES = "noencodedtypes";
83 private static final String NOMULTIREFS = "nomultirefs";
84 private static final String NORPCSTRUCTURES = "norpcstructures";
85 private static final String NOVALIDATION = "novalidation";
86 private static final String RESOLVEIDREF = "resolveidref";
87 private static final String SEARCHSCHEMA = "searchschema";
88 private static final String SERIALIZEINTERFACES = "serializeinterfaces";
89 private static final String STRICT = "strict";
90 private static final String UNWRAP = "unwrap";
91 private static final String WSI = "wsi";
92 private static final String PROXY = "proxy";
93 private static final String NAMESPACE_MAPPING = "Namespace mapping";
94 public static final String SOAPUI_ACTION_ID = "WSCompileAction";
95
96 public WSCompileAction()
97 {
98 super( "JAX-RPC Artifacts", "Generates JAX-RPC artifacts using wscompile");
99 }
100
101 protected XFormDialog buildDialog(Interface modelItem)
102 {
103 XFormDialogBuilder builder = XFormFactory.createDialogBuilder("WSCompile");
104
105 XForm mainForm = builder.createForm( "Basic" );
106 addWSDLFields( mainForm, modelItem );
107
108 mainForm.addTextField( PACKAGE, "the package of the classes generated by wscompile", XForm.FieldType.JAVA_PACKAGE );
109 mainForm.addTextField( OUTPUT, "where to place generated output files", XForm.FieldType.PROJECT_FOLDER );
110 mainForm.addCheckBox( KEEP, "(Keep generated files)");
111 mainForm.addTextField( MAPPING, "Generate a J2EE mapping.xml file", XForm.FieldType.PROJECT_FILE );
112 mainForm.addTextField( MODEL, "Write the internal model to the given file", XForm.FieldType.PROJECT_FILE );
113 mainForm.addTextField( SOURCE, "Where to place generated source files", XForm.FieldType.PROJECT_FOLDER );
114 mainForm.addTextField( NONCLASS, "Where to place non-class generated files", XForm.FieldType.PROJECT_FOLDER );
115 mainForm.addCheckBox( OPTIMIZE, "(Optimize generated code)");
116 mainForm.addCheckBox( DEBUG, "(Generate debugging info)");
117 mainForm.addComboBox( SOURCE_VERSION, new String[] {"1.0.1", "1.0.3", "1.1", "1.1.1", "1.1.2"},
118 "Generate code for the specified JAX-RPC SI version" );
119 mainForm.addTextField( SECURITY, "Security configuration file to generate security code", XForm.FieldType.PROJECT_FILE );
120 mainForm.addTextField( PROXY, "Specify a HTTP proxy server", XForm.FieldType.URL );
121
122 XForm featuresForm = builder.createForm( "Features" );
123
124 featuresForm.addCheckBox( DATAHANDLERONLY, "(Always map attachments to the DataHandler type)");
125 featuresForm.addCheckBox( DONOTUNWRAP , "(Disable unwrapping of document/literal wrapper elements in WSI mode)");
126 featuresForm.addCheckBox( EXPLICITCONTEXT , "(Turn on explicit service context mapping)");
127 featuresForm.addCheckBox( JAXBENUMTYPE , "(Map anonymous enumeration to its base type)");
128 featuresForm.addCheckBox( NODATABINDING , "(Turn off data binding for literal encoding)");
129 featuresForm.addCheckBox( NOENCODEDTYPES , "(Turn off encoding type information)");
130 featuresForm.addCheckBox( NOMULTIREFS , "(Turn off support for multiple references)");
131 featuresForm.addCheckBox( NORPCSTRUCTURES , "(Do not generate RPC structures)");
132 featuresForm.addCheckBox( NOVALIDATION , "(Turn off full validation of imported WSDL documents)");
133 featuresForm.addCheckBox( RESOLVEIDREF , "(Resolve xsd:IDREF)");
134 featuresForm.addCheckBox( SEARCHSCHEMA , "(Search schema aggressively for types)");
135 featuresForm.addCheckBox( SERIALIZEINTERFACES , "(Turn on direct serialization of interface types)");
136 featuresForm.addCheckBox( STRICT , "(Generate code strictly compliant with JAXRPC spec)");
137 featuresForm.addCheckBox( UNWRAP , "(Enable unwrapping of document/literal wrapper elements in WSI mode)");
138 featuresForm.addCheckBox( WSI , "(Enable WSI-Basic Profile features, to be used for document/literal and rpc/literal)");
139
140 XForm advForm = builder.createForm( "Advanced" );
141 advForm.addNameSpaceTable( NAMESPACE_MAPPING, modelItem );
142
143 buildArgsForm( builder, false, "wscompile");
144
145 ActionList actions = buildDefaultActions(HelpUrls.WSCOMPILE_HELP_URL, modelItem);
146 actions.addAction( new WSCompileShowConfigFileAction( "JAX-RPC wscompile", "Contents of generated config.xml file", modelItem ));
147
148 return builder.buildDialog( actions,
149 "Specify arguments for JAX-RPC wscompile", UISupport.TOOL_ICON );
150 }
151
152 protected StringToStringMap initValues(Interface modelItem)
153 {
154 StringToStringMap values = super.initValues(modelItem);
155 values.putIfMissing( SOURCE_VERSION, "1.1.2" );
156 values.putIfMissing( WSI, Boolean.toString( true ));
157
158 return values;
159 }
160
161 protected void generate(StringToStringMap values, ToolHost toolHost, Interface modelItem) throws Exception
162 {
163 String wscompileDir = SoapUI.getSettings().getString( ToolsSettings.JWSDP_WSCOMPILE_LOCATION, null );
164 if( Tools.isEmpty( wscompileDir ))
165 {
166 UISupport.showErrorMessage( "wscompile directory must be set in global preferences" );
167 return;
168 }
169
170 String wscompileExtension = UISupport.isWindows() ? ".bat" : ".sh";
171
172 File wscompileFile = new File( wscompileDir + File.separatorChar + "wscompile" + wscompileExtension );
173 if( !wscompileFile.exists() )
174 {
175 UISupport.showErrorMessage( "Could not find wscompile script at [" + wscompileFile + "]" );
176 return;
177 }
178
179 ProcessBuilder builder = new ProcessBuilder();
180 ArgumentBuilder args = buildArgs( UISupport.isWindows(), modelItem );
181 builder.command(args.getArgs());
182 builder.directory(new File(wscompileDir));
183
184 toolHost.run( new ProcessToolRunner( builder, "JAX-RPC wscompile", modelItem ));
185 }
186
187 private ArgumentBuilder buildArgs( boolean isWindows, Interface modelItem ) throws IOException
188 {
189 StringToStringMap values = dialog.getValues();
190 ArgumentBuilder builder = new ArgumentBuilder( values );
191 builder.startScript( "wscompile" );
192
193 values.put( OUTPUT, Tools.ensureDir( values.get( OUTPUT ), "" ));
194
195 values.put( SOURCE, Tools.ensureDir( values.get( SOURCE ), values.get( OUTPUT ) ));
196 values.put( NONCLASS, Tools.ensureDir( values.get( NONCLASS ), values.get( OUTPUT ) ));
197
198 values.put( MAPPING, Tools.ensureFileDir( values.get( MAPPING ), values.get( OUTPUT ) ));
199 values.put( MODEL, Tools.ensureFileDir( values.get( MODEL ), values.get( OUTPUT ) ));
200
201 builder.addString( OUTPUT, "-d" );
202 builder.addBoolean( KEEP, "-keep" );
203 builder.addString( MAPPING, "-mapping" );
204 builder.addString( MODEL, "-model" );
205 builder.addString( SOURCE, "-s" );
206 builder.addString( NONCLASS, "-nd" );
207 builder.addBoolean( OPTIMIZE, "-O" );
208 builder.addBoolean( DEBUG, "-g" );
209 builder.addString( SOURCE_VERSION, "-source" );
210 builder.addString( SECURITY, "-security" );
211 builder.addString( PROXY, "httpproxy", ":" );
212
213 builder.addBoolean( DATAHANDLERONLY, "-f:datahandleronly" );
214 builder.addBoolean( DONOTUNWRAP , "-f:donotunwrap" );
215 builder.addBoolean( EXPLICITCONTEXT , "-f:explicitcontext" );
216 builder.addBoolean( JAXBENUMTYPE , "-f:jaxbenumtype" );
217 builder.addBoolean( NODATABINDING , "-f:nodatabinding" );
218 builder.addBoolean( NOENCODEDTYPES , "-f:noencodedtypes" );
219 builder.addBoolean( NOMULTIREFS , "-f:nomultirefs" );
220 builder.addBoolean( NORPCSTRUCTURES , "-f:norpcstructures" );
221 builder.addBoolean( NOVALIDATION , "-f:novalidation" );
222 builder.addBoolean( RESOLVEIDREF , "-f:resolveidref" );
223 builder.addBoolean( SEARCHSCHEMA , "-f:searchschema" );
224 builder.addBoolean( SERIALIZEINTERFACES , "-f:serializeinterfaces");
225 builder.addBoolean( STRICT , "-f:strict");
226 builder.addBoolean( UNWRAP , "-f:unwrap");
227 builder.addBoolean( WSI , "-f:wsi");
228
229 builder.addArgs( "-import" );
230 builder.addArgs( "-verbose" );
231 addToolArgs( values, builder );
232 builder.addArgs( buildConfigFile( values, modelItem ) );
233 return builder;
234 }
235
236 private String buildConfigFile(StringToStringMap values, Interface modelItem ) throws IOException
237 {
238 File file = File.createTempFile( "wscompile-config", ".xml" );
239 ConfigurationDocument configDocument = createConfigFile(values, modelItem);
240 configDocument.save( file );
241 return file.getAbsolutePath();
242 }
243
244 private ConfigurationDocument createConfigFile(StringToStringMap values, Interface modelItem)
245 {
246 ConfigurationDocument configDocument = ConfigurationDocument.Factory.newInstance();
247 Configuration config = configDocument.addNewConfiguration();
248
249 WsdlType wsdl = config.addNewWsdl();
250 wsdl.setLocation( getWsdlUrl( values, modelItem ) );
251 wsdl.setPackageName( values.get( PACKAGE ).toString() );
252
253 try
254 {
255 StringToStringMap nsMappings = StringToStringMap.fromXml(values.get(NAMESPACE_MAPPING));
256 if (!nsMappings.isEmpty())
257 {
258 NamespaceMappingRegistryType nsMappingRegistry = wsdl.addNewNamespaceMappingRegistry();
259
260 for (String namespace : nsMappings.keySet())
261 {
262 String packageName = nsMappings.get( namespace );
263
264 NamespaceMappingType newMapping = nsMappingRegistry.addNewNamespaceMapping();
265 newMapping.setNamespace(namespace);
266 newMapping.setPackageName(packageName);
267 }
268 }
269 }
270 catch (Exception e)
271 {
272 SoapUI.logError( e );
273 }
274 return configDocument;
275 }
276 }