001/*
002 * (C) Copyright 2006-2012 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Thomas Roger <troger@nuxeo.com>
016 */
017
018package org.nuxeo.ecm.activity;
019
020import java.util.ArrayList;
021import java.util.HashMap;
022import java.util.List;
023import java.util.Map;
024
025import org.nuxeo.runtime.model.ContributionFragmentRegistry;
026
027/**
028 * Registry for activity link builders, handling merge of registered {@link ActivityLinkBuilderDescriptor} elements.
029 *
030 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a>
031 * @since 5.6
032 */
033public class ActivityLinkBuilderRegistry extends ContributionFragmentRegistry<ActivityLinkBuilderDescriptor> {
034
035    protected Map<String, ActivityLinkBuilder> activityLinkBuilders = new HashMap<String, ActivityLinkBuilder>();
036
037    protected List<String> activityLinkBuildersIds = new ArrayList<String>();
038
039    public ActivityLinkBuilder getDefaultActivityLinkBuilder() {
040        if (activityLinkBuildersIds.isEmpty()) {
041            throw new IllegalStateException("No default ActivityLinkBuilder configured");
042        }
043        return activityLinkBuilders.get(activityLinkBuildersIds.get(0));
044    }
045
046    public ActivityLinkBuilder get(String name) {
047        return activityLinkBuilders.get(name);
048    }
049
050    @Override
051    public String getContributionId(ActivityLinkBuilderDescriptor contrib) {
052        return contrib.getName();
053    }
054
055    @Override
056    public void contributionUpdated(String id, ActivityLinkBuilderDescriptor contrib,
057            ActivityLinkBuilderDescriptor newOrigContrib) {
058        activityLinkBuilders.put(id, contrib.getActivityLinkBuilder());
059        if (contrib.isDefault()) {
060            activityLinkBuildersIds.add(0, id);
061        }
062    }
063
064    @Override
065    public void contributionRemoved(String id, ActivityLinkBuilderDescriptor origContrib) {
066        activityLinkBuilders.remove(id);
067        activityLinkBuildersIds.remove(id);
068    }
069
070    @Override
071    public ActivityLinkBuilderDescriptor clone(ActivityLinkBuilderDescriptor orig) {
072        return orig.clone();
073    }
074
075    @Override
076    public void merge(ActivityLinkBuilderDescriptor src, ActivityLinkBuilderDescriptor dst) {
077        Class<? extends ActivityLinkBuilder> clazz = src.getActivityLinkBuilderClass();
078        if (clazz != null) {
079            dst.setActivityLinkBuilderClass(clazz);
080        }
081        boolean isDefault = src.isDefault();
082        if (isDefault != dst.isDefault()) {
083            dst.setDefault(isDefault);
084        }
085        boolean enabled = src.isEnabled();
086        if (enabled != dst.isEnabled()) {
087            dst.setEnabled(enabled);
088        }
089    }
090
091}