/*****************************************************************************
* 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.cspecext.model;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.buckminster.core.actor.MissingPrerequisiteException;
import org.eclipse.buckminster.core.cspec.IPrerequisite;
import org.eclipse.buckminster.core.cspec.builder.GroupBuilder;
import org.eclipse.buckminster.core.cspec.builder.PrerequisiteBuilder;
import org.eclipse.buckminster.core.cspec.builder.TopLevelAttributeBuilder;
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.buckminster.runtime.BuckminsterException;
import org.eclipse.buckminster.sax.Utils;
import org.eclipse.core.runtime.CoreException;
/**
* @author Thomas Hallgren
*/
public class AlterGroup extends AlterAttribute<Group> {
public static final String ELEM_ALTER_ATTRIBUTE = "alterAttribute"; //$NON-NLS-1$
public static final String ELEM_REMOVE = "remove"; //$NON-NLS-1$
private final Map<String, Prerequisite> alteredPrerequisites;
private final Set<String> removedPrerequisites;
public AlterGroup(Group base, Set<String> removedHints, Map<String, String> alteredHints, Set<String> removedPrerequisites,
Map<String, Prerequisite> alteredPrerequisites) {
super(base, removedHints, alteredHints);
this.removedPrerequisites = Utils.createUnmodifiableSet(removedPrerequisites);
this.alteredPrerequisites = Utils.createUnmodifiableMap(alteredPrerequisites);
}
@Override
public void alterAttribute(TopLevelAttributeBuilder original) throws CoreException {
if (!(original instanceof GroupBuilder))
throw BuckminsterException.fromMessage("%s is not an group", original.getQualifiedName()); //$NON-NLS-1$
Group base = getBase();
GroupBuilder gBld = (GroupBuilder) original;
alterPrerequisiteMap(gBld);
alterDocumentation(gBld);
gBld.setPrerequisiteRebase(CSpecExtension.overrideCheckNull(gBld.getPrerequisiteRebase(), base.getPrerequisiteRebase()));
}
protected void alterPrerequisiteMap(GroupBuilder original) throws CoreException {
Group base = this.getBase();
String attrName = original.getName();
String compName = original.getCSpecName();
List<? extends IPrerequisite> pqs = original.getPrerequisites();
List<Prerequisite> addedPqs = base.getPrerequisites();
if (!(addedPqs.isEmpty() && alteredPrerequisites.isEmpty() && removedPrerequisites.isEmpty())) {
for (String pqName : removedPrerequisites)
if (GroupBuilder.indexOfPrerequisite(pqs, pqName) < 0)
throw new MissingPrerequisiteException(compName, attrName, pqName);
for (String pqName : alteredPrerequisites.keySet())
if (GroupBuilder.indexOfPrerequisite(pqs, pqName) < 0)
throw new MissingPrerequisiteException(compName, attrName, pqName);
for (IPrerequisite pq : addedPqs) {
String pqName = pq.toString();
if (GroupBuilder.indexOfPrerequisite(pqs, pqName) >= 0)
throw new PrerequisiteAlreadyDefinedException(compName, attrName, pqName);
}
for (String pqName : removedPrerequisites)
pqs.remove(GroupBuilder.indexOfPrerequisite(pqs, pqName));
for (IPrerequisite pq : alteredPrerequisites.values())
((PrerequisiteBuilder) pqs.get(GroupBuilder.indexOfPrerequisite(pqs, pq.toString()))).initFrom(pq);
for (Prerequisite pq : addedPqs) {
PrerequisiteBuilder bld = original.createPrerequisiteBuilder();
bld.initFrom(pq);
original.addPrerequisite(bld);
}
}
}
}