/***************************************************************************** * Copyright (c) 2006-2013, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. *****************************************************************************/ package org.eclipse.buckminster.core.cspec.builder; import java.util.List; import java.util.regex.Pattern; import org.eclipse.buckminster.core.cspec.IPrerequisite; import org.eclipse.buckminster.core.cspec.model.Prerequisite; import org.eclipse.buckminster.core.version.VersionHelper; import org.eclipse.buckminster.osgi.filter.Filter; import org.eclipse.equinox.p2.metadata.VersionRange; /** * @author Thomas Hallgren */ public class PrerequisiteBuilder extends CSpecElementBuilder implements IPrerequisite { private String alias; private final AttributeBuilder attributeBuilder; private String component; private String componentType; private VersionRange versionRange; private boolean contributor = true; private Pattern excludePattern; private Pattern includePattern; private Filter filter; PrerequisiteBuilder(AttributeBuilder attributeBuilder) { super(attributeBuilder.getCSpecBuilder()); this.attributeBuilder = attributeBuilder; } @Override public void clear() { super.clear(); alias = null; component = null; componentType = null; versionRange = null; contributor = true; excludePattern = null; includePattern = null; filter = null; } public Prerequisite createPrerequisite() { return new Prerequisite(this); } @Override public String getAlias() { return alias; } @Override public String getAttribute() { return getAttributeBuilder().getName(); } public AttributeBuilder getAttributeBuilder() { return attributeBuilder; } @Override public String getComponentName() { return component; } @Override public String getComponentType() { return componentType; } @Override public Pattern getExcludePattern() { return excludePattern; } @Override public Filter getFilter() { return filter; } @Override public Pattern getIncludePattern() { return includePattern; } @Override public VersionRange getVersionRange() { return versionRange; } public void initFrom(IPrerequisite prerequisite) { super.initFrom(prerequisite.getName()); alias = prerequisite.getAlias(); component = prerequisite.getComponentName(); componentType = prerequisite.getComponentType(); versionRange = prerequisite.getVersionRange(); contributor = prerequisite.isContributor(); excludePattern = prerequisite.getExcludePattern(); includePattern = prerequisite.getIncludePattern(); filter = prerequisite.getFilter(); } @Override public boolean isContributor() { return contributor; } @Override public boolean isExternal() { return component != null; } @Override public boolean isMatch(String componentName, String attribute) { return Prerequisite.isMatch(componentName, attribute, excludePattern, includePattern); } public void setAlias(String alias) { this.alias = alias; } public void setComponentName(String component) { this.component = component; } public void setComponentType(String componentType) { this.componentType = componentType; } public void setContributor(boolean contributor) { this.contributor = contributor; } public void setExcludePattern(Pattern excludePattern) { this.excludePattern = excludePattern; } public void setFilter(Filter filter) { this.filter = filter; } public void setIncludePattern(Pattern includePattern) { this.includePattern = includePattern; } public void setVersionRange(VersionRange versionRange) { this.versionRange = versionRange; } @Override public String toString() { String name = getName(); if (name == null) name = ""; //$NON-NLS-1$ if (component == null) return name; StringBuilder bld = new StringBuilder(); bld.append(component); if (componentType != null) { bld.append(':'); bld.append(componentType); } bld.append('#'); bld.append(name); if (versionRange != null) { bld.append('/'); bld.append(VersionHelper.getHumanReadable(versionRange)); } return bld.toString(); } void finalWrapUp(List<ComponentRequestBuilder> dependencies) { if (componentType != null || versionRange != null) { // Count number of hits on this type and number of hits total int hitsTotal = 0; int hitsOnType = 0; int hitsOnRange = 0; int idx = dependencies.size(); while (--idx >= 0) { ComponentRequestBuilder dep = dependencies.get(idx); if (component.equals(dep.getName())) { ++hitsTotal; if (componentType != null) { if (componentType.equals(dep.getComponentTypeID())) { ++hitsOnType; if (versionRange != null) { if (dep.getVersionRange() != null && dep.getVersionRange().intersect(versionRange) != null) { ++hitsOnRange; } } } continue; } if (versionRange != null) { if (dep.getVersionRange() != null && dep.getVersionRange().intersect(versionRange) != null) ++hitsOnRange; else continue; } } } // Remove unnecessary qualification if (hitsOnType == hitsTotal) componentType = null; if (hitsOnRange == hitsTotal) versionRange = null; } } }