/** * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/lgpl-3.0.txt * * 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. */ /** * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/lgpl-3.0.txt * * 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. */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.kevoree.tools.nativeCode.mavenplugin; import org.apache.maven.model.Model; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.kevoree.*; import org.kevoree.tools.nativeCode.mavenplugin.utils.MavenHelper; import org.kevoree.tools.nativeN.utils.KevScriptLoader; import org.kevoree.tools.nativeN.generator.AbstractCodeGenerator; import org.kevoree.tools.nativeN.generator.CodeGeneratorC; import org.kevoree.tools.nativeN.generator.CodeGeneratorJava; import org.kevoree.tools.nativeN.utils.FileManager; import java.io.*; import java.util.List; /** * @author jedartois * @author <a href="mailto:jedartois@gmail.com">Jean-Emile DARTOIS</a> * @version $Id$ * @goal generate * @phase generate-sources * @requiresDependencyResolution compile */ public class GenerateFilesMojo extends AbstractMojo { /** * The directory root under which processor-generated source files will be placed; files are placed in * subdirectories based on package namespace. This is equivalent to the <code>-s</code> argument for apt. * * @parameter default-value="${project.build.directory}/generated-sources/kevoree" */ private File sourceOutputDirectory; /** * @parameter default-value="${basedir}/src/main" */ private File inputCFile; /** * POM * * @parameter expression="${project}" * @readonly * @required */ protected MavenProject project; final String[] files_thirdparty = {"component.h", "kqueue.h", "events_common.h", "events_fifo.h", "HashMap.h", "settings.h"}; final String nameWrapper ="-wrapper"; @Override public void execute() throws MojoExecutionException, MojoFailureException { if (inputCFile == null || !(inputCFile.exists())) { getLog().warn("InputDir null => "); } else { List<File> componentFiles = MavenHelper.scanForKevScript(inputCFile); System.out.println(inputCFile + "There is not kevs finds size = " + componentFiles.size()); for (File f : componentFiles) { getLog().info("File found =>" + f.getAbsolutePath()); try { generateSources(f.getName().replace(".kevs", ""), f.getPath(), f.getPath().replace(f.getName(), "")); } catch (Exception e) { e.printStackTrace(); } } } } public String generateJavaSources(AbstractCodeGenerator code) throws IOException { // Create Java Project Wrapper File modulesFiles = new File(project.getBasedir(), "modules"); if (!modulesFiles.exists()) { modulesFiles.mkdirs(); } File wrapperPomProject = new File(modulesFiles, "wrapper"); if (!wrapperPomProject.exists()) { modulesFiles.mkdirs(); } Model wrapper_java = MavenHelper.createModel(project.getGroupId(), project.getArtifactId() + nameWrapper, project.getVersion(), MavenHelper.createParent(project), project); wrapper_java.setName(project.getName() + " :: Wrapper Java"); wrapper_java.setPomFile(new File(wrapperPomProject, "pom.xml")); getLog().info("Create Wrapper Pom"); MavenHelper.createPom("poms/pom.xml.component", wrapper_java.getPomFile().getPath(), wrapper_java, project); getLog().info("Generating files"); String root_build = inputCFile.getPath(); if (!root_build.endsWith(File.separator)) { root_build = root_build + File.separator; } /// GENERATE JAVA FILES File file_java = new File(root_build + "java/org/kevoree/library/nativeN/" + code.getComponentType().getName()); if (file_java.mkdirs()) { String gen_wrapper = new String(FileManager.load(GenerateFilesMojo.class.getClassLoader().getResourceAsStream("wrapper/wrapper.template"))); gen_wrapper = gen_wrapper.replace("$PACKAGE$", "package org.kevoree.library.nativeN." + code.getComponentType().getName() + ";"); gen_wrapper = gen_wrapper.replace("$HEADER_PORTS$", code.getHeaderPorts()); gen_wrapper = gen_wrapper.replace("$PORTS$", code.getPorts()); gen_wrapper = gen_wrapper.replace("$CLASS$", code.getComponentType().getName()); gen_wrapper = gen_wrapper.replace("$artifactId$", project.getArtifactId() + nameWrapper); gen_wrapper = gen_wrapper.replace("$groupId$", project.getGroupId()); gen_wrapper = gen_wrapper.replace("$version$", project.getVersion()); gen_wrapper = gen_wrapper.replace("$DICO$", code.getBody()); gen_wrapper = gen_wrapper.replace("$DICO$", code.getBody()); gen_wrapper = gen_wrapper.replace("$CNAME$",code.getComponentType().getName()); MavenHelper.writeFile(file_java.getPath() + "/" + code.getComponentType().getName() + ".java", gen_wrapper, false, false); } else { getLog().error("Generating component java"); } // add module // project.getModel().addModule("./" + wrapper_java.getArtifactId()); return wrapper_java.getArtifactId(); } public String generateCSources(AbstractCodeGenerator code) throws IOException { String componentName = code.getComponentType().getName(); File modulesFiles = new File(project.getBasedir(), "modules"); if (!modulesFiles.exists()) { modulesFiles.mkdirs(); } // Create NativeCode Pom Root Model component_c = MavenHelper.createModel(project.getGroupId(), project.getArtifactId() +nameWrapper, project.getVersion(), MavenHelper.createParent(project), project); component_c.setName(project.getName() + " :: NativeCode "); // Create sub NativeCode {arm,osx,nix32,nix64} MavenHelper.createPom("poms/pom.xml.c.nix32", modulesFiles.getAbsolutePath()+File.separator+"nix32/pom.xml", component_c, project); MavenHelper.createPom("poms/pom.xml.c.nix64", modulesFiles.getAbsolutePath()+File.separator+"nix64/pom.xml", component_c, project); MavenHelper.createPom("poms/pom.xml.c.osx", modulesFiles.getAbsolutePath()+File.separator+"osx/pom.xml", component_c, project); MavenHelper.createPom("poms/pom.xml.c.arm", modulesFiles.getAbsolutePath()+File.separator+"arm/pom.xml", component_c, project); /// GENERATE C FILES String root_build = inputCFile.getPath(); if (!root_build.endsWith(File.separator)) { root_build = root_build + File.separator; } /// GENERATE C FILES String path_c = root_build + "c/"; File file_c = new File(path_c); if (file_c.mkdirs()) { getLog().info("-> " + componentName + ".c"); MavenHelper.writeFile(file_c.getPath() + "/" + componentName + ".c", code.getHeaderPorts().replace("$NAME$", componentName), false, true); getLog().info("-> " + componentName + ".h"); MavenHelper.writeFile(file_c.getPath() + "/" + componentName + ".h", code.getBody(), false, true); // lib File file = new File(path_c + "/thirdparty"); if (file.mkdir()) { getLog().info("-> Thirdparty"); for (String n : files_thirdparty) { FileManager.copyFileFromStream(GenerateFilesMojo.class.getClassLoader().getResourceAsStream(n), file.getPath(), n, true); } } else { getLog().error("Creating thirdparty directory"); } } else { getLog().error("Creating sources directory"); } // add module // project.getModel().addModule("./" + component_c.getArtifactId()); // project.getModel().setBuild(null); //project.getModel().setPackaging("pom"); return component_c.getArtifactId(); } /** * Generate interfaces * * @param componentName * @param path_to_kevScript_file * @param path_out * @throws Exception */ public void generateSources(String componentName, String path_to_kevScript_file, String path_out) throws Exception { getLog().info("Reading KevScript"); // getting model from KevScript where CreatingType exist ContainerRoot model = KevScriptLoader.getModel(path_to_kevScript_file); //Set model to generators AbstractCodeGenerator codeGeneratorJava = new CodeGeneratorJava(model); AbstractCodeGenerator codeGeneratorC = new CodeGeneratorC(model); getLog().info("Generate sources"); // Generate JAVA CODE according with the model codeGeneratorJava.execute(); // Generate C CODE according with the model codeGeneratorC.execute(); generateJavaSources(codeGeneratorJava); generateCSources(codeGeneratorC); String path_pom_root = project.getModel().getPomFile().getPath(); String pom_root = new String(FileManager.load(path_pom_root)); if (!pom_root.contains("modules")) { String modules = " <modules>\n" + " <module>modules/wrapper</module>\n" + " </modules>\n" + "<profiles>\n" + " <profile>\n" + " <id>nix32</id>\n" + " <activation>\n" + " <os>\n" + " <family>unix</family>\n" + " <name>Linux</name>\n" + " <arch>i386</arch>\n" + " </os>\n" + " </activation>\n" + " <modules>\n" + " <module>modules/nix32</module>\n" + " </modules>\n" + " </profile>\n" + "\n" + " <profile>\n" + " <id>nix64</id>\n" + " <activation>\n" + " <os>\n" + " <family>unix</family>\n" + " <name>Linux</name>\n" + " <arch>x64</arch>\n" + " </os>\n" + " </activation>\n" + " <modules>\n" + " <module>modules/nix64</module>\n" + " </modules>\n" + " </profile>\n" + " <profile>\n" + " <id>osx</id>\n" + " <activation>\n" + " <os>\n" + " <family>mac</family>\n" + " </os>\n" + " </activation>\n" + "\n" + " <modules>\n" + " <module>modules/osx</module>\n" + " </modules>\n" + " </profile>\n" + " <profile>\n" + " <id>arm</id>\n" + " <activation>\n" + " <os>\n" + " <family>unix</family>\n" + " <name>Linux</name>\n" + " <arch>arm</arch>\n" + " </os>\n" + " </activation>\n" + " <modules>\n" + " <module>modules/arm</module>\n" + " </modules>\n" + " </profile>\n" + " </profiles>" + "" + "" + "</project>"; MavenHelper.writeFile(path_pom_root, pom_root.replace("</project>", modules), false, false); } } }