blob: e5509ee592e0966f03bf3d0d30e3d7591605ce06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 SAP AG 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.packaging;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.archiver.ArchivedFileSet;
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
import org.codehaus.plexus.component.annotations.Component;
import org.eclipse.tycho.ArtifactDescriptor;
import org.eclipse.tycho.ArtifactType;
import org.eclipse.tycho.ReactorProject;
import org.eclipse.tycho.core.shared.BuildProperties;
import org.eclipse.tycho.core.shared.BuildPropertiesImpl;
import org.eclipse.tycho.core.shared.BuildPropertiesParser;
import org.eclipse.tycho.core.utils.TychoProjectUtils;
import org.eclipse.tycho.model.Feature;
@Component(role = LicenseFeatureHelper.class)
public class LicenseFeatureHelper {
public LicenseFeatureHelper() {
}
/**
* Get the license feature jar for feature (or <code>null</code> if it has no license feature).
*
* See {@linkplain http://wiki.eclipse.org/Equinox/p2/License_Mechanism }.
*
* @param feature
* original feature
* @param mavenProject
* original feature project
* @return the license feature jar
*/
public File getLicenseFeature(Feature feature, MavenProject mavenProject) {
String id = feature.getLicenseFeature();
if (id == null) {
return null;
}
ArtifactDescriptor licenseFeature = TychoProjectUtils.getDependencyArtifacts(mavenProject).getArtifact(
ArtifactType.TYPE_ECLIPSE_FEATURE, id, feature.getLicenseFeatureVersion());
if (licenseFeature == null) {
throw new IllegalStateException("License feature with id " + id
+ " is not found among project dependencies");
}
ReactorProject licenseProject = licenseFeature.getMavenProject();
if (licenseProject == null) {
return licenseFeature.getLocation();
}
File artifact = licenseProject.getArtifact();
if (!artifact.isFile()) {
throw new IllegalStateException("At least ''package'' phase need to be executed");
}
return artifact;
}
/**
* Get all files included in license feature jar (via build.properties
* bin.includes/bin.excludes) exept for feature.xml, feature.properties and build.properties as
* an archived fileset so they can be added to another feature jar.
*
* @param licenseFeature
* license feature jar
*/
public ArchivedFileSet getLicenseFeatureFileSet(File licenseFeature) throws IOException {
// copy all files from license feature's build.properties file except
// feature.properties, feature.xml and build.properties itself
BuildProperties buildProperties;
try (ZipFile zip = new ZipFile(licenseFeature)) {
ZipEntry entry = zip.getEntry(BuildPropertiesParser.BUILD_PROPERTIES);
if (entry != null) {
InputStream is = zip.getInputStream(entry);
Properties p = new Properties();
p.load(is);
buildProperties = new BuildPropertiesImpl(p);
} else {
throw new IllegalArgumentException("license feature must include build.properties file");
}
}
List<String> includes = buildProperties.getBinIncludes();
Set<String> excludes = new HashSet<>(buildProperties.getBinExcludes());
excludes.add(Feature.FEATURE_XML);
excludes.add("feature.properties");
excludes.add(BuildPropertiesParser.BUILD_PROPERTIES);
// mavenArchiver ignores license feature files that are also present in 'this' feature
// i.e. if there is a conflict, files from 'this' feature win
DefaultArchivedFileSet result = new DefaultArchivedFileSet(licenseFeature);
result.setIncludes(includes.toArray(new String[includes.size()]));
result.setExcludes(excludes.toArray(new String[excludes.size()]));
return result;
}
}