Author: rec Date: Fri May 31 12:00:19 2013 New Revision: 1488182 URL: http://svn.apache.org/r1488182 Log: [UIMA-2471] add a jcasgen-maven-plugin (and m2e connector) - Switched to annotation-based Maven component configuration - Downgraded to Maven 3.0 (was 3.0.4)
Modified: uima/uimaj/trunk/jcasgen-maven-plugin/pom.xml uima/uimaj/trunk/jcasgen-maven-plugin/src/main/java/org/apache/uima/tools/jcasgen/maven/JCasGenMojo.java Modified: uima/uimaj/trunk/jcasgen-maven-plugin/pom.xml URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/jcasgen-maven-plugin/pom.xml?rev=1488182&r1=1488181&r2=1488182&view=diff ============================================================================== --- uima/uimaj/trunk/jcasgen-maven-plugin/pom.xml (original) +++ uima/uimaj/trunk/jcasgen-maven-plugin/pom.xml Fri May 31 12:00:19 2013 @@ -1,20 +1,20 @@ <!-- - 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 + 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 + 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. + 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. --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> @@ -33,15 +33,22 @@ <relativePath>../uimaj-parent/pom.xml</relativePath> </parent> <dependencies> + <!-- Dependencies on the Maven Plugin API and friends --> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> - <version>3.0.4</version> + <version>3.0</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> - <version>3.0.4</version> + <version>3.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-tools</groupId> + <artifactId>maven-plugin-annotations</artifactId> + <version>3.2</version> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.uima</groupId> Modified: uima/uimaj/trunk/jcasgen-maven-plugin/src/main/java/org/apache/uima/tools/jcasgen/maven/JCasGenMojo.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/jcasgen-maven-plugin/src/main/java/org/apache/uima/tools/jcasgen/maven/JCasGenMojo.java?rev=1488182&r1=1488181&r2=1488182&view=diff ============================================================================== --- uima/uimaj/trunk/jcasgen-maven-plugin/src/main/java/org/apache/uima/tools/jcasgen/maven/JCasGenMojo.java (original) +++ uima/uimaj/trunk/jcasgen-maven-plugin/src/main/java/org/apache/uima/tools/jcasgen/maven/JCasGenMojo.java Fri May 31 12:00:19 2013 @@ -33,6 +33,11 @@ import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; +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.apache.maven.project.MavenProject; import org.apache.uima.UIMAFramework; import org.apache.uima.resource.ResourceManager; @@ -52,227 +57,242 @@ import org.sonatype.plexus.build.increme * Note that by default this runs at the process-resources phase because it requires the XML * descriptor files to already be at the appropriate places on the classpath, and the * generate-resources phase runs before resources are copied. - * - * @goal generate - * @phase process-resources - * @requiresDependencyResolution compile */ -public class JCasGenMojo extends AbstractMojo { - - /** - * The path to the XML type system description. - * - * @parameter - * @required - * @readonly - */ - private String typeSystem; - - /** - * The directory where the generated sources will be written. - * - * @parameter default-value="${project.build.directory}/generated-sources/jcasgen" - * @required - * @readonly - */ - private File outputDirectory; - - /** - * The Maven Project. - * - * @parameter property="project" - * @required - * @readonly - */ - private MavenProject project; - - /** - * The Plexus build context, used to see if files have changed. - * - * @component - */ - private BuildContext buildContext; - - public void execute() throws MojoExecutionException, MojoFailureException { - - // add the generated sources to the build - if (!this.outputDirectory.exists()) { - this.outputDirectory.mkdirs(); - this.buildContext.refresh(this.outputDirectory); - } - this.project.addCompileSourceRoot(this.outputDirectory.getPath()); - - // the type system is relative to the base directory - File typeSystemFile = new File(this.project.getBasedir(), this.typeSystem); +@Mojo(name = "generate", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, requiresDependencyResolution = ResolutionScope.COMPILE) +public class JCasGenMojo + extends AbstractMojo +{ + @Component + private MavenProject project; + + @Component + private BuildContext buildContext; + + /** + * The path to the XML type system description. + */ + @Parameter(required = true) + private String typeSystem; + + /** + * The directory where the generated sources will be written. + */ + @Parameter(defaultValue = "${project.build.directory}/generated-sources/jcasgen", required = true) + private File outputDirectory; - // assemble the classpath - List<String> elements; - try { - elements = this.project.getCompileClasspathElements(); - } catch (DependencyResolutionRequiredException e) { - throw new MojoExecutionException(e.getMessage(), e); - } - StringBuilder classpathBuilder = new StringBuilder(); - for (String element : elements) { - if (classpathBuilder.length() > 0) { - classpathBuilder.append(File.pathSeparatorChar); - } - classpathBuilder.append(element); - } - String classpath = classpathBuilder.toString(); + @Override + public void execute() + throws MojoExecutionException, MojoFailureException + { + + // add the generated sources to the build + if (!this.outputDirectory.exists()) { + this.outputDirectory.mkdirs(); + this.buildContext.refresh(this.outputDirectory); + } + this.project.addCompileSourceRoot(this.outputDirectory.getPath()); - // skip JCasGen if there are no changes in the type system file or the files it references - if (!this.buildContext.hasDelta(this.typeSystem) && !this.hasDelta(typeSystemFile, classpath)) { - this.getLog().info("JCasGen: Skipped, since no type system changes were detected"); - return; - } + // the type system is relative to the base directory + File typeSystemFile = new File(this.project.getBasedir(), this.typeSystem); - // run JCasGen to generate the Java sources - Jg jCasGen = new Jg(); - String[] args = new String[] { "-jcasgeninput", typeSystemFile.toString(), "-jcasgenoutput", - this.outputDirectory.getAbsolutePath(), "=jcasgenclasspath", classpath }; - try { - jCasGen.main0(args, null, new JCasGenProgressMonitor(), new JCasGenErrors()); - } catch (JCasGenException e) { - throw new MojoExecutionException(e.getMessage(), e.getCause()); - } + // assemble the classpath + List<String> elements; + try { + elements = this.project.getCompileClasspathElements(); + } + catch (DependencyResolutionRequiredException e) { + throw new MojoExecutionException(e.getMessage(), e); + } + StringBuilder classpathBuilder = new StringBuilder(); + for (String element : elements) { + if (classpathBuilder.length() > 0) { + classpathBuilder.append(File.pathSeparatorChar); + } + classpathBuilder.append(element); + } + String classpath = classpathBuilder.toString(); - // signal that the output directory has changed - this.buildContext.refresh(this.outputDirectory); - } + // skip JCasGen if there are no changes in the type system file or the files it references + if (!this.buildContext.hasDelta(this.typeSystem) + && !this.hasDelta(typeSystemFile, classpath)) { + this.getLog().info("JCasGen: Skipped, since no type system changes were detected"); + return; + } - private class JCasGenProgressMonitor implements IProgressMonitor { + // run JCasGen to generate the Java sources + Jg jCasGen = new Jg(); + String[] args = new String[] { "-jcasgeninput", typeSystemFile.toString(), + "-jcasgenoutput", this.outputDirectory.getAbsolutePath(), "=jcasgenclasspath", + classpath }; + try { + jCasGen.main0(args, null, new JCasGenProgressMonitor(), new JCasGenErrors()); + } + catch (JCasGenException e) { + throw new MojoExecutionException(e.getMessage(), e.getCause()); + } - public JCasGenProgressMonitor() { + // signal that the output directory has changed + this.buildContext.refresh(this.outputDirectory); } - @Override - public void done() { - } + private class JCasGenProgressMonitor + implements IProgressMonitor + { - @Override - public void beginTask(String name, int totalWorked) { - } + public JCasGenProgressMonitor() + { + } - @Override - public void subTask(String message) { - getLog().info("JCasGen: " + message); - } + @Override + public void done() + { + } - @Override - public void worked(int work) { - } - } + @Override + public void beginTask(String name, int totalWorked) + { + } - private class JCasGenErrors implements IError { + @Override + public void subTask(String message) + { + getLog().info("JCasGen: " + message); + } - public JCasGenErrors() { + @Override + public void worked(int work) + { + } } - @Override - public void newError(int severity, String message, Exception exception) { - String fullMessage = "JCasGen: " + message; - if (severity == IError.INFO) { - getLog().info(fullMessage, exception); - } else if (severity == IError.WARN) { - getLog().warn(fullMessage, exception); - } else if (severity == IError.ERROR) { - throw new JCasGenException(exception.getMessage(), exception); - } else { - throw new UnsupportedOperationException("Unknown severity level: " + severity); - } - } - } + private class JCasGenErrors + implements IError + { - private static class JCasGenException extends RuntimeException { - private static final long serialVersionUID = 1L; + public JCasGenErrors() + { + } - public JCasGenException(String message, Throwable cause) { - super(message, cause); + @Override + public void newError(int severity, String message, Exception exception) + { + String fullMessage = "JCasGen: " + message; + if (severity == IError.INFO) { + getLog().info(fullMessage, exception); + } + else if (severity == IError.WARN) { + getLog().warn(fullMessage, exception); + } + else if (severity == IError.ERROR) { + throw new JCasGenException(exception.getMessage(), exception); + } + else { + throw new UnsupportedOperationException("Unknown severity level: " + severity); + } + } } - } - private boolean hasDelta(File typeSystemFile, String classpath) { - // load the type system and resolve the imports using the classpath - TypeSystemDescription typeSystemDescription; - try { - XMLInputSource in = new XMLInputSource(typeSystemFile.toURI().toURL()); - typeSystemDescription = UIMAFramework.getXMLParser().parseTypeSystemDescription(in); - ResourceManager resourceManager = UIMAFramework.newDefaultResourceManager(); - resourceManager.setExtensionClassPath(classpath, true); - typeSystemDescription.resolveImports(resourceManager); - // on any exception, the type system was invalid, so assume no files have changed - } catch (InvalidXMLException e) { - return false; - } catch (MalformedURLException e) { - return false; - } catch (IOException e) { - return false; + private static class JCasGenException + extends RuntimeException + { + private static final long serialVersionUID = 1L; + + public JCasGenException(String message, Throwable cause) + { + super(message, cause); + } } - File buildOutputDirectory = new File(this.project.getBuild().getOutputDirectory()); + private boolean hasDelta(File typeSystemFile, String classpath) + { + // load the type system and resolve the imports using the classpath + TypeSystemDescription typeSystemDescription; + try { + XMLInputSource in = new XMLInputSource(typeSystemFile.toURI().toURL()); + typeSystemDescription = UIMAFramework.getXMLParser().parseTypeSystemDescription(in); + ResourceManager resourceManager = UIMAFramework.newDefaultResourceManager(); + resourceManager.setExtensionClassPath(classpath, true); + typeSystemDescription.resolveImports(resourceManager); + // on any exception, the type system was invalid, so assume no files have changed + } + catch (InvalidXMLException e) { + return false; + } + catch (MalformedURLException e) { + return false; + } + catch (IOException e) { + return false; + } + + File buildOutputDirectory = new File(this.project.getBuild().getOutputDirectory()); - // map each resource from its target location to its source location - Map<File, File> targetToSource = new HashMap<File, File>(); - for (Resource resource : this.project.getResources()) { - File resourceDir = new File(resource.getDirectory()); - if (resourceDir.exists()) { - - // scan for the resource files - List<String> includes = resource.getIncludes(); - if (includes.isEmpty()) { - includes = Arrays.asList("**"); - } - List<String> excludes = resource.getExcludes(); - DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir(resourceDir); - scanner.setIncludes(includes.toArray(new String[includes.size()])); - scanner.setExcludes(excludes.toArray(new String[excludes.size()])); - scanner.scan(); - - // map each of the resources from its target location to its source location - String targetPath = resource.getTargetPath(); - for (String filePath : scanner.getIncludedFiles()) { - File sourceFile = new File(resourceDir, filePath); - File baseDirectory = targetPath != null ? new File(buildOutputDirectory, targetPath) - : buildOutputDirectory; - File targetFile = new File(baseDirectory, filePath); - targetToSource.put(targetFile, sourceFile); + // map each resource from its target location to its source location + Map<File, File> targetToSource = new HashMap<File, File>(); + for (Resource resource : this.project.getResources()) { + File resourceDir = new File(resource.getDirectory()); + if (resourceDir.exists()) { + + // scan for the resource files + List<String> includes = resource.getIncludes(); + if (includes.isEmpty()) { + includes = Arrays.asList("**"); + } + List<String> excludes = resource.getExcludes(); + DirectoryScanner scanner = new DirectoryScanner(); + scanner.setBasedir(resourceDir); + scanner.setIncludes(includes.toArray(new String[includes.size()])); + scanner.setExcludes(excludes.toArray(new String[excludes.size()])); + scanner.scan(); + + // map each of the resources from its target location to its source location + String targetPath = resource.getTargetPath(); + for (String filePath : scanner.getIncludedFiles()) { + File sourceFile = new File(resourceDir, filePath); + File baseDirectory = targetPath != null ? new File(buildOutputDirectory, + targetPath) : buildOutputDirectory; + File targetFile = new File(baseDirectory, filePath); + targetToSource.put(targetFile, sourceFile); + } + } } - } - } - // search through the type system description for source files that have changed - for (TypeDescription type : typeSystemDescription.getTypes()) { - URL typeSystemURL = type.getSourceUrl(); - if (typeSystemURL != null) { - File targetFile; - try { - targetFile = new File(typeSystemURL.toURI()); - // for any type system source that is not a File, assume it has not changed - } catch (URISyntaxException e) { - continue; - } catch (IllegalArgumentException e) { - continue; - } - File sourceFile = targetToSource.get(targetFile); - if (sourceFile != null) { - // for any type system file that is also a resource file, return true if it has changed - if (this.buildContext.hasDelta(sourceFile)) { - this.getLog().info("Type system file " + sourceFile + " has changed"); - return true; - } - // for any type system file that is in the same project, return true if it has changed - if (targetFile.getAbsolutePath().startsWith(this.project.getBasedir().getAbsolutePath())) { - if (this.buildContext.hasDelta(targetFile)) { - this.getLog().info("Type system file " + sourceFile + " has changed"); - return true; + // search through the type system description for source files that have changed + for (TypeDescription type : typeSystemDescription.getTypes()) { + URL typeSystemURL = type.getSourceUrl(); + if (typeSystemURL != null) { + File targetFile; + try { + targetFile = new File(typeSystemURL.toURI()); + // for any type system source that is not a File, assume it has not changed + } + catch (URISyntaxException e) { + continue; + } + catch (IllegalArgumentException e) { + continue; + } + File sourceFile = targetToSource.get(targetFile); + if (sourceFile != null) { + // for any type system file that is also a resource file, return true if it has + // changed + if (this.buildContext.hasDelta(sourceFile)) { + this.getLog().info("Type system file " + sourceFile + " has changed"); + return true; + } + // for any type system file that is in the same project, return true if it has + // changed + if (targetFile.getAbsolutePath().startsWith( + this.project.getBasedir().getAbsolutePath())) { + if (this.buildContext.hasDelta(targetFile)) { + this.getLog().info("Type system file " + sourceFile + " has changed"); + return true; + } + } + } } - } } - } + // no type system files have changed + return false; } - // no type system files have changed - return false; - } }