View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2009 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 }