View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 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.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 }