blob: 2dd50639bb40ce31f9cf81545f4a370263bb5fef [file] [log] [blame]
package org.apache.axis2.maven2.wsdl2code;
/*
* Copyright 2006 Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.axis2.util.CommandLineOption;
import org.apache.axis2.util.CommandLineOptionConstants;
import org.apache.axis2.util.CommandLineOptionParser;
import org.apache.axis2.wsdl.codegen.CodeGenerationEngine;
import org.apache.axis2.wsdl.codegen.CodeGenerationException;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
/**
* @description A Mojo for generating Java sources from a WSDL.
* @goal wsdl2code
* @phase generate-sources
* @requiresDependencyResolution test
*/
public class WSDL2CodeMojo extends AbstractMojo
{
/**
* The maven project.
* @parameter expression="${project}"
* @read-only
* @required
*/
private MavenProject project;
/**
* The artifact factory.
* @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}"
* @read-only
* @required
*/
private ArtifactFactory artifactFactory;
/**
* The plugins artifact list.
* @parameter expression="${plugin.artifacts}"
* @read-only
* @required
*/
private List pluginArtifacts;
/**
* The WSDL file, which is being read.
* @parameter expression="${axis2.wsdl2code.wsdl}" default-value="src/main/axis2/service.wsdl"
*/
private File wsdlFile;
/**
* The output directory, where the generated sources are being created.
* @parameter expression="${axis2.wsdl2code.target}" default-value="${project.build.directory}/generated-sources/axis2/wsdl2code"
*/
private File outputDirectory;
/**
* Package name of the generated sources; will be used to create a package structure
* below the output directory.
* @parameter expression="${axis2.wsdl2code.package}"
* @required
*/
private String packageName;
/**
* The programming language of the generated sources.
* @parameter expression="${axis2.wsdl2code.language}" default-value="java"
*/
private String language;
/**
* The databinding framework, which is being used.
* @parameter expression="${axis2.wsdl2code.databindingName}" default-value="adb"
*/
private String databindingName;
/**
* Port name, for which to generate sources. By default, sources will
* be generated for all ports.
* @parameter expression="${axis2.wsdl2code.portName}"
*/
private String portName;
/**
* Service name, for which to generate sources. By default, sources will
* be generated for all services.
* @parameter expression="${axis2.wsdl2code.serviceName}"
*/
private String serviceName;
/**
* Mode, for which sources are being generated; either of "sync", "async" or "both".
* @parameter expression="${axis2.wsdl2code.syncMode}" default-value="both"
*/
private String syncMode;
/**
* Whether server side sources are being generated.
* @parameter expression="${axis2.wsdl2code.generateServerSide}" default-value="false"
*/
private boolean generateServerSide;
/**
* Whether to generate sources for a test case.
* @parameter expression="${axis2.wsdl2code.generateTestCase}" default-value="false"
*/
private boolean generateTestcase;
/**
* Whether to generate a "services.xml" file.
* @parameter expression="${axis2.wsdl2code.generateServicesXml}" default-value="false"
*/
private boolean generateServicesXml;
/**
* Whether to generate simply all classes. This is only valid in conjunction with
* "generateServerSide".
* @parameter expression="${axis2.wsdl2code.generateAllClasses}" default-value="false"
*/
private boolean generateAllClasses;
/**
* Whether to unpack classes.
* @parameter expression="${axis2.wsdl2code.unpackClasses}" default-value="false"
*/
private boolean unpackClasses;
/**
* Whether to generate the server side interface.
* @parameter expression="${axis2.wsdl2code.generateServerSideInterface}" default-value="false"
*/
private boolean generateServerSideInterface = false;
/**
* @parameter expression="${axis2.wsdl2code.namespaceToPackages}"
*/
private String namespaceToPackages = null;
/**
* @parameter
*/
private NamespaceURIMapping[] namespaceURIs;
private static class InheritedArtifact
{
private final String groupId, artifactId;
private boolean added;
InheritedArtifact( String pGroupId, String pArtifactId )
{
groupId = pGroupId;
artifactId = pArtifactId;
}
String getGroupId() { return groupId; }
String getArtifactId() { return artifactId; }
boolean isAdded() { return added; }
void setAdded() {
if (added)
{
throw new IllegalStateException( "This artifact was already added: " +
groupId + ":" + artifactId );
}
}
}
private static final InheritedArtifact[] inheritedArtifacts =
{
new InheritedArtifact( "org.apache.axis2", "axis2-common" ),
new InheritedArtifact( "org.apache.axis2", "axis2-core" ),
new InheritedArtifact( "org.apache.ws.commons.axiom", "axiom-api" ),
new InheritedArtifact( "org.apache.ws.commons.axiom", "axiom-impl" ),
new InheritedArtifact( "org.apache.ws.commons", "neethi" ),
new InheritedArtifact( "wsdl4j", "wsdl4j" ),
new InheritedArtifact( "commons-httpclient", "commons-httpclient" )
};
private static final InheritedArtifact[] adbArtifacts =
{
new InheritedArtifact( "org.apache.axis2", "axis2-adb" )
};
/**
* Fills the option map. This map is passed onto
* the code generation API to generate the code.
*/
private Map fillOptionMap() throws MojoFailureException {
Map optionMap = new HashMap();
////////////////////////////////////////////////////////////////
//WSDL file name
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.WSDL_LOCATION_URI_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.WSDL_LOCATION_URI_OPTION,
getStringArray(wsdlFile.getPath())));
//output location
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.OUTPUT_LOCATION_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.OUTPUT_LOCATION_OPTION,
getStringArray(outputDirectory.getPath())));
//////////////////////////////////////////////////////////////////
// Databinding type
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.DATA_BINDING_TYPE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.DATA_BINDING_TYPE_OPTION,
getStringArray(databindingName)));
if ("async".equals(syncMode)) {
// Async only option - forcing to generate async methods only
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_ASYNC_ONLY_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_ASYNC_ONLY_OPTION,
new String[0]));
} else if ("sync".equals(syncMode)) {
// Sync only option - forcing to generate Sync methods only
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_SYNC_ONLY_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_SYNC_ONLY_OPTION,
new String[0]));
} else if ("both".equals(syncMode)) {
// Do nothing
} else {
throw new MojoFailureException("Invalid syncMode: " + syncMode +
", expected either of 'sync', 'async' or 'both'.");
}
//Package
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.PACKAGE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.PACKAGE_OPTION,
getStringArray(packageName)));
//stub language
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.STUB_LANGUAGE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.STUB_LANGUAGE_OPTION,
getStringArray(language)));
//server side and generate services.xml options
if (generateServerSide) {
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_CODE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_CODE_OPTION,
new String[0]));
//services XML generation - effective only when specified as the server side
if (generateServicesXml) {
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants
.GENERATE_SERVICE_DESCRIPTION_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants
.GENERATE_SERVICE_DESCRIPTION_OPTION,
new String[0]));
}
//generate all option - Only valid when generating serverside code
if (generateAllClasses) {
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_ALL_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_ALL_OPTION,
new String[0]));
}
}
//generate the test case
if (generateTestcase) {
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_TEST_CASE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_TEST_CASE_OPTION,
new String[0]));
}
//Unwrap classes option - this determines whether the generated classes are inside the stub/MR
//or gets generates as seperate classes
if (unpackClasses) {
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.UNPACK_CLASSES_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.UNPACK_CLASSES_OPTION,
new String[0]));
}
//server side interface option
if (generateServerSideInterface) {
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_INTERFACE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_INTERFACE_OPTION,
new String[0]));
}
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.SERVICE_NAME_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.SERVICE_NAME_OPTION,
new String[]{serviceName}));
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.PORT_NAME_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.PORT_NAME_OPTION,
new String[]{portName}));
// set the namespaces
optionMap.put(
CommandLineOptionConstants.WSDL2JavaConstants.NAME_SPACE_TO_PACKAGE_OPTION,
new CommandLineOption(
CommandLineOptionConstants.WSDL2JavaConstants.NAME_SPACE_TO_PACKAGE_OPTION,
new String[]{getNamespaceToPackagesMap()}));
return optionMap;
}
private String getNamespaceToPackagesMap() throws MojoFailureException {
StringBuffer sb = new StringBuffer();
if (namespaceToPackages != null) {
sb.append(namespaceToPackages);
}
if (namespaceURIs != null) {
for (int i = 0; i < namespaceURIs.length; i++) {
NamespaceURIMapping mapping = namespaceURIs[i];
String uri = mapping.getUri();
if (uri == null) {
throw new MojoFailureException("A namespace to package mapping requires an uri child element.");
}
String uriPackageName = mapping.getPackageName();
if (uriPackageName != null) {
throw new MojoFailureException("A namespace to package mapping requires a packageName child element.");
}
if(sb.length() > 0) {
sb.append(",");
}
sb.append(uri);
sb.append('=');
sb.append(uriPackageName);
}
}
return sb.toString();
}
/**
* Utility method to convert a string into a single item string[]
* @param value
* @return Returns String[].
*/
private String[] getStringArray(String value) {
String[] values = new String[1];
values[0] = value;
return values;
}
public void execute() throws MojoFailureException, MojoExecutionException {
Map commandLineOptions = this.fillOptionMap();
CommandLineOptionParser parser =
new CommandLineOptionParser(commandLineOptions);
try {
new CodeGenerationEngine(parser).generate();
} catch (CodeGenerationException e) {
Throwable t = e;
while (t.getCause() != null)
{
t = t.getCause();
}
t.printStackTrace();
throw new MojoExecutionException(e.getMessage(), e);
}
fixCompileSourceRoots();
fixDependencies();
showDependencies();
}
private void showDependencies()
{
Log log = getLog();
if ( !log.isDebugEnabled() )
{
return;
}
log.debug( "The projects dependency artifacts are: " );
for (Iterator iter = project.getDependencyArtifacts().iterator(); iter.hasNext(); )
{
Artifact artifact = (Artifact) iter.next();
log.debug( " " + artifact.getGroupId() + ":" + artifact.getArtifactId() +
":" + artifact.getVersion() + ":" + artifact.getClassifier() +
":" + artifact.getScope() + ":" + artifact.getType() );
}
log.debug( "The projects transitive artifacts are: " );
for (Iterator iter = project.getArtifacts().iterator(); iter.hasNext(); )
{
Artifact artifact = (Artifact) iter.next();
log.debug( " " + artifact.getGroupId() + ":" + artifact.getArtifactId() +
":" + artifact.getVersion() + ":" + artifact.getClassifier() +
":" + artifact.getScope() + ":" + artifact.getType() );
}
}
private Artifact findArtifact(Collection pCollection, String pGroupId, String pArtifactId) {
for ( Iterator iter = pCollection.iterator(); iter.hasNext(); )
{
Artifact artifact = (Artifact) iter.next();
if ( pGroupId.equals( artifact.getGroupId() ) &&
pArtifactId.equals( artifact.getArtifactId() ) )
{
return artifact;
}
}
return null;
}
private InheritedArtifact[] getInheritedArtifacts()
{
final List list = new ArrayList();
list.addAll( Arrays.asList( inheritedArtifacts ) );
if ( "adb".equals( databindingName ) ) {
list.addAll( Arrays.asList( adbArtifacts ) );
}
return (InheritedArtifact[]) list.toArray( new InheritedArtifact[ list.size() ] );
}
private InheritedArtifact getInheritedArtifact( InheritedArtifact[] pInheritedArtifacts,
Artifact pArtifact )
{
for ( int i = 0; i < pInheritedArtifacts.length; i++ )
{
InheritedArtifact iArtifact = pInheritedArtifacts[i];
if ( iArtifact.getGroupId().equals( pArtifact.getGroupId() ) &&
iArtifact.getArtifactId().equals( pArtifact.getArtifactId() ) )
{
return iArtifact;
}
}
return null;
}
private void fixDependencies()
{
final Set set = new HashSet( project.getDependencyArtifacts() );
final InheritedArtifact[] inhArtifacts = getInheritedArtifacts();
for (Iterator iter = pluginArtifacts.iterator(); iter.hasNext(); )
{
final Artifact artifact = (Artifact) iter.next();
final InheritedArtifact iArtifact = getInheritedArtifact( inhArtifacts, artifact );
if ( iArtifact != null )
{
iArtifact.setAdded();
final String groupId = artifact.getGroupId();
final String artifactId = artifact.getArtifactId();
if ( findArtifact( project.getArtifacts(), groupId, artifactId )
== null)
{
getLog().debug( "Adding artifact " + groupId + ":" + artifactId );
Artifact artfct = artifactFactory.createArtifactWithClassifier( groupId, artifactId,
artifact.getVersion(),
artifact.getType(),
artifact.getClassifier() );
artfct.setScope( Artifact.SCOPE_COMPILE );
set.add( artfct );
}
else
{
getLog().debug( "The artifact " + artifact.getGroupId() + ":" +
artifact.getArtifactId() + " is already present " +
" in the project and will not be added." );
}
}
}
project.setDependencyArtifacts( set );
}
private void fixCompileSourceRoots()
{
File srcDir = new File(outputDirectory, "src");
project.addCompileSourceRoot(srcDir.getPath());
}
}