package org.kevoree.annotator.runner; import org.kevoree.ContainerRoot; import org.kevoree.DeployUnit; import org.kevoree.annotator.Annotations2Model; import org.kevoree.annotator.MinimalPomParser; import org.kevoree.api.helper.KModelHelper; import org.kevoree.factory.DefaultKevoreeFactory; import org.kevoree.factory.KevoreeFactory; import org.kevoree.log.Log; import org.kevoree.pmodeling.api.json.JSONModelSerializer; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * Created by duke on 8/14/14. */ public class App { public static void analyze(String paths, ContainerRoot model, KevoreeFactory factory, DeployUnit mainDu) { String[] pathsS = paths.split(File.pathSeparator); for (String s : pathsS) { JarFile jarFile; try { File sf = new File(s); if (!sf.isDirectory() && sf.getName().endsWith(".jar")) { jarFile = new JarFile(sf); final Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { final JarEntry entry = entries.nextElement(); if (entry.getName().contains(".")) { if (entry.getName().startsWith("META-INF/maven/") && entry.getName().endsWith("pom.xml")) { JarEntry fileEntry = jarFile.getJarEntry(entry.getName()); InputStream input = jarFile.getInputStream(fileEntry); try { DeployUnit du = MinimalPomParser.currentURL(input, model, factory); mainDu.addRequiredLibs(du); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } } } } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] ignore) throws Exception { long before = System.currentTimeMillis(); Annotations2Model annotations2Model = new Annotations2Model(); KevoreeFactory factory = new DefaultKevoreeFactory(); String directoryTargets = System.getProperty("dev.target.dirs"); String[] directoryTargetList = directoryTargets.split(File.pathSeparator); for (String directoryTarget : directoryTargetList) { File directoryTargetFile = new File(directoryTarget); if (!(directoryTargetFile.exists() && directoryTargetFile.isDirectory())) { throw new Exception("Bad target dir argument !" + directoryTarget); } else { ContainerRoot model = factory.createContainerRoot(); factory.root(model); DeployUnit mainDu = MinimalPomParser.lookupLocalDeployUnit(directoryTargetFile, model, factory); if (System.getProperty("dev.classloader") != null) { analyze(System.getProperty("dev.classloader"), model, factory, mainDu); } ArrayList<String> classPaths = new ArrayList<String>(); classPaths.add(directoryTargetFile.getAbsolutePath()); annotations2Model.fillModel(directoryTargetFile, model, mainDu, classPaths); //generate the file if (model.getPackages().size() > 0) { File targetFile = new File(directoryTarget + File.separator + "KEV-INF" + File.separator + "lib.json"); JSONModelSerializer saver = new JSONModelSerializer(); targetFile.getParentFile().mkdirs(); targetFile.createNewFile(); FileOutputStream fop = new FileOutputStream(targetFile); saver.serializeToStream(model, fop); fop.flush(); fop.close(); File targetFileDev = new File(directoryTarget + File.separator + "KEV-INF" + File.separator + "dev.meta"); FileWriter writer = new FileWriter(targetFileDev); writer.append(buildKernelKey(mainDu)); writer.flush(); writer.close(); } } } long time = System.currentTimeMillis() - before; Log.info("Generation of KEV-INF/lib.json done in {} ms ", time); } public static String buildKernelKey(DeployUnit deployUnit) { StringBuilder builder = new StringBuilder(); builder.append("mvn:"); builder.append(KModelHelper.fqnGroup(deployUnit)); builder.append(":"); builder.append(deployUnit.getName()); builder.append(":"); builder.append(deployUnit.getVersion()); return builder.toString(); } }