/**
* 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
* <p/>
* http://www.gnu.org/licenses/lgpl-3.0.txt
* <p/>
* 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.
*/
package org.kevoree.tools.mavenplugin;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Repository;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
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.kevoree.ContainerRoot;
import org.kevoree.DeployUnit;
import org.kevoree.Value;
import org.kevoree.api.helper.KModelHelper;
import org.kevoree.factory.DefaultKevoreeFactory;
import org.kevoree.factory.KevoreeFactory;
import org.kevoree.pmodeling.api.json.JSONModelSerializer;
import org.kevoree.tools.mavenplugin.util.Annotations2Model;
import org.kevoree.tools.mavenplugin.util.ModelBuilderHelper;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@Mojo(name = "generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class KevGenerateMojo extends AbstractMojo {
@Parameter(required = true, readonly = true, defaultValue = "${project}")
public MavenProject project;
@Parameter(defaultValue = "${localRepository}")
private ArtifactRepository localRepository = null;
@Parameter(defaultValue = "${project.build.directory}/classes", required = true)
protected File modelOutputDirectory;
@Parameter(required = true)
private String namespace = null;
private Annotations2Model annotations2Model = new Annotations2Model();
private KevoreeFactory factory = new DefaultKevoreeFactory();
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (project.getArtifact().getType().equals("jar")) {
getLog().info("Generating a Kevoree model by reflection...");
final ContainerRoot model = factory.createContainerRoot();
factory.root(model);
final HashMap<String, Set<String>> collectedClasses = new HashMap<String, Set<String>>();
DeployUnit deployUnit = processModel(model, collectedClasses);
try {
annotations2Model.fillModel(modelOutputDirectory, model, deployUnit,
project.getCompileClasspathElements(), collectedClasses);
} catch (Exception e) {
throw new MojoExecutionException("Error while parsing Kevoree annotations", e);
}
processModelSerialization(model);
}
}
private DeployUnit processModel(ContainerRoot model, Map<String, Set<String>> collectedClasses) {
model.setGenerated_KMF_ID("0");
DeployUnit du = factory.createDeployUnit();
du.setName(project.getArtifact().getArtifactId());
String hashcode = ModelBuilderHelper.createKey(namespace, project.getArtifactId(), project.getVersion(), null);
du.setHashcode(hashcode);
du.setVersion(project.getArtifact().getBaseVersion());
Value platform = factory.createValue();
platform.setName("platform");
platform.setValue("java");
du.addFilters(platform);
// add repositories
for (Repository repo : project.getRepositories()) {
Value repoVal = factory.createValue();
repoVal.setName("repo_" + repo.getId());
repoVal.setValue(repo.getUrl());
du.addFilters(repoVal);
}
org.kevoree.Package pack = KModelHelper.fqnCreate(namespace, model, factory);
if (pack == null) {
getLog().info("Package " + project.getArtifact().getGroupId() + " " + pack);
} else {
pack.addDeployUnits(du);
}
du.setUrl(project.getArtifact().getGroupId() + ":" + du.getName() + ":" + du.getVersion());
try {
File f2 = localRepository.find(project.getArtifact()).getFile();
if (f2 != null && f2.getAbsolutePath().endsWith(".jar")) {
JarFile file = new JarFile(f2);
Enumeration<JarEntry> entries = file.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
// System.err.println(entry.getName());
Set<String> sources = collectedClasses.get(entry.getName());
if (sources == null) {
sources = new HashSet<String>();
collectedClasses.put(entry.getName(), sources);
}
sources.add(project.getArtifact().getGroupId() + ":" + project.getArtifact().getArtifactId() + ":"
+ project.getArtifact().getVersion() + ":" + project.getArtifact().getType());
}
file.close();
}
} catch (Exception ignore) {}
return du;
}
private void processModelSerialization(ContainerRoot model) throws MojoExecutionException {
JSONModelSerializer saver = factory.createJSONSerializer();
Path path = Paths.get(modelOutputDirectory.getPath(), "KEV-INF", "kevlib.json");
File modelJson = new File(path.toString());
try {
modelJson.getParentFile().mkdirs();
modelJson.createNewFile();
FileOutputStream fos = new FileOutputStream(modelJson);
saver.serializeToStream(model, fos);
fos.flush();
fos.close();
getLog().info("Model saved at " + Paths.get(project.getBasedir().getAbsolutePath()).relativize(path));
} catch (Exception e) {
getLog().error(e);
throw new MojoExecutionException("Unable to write model at "
+ Paths.get(project.getBasedir().getAbsolutePath()).relativize(path));
}
}
}