/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.actions.iface.tools.cxf; import com.eviware.soapui.SoapUI; import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction; import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder; import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ProcessToolRunner; import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.model.iface.Interface; import com.eviware.soapui.settings.ToolsSettings; import com.eviware.soapui.support.Tools; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.types.StringToStringMap; import com.eviware.x.form.XForm; import com.eviware.x.form.XFormDialog; import com.eviware.x.form.XFormDialogBuilder; import com.eviware.x.form.XFormFactory; import java.io.File; import java.io.IOException; /** * Invokes Apache CXF wsdl2java utility * * @author Ole.Matzura */ public class CXFAction extends AbstractToolsAction<Interface> { private static final String PACKAGE = "Package"; private static final String OUTPUT = "Output Directory"; private static final String NAMESPACE_MAPPING = "Output Packages"; private static final String CATALOG_FILE = "Catalog"; private static final String SERVER_STUBS = "Server"; private static final String CLIENT_STUBS = "Client"; private static final String IMPL_STUBS = "Implementation"; private static final String ANT_FILE = "build.xml"; private static final String GENERATE_ALL = "All Code"; private static final String COMPILE = "Compile"; private static final String CLASSDIR = "Class Folder"; private static final String VALIDATE = "Validate WSDL"; private static final String EXCLUDE_NAMESPACES = "Exclude namespaces"; private static final String EXSH = "EXSH"; private static final String DNS = "DNS"; private static final String DEX = "DEX"; public static final String SOAPUI_ACTION_ID = "CXFAction"; private static final String BINDING_FILES = "Bindings"; public CXFAction() { super("Apache CXF", "Generates Apache CXF code using the wsdl2java utility"); } protected XFormDialog buildDialog(Interface modelItem) { XFormDialogBuilder builder = XFormFactory.createDialogBuilder("Apache CXF Stubs"); XForm mainForm = builder.createForm("Basic"); addWSDLFields(mainForm, modelItem); mainForm.addTextField(OUTPUT, "Root directory for all emitted files.", XForm.FieldType.PROJECT_FOLDER); mainForm.addTextField(PACKAGE, "Default Package for generated classes", XForm.FieldType.JAVA_PACKAGE); mainForm.addNameSpaceTable(NAMESPACE_MAPPING, modelItem); mainForm.addCheckBox(CLIENT_STUBS, "Generates starting point code for a client mainline"); mainForm.addCheckBox(SERVER_STUBS, "Generates starting point code for a server mainline"); mainForm.addCheckBox(IMPL_STUBS, "Generates starting point code for an implementation object"); mainForm.addCheckBox(ANT_FILE, "Generates the Ant build.xml file"); mainForm.addCheckBox(GENERATE_ALL, "<html>Generates all starting point code: types, <br>service proxy, service interface, server mainline, " + "<br>client mainline, implementation object, and an Ant build.xml file</html>"); XForm advForm = builder.createForm("Advanced"); advForm.addTextField(BINDING_FILES, "Space-separated list of JAXWS or JAXB binding files", XForm.FieldType.TEXT); advForm.addCheckBox(COMPILE, "Compiles generated Java files"); advForm.addTextField(CLASSDIR, "The directory into which the compiled class files are written", XForm.FieldType.FOLDER); advForm.addTextField(CATALOG_FILE, "The catalog file to map the imported wsdl/schema", XForm.FieldType.FILE); advForm.addNameSpaceTable(EXCLUDE_NAMESPACES, modelItem); advForm.addCheckBox(EXSH, "Enables processing of extended soap header message binding"); advForm.addCheckBox(DNS, "Enables loading of the default namespace package name mapping"); advForm.addCheckBox(DEX, "Enables loading of the default excludes namespace mapping"); advForm.addCheckBox(VALIDATE, "Enables validating the WSDL before generating the code"); buildArgsForm(builder, true, "wsdl2java"); return builder.buildDialog(buildDefaultActions(HelpUrls.CXFWSDL2JAVA_HELP_URL, modelItem), "Specify arguments for Apache CXF wsdl2java", UISupport.TOOL_ICON); } protected StringToStringMap initValues(Interface modelItem, Object param) { StringToStringMap values = super.initValues(modelItem, param); values.putIfMissing(DNS, "true"); values.putIfMissing(DEX, "true"); return values; } protected void generate(StringToStringMap values, ToolHost toolHost, Interface modelItem) throws Exception { String xfireDir = SoapUI.getSettings().getString(ToolsSettings.CXF_LOCATION, null); if (Tools.isEmpty(xfireDir)) { UISupport.showErrorMessage("CXF directory must be set in global preferences"); return; } ProcessBuilder builder = new ProcessBuilder(); ArgumentBuilder args = buildArgs(values, modelItem); builder.command(args.getArgs()); builder.directory(new File(xfireDir)); toolHost.run(new ProcessToolRunner(builder, "Apache CXF wsdl2java", modelItem)); } private ArgumentBuilder buildArgs(StringToStringMap values, Interface modelItem) throws IOException { values.put(OUTPUT, Tools.ensureDir(values.get(OUTPUT), "")); ArgumentBuilder builder = new ArgumentBuilder(values); builder.startScript("wsdl2java"); StringToStringMap nsMappings = StringToStringMap.fromXml(values.get(NAMESPACE_MAPPING)); String packages = values.get(PACKAGE).trim(); for (String key : nsMappings.keySet()) { packages += " " + key + "=" + nsMappings.get(key); } if (packages.length() > 0) { builder.addBoolean(NAMESPACE_MAPPING, "-p", null, packages); } builder.addString(BINDING_FILES, "-b"); builder.addString(CATALOG_FILE, "-catalog"); builder.addString(OUTPUT, "-d"); builder.addBoolean(COMPILE, "-compile"); builder.addString(CLASSDIR, "-classdir"); builder.addBoolean(CLIENT_STUBS, "-client"); builder.addBoolean(SERVER_STUBS, "-server"); builder.addBoolean(IMPL_STUBS, "-impl"); builder.addBoolean(GENERATE_ALL, "-all"); builder.addBoolean(ANT_FILE, "-ant"); StringToStringMap excludes = StringToStringMap.fromXml(values.get(EXCLUDE_NAMESPACES)); for (String key : excludes.keySet()) { String value = excludes.get(key); if (value.equals("-")) { builder.addArgs("-b", key); } else { builder.addArgs("-b", key + "=" + value); } } builder.addBoolean(EXSH, "-exsh", "true", "false"); builder.addBoolean(DNS, "-dns", "true", "false"); builder.addBoolean(DEX, "-dex", "true", "false"); builder.addBoolean(VALIDATE, "-validate"); builder.addArgs("-verbose"); addToolArgs(values, builder); builder.addArgs(getWsdlUrl(values, modelItem)); return builder; } }