/*******************************************************************************
* Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package com.cisco.yangide.m2e.yang;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import org.apache.maven.plugin.MojoExecution;
import org.codehaus.plexus.util.Scanner;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.IMaven;
import org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant;
import org.sonatype.plexus.build.incremental.BuildContext;
import com.cisco.yangide.core.YangCorePlugin;
import com.cisco.yangide.core.YangModelException;
import com.cisco.yangide.core.indexing.IJob;
import com.cisco.yangide.core.indexing.JobAdapter;
import com.cisco.yangide.core.model.YangModelManager;
import com.cisco.yangide.core.parser.IYangValidationListener;
import com.cisco.yangide.core.parser.YangParserUtil;
import com.cisco.yangide.ui.YangUIPlugin;
import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
/**
* @author Konstantin Zaitsev
* @date Jul 2, 2014
*/
public class YangBuildParticipant extends MojoExecutionBuildParticipant {
public YangBuildParticipant(MojoExecution execution, boolean runOnIncremental) {
super(execution, runOnIncremental);
}
@Override
public Set<IProject> build(final int kind, IProgressMonitor monitor) throws Exception {
long dt = System.currentTimeMillis();
IMaven maven = MavenPlugin.getMaven();
BuildContext buildContext = getBuildContext();
String projectName = getMavenProjectFacade().getProject().getName();
File source = maven.getMojoParameterValue(getSession().getCurrentProject(), getMojoExecution(),
YangM2EPlugin.YANG_FILES_ROOT_DIR, File.class, monitor);
if (source == null) {
source = new File(getSession().getCurrentProject().getBasedir(), YangM2EPlugin.YANG_FILES_ROOT_DIR_DEFAULT);
}
Scanner ds = buildContext.newScanner(source);
ds.scan();
final String[] includedFiles = ds.getIncludedFiles();
if (includedFiles == null || includedFiles.length <= 0) {
return null;
}
// clear markers before build
getMavenProjectFacade().getProject().deleteMarkers(YangCorePlugin.YANGIDE_PROBLEM_MARKER, true,
IResource.DEPTH_INFINITE);
Set<File> outputDirs = new HashSet<>();
YangGeneratorConfiguration[] confs = maven.getMojoParameterValue(getSession().getCurrentProject(),
getMojoExecution(), YangM2EPlugin.YANG_CODE_GENERATORS, YangGeneratorConfiguration[].class, monitor);
if (confs != null) {
for (YangGeneratorConfiguration conf : confs) {
if (conf.getOutputBaseDir() != null) {
outputDirs.add(conf.getOutputBaseDir());
}
}
}
boolean isCleanRequired = YangUIPlugin.getDefault().getPreferenceStore()
.getBoolean(YangPreferenceConstants.M2E_PLUGIN_CLEAN_TARGET);
if (isCleanRequired) {
long dt2 = System.currentTimeMillis();
for (File outputDir : outputDirs) {
IContainer[] containers = ResourcesPlugin.getWorkspace().getRoot()
.findContainersForLocationURI(URIUtil.toURI(outputDir.getAbsolutePath()));
if (containers != null && containers.length > 0) {
containers[0].delete(true, monitor);
}
}
YangM2EPlugin.traceTime(projectName, "clean classes", dt2, System.currentTimeMillis());
}
Set<IProject> result = super.build(kind, monitor);
for (Throwable ex : getSession().getResult().getExceptions()) {
YangCorePlugin.log(ex);
}
for (File outputDir : outputDirs) {
buildContext.refresh(outputDir);
}
final IProject curProject = getMavenProjectFacade().getProject();
curProject.touch(monitor);
final File basedir = ds.getBasedir();
// wait index job
long dt3 = System.currentTimeMillis();
if (kind == FULL_BUILD) {
YangModelManager.getIndexManager().indexAll(curProject);
}
YangModelManager.getIndexManager().performConcurrentJob(new JobAdapter() {
@Override
public boolean execute(IProgressMonitor progress) {
validate(basedir, includedFiles);
return false;
}
}, IJob.WaitUntilReady, monitor);
YangM2EPlugin.traceTime(projectName, "yang index", dt3, System.currentTimeMillis());
YangM2EPlugin.traceTime(projectName, "total", dt, System.currentTimeMillis());
return result;
}
private void validate(File basedir, String[] includedFiles) {
for (String path : includedFiles) {
final IFile ifile = YangCorePlugin.getIFileFromFile(new File(basedir, path));
if (ifile != null) {
try {
YangParserUtil.validateYangFile(YangCorePlugin.createYangFile(ifile).getBuffer().getContents()
.toCharArray(), ifile.getProject(), new IYangValidationListener() {
@Override
public void validationError(String msg, int lineNumber, int charStart, int charEnd) {
YangCorePlugin.createProblemMarker(ifile, msg, lineNumber, charStart, charEnd);
}
@Override
public void syntaxError(String msg, int lineNumber, int charStart, int charEnd) {
YangCorePlugin.createProblemMarker(ifile, msg, lineNumber, charStart, charEnd);
}
});
} catch (YangModelException e) {
YangCorePlugin.log(e);
}
}
}
}
}