1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.iface.tools.jbossws;
14
15 import java.io.File;
16 import java.io.IOException;
17 import java.net.MalformedURLException;
18 import java.net.URL;
19
20 import org.jboss.jbosswsTools.ConfigurationDocument;
21 import org.jboss.jbosswsTools.ConfigurationType;
22 import org.jboss.jbosswsTools.GlobalType;
23 import org.jboss.jbosswsTools.PkgNSType;
24 import org.jboss.jbosswsTools.WsdlToJavaType;
25 import org.jboss.jbosswsTools.WsxmlType;
26 import org.jboss.jbosswsTools.WsdlToJavaType.ParameterStyle;
27 import org.w3c.dom.Element;
28
29 import com.eviware.soapui.SoapUI;
30 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
31 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder;
32 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ProcessToolRunner;
33 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ShowConfigFileAction;
34 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
35 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
36 import com.eviware.soapui.model.ModelItem;
37 import com.eviware.soapui.model.iface.Interface;
38 import com.eviware.soapui.model.project.Project;
39 import com.eviware.soapui.settings.ToolsSettings;
40 import com.eviware.soapui.support.Tools;
41 import com.eviware.soapui.support.UISupport;
42 import com.eviware.soapui.support.action.swing.ActionList;
43 import com.eviware.soapui.support.types.StringToStringMap;
44 import com.eviware.x.form.XForm;
45 import com.eviware.x.form.XFormDialog;
46 import com.eviware.x.form.XFormDialogBuilder;
47 import com.eviware.x.form.XFormFactory;
48 import com.eviware.x.form.XFormField;
49 import com.eviware.x.form.XFormFieldListener;
50 import com.eviware.x.form.XFormTextField;
51
52 /***
53 * Invokes jbossws wsdl2java tools
54 *
55 * @author Ole.Matzura
56 */
57
58 public class WSToolsWsdl2JavaAction extends AbstractToolsAction<Interface>
59 {
60 public static final String SOAPUI_ACTION_ID = "WSToolsWsdl2JavaAction";
61
62 private static final String NAMESPACE_MAPPING = "Namespace mapping";
63 private static final String OUTPUT = "Output Directory";
64 private static final String MAPPING = "Mapping file";
65 private static final String UNWRAP = "Unwrap";
66 private static final String APPEND = "Append";
67 private static final String SERVLET_LINK = "Servlet Link";
68 private static final String EJB_LINK = "EJB Link";
69 private XFormTextField ejbLinkField;
70 private XFormTextField servletLinkField;
71 private XFormField appendField;
72
73 public WSToolsWsdl2JavaAction()
74 {
75 super( "JBossWS Artifacts", "Generates JBossWS artifacts using the jboss wstools utility");
76 }
77
78 @Override
79 public boolean applies( ModelItem target )
80 {
81 Interface iface = (Interface) target;
82 return !iface.getProject().hasNature(Project.JBOSSWS_NATURE_ID);
83 }
84
85 @Override
86 protected StringToStringMap initValues(Interface modelItem )
87 {
88 StringToStringMap values = super.initValues(modelItem);
89
90 boolean hasEjbLink = values.get( EJB_LINK, "" ).length() > 0;
91 boolean hasServletLink = values.get( SERVLET_LINK, "" ).length() > 0;
92
93 if( !hasEjbLink && !hasServletLink )
94 {
95 ejbLinkField.setEnabled( true );
96 servletLinkField.setEnabled( true );
97 }
98 else
99 {
100 ejbLinkField.setEnabled( hasEjbLink && !hasServletLink );
101 servletLinkField.setEnabled( hasServletLink && !hasEjbLink );
102
103 if( hasEjbLink && hasServletLink )
104 values.put( SERVLET_LINK, "" );
105 }
106
107 appendField.setEnabled( hasEjbLink || hasServletLink );
108
109 return values;
110 }
111
112 protected XFormDialog buildDialog(Interface modelItem )
113 {
114 XFormDialogBuilder builder = XFormFactory.createDialogBuilder("JBossWS Artifacts");
115
116 XForm mainForm = builder.createForm( "Basic" );
117 addWSDLFields( mainForm, modelItem );
118
119 mainForm.addTextField( OUTPUT, "The root directory for all emitted files.", XForm.FieldType.PROJECT_FOLDER );
120 mainForm.addTextField( MAPPING, "mapping file to generate", XForm.FieldType.PROJECT_FILE );
121 mainForm.addCheckBox( UNWRAP, "unwrap doc-literal operations" );
122
123 mainForm.addNameSpaceTable( NAMESPACE_MAPPING, modelItem );
124
125 mainForm.addSeparator( "webservices.xml generation options" );
126 ejbLinkField = mainForm.addTextField( EJB_LINK, "The ejb-jar.xml ejb-link for Stateless Session Bean endpoints", XForm.FieldType.TEXT );
127 ejbLinkField.addFormFieldListener( new XFormFieldListener()
128 {
129 public void valueChanged( XFormField sourceField, String newValue, String oldValue )
130 {
131 servletLinkField.setEnabled( newValue.length() == 0 );
132 appendField.setEnabled( newValue.length() > 0 );
133 }} );
134
135 servletLinkField = mainForm.addTextField( SERVLET_LINK, "The web.xml servlet-link that is used by Java Service Endpoints (WAR)", XForm.FieldType.TEXT );
136 servletLinkField.addFormFieldListener( new XFormFieldListener()
137 {
138 public void valueChanged( XFormField sourceField, String newValue, String oldValue )
139 {
140 ejbLinkField.setEnabled( newValue.length() == 0 );
141 appendField.setEnabled( newValue.length() > 0 );
142 }} );
143
144 appendField = mainForm.addCheckBox( APPEND, "append to existing file" );
145 appendField.setEnabled( false );
146 buildArgsForm( builder, false, "wstools" );
147
148 ActionList actions = buildDefaultActions(HelpUrls.WSTOOLS_HELP_URL, modelItem);
149 actions.addAction( new JBossWSShowConfigFileAction( "JBossWS Wsdl2Java", "Contents of generated wsconfig.xml file", modelItem ));
150 return builder.buildDialog( actions,
151 "Specify arguments for JBossWS wstools wsdl2java functionality", UISupport.TOOL_ICON );
152 }
153
154 protected void generate(StringToStringMap values, ToolHost toolHost, Interface modelItem ) throws Exception
155 {
156 String wstoolsDir = SoapUI.getSettings().getString( ToolsSettings.JBOSSWS_WSTOOLS_LOCATION, null );
157 if( Tools.isEmpty( wstoolsDir ))
158 {
159 UISupport.showErrorMessage( "wstools directory must be set in global preferences" );
160 return;
161 }
162
163 String wsToolsExtension = UISupport.isWindows() ? ".bat" : ".sh";
164
165 File wstoolsFile = new File( wstoolsDir + File.separatorChar + "wstools" + wsToolsExtension );
166 if( !wstoolsFile.exists() )
167 {
168 UISupport.showErrorMessage( "Could not find wstools script at [" + wstoolsFile + "]" );
169 return;
170 }
171
172 ProcessBuilder builder = new ProcessBuilder();
173 ArgumentBuilder args = buildArgs( UISupport.isWindows(), modelItem );
174 builder.command(args.getArgs());
175 builder.directory(new File(wstoolsDir));
176
177 toolHost.run( new ProcessToolRunner( builder, "JBossWS wstools", modelItem ));
178 }
179
180 private ArgumentBuilder buildArgs( boolean isWindows, Interface modelItem ) throws IOException
181 {
182 StringToStringMap values = dialog.getValues();
183
184 values.put( OUTPUT, Tools.ensureDir( values.get( OUTPUT ), "" ));
185
186 ArgumentBuilder builder = new ArgumentBuilder( values );
187 builder.startScript( "wstools" );
188
189 builder.addArgs( "-config", buildConfigFile( values, modelItem ) );
190 builder.addString( OUTPUT, "-dest" );
191 addToolArgs( values, builder );
192 return builder;
193 }
194
195 private String buildConfigFile(StringToStringMap values, Interface modelItem ) throws IOException
196 {
197 File file = File.createTempFile( "wstools-config", ".xml" );
198 ConfigurationDocument configDocument = createConfigFile(values, modelItem);
199
200 configDocument.save( file );
201
202 return file.getAbsolutePath();
203 }
204
205 private ConfigurationDocument createConfigFile(StringToStringMap values, Interface modelItem )
206 {
207 ConfigurationDocument configDocument = ConfigurationDocument.Factory.newInstance();
208 ConfigurationType config = configDocument.addNewConfiguration();
209
210 try
211 {
212 StringToStringMap nsMappings = StringToStringMap.fromXml(values.get(NAMESPACE_MAPPING));
213 if (!nsMappings.isEmpty())
214 {
215 GlobalType global = config.addNewGlobal();
216
217 for (String namespace : nsMappings.keySet())
218 {
219 PkgNSType entry = global.addNewPackageNamespace();
220 entry.setNamespace( namespace );
221 entry.setPackage( nsMappings.get( namespace ));
222 }
223 }
224 }
225 catch (Exception e)
226 {
227 SoapUI.logError( e );
228 }
229
230 WsdlToJavaType wsdl2Java = config.addNewWsdlJava();
231
232 String wsdlUrl = getWsdlUrl( values, modelItem );
233 try
234 {
235 new URL( wsdlUrl );
236 wsdl2Java.setLocation( wsdlUrl );
237 }
238 catch( MalformedURLException e )
239 {
240 ((Element)wsdl2Java.getDomNode()).setAttribute( "file", wsdlUrl );
241 }
242
243 if( values.getBoolean( UNWRAP ))
244 wsdl2Java.setParameterStyle( ParameterStyle.BARE );
245 else
246 wsdl2Java.setParameterStyle( ParameterStyle.WRAPPED );
247
248 if( values.get( EJB_LINK ) != null && values.get( EJB_LINK ).length() > 0 )
249 {
250 WsxmlType webservices = wsdl2Java.addNewWebservices();
251 webservices.setEjbLink( values.get( EJB_LINK ) );
252 webservices.setAppend( values.getBoolean( APPEND ) );
253 }
254 else if( values.get( SERVLET_LINK ) != null && values.get( SERVLET_LINK ).length() > 0)
255 {
256 WsxmlType webservices = wsdl2Java.addNewWebservices();
257 webservices.setServletLink( values.get( SERVLET_LINK ) );
258 webservices.setAppend( values.getBoolean( APPEND ) );
259 }
260
261 String mappingFile = values.get( MAPPING ).toString().trim();
262 if( mappingFile.length() > 0 )
263 {
264 wsdl2Java.addNewMapping().setFile( mappingFile );
265 }
266 return configDocument;
267 }
268
269 private final class JBossWSShowConfigFileAction extends ShowConfigFileAction
270 {
271 private final Interface modelItem;
272
273 private JBossWSShowConfigFileAction( String title, String description, Interface modelItem )
274 {
275 super( title, description );
276 this.modelItem = modelItem;
277 }
278
279 protected String getConfigFile()
280 {
281 ConfigurationDocument configDocument = createConfigFile(dialog.getValues(), modelItem);
282 return configDocument.toString();
283 }
284 }
285
286 }