/******************************************************************************* * 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$ } }