blob: ac9665c766334189344fd7c98062401881009ef3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Sonatype 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
*
* Contributors:
* Sonatype Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.extras.sourcefeature;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.eclipse.sisu.equinox.EquinoxServiceFactory;
import org.eclipse.tycho.PackagingType;
import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction;
import org.eclipse.tycho.core.shared.TargetEnvironment;
import org.eclipse.tycho.model.Feature;
import org.eclipse.tycho.model.FeatureRef;
import org.eclipse.tycho.p2.facade.internal.AttachedArtifact;
import org.eclipse.tycho.p2.metadata.DependencyMetadataGenerator;
import org.eclipse.tycho.p2.metadata.IArtifactFacade;
import org.eclipse.tycho.p2.metadata.IDependencyMetadata;
import org.eclipse.tycho.p2.metadata.PublisherOptions;
import org.eclipse.tycho.p2.resolver.P2MetadataProvider;
import de.pdark.decentxml.Document;
import de.pdark.decentxml.Element;
import de.pdark.decentxml.XMLDeclaration;
@Component(role = P2MetadataProvider.class, hint = "org.eclipse.tycho.extras.sourcefeature.SourceFeatureP2MetadataProvider")
public class SourceFeatureP2MetadataProvider implements P2MetadataProvider, Initializable {
@Requirement
private Logger log;
@Requirement
private EquinoxServiceFactory equinox;
private DependencyMetadataGenerator generator;
@Override
public Map<String, IDependencyMetadata> getDependencyMetadata(MavenSession session, MavenProject project,
List<TargetEnvironment> environments, OptionalResolutionAction optionalAction) {
if (!PackagingType.TYPE_ECLIPSE_FEATURE.equals(project.getPackaging())) {
return null;
}
Plugin plugin = project.getPlugin("org.eclipse.tycho.extras:tycho-source-feature-plugin");
if (plugin != null) {
if (plugin.getConfiguration() != null && ((Xpp3Dom) plugin.getConfiguration()).getChild("skip") != null) {
if (Boolean.valueOf(((Xpp3Dom) plugin.getConfiguration()).getChild("skip").getValue())) {
return null;
}
}
try {
File sourceFeatureBasedir = SourceFeatureMojo.getSourcesFeatureOutputDir(project);
/*
* There is no easy way to determine what *exact* source bundles/features will be
* included in the source feature at this point. Because of this, the source feature
* dependency-only metadata does not include any dependencies.
*
* This has two implications.
*
* First, any missing source bundles/features will not be detected/reported until
* source feature mojo is executed. This is inconsistent with how everything else
* works in Tycho, but probably is a good thing.
*
* More importantly, though, source bundles/features are not included as transitive
* dependencies of other reactor projects that include the source feature. To solve
* this for eclipse-repository project, repository project dependencies are
* recalculated during repository packaging. Other 'aggregating' project types, like
* eclipse-update-site and eclipse-feature with deployableFeature=true, will not be
* compatible with source features until
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=353889 is implemented.
*/
Feature feature = Feature.read(new File(project.getBasedir(), "feature.xml"));
Document document = new Document();
document.setRootNode(new Element("feature"));
document.setXmlDeclaration(new XMLDeclaration("1.0", "UTF-8"));
Feature sourceFeature = new Feature(document);
sourceFeature.setId(feature.getId() + ".source");
sourceFeature.setVersion(feature.getVersion());
// 410418 source feature includes binary feature
FeatureRef binaryRef = new FeatureRef("includes");
binaryRef.setId(feature.getId());
binaryRef.setVersion(feature.getVersion());
sourceFeature.addFeatureRef(binaryRef);
Feature.write(sourceFeature, new File(sourceFeatureBasedir, Feature.FEATURE_XML));
String classifier = SourceFeatureMojo.SOURCES_FEATURE_CLASSIFIER;
IArtifactFacade artifact = new AttachedArtifact(project, sourceFeatureBasedir, classifier);
return Collections.singletonMap(classifier, generator.generateMetadata(artifact, null,
OptionalResolutionAction.REQUIRE, new PublisherOptions()));
} catch (IOException e) {
log.error("Could not create sources feature.xml", e);
}
}
return null;
}
@Override
public void initialize() throws InitializationException {
this.generator = equinox.getService(DependencyMetadataGenerator.class, "(role-hint=dependency-only)");
}
}