blob: 622716a4d3cbd1862274d2498f1a7d9b6b6e1d25 [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.custombundle;
import java.io.File;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
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.core.resolver.shared.OptionalResolutionAction;
import org.eclipse.tycho.core.shared.TargetEnvironment;
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;
/**
* This component is invoked during Tycho dependency resolution and provides P2 metadata that
* describes artifacts that will be created by custom-bundle goal.
*/
@Component(role = P2MetadataProvider.class, hint = "org.eclipse.tycho.extras.custombundle.CustomBundleP2MetadataProvider")
public class CustomBundleP2MetadataProvider implements P2MetadataProvider, Initializable {
@Requirement
private EquinoxServiceFactory equinox;
private DependencyMetadataGenerator generator;
@Override
public Map<String, IDependencyMetadata> getDependencyMetadata(MavenSession session, MavenProject project,
List<TargetEnvironment> environments, OptionalResolutionAction optionalAction) {
Map<String, IDependencyMetadata> metadata = new LinkedHashMap<>();
Plugin plugin = project.getPlugin("org.eclipse.tycho.extras:tycho-custom-bundle-plugin");
if (plugin != null) {
// it is possible to configure manifest location at <plugin> level, but it does not make sense to do so
for (PluginExecution execution : plugin.getExecutions()) {
File location = getBundleLocation(execution);
String classifier = getClassifier(execution);
if (location != null && classifier != null) {
IArtifactFacade artifact = new AttachedArtifact(project, location, classifier);
metadata.put(classifier, new SecondaryDependencyMetadata(generator.generateMetadata(artifact,
environments, optionalAction, new PublisherOptions())));
}
}
}
return metadata;
}
private String getClassifier(PluginExecution execution) {
Xpp3Dom cfg = (Xpp3Dom) execution.getConfiguration();
if (cfg == null) {
return null;
}
Xpp3Dom classifierDom = cfg.getChild("classifier");
if (classifierDom == null) {
return null;
}
return classifierDom.getValue();
}
private File getBundleLocation(PluginExecution execution) {
Xpp3Dom cfg = (Xpp3Dom) execution.getConfiguration();
if (cfg == null) {
return null;
}
Xpp3Dom locationDom = cfg.getChild("bundleLocation");
if (locationDom == null) {
return null;
}
return new File(locationDom.getValue());
}
@Override
public void initialize() throws InitializationException {
this.generator = equinox.getService(DependencyMetadataGenerator.class, "(role-hint=dependency-only)");
}
private static class SecondaryDependencyMetadata implements IDependencyMetadata {
final Set<Object> metadata;
public SecondaryDependencyMetadata(IDependencyMetadata original) {
metadata = Collections.unmodifiableSet(original.getMetadata());
}
public Set<Object> getMetadata(boolean primary) {
return primary ? Collections.emptySet() : metadata;
}
public Set<Object> getMetadata() {
return metadata;
}
}
}