/*******************************************************************************
* Copyright (c) 2008, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.build.publisher;
import java.util.*;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils.IPathComputer;
import org.eclipse.equinox.internal.p2.publisher.FileSetDescriptor;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.publisher.AbstractAdvice;
import org.eclipse.equinox.p2.publisher.actions.IFeatureRootAdvice;
public class FeatureRootAdvice extends AbstractAdvice implements IFeatureRootAdvice {
private static final int IDX_COMPUTER = 0;
private static final int IDX_DESCRIPTOR = 1;
// String config -> Object[] { GatheringComputer, Map: permission -> Set, String }
private final Map advice = new HashMap();
private String featureId;
private Version featureVersion;
@Override
public boolean isApplicable(String configSpec, boolean includeDefault, String id, Version version) {
if (featureId != null && !featureId.equals(id))
return false;
if (featureVersion != null && !featureVersion.equals(version))
return false;
if (configSpec != null && !advice.containsKey(configSpec))
return false;
return true;
}
/**
* Return the configs for which we have advice
* @return String[]
*/
public String[] getConfigs() {
return (String[]) advice.keySet().toArray(new String[advice.size()]);
}
/**
* Return the GatheringComputer containing the set of rootfiles to include for the given config
* Returns null if we have no advice for the given config.
* @param config
* @return GatheringComputer
*/
public IPathComputer getRootFileComputer(String config) {
if (advice.containsKey(config))
return (GatheringComputer) ((Object[]) advice.get(config))[IDX_COMPUTER];
return null;
}
public void addRootfiles(String config, GatheringComputer computer) {
Object[] configAdvice = getConfigAdvice(config);
if (configAdvice[IDX_COMPUTER] == null)
configAdvice[IDX_COMPUTER] = computer;
else {
GatheringComputer existing = (GatheringComputer) configAdvice[IDX_COMPUTER];
existing.addAll(computer);
}
FileSetDescriptor descriptor = getDescriptor(config);
descriptor.addFiles(computer.getFiles());
}
public void addPermissions(String config, String permissions, String[] files) {
FileSetDescriptor descriptor = getDescriptor(config);
for (int i = 0; i < files.length; i++) {
descriptor.addPermissions(new String[] {permissions, files[i]});
}
}
public void addLinks(String config, String links) {
FileSetDescriptor descriptor = getDescriptor(config);
descriptor.setLinks(links);
}
private Object[] getConfigAdvice(String config) {
Object[] configAdvice = (Object[]) advice.get(config);
if (configAdvice == null) {
configAdvice = new Object[3];
advice.put(config, configAdvice);
}
return configAdvice;
}
public FileSetDescriptor getDescriptor(String config) {
Object[] configAdvice = getConfigAdvice(config);
FileSetDescriptor descriptor = null;
if (configAdvice[IDX_DESCRIPTOR] != null)
descriptor = (FileSetDescriptor) configAdvice[IDX_DESCRIPTOR];
else {
String key = "root"; //$NON-NLS-1$
if (config.length() > 0)
key += "." + config; //$NON-NLS-1$
descriptor = new FileSetDescriptor(key, config);
configAdvice[IDX_DESCRIPTOR] = descriptor;
}
return descriptor;
}
public void setFeatureId(String featureId) {
this.featureId = featureId;
}
public void setFeatureVersion(Version featureVersion) {
this.featureVersion = featureVersion;
}
public String[] getConfigurations() {
Set keys = advice.keySet();
return (String[]) keys.toArray(new String[keys.size()]);
}
}