/*
* Copyright (c) 2002-2013 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 com.alibaba.citrus.maven.eclipse;
import java.io.File;
import java.io.IOException;
import com.alibaba.citrus.maven.eclipse.base.eclipse.EclipsePlugin;
import com.alibaba.citrus.maven.eclipse.base.eclipse.writers.EclipseClasspathWriter;
import com.alibaba.citrus.maven.eclipse.base.eclipse.writers.EclipseOSGiManifestWriter;
import com.alibaba.citrus.maven.eclipse.base.eclipse.writers.EclipseProjectWriter;
import com.alibaba.citrus.maven.eclipse.base.eclipse.writers.EclipseWriter;
import com.alibaba.citrus.maven.eclipse.base.eclipse.writers.EclipseWriterConfig;
import com.alibaba.citrus.maven.eclipse.base.ide.IdeDependency;
import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.util.xml.XMLWriter;
/**
* Modification on the original eclipse:eclipse plugin, to ignore osgi dependencies in pde project.
*
* @author Michael Zhou
* @goal pde-eclipse
*/
public class PdeEclipsePlugin extends EclipsePlugin {
/**
* if set ignoreOsgiBundle=true in a PDE project, it will include all dependencies of project.
* If not, the OSGI dependencies will be excluded.
* <p/>
*
* @parameter expression="${eclipse.ignoreOsgiBundle}" default-value="false"
*/
private boolean ignoreOsgiBundle;
/**
* if a libdir is specified, e.g. "lib", in a PDE project, it will copy dependencies into this folder
* instead of creating resource links for them.
* <p/>
*
* @parameter expression="${eclipse.libdir}"
*/
private String libdir;
@Override
protected IdeDependency[] doDependencyResolution() throws MojoExecutionException {
IdeDependency[] deps = super.doDependencyResolution();
if (ignoreOsgiBundle) {
for (int i = 0; i < deps.length; i++) {
IdeDependency dep = deps[i];
if (dep.isOsgiBundle()) {
deps[i] = new IdeDependency(dep.getGroupId(),
dep.getArtifactId(),
dep.getVersion(),
dep.getClassifier(),
dep.isReferencedProject(),
dep.isTestDependency(),
dep.isSystemScoped(),
dep.isProvided(),
dep.isAddedToClasspath(),
dep.getFile(),
dep.getType(),
false, // force to be false
null,
-1,
dep.getEclipseProjectName());
}
}
}
if (isPdeProject() && libdir != null) {
for (int j = 0; j < deps.length; j++) {
IdeDependency dep = deps[j];
if (!dep.isProvided() && !dep.isReferencedProject() && !dep.isTestDependency() && !dep.isOsgiBundle() && dep.getFile() != null) {
File lib = new File(getProject().getBasedir(), libdir);
File srcfile = dep.getFile();
getLog().info("Copying " + srcfile.getName() + " to " + lib.getAbsolutePath());
try {
FileUtils.copyFileToDirectory(srcfile, lib);
} catch (IOException e) {
getLog().error("Failed to copy " + srcfile.getName() + " to " + lib.getAbsolutePath(), e);
}
}
}
}
return deps;
}
@Override
protected EclipseWriter getEclipseClasspathWriter(EclipseWriterConfig config) {
return new EclipseClasspathWriter() {
@Override
protected String getDependencyPathForPde(String name) {
return addLibdir(name);
}
}.init(getLog(), config);
}
@Override
protected EclipseWriter getEclipseProjectWriter(EclipseWriterConfig config) {
return new EclipseProjectWriter() {
@Override
protected void writeResourceLinksForPdeProject(XMLWriter writer, IdeDependency[] dependencies)
throws MojoExecutionException {
if (libdir == null) {
super.writeResourceLinksForPdeProject(writer,
dependencies);
}
}
}.init(getLog(), config);
}
@Override
@Deprecated
protected EclipseWriter getEclipseOSGiManifestWriter(EclipseWriterConfig config) {
return new EclipseOSGiManifestWriter() {
@Override
protected String getDependencyPathForPde(String name) {
return addLibdir(name);
}
}.init(getLog(), config);
}
private String addLibdir(String name) {
if (libdir == null) {
return name;
} else {
return (libdir + "/" + name).replace("^/+", "").replace("/+", "/");
}
}
}