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
86 .addComboBox( STYLE, new String[] { Style.DOCUMENT.toString(), Style.RPC.toString() }, "The style to use" );
87 mainForm.addComboBox( PARAMETER_STYLE, new String[] { ParameterStyle.BARE.toString(),
88 ParameterStyle.WRAPPED.toString() }, "The style to use" );
89 mainForm.addTextField( CLASSPATH, "Classpath to use", XForm.FieldType.PROJECT_FOLDER );
90 mainForm.addTextField( OUTPUT, "The root directory for all emitted files.", XForm.FieldType.PROJECT_FOLDER );
91 mainForm.addTextField( MAPPING, "mapping file to generate", XForm.FieldType.PROJECT_FILE );
92 mainForm.addTextField( TARGET_NAMESPACE, "The target namespace for the generated WSDL", XForm.FieldType.TEXT );
93 mainForm.addTextField( TYPES_NAMESPACE, "The namespace for the generated types", XForm.FieldType.TEXT );
94 mainForm.addTextField( EJB_LINK, "The name of the source EJB to link to", XForm.FieldType.TEXT );
95 mainForm.addTextField( SERVLET_LINK, "The name of the source Servlet to link to", XForm.FieldType.TEXT );
96
97 buildArgsForm( builder, false, "wstools" );
98
99 ActionList actions = buildDefaultActions( HelpUrls.WSTOOLS_HELP_URL, project );
100 actions.addAction( new ShowConfigFileAction( "JBossWS Java2Wsdl", "Contents of generated wsconfig.xml file" )
101 {
102 protected String getConfigFile()
103 {
104 ConfigurationDocument configDocument = createConfigFile( dialog.getValues() );
105 return configDocument.toString();
106 }
107 } );
108
109 return builder.buildDialog( actions, "Specify arguments for JBossWS wstools java2wsdl functionality",
110 UISupport.TOOL_ICON );
111 }
112
113 protected void generate( StringToStringMap values, ToolHost toolHost, WsdlProject project ) throws Exception
114 {
115 String wstoolsDir = SoapUI.getSettings().getString( ToolsSettings.JBOSSWS_WSTOOLS_LOCATION, null );
116 if( Tools.isEmpty( wstoolsDir ) )
117 {
118 UISupport.showErrorMessage( "wstools directory must be set in global preferences" );
119 return;
120 }
121
122 String wsToolsExtension = UISupport.isWindows() ? ".bat" : ".sh";
123
124 File wstoolsFile = new File( wstoolsDir + File.separatorChar + "wstools" + wsToolsExtension );
125 if( !wstoolsFile.exists() )
126 {
127 UISupport.showErrorMessage( "Could not find wstools script at [" + wstoolsFile + "]" );
128 return;
129 }
130
131 ProcessBuilder builder = new ProcessBuilder();
132 ArgumentBuilder args = buildArgs( UISupport.isWindows() );
133 builder.command( args.getArgs() );
134 builder.directory( new File( wstoolsDir ) );
135
136 toolHost.run( new ToolRunner( builder, new File( values.get( OUTPUT ) ), values.get( SERVICE_NAME ), project ) );
137 }
138
139 private ArgumentBuilder buildArgs( boolean isWindows ) throws IOException
140 {
141 StringToStringMap values = dialog.getValues();
142 values.put( OUTPUT, Tools.ensureDir( values.get( OUTPUT ), "" ) );
143
144 ArgumentBuilder builder = new ArgumentBuilder( values );
145 builder.startScript( "wstools" );
146
147 builder.addString( CLASSPATH, "-cp" );
148 builder.addArgs( "-config", buildConfigFile( values ) );
149 builder.addString( OUTPUT, "-dest" );
150 addToolArgs( values, builder );
151 return builder;
152 }
153
154 private String buildConfigFile( StringToStringMap values ) throws IOException
155 {
156 File file = File.createTempFile( "wstools-config", ".xml" );
157 ConfigurationDocument configDocument = createConfigFile( values );
158
159 configDocument.save( file );
160
161 return file.getAbsolutePath();
162 }
163
164 private ConfigurationDocument createConfigFile( StringToStringMap values )
165 {
166 ConfigurationDocument configDocument = ConfigurationDocument.Factory.newInstance();
167 ConfigurationType config = configDocument.addNewConfiguration();
168
169 JavaToWsdlType java2Wsdl = config.addNewJavaWsdl();
170 ServiceType service = java2Wsdl.addNewService();
171 service.setEndpoint( values.get( ENDPOINT ) );
172 service.setStyle( Style.Enum.forString( values.get( STYLE ) ) );
173 service.setParameterStyle( ParameterStyle.Enum.forString( values.get( PARAMETER_STYLE ) ) );
174 service.setName( values.get( SERVICE_NAME ) );
175
176 MappingType mapping = java2Wsdl.addNewMapping();
177 mapping.setFile( values.get( MAPPING ) );
178
179 NamespacesType namespaces = java2Wsdl.addNewNamespaces();
180 namespaces.setTargetNamespace( values.get( TARGET_NAMESPACE ) );
181 namespaces.setTypeNamespace( values.get( TYPES_NAMESPACE ) );
182
183 WsxmlType webservices = java2Wsdl.addNewWebservices();
184 if( values.get( EJB_LINK ) != null && values.get( EJB_LINK ).length() > 0 )
185 webservices.setEjbLink( values.get( EJB_LINK ) );
186 if( values.get( SERVLET_LINK ) != null && values.get( SERVLET_LINK ).length() > 0 )
187 webservices.setServletLink( values.get( SERVLET_LINK ) );
188 return configDocument;
189 }
190
191 private class ToolRunner extends ProcessToolRunner
192 {
193 private final File outDir;
194 private final String serviceName;
195 private final WsdlProject project;
196
197 public ToolRunner( ProcessBuilder builder, File outDir, String serviceName, WsdlProject modelItem )
198 {
199 super( builder, "JBossWS wstools", modelItem );
200 this.outDir = outDir;
201 this.serviceName = serviceName;
202 this.project = modelItem;
203 }
204
205 protected void afterRun( RunnerContext context )
206 {
207 if( context.getStatus() != RunnerContext.RunnerStatus.FINISHED )
208 return;
209
210 try
211 {
212 String wsdlUrl = "file:" + outDir.getAbsolutePath() + File.separatorChar + "wsdl" + File.separatorChar
213 + serviceName + ".wsdl";
214 Interface[] ifaces = WsdlInterfaceFactory.importWsdl( project, wsdlUrl, true );
215
216 if( ifaces.length > 0 )
217 {
218 context.log( "Added Interface [" + ifaces[0].getName() + "] to project" );
219 ifaces[0].getSettings().setString( WSToolsRegenerateJava2WsdlAction.class.getName() + "@values",
220 dialog.getValues().toXml() );
221 UISupport.select( ifaces[0] );
222 }
223 }
224 catch( SoapUIException e )
225 {
226 SoapUI.logError( e );
227 }
228 }
229 }
230 }