org.codehaus.mojo.jaxb2.javageneration.TestXjcMojo Maven / Gradle / Ivy
Show all versions of jaxb2-maven-plugin Show documentation
package org.codehaus.mojo.jaxb2.javageneration;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.codehaus.mojo.jaxb2.AbstractJaxbMojo;
import org.codehaus.mojo.jaxb2.shared.FileSystemUtilities;
import org.codehaus.mojo.jaxb2.shared.filters.Filter;
import org.codehaus.mojo.jaxb2.shared.filters.Filters;
import org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Mojo that creates test-scope Java source or binaries from XML schema(s)
* by invoking the JAXB XJC binding compiler. This implementation is tailored
* to use the JAXB Reference Implementation from project Kenai.
* Note that the TestXjcMojo was completely re-implemented for the 2.x versions.
* Its configuration semantics and parameter set is not necessarily
* backwards compatible with the 1.x plugin versions. If you are
* upgrading from version 1.x of the plugin, read the documentation carefully.
*
* @author Lennart Jörelid
* @see The JAXB Reference Implementation
*/
@Mojo(name = "testXjc",
defaultPhase = LifecyclePhase.GENERATE_TEST_SOURCES,
requiresDependencyResolution = ResolutionScope.TEST,
threadSafe = false)
public class TestXjcMojo extends AbstractJavaGeneratorMojo {
/**
* The last part of the stale fileName for this TestXjcMojo.
*/
public static final String STALE_FILENAME = "testXjcStaleFlag";
/**
* Standard directory path (relative to basedir) searched recursively for test
* source files (typically XSDs), unless overridden by a
* testSources
configuration element.
*/
public static final String STANDARD_TEST_SOURCE_DIRECTORY = "src/test/xsd";
/**
* Default exclude Filters for test sources, used unless overridden by an
* explicit configuration in the {@code testSourceExcludeFilters} parameter.
* The default values are found as follows:
*
*
* final List<Filter<File>> xjbTemp = new ArrayList<Filter<File>>();
* xjbTemp.addAll(AbstractJaxbMojo.STANDARD_EXCLUDE_FILTERS);
* xsdTemp.add(new PatternFileFilter(Arrays.asList("\\.xjb"), true));
* STANDARD_TEST_SOURCE_EXCLUDE_FILTERS = Collections.unmodifiableList(xsdTemp);
*
*
*
* @see #STANDARD_EXCLUDE_FILTERS
*/
public static final List> STANDARD_TEST_SOURCE_EXCLUDE_FILTERS;
/**
* Standard directory path (relative to basedir) searched recursively for XJB
* files, unless overridden by an testXjbSources
configuration element.
* As explained in the JAXB specification, XJB files (JAXB Xml Binding files)
* are used to configure parts of the Java source generation.
*/
public static final String STANDARD_TEST_XJB_DIRECTORY = "src/test/xjb";
/**
* Default List of exclude Filters for XJB files, unless overridden by providing
* an explicit configuration in the {@code testXjbExcludeFilters} parameter.
* The default values are found as follows:
*
*
* final List<Filter<File>> xjbTemp = new ArrayList<Filter<File>>();
* xjbTemp.addAll(AbstractJaxbMojo.STANDARD_EXCLUDE_FILTERS);
* xjbTemp.add(new PatternFileFilter(Arrays.asList("\\.xsd"), true));
* STANDARD_TEST_XJB_EXCLUDE_FILTERS = Collections.unmodifiableList(xjbTemp);
*
*
*
* @see #STANDARD_EXCLUDE_FILTERS
*/
public static final List> STANDARD_TEST_XJB_EXCLUDE_FILTERS;
static {
final List> xjbTemp = new ArrayList>();
xjbTemp.addAll(AbstractJaxbMojo.STANDARD_EXCLUDE_FILTERS);
xjbTemp.add(new PatternFileFilter(Arrays.asList("\\.xsd"), true));
STANDARD_TEST_XJB_EXCLUDE_FILTERS = Collections.unmodifiableList(xjbTemp);
final List> xsdTemp = new ArrayList>();
xsdTemp.addAll(AbstractJaxbMojo.STANDARD_EXCLUDE_FILTERS);
xsdTemp.add(new PatternFileFilter(Arrays.asList("\\.xjb"), true));
STANDARD_TEST_SOURCE_EXCLUDE_FILTERS = Collections.unmodifiableList(xsdTemp);
}
/**
* Corresponding XJC parameter: {@code d}.
* The working directory where the generated Java test source files are created.
*/
@Parameter(defaultValue = "${project.build.directory}/generated-test-sources/jaxb", required = true)
private File outputDirectory;
/**
* Parameter holding List of XSD paths to files and/or directories which should be recursively searched
* for XSD files. Only files or directories that actually exist will be included (in the case of files)
* or recursively searched for XSD files to include (in the case of directories).
* Configure using standard Maven structure for Lists:
*
*
* <configuration>
* ...
* <testSources>
* <testSource>some/explicit/relative/file.xsd</testSource>
* <testSource>/another/absolute/path/to/a/specification.xsd</testSource>
* <testSource>a/directory/holding/xsds</testSource>
* </testSources>
* </configuration>
*
*
*
* @see #STANDARD_TEST_SOURCE_DIRECTORY
*/
@Parameter(required = false)
private List testSources;
/**
* Parameter holding List of XJB Files and/or directories which should be recursively searched
* for XJB files. Only files or directories that actually exist will be included (in the case of files)
* or recursively searched for XJB files to include (in the case of directories). JAXB binding files are
* used to configure parts of the Java source generation.
* Supply the configuration using the standard Maven structure for configuring plugin Lists:
*
*
* <configuration>
* ...
* <testXjbSources>
* <testXjbSource>bindings/aBindingConfiguration.xjb</testXjbSource>
* <testXjbSource>bindings/config/directory</testXjbSource>
* </testXjbSources>
* </configuration>
*
*
*
* @see #STANDARD_TEST_XJB_DIRECTORY
*/
@Parameter(required = false)
private List testXjbSources;
/**
* Parameter holding a List of Filters, used to match all files under the {@code testSources} directories
* which should not be considered XJC test source files. (The filters identify files to
* exclude, and hence this parameter is called {@code testS§ourceExcludeFilters}). If a file under any of the
* test source directories matches at least one of the Filters supplied in the {@code testSourceExcludeFilters},
* it is not considered an XJC source file, and therefore excluded from processing.
* If not explicitly provided, the Mojo uses the value within {@code STANDARD_TEST_SOURCE_EXCLUDE_FILTERS}.
* The algorithm for finding XJC test sources is as follows:
*
* - Find all files given in the testSources List. Any Directories provided are searched for files
* recursively.
* - Exclude any found files matching any of the supplied {@code testSourceExcludeFilters} List.
* - The remaining Files are submitted for processing by the XJC tool.
*
* Example: The following configuration would exclude any sources whose names end with
* {@code txt} or {@code foo}:
*
*
* <configuration>
* ...
* <testSourceExcludeFilters>
* <suffixFilter impl="org.codehaus.mojo.jaxb2.shared.filters.source.ExclusionRegularExpressionFileFilter">txt</suffixFilter>
* <suffixFilter impl="org.codehaus.mojo.jaxb2.shared.filters.source.ExclusionRegularExpressionFileFilter">foo</suffixFilter>
* </testSourceExcludeFilters>
* </configuration>
*
*
*
* @see #STANDARD_TEST_SOURCE_EXCLUDE_FILTERS
* @see org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter
* @see org.codehaus.mojo.jaxb2.shared.filters.pattern.AbstractPatternFilter
* @see org.codehaus.mojo.jaxb2.shared.filters.AbstractFilter
*/
@Parameter(required = false)
private List> testSourceExcludeFilters;
/***
* Parameter holding a List of Filters, used to match all files under the {@code testXjbSources} directories
* which should not be considered XJB files. (The filters identify files to exclude, and hence
* this parameter is called {@code testXjbExcludeFilters}). If a file matches at least one of the supplied Filters,
* it is not considered an XJB file, and therefore excluded from processing.
* If not explicitly provided, the Mojo uses the value within {@code STANDARD_TEST_XJB_EXCLUDE_FILTERS}.
* Example: The following configuration would exclude any XJB files whose names end with
* {@code xml} or {@code foo}:
*
*
* <configuration>
* ...
* <testXjbExcludeFilters>
* <suffixFilter impl="org.codehaus.mojo.jaxb2.shared.filters.source.ExclusionRegularExpressionFileFilter">xml</suffixFilter>
* <suffixFilter impl="org.codehaus.mojo.jaxb2.shared.filters.source.ExclusionRegularExpressionFileFilter">foo</suffixFilter>
* </sourceExcludeFilters>
* </testXjbExcludeFilters>
*
*
*
* @see #STANDARD_TEST_XJB_EXCLUDE_FILTERS
* @see org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter
* @see org.codehaus.mojo.jaxb2.shared.filters.pattern.AbstractPatternFilter
* @see org.codehaus.mojo.jaxb2.shared.filters.AbstractFilter
*/
@Parameter(required = false)
private List> testXjbExcludeFilters;
/**
* Indicate if the XjcMojo execution should be skipped.
*/
@Parameter(property = "xjc.test.skip", defaultValue = "false")
private boolean skipTestXjc;
/**
* {@inheritDoc}
*/
@Override
protected boolean shouldExecutionBeSkipped() {
return skipTestXjc;
}
/**
* {@inheritDoc}
*/
@Override
protected List getSources() {
final List> excludePatterns = testSourceExcludeFilters == null
? STANDARD_TEST_SOURCE_EXCLUDE_FILTERS
: testSourceExcludeFilters;
Filters.initialize(getLog(), excludePatterns);
// All done.
return FileSystemUtilities.filterFiles(
getProject().getBasedir(),
testSources,
Arrays.asList(STANDARD_TEST_SOURCE_DIRECTORY),
getLog(),
"testSources",
excludePatterns);
}
/**
* {@inheritDoc}
*/
@Override
protected List getSourceXJBs() {
final List> excludePatterns = testXjbExcludeFilters == null
? STANDARD_TEST_XJB_EXCLUDE_FILTERS
: testXjbExcludeFilters;
Filters.initialize(getLog(), excludePatterns);
return FileSystemUtilities.filterFiles(
getProject().getBasedir(),
testXjbSources,
STANDARD_TEST_XJB_DIRECTORY,
getLog(),
"testXjbSources",
excludePatterns);
}
/**
* {@inheritDoc}
*/
@Override
protected String getStaleFileName() {
return STALE_FILENAME;
}
/**
* {@inheritDoc}
*/
@Override
protected File getOutputDirectory() {
return outputDirectory;
}
/**
* {@inheritDoc}
*/
@Override
protected List getClasspath() throws MojoExecutionException {
try {
return (List) getProject().getTestClasspathElements();
} catch (DependencyResolutionRequiredException e) {
throw new MojoExecutionException("Could not retrieve Compile classpath.", e);
}
}
/**
* {@inheritDoc}
*/
@Override
protected void addGeneratedSourcesToProjectSourceRoot() {
getProject().addTestCompileSourceRoot(getOutputDirectory().getAbsolutePath());
}
/**
* {@inheritDoc}
*/
@Override
protected void addResource(final Resource resource) {
getProject().addTestResource(resource);
}
}