001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.fusesource.hawtbuf.proto.compiler;
019
020 import java.io.File;
021 import java.io.FileFilter;
022 import java.util.Arrays;
023 import java.util.List;
024
025 import org.apache.maven.plugin.AbstractMojo;
026 import org.apache.maven.plugin.MojoExecutionException;
027 import org.apache.maven.project.MavenProject;
028
029 /**
030 * A Maven Mojo so that the Proto compiler can be used with maven.
031 *
032 * @goal compile
033 * @phase process-sources
034 */
035 public class ProtoMojo extends AbstractMojo {
036
037 /**
038 * The maven project.
039 *
040 * @parameter expression="${project}"
041 * @required
042 * @readonly
043 */
044 protected MavenProject project;
045
046 /**
047 * The directory where the proto files (<code>*.proto</code>) are
048 * located.
049 *
050 * @parameter default-value="${basedir}/src/main/proto"
051 */
052 private File mainSourceDirectory;
053
054 /**
055 * The directory where the output files will be located.
056 *
057 * @parameter default-value="${project.build.directory}/generated-sources/proto"
058 */
059 private File mainOutputDirectory;
060
061 /**
062 * The directory where the proto files (<code>*.proto</code>) are
063 * located.
064 *
065 * @parameter default-value="${basedir}/src/test/proto"
066 */
067 private File testSourceDirectory;
068
069 /**
070 * The directory where the output files will be located.
071 *
072 * @parameter default-value="${project.build.directory}/test-generated-sources/proto"
073 */
074 private File testOutputDirectory;
075
076 /**
077 * The type of generator to run.
078 *
079 * @parameter default-value="default"
080 */
081 private String type;
082
083 public void execute() throws MojoExecutionException {
084
085 File[] mainFiles = null;
086 if ( mainSourceDirectory.exists() ) {
087 mainFiles = mainSourceDirectory.listFiles(new FileFilter() {
088 public boolean accept(File pathname) {
089 return pathname.getName().endsWith(".proto");
090 }
091 });
092 if (mainFiles==null || mainFiles.length==0) {
093 getLog().warn("No proto files found in directory: " + mainSourceDirectory.getPath());
094 } else {
095 processFiles(mainFiles, mainOutputDirectory);
096 this.project.addCompileSourceRoot(mainOutputDirectory.getAbsolutePath());
097 }
098 }
099
100 File[] testFiles = null;
101 if ( testSourceDirectory.exists() ) {
102 testFiles = testSourceDirectory.listFiles(new FileFilter() {
103 public boolean accept(File pathname) {
104 return pathname.getName().endsWith(".proto");
105 }
106 });
107 if (testFiles==null || testFiles.length==0) {
108 getLog().warn("No proto files found in directory: " + testSourceDirectory.getPath());
109 } else {
110 processFiles(testFiles, testOutputDirectory);
111 this.project.addTestCompileSourceRoot(testOutputDirectory.getAbsolutePath());
112 }
113 }
114 }
115
116 private void processFiles(File[] mainFiles, File outputDir) throws MojoExecutionException {
117 List<File> recFiles = Arrays.asList(mainFiles);
118 for (File file : recFiles) {
119 try {
120 getLog().info("Compiling: "+file.getPath());
121 if( "default".equals(type) ) {
122 JavaGenerator generator = new JavaGenerator();
123 generator.setOut(outputDir);
124 generator.compile(file);
125 } else if( "alt".equals(type) ) {
126 AltJavaGenerator generator = new AltJavaGenerator();
127 generator.setOut(outputDir);
128 generator.compile(file);
129 }
130 } catch (CompilerException e) {
131 getLog().error("Protocol Buffer Compiler failed with the following error(s):");
132 for (String error : e.getErrors() ) {
133 getLog().error("");
134 getLog().error(error);
135 }
136 getLog().error("");
137 throw new MojoExecutionException("Compile failed. For more details see error messages listed above.", e);
138 }
139 }
140 }
141
142 }