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.JavaToWsdlType;
21 import org.jboss.jbosswsTools.MappingType;
22 import org.jboss.jbosswsTools.NamespacesType;
23 import org.jboss.jbosswsTools.ServiceType;
24 import org.jboss.jbosswsTools.WsxmlType;
25 import org.jboss.jbosswsTools.ServiceType.ParameterStyle;
26 import org.jboss.jbosswsTools.ServiceType.Style;
27
28 import com.eviware.soapui.SoapUI;
29 import com.eviware.soapui.impl.WsdlInterfaceFactory;
30 import com.eviware.soapui.impl.wsdl.WsdlProject;
31 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
32 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder;
33 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ProcessToolRunner;
34 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.RunnerContext;
35 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ShowConfigFileAction;
36 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
37 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
38 import com.eviware.soapui.model.iface.Interface;
39 import com.eviware.soapui.settings.ToolsSettings;
40 import com.eviware.soapui.support.SoapUIException;
41 import com.eviware.soapui.support.Tools;
42 import com.eviware.soapui.support.UISupport;
43 import com.eviware.soapui.support.action.swing.ActionList;
44 import com.eviware.soapui.support.types.StringToStringMap;
45 import com.eviware.x.form.XForm;
46 import com.eviware.x.form.XFormDialog;
47 import com.eviware.x.form.XFormDialogBuilder;
48 import com.eviware.x.form.XFormFactory;
49
50 /***
51 * Invokes jbossws java2wsdl tools
52 *
53 * @author Ole.Matzura
54 */
55
56 public class WSToolsJava2WsdlAction extends AbstractToolsAction<WsdlProject>
57 {
58 public static final String SOAPUI_ACTION_ID = "WSToolsJava2WsdlAction";
59
60 private static final String CLASSPATH = "Classpath";
61 private static final String OUTPUT = "Output Directory";
62 private static final String ENDPOINT = "Endpoint";
63 private static final String MAPPING = "Mapping file";
64 private static final String SERVICE_NAME = "Service Name";
65 private static final String STYLE = "Style";
66 private static final String PARAMETER_STYLE = "Parameter Style";
67 private static final String TARGET_NAMESPACE = "Target Namespace";
68 private static final String TYPES_NAMESPACE = "Types Namespace";
69 private static final String EJB_LINK = "ejb-link";
70 private static final String SERVLET_LINK = "servlet-link";
71
72 public WSToolsJava2WsdlAction()
73 {
74 super( "Generate WSDL with JBossWS", "Generates WSDL with the jbossws wstools utility");
75 }
76
77 protected XFormDialog buildDialog( WsdlProject project )
78 {
79 XFormDialogBuilder builder = XFormFactory.createDialogBuilder("Generate JBossWS WSDL Artifacts");
80
81 XForm mainForm = builder.createForm( "Basic" );
82
83 mainForm.addTextField( ENDPOINT, "Serice Endpoint Interface", XForm.FieldType.JAVA_CLASS );
84 mainForm.addTextField( SERVICE_NAME, "The name of the generated Service", XForm.FieldType.TEXT );
85 mainForm.addComboBox( STYLE, new String [] {Style.DOCUMENT.toString(), Style.RPC.toString()}, "The style to use" );
86 mainForm.addComboBox( PARAMETER_STYLE, new String [] {ParameterStyle.BARE.toString(), ParameterStyle.WRAPPED.toString()}, "The style to use" );
87 mainForm.addTextField( CLASSPATH, "Classpath to use", XForm.FieldType.PROJECT_FOLDER );
88 mainForm.addTextField( OUTPUT, "The root directory for all emitted files.", XForm.FieldType.PROJECT_FOLDER );
89 mainForm.addTextField( MAPPING, "mapping file to generate", XForm.FieldType.PROJECT_FILE );
90 mainForm.addTextField( TARGET_NAMESPACE, "The target namespace for the generated WSDL", XForm.FieldType.TEXT );
91 mainForm.addTextField( TYPES_NAMESPACE, "The namespace for the generated types", XForm.FieldType.TEXT );
92 mainForm.addTextField( EJB_LINK, "The name of the source EJB to link to", XForm.FieldType.TEXT );
93 mainForm.addTextField( SERVLET_LINK, "The name of the source Servlet to link to", XForm.FieldType.TEXT );
94
95 buildArgsForm( builder, false, "wstools" );
96
97 ActionList actions = buildDefaultActions( HelpUrls.WSTOOLS_HELP_URL, project );
98 actions.addAction( new ShowConfigFileAction( "JBossWS Java2Wsdl", "Contents of generated wsconfig.xml file" )
99 {
100 protected String getConfigFile()
101 {
102 ConfigurationDocument configDocument = createConfigFile(dialog.getValues());
103 return configDocument.toString();
104 }});
105
106 return builder.buildDialog( actions,
107 "Specify arguments for JBossWS wstools java2wsdl functionality", UISupport.TOOL_ICON );
108 }
109
110 protected void generate(StringToStringMap values, ToolHost toolHost, WsdlProject project ) throws Exception
111 {
112 String wstoolsDir = SoapUI.getSettings().getString( ToolsSettings.JBOSSWS_WSTOOLS_LOCATION, null );
113 if( Tools.isEmpty( wstoolsDir ))
114 {
115 UISupport.showErrorMessage( "wstools directory must be set in global preferences" );
116 return;
117 }
118
119 String wsToolsExtension = UISupport.isWindows() ? ".bat" : ".sh";
120
121 File wstoolsFile = new File( wstoolsDir + File.separatorChar + "wstools" + wsToolsExtension );
122 if( !wstoolsFile.exists() )
123 {
124 UISupport.showErrorMessage( "Could not find wstools script at [" + wstoolsFile + "]" );
125 return;
126 }
127
128 ProcessBuilder builder = new ProcessBuilder();
129 ArgumentBuilder args = buildArgs( UISupport.isWindows() );
130 builder.command(args.getArgs());
131 builder.directory(new File(wstoolsDir));
132
133 toolHost.run( new ToolRunner( builder, new File( values.get( OUTPUT )), values.get( SERVICE_NAME ), project ));
134 }
135
136 private ArgumentBuilder buildArgs( boolean isWindows ) throws IOException
137 {
138 StringToStringMap values = dialog.getValues();
139 values.put( OUTPUT, Tools.ensureDir( values.get( OUTPUT ), "" ));
140
141 ArgumentBuilder builder = new ArgumentBuilder( values );
142 builder.startScript( "wstools" );
143
144 builder.addString( CLASSPATH, "-cp" );
145 builder.addArgs( "-config", buildConfigFile( values ) );
146 builder.addString( OUTPUT, "-dest" );
147 addToolArgs( values, builder );
148 return builder;
149 }
150
151 private String buildConfigFile(StringToStringMap values ) throws IOException
152 {
153 File file = File.createTempFile( "wstools-config", ".xml" );
154 ConfigurationDocument configDocument = createConfigFile(values);
155
156 configDocument.save( file );
157
158 return file.getAbsolutePath();
159 }
160
161 private ConfigurationDocument createConfigFile(StringToStringMap values)
162 {
163 ConfigurationDocument configDocument = ConfigurationDocument.Factory.newInstance();
164 ConfigurationType config = configDocument.addNewConfiguration();
165
166 JavaToWsdlType java2Wsdl = config.addNewJavaWsdl();
167 ServiceType service = java2Wsdl.addNewService();
168 service.setEndpoint( values.get( ENDPOINT ));
169 service.setStyle( Style.Enum.forString( values.get(STYLE)));
170 service.setParameterStyle( ParameterStyle.Enum.forString( values.get(PARAMETER_STYLE)));
171 service.setName( values.get( SERVICE_NAME ));
172
173 MappingType mapping = java2Wsdl.addNewMapping();
174 mapping.setFile( values.get( MAPPING ));
175
176 NamespacesType namespaces = java2Wsdl.addNewNamespaces();
177 namespaces.setTargetNamespace( values.get( TARGET_NAMESPACE ));
178 namespaces.setTypeNamespace( values.get( TYPES_NAMESPACE ));
179
180 WsxmlType webservices = java2Wsdl.addNewWebservices();
181 if( values.get( EJB_LINK ) != null && values.get( EJB_LINK ).length() > 0 )
182 webservices.setEjbLink( values.get( EJB_LINK ));
183 if( values.get( SERVLET_LINK ) != null && values.get( SERVLET_LINK ).length() > 0 )
184 webservices.setServletLink( values.get( SERVLET_LINK ));
185 return configDocument;
186 }
187
188 private class ToolRunner extends ProcessToolRunner
189 {
190 private final File outDir;
191 private final String serviceName;
192 private final WsdlProject project;
193
194 public ToolRunner(ProcessBuilder builder, File outDir, String serviceName, WsdlProject modelItem )
195 {
196 super(builder, "JBossWS wstools", modelItem );
197 this.outDir = outDir;
198 this.serviceName = serviceName;
199 this.project = modelItem;
200 }
201
202 protected void afterRun( RunnerContext context )
203 {
204 if( context.getStatus() != RunnerContext.RunnerStatus.FINISHED )
205 return;
206
207 try
208 {
209 String wsdlUrl = "file:" + outDir.getAbsolutePath() + File.separatorChar + "wsdl" + File.separatorChar + serviceName + ".wsdl";
210 Interface[] ifaces = WsdlInterfaceFactory.importWsdl( project, wsdlUrl, true );
211
212 if (ifaces.length > 0)
213 {
214 context.log( "Added Interface [" + ifaces[0].getName() + "] to project" );
215 ifaces[0].getSettings().setString( WSToolsRegenerateJava2WsdlAction.class.getName() + "@values",
216 dialog.getValues().toXml() );
217 UISupport.select(ifaces[0]);
218 }
219 }
220 catch (SoapUIException e)
221 {
222 SoapUI.logError( e );
223 }
224 }
225 }
226 }