/* * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) 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: * bstefanescu * * $Id$ */ package org.eclipse.ecr.runtime.deploy; import java.util.ArrayList; import java.util.List; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> */ public abstract class CompositeContribution extends ExtensibleContribution { protected final List<CompositeContribution> contributionFragments = new ArrayList<CompositeContribution>(); private boolean isContributionEnabled; @Override public void resolve(ContributionManager mgr) { super.resolve(mgr); if (baseContribution instanceof CompositeContribution) { ((CompositeContribution) baseContribution).addContributionFragment(this); } } @Override public void unresolve(ContributionManager mgr) { if (baseContribution instanceof CompositeContribution) { ((CompositeContribution) baseContribution).removeContributionFragment(this); } super.unresolve(mgr); } public boolean isContributionEnabled() { return isContributionEnabled; } private void setContributionEnabled(boolean isEnabled) { isContributionEnabled = isEnabled; } private void addContributionFragment(CompositeContribution fragment) { fragment.setContributionEnabled(true); int index = contributionFragments.indexOf(fragment); if (index > -1) { contributionFragments.set(index, fragment); } else { contributionFragments.add(fragment); } } private void removeContributionFragment(CompositeContribution fragment) { int index = contributionFragments.indexOf(fragment); if (index > -1) { // do not physically remove fragments since they can be reloaded contributionFragments.get(index).setContributionEnabled(false); } } public List<CompositeContribution> getContributionFragments() { return contributionFragments; } private CompositeContribution getRootComposite() { if (baseContribution instanceof CompositeContribution) { return ((CompositeContribution) baseContribution).getRootComposite(); } return this; } @Override protected ExtensibleContribution getMergedContribution() throws Exception { CompositeContribution root = getRootComposite(); ExtensibleContribution mc = root.baseContribution != null ? root.baseContribution.getMergedContribution() : root.clone(); for (CompositeContribution fragment : root.contributionFragments) { if (fragment.isContributionEnabled()) { copyFragmentsOver(mc); } } mc.contributionId = root.contributionId; mc.baseContributionId = root.baseContributionId; return mc; } private void copyFragmentsOver(ExtensibleContribution mc) { copyOver(mc); for (CompositeContribution fragment : contributionFragments) { if (fragment.isContributionEnabled()) { fragment.copyFragmentsOver(mc); } } } @Override public String toString() { if (baseContributionId == null) { return contributionId; } return contributionId + "@" + baseContributionId; } }