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