blob: f9d98b4f96ad22df1ba8d582d7402b6af5f2d3bc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 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
* Genuitec, LLC - added license support
*******************************************************************************/
package org.eclipse.equinox.internal.p2.metadata;
import java.util.*;
import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils;
import org.eclipse.equinox.p2.metadata.*;
import org.eclipse.equinox.p2.metadata.expression.IMatchExpression;
import org.eclipse.equinox.p2.metadata.expression.IMemberProvider;
public class ResolvedInstallableUnit implements IInstallableUnit, IMemberProvider {
private static IInstallableUnitFragment[] NO_IU = new IInstallableUnitFragment[0];
private final IInstallableUnitFragment[] fragments;
protected final IInstallableUnit original;
public static final String MEMBER_ORIGINAL = "original"; //$NON-NLS-1$
public static final String MEMBER_FRAGMENTS = "fragments"; //$NON-NLS-1$
public ResolvedInstallableUnit(IInstallableUnit resolved) {
this(resolved, null);
}
public ResolvedInstallableUnit(IInstallableUnit resolved, IInstallableUnitFragment[] fragments) {
this.original = resolved;
this.fragments = fragments == null ? NO_IU : fragments;
}
public Collection<IInstallableUnitFragment> getFragments() {
int fcount = fragments.length;
if (fcount == 0)
return CollectionUtils.emptyList();
ArrayList<IInstallableUnitFragment> result = new ArrayList<IInstallableUnitFragment>(fcount);
result.addAll(Arrays.asList(fragments));
for (int i = 0; i < fcount; i++) {
IInstallableUnit fragment = fragments[i];
if (fragment.isResolved())
result.addAll(fragment.getFragments());
}
return result;
}
public Collection<IArtifactKey> getArtifacts() {
return original.getArtifacts();
}
public IMatchExpression<IInstallableUnit> getFilter() {
return original.getFilter();
}
public String getId() {
return original.getId();
}
public String getProperty(String key) {
return original.getProperty(key);
}
public Map<String, String> getProperties() {
return original.getProperties();
}
public String getProperty(String key, String locale) {
return original.getProperty(key, locale);
}
public Collection<IProvidedCapability> getProvidedCapabilities() {
Collection<IProvidedCapability> originalCapabilities = original.getProvidedCapabilities();
if (fragments.length == 0)
return originalCapabilities;
ArrayList<IProvidedCapability> result = new ArrayList<IProvidedCapability>(originalCapabilities);
for (int i = 0; i < fragments.length; i++)
result.addAll(fragments[i].getProvidedCapabilities());
return result;
}
public Collection<IRequirement> getRequirements() {
Collection<IRequirement> originalCapabilities = original.getRequirements();
if (fragments.length == 0)
return originalCapabilities;
ArrayList<IRequirement> result = new ArrayList<IRequirement>(originalCapabilities);
for (int i = 0; i < fragments.length; i++)
result.addAll(fragments[i].getRequirements());
return result;
}
public Collection<IRequirement> getMetaRequirements() {
Collection<IRequirement> originalCapabilities = original.getMetaRequirements();
if (fragments.length == 0)
return originalCapabilities;
ArrayList<IRequirement> result = new ArrayList<IRequirement>(originalCapabilities);
for (int i = 0; i < fragments.length; i++)
result.addAll(fragments[i].getMetaRequirements());
return result;
}
public Collection<ITouchpointData> getTouchpointData() {
Collection<ITouchpointData> originalTouchpointData = original.getTouchpointData();
if (fragments.length == 0)
return originalTouchpointData;
ArrayList<ITouchpointData> result = new ArrayList<ITouchpointData>(originalTouchpointData);
for (int i = 0; i < fragments.length; i++)
result.addAll(fragments[i].getTouchpointData());
return result;
}
public ITouchpointType getTouchpointType() {
return original.getTouchpointType();
}
public Version getVersion() {
return original.getVersion();
}
public boolean isSingleton() {
return original.isSingleton();
}
public boolean equals(Object obj) {
//TODO This is pretty ugly....
boolean result = original.equals(obj);
if (result)
return true;
if (obj instanceof ResolvedInstallableUnit)
return original.equals(((ResolvedInstallableUnit) obj).original);
return false;
}
public int hashCode() {
// TODO Auto-generated method stub
return original.hashCode();
}
public String toString() {
return "[R]" + original.toString(); //$NON-NLS-1$
}
public IInstallableUnit getOriginal() {
return original;
}
public int compareTo(IInstallableUnit other) {
int cmp = getId().compareTo(other.getId());
if (cmp == 0)
cmp = getVersion().compareTo(other.getVersion());
return cmp;
}
public boolean isResolved() {
return true;
}
public IInstallableUnit unresolved() {
return original.unresolved();
}
public IUpdateDescriptor getUpdateDescriptor() {
return original.getUpdateDescriptor();
}
public Collection<ILicense> getLicenses() {
return original.getLicenses();
}
public Collection<ILicense> getLicenses(String locale) {
return original.getLicenses(locale);
}
public ICopyright getCopyright() {
return original.getCopyright();
}
public ICopyright getCopyright(String locale) {
return original.getCopyright(locale);
}
public boolean satisfies(IRequirement candidate) {
return candidate.isMatch(this);
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.metadata.expression.IMemberProvider#getMember(java.lang.String)
*/
public Object getMember(String memberName) {
if (MEMBER_FRAGMENTS == memberName)
return fragments;
if (MEMBER_ORIGINAL == memberName)
return original;
if (InstallableUnit.MEMBER_PROVIDED_CAPABILITIES == memberName)
return getProvidedCapabilities();
if (InstallableUnit.MEMBER_ID == memberName)
return getId();
if (InstallableUnit.MEMBER_VERSION == memberName)
return getVersion();
if (InstallableUnit.MEMBER_PROPERTIES == memberName)
return getProperties();
if (InstallableUnit.MEMBER_FILTER == memberName)
return getFilter();
if (InstallableUnit.MEMBER_ARTIFACTS == memberName)
return getArtifacts();
if (InstallableUnit.MEMBER_REQUIREMENTS == memberName)
return getRequirements();
if (InstallableUnit.MEMBER_LICENSES == memberName)
return getLicenses();
if (InstallableUnit.MEMBER_COPYRIGHT == memberName)
return getCopyright();
if (InstallableUnit.MEMBER_TOUCHPOINT_DATA == memberName)
return getTouchpointData();
if (InstallableUnit.MEMBER_TOUCHPOINT_TYPE == memberName)
return getTouchpointType();
if (InstallableUnit.MEMBER_UPDATE_DESCRIPTOR == memberName)
return getUpdateDescriptor();
if (InstallableUnit.MEMBER_SINGLETON == memberName)
return Boolean.valueOf(isSingleton());
throw new IllegalArgumentException("No such member: " + memberName); //$NON-NLS-1$
}
}