/***************************************************************************** * 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.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.buckminster.core.cspec.IAttribute; import org.eclipse.buckminster.core.cspec.IGroup; import org.eclipse.buckminster.core.cspec.IPrerequisite; import org.eclipse.buckminster.core.cspec.model.CSpec; import org.eclipse.buckminster.core.cspec.model.Group; import org.eclipse.buckminster.core.cspec.model.Prerequisite; import org.eclipse.buckminster.core.cspec.model.PrerequisiteAlreadyDefinedException; import org.eclipse.core.runtime.IPath; /** * @author Thomas Hallgren */ public class GroupBuilder extends TopLevelAttributeBuilder implements IGroup { public static int indexOfPrerequisite(List<? extends IPrerequisite> prerequisites, String prerequisiteKey) { int idx = prerequisites.size(); while (--idx >= 0) if (prerequisites.get(idx).toString().equals(prerequisiteKey)) return idx; return -1; } private final ArrayList<PrerequisiteBuilder> prerequisites = new ArrayList<PrerequisiteBuilder>(); private IPath rebase; GroupBuilder(CSpecBuilder cspecBuilder) { super(cspecBuilder); } @Override public PrerequisiteBuilder addPrerequisite(PrerequisiteBuilder prerequisite) throws PrerequisiteAlreadyDefinedException { String key = prerequisite.toString(); if (indexOfPrerequisite(prerequisites, key) >= 0) throw new PrerequisiteAlreadyDefinedException(getCSpecName(), getName(), key); prerequisites.add(prerequisite); return prerequisite; } public void addSelfRequirement() throws PrerequisiteAlreadyDefinedException { addLocalPrerequisite(CSpec.SELF_ARTIFACT); } @Override public void clear() { super.clear(); prerequisites.clear(); rebase = null; } @Override public Group createAttribute() { return new Group(this); } @Override public AttributeBuilder getAttributeBuilder(CSpecBuilder specBuilder) { return specBuilder == getCSpecBuilder() ? this : new GroupBuilder(specBuilder); } public PrerequisiteBuilder getPrerequisite(String prerequisteName) { int idx = indexOfPrerequisite(prerequisites, prerequisteName); return (idx < 0) ? null : prerequisites.get(idx); } public List<Prerequisite> getPrerequisiteList() { int top = (prerequisites == null) ? 0 : prerequisites.size(); if (top == 0) return Collections.emptyList(); ArrayList<Prerequisite> bld = new ArrayList<Prerequisite>(top); for (int idx = 0; idx < top; ++idx) bld.add(prerequisites.get(idx).createPrerequisite()); return bld; } @Override public IPath getPrerequisiteRebase() { return rebase; } @Override public List<PrerequisiteBuilder> getPrerequisites() { return prerequisites; } @Override public void initFrom(IAttribute attribute) { IGroup group = (IGroup) attribute; super.initFrom(group); for (IPrerequisite pq : group.getPrerequisites()) { PrerequisiteBuilder pb = createPrerequisiteBuilder(); pb.initFrom(pq); prerequisites.add(pb); } rebase = group.getPrerequisiteRebase(); } @Override public void removePrerequisite(String prerequisteName) { int idx = indexOfPrerequisite(prerequisites, prerequisteName); if (idx >= 0) prerequisites.remove(idx); } public void setPrerequisiteRebase(IPath rebase) { this.rebase = rebase == null ? null : rebase.addTrailingSeparator(); } void finalWrapUp(List<ComponentRequestBuilder> dependencies) { for (PrerequisiteBuilder pq : prerequisites) pq.finalWrapUp(dependencies); } }