package org.kevoree.tools.mavenplugin; import com.typesafe.config.Config; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.kevoree.ContainerRoot; import org.kevoree.bootstrap.util.ConfigHelper; import org.kevoree.factory.DefaultKevoreeFactory; import org.kevoree.factory.KevoreeFactory; import org.kevoree.kcl.api.FlexyClassLoader; import org.kevoree.kevscript.KevScriptEngine; import org.kevoree.log.Log; import org.kevoree.microkernel.KevoreeKernel; import org.kevoree.microkernel.impl.KevoreeMicroKernelImpl; import org.kevoree.pmodeling.api.ModelLoader; import org.kevoree.tools.mavenplugin.util.RegistryHelper; import java.io.*; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; /** * Created with IntelliJ IDEA. * User: duke * Date: 28/11/2013 * Time: 11:13 */ @Mojo(name = "run", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) public class KevRunnerMojo extends KevGenerateMojo { @Parameter() private String registry = null; @Parameter(defaultValue = "${project.basedir}/src/main/kevs/main.kevs") private File kevscript = null; @Parameter(defaultValue = "node0") private String nodeName = null; @Parameter() private HashMap<String, String> ctxVars = new HashMap<>(); @Parameter private File[] mergeLocalLibraries; @Override public void execute() throws MojoExecutionException, MojoFailureException { super.execute(); try { if (System.getProperty("dev.target.dirs") == null) { StringBuilder pathsToMerge = new StringBuilder(modelOutputDirectory.getAbsolutePath()); if (mergeLocalLibraries != null) { for (File filePath: mergeLocalLibraries) { if (!filePath.getAbsolutePath().equals(modelOutputDirectory.getAbsolutePath())) { pathsToMerge.append(File.pathSeparator); pathsToMerge.append(filePath.getAbsolutePath()); } } } System.setProperty("dev.target.dirs", pathsToMerge.toString()); } else { StringBuilder pathsToMerge = new StringBuilder(modelOutputDirectory.getAbsolutePath()); String[] paths = System.getProperty("dev.target.dirs").split(File.pathSeparator); for (String path: paths) { if (!path.equals(modelOutputDirectory.getAbsolutePath())) { pathsToMerge.append(File.pathSeparator); pathsToMerge.append(path); } } System.setProperty("dev.target.dirs", pathsToMerge.toString()); } KevoreeFactory factory = new DefaultKevoreeFactory(); if (System.getProperty("node.name") == null) { System.setProperty("node.name", nodeName); } if (System.getProperty("kevoree.version") == null) { System.setProperty("kevoree.version", factory.getVersion()); } Config config = ConfigHelper.get(); URL registryUrl = RegistryHelper.getUrl(config, registry); if (System.getProperty("registry.host") == null) { System.setProperty("registry.host", registryUrl.getHost()); } if (System.getProperty("registry.port") == null) { int port = registryUrl.getPort(); if (port == -1) { port = registryUrl.getDefaultPort(); } System.setProperty("registry.port", String.valueOf(port)); } if (System.getProperty("registry.ssl") == null) { System.setProperty("registry.ssl", String.valueOf(registryUrl.getProtocol().equals("https"))); } if (System.getProperty("log.level") != null) { String log = System.getProperty("log.level"); if ("DEBUG".equalsIgnoreCase(log) && !Log.DEBUG) { Log.set(Log.LEVEL_DEBUG); } else if ("WARN".equalsIgnoreCase(log) && !Log.WARN) { Log.set(Log.LEVEL_WARN); } else if ("INFO".equalsIgnoreCase(log) && !Log.INFO) { Log.set(Log.LEVEL_INFO); } else if ("ERROR".equalsIgnoreCase(log) && !Log.ERROR) { Log.set(Log.LEVEL_ERROR); } else if ("TRACE".equalsIgnoreCase(log) && !Log.TRACE) { Log.set(Log.LEVEL_TRACE); } else if ("NONE".equalsIgnoreCase(log)) { Log.set(Log.LEVEL_NONE); } } String script = new String(Files.readAllBytes(kevscript.toPath())); ModelLoader loader = factory.createJSONLoader(); Path libModelPath = Paths.get(modelOutputDirectory.getAbsolutePath(), "KEV-INF", "kevlib.json"); InputStream inStream = new FileInputStream(libModelPath.toFile()); ContainerRoot ctxModel = (ContainerRoot) loader.loadModelFromStream(inStream).get(0); try { getLog().info(""); getLog().info("Applying KevScript: " + Paths.get(project.getBasedir().getAbsolutePath()).relativize(kevscript.toPath()) + "..."); getLog().info("On model: " + Paths.get(project.getBasedir().getAbsolutePath()).relativize(libModelPath)); KevScriptEngine kevs = new KevScriptEngine(registryUrl.toString()); kevs.execute(script, ctxModel, ctxVars); Path ctxModelPath = Paths.get(modelOutputDirectory.getAbsolutePath(), "KEV-INF", "ctxModel.json"); try { factory.createJSONSerializer().serializeToStream(ctxModel, new FileOutputStream(ctxModelPath.toFile())); getLog().info(" => resulting model saved at " + Paths.get(project.getBasedir().getAbsolutePath()).relativize(ctxModelPath)); getLog().info(""); getLog().info("Starting Kevoree runtime using -Dnode.bootstrap=" + Paths.get(project.getBasedir().getAbsolutePath()).relativize(ctxModelPath)); KevoreeKernel kernel = new KevoreeMicroKernelImpl(); String bootJar = "mvn:org.kevoree:org.kevoree.bootstrap:" + System.getProperty("kevoree.version"); FlexyClassLoader kcl = kernel.install(bootJar, bootJar); if (System.getProperty("node.bootstrap") == null) { System.setProperty("node.bootstrap", ctxModelPath.toString()); } kernel.boot(kcl.getResourceAsStream("KEV-INF/bootinfo")); Thread.currentThread().join(); } catch (IOException e) { throw new MojoExecutionException("Unable to write context model to " + Paths.get(project.getBasedir().getAbsolutePath()).relativize(ctxModelPath)); } } catch (Exception e) { throw new MojoExecutionException("Something went wrong", e); } } catch (IOException e) { throw new MojoExecutionException("Unable to read KevScript file at " + Paths.get(project.getBasedir().getAbsolutePath()).relativize(kevscript.toPath()), e); } catch (Exception e) { throw new MojoExecutionException("Something went wrong", e); } } }