001/*
002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and contributors.
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 *     Anahide Tchertchian
016 */
017package org.nuxeo.ecm.platform.forms.layout.core.registries;
018
019import java.util.ArrayList;
020import java.util.List;
021
022import org.nuxeo.ecm.platform.forms.layout.api.LayoutTypeDefinition;
023import org.nuxeo.runtime.model.SimpleContributionRegistry;
024
025/**
026 * Regiustry for layoyut type definitions.
027 *
028 * @since 6.0
029 */
030public class LayoutTypeDefinitionRegistry extends SimpleContributionRegistry<LayoutTypeDefinition> {
031
032    protected final String category;
033
034    public LayoutTypeDefinitionRegistry(String category) {
035        super();
036        this.category = category;
037    }
038
039    public String getCategory() {
040        return category;
041    }
042
043    @Override
044    public String getContributionId(LayoutTypeDefinition contrib) {
045        return contrib.getName();
046    }
047
048    public List<LayoutTypeDefinition> getDefinitions() {
049        List<LayoutTypeDefinition> res = new ArrayList<LayoutTypeDefinition>();
050        for (LayoutTypeDefinition item : currentContribs.values()) {
051            if (item != null) {
052                res.add(item);
053            }
054        }
055        return res;
056    }
057
058    public LayoutTypeDefinition getDefinition(String id) {
059        return getCurrentContribution(id);
060    }
061
062    @Override
063    // overridden to handle aliases
064    public synchronized void addContribution(LayoutTypeDefinition contrib) {
065        super.addContribution(contrib);
066        List<String> aliases = contrib.getAliases();
067        if (aliases != null) {
068            for (String alias : aliases) {
069                FragmentList<LayoutTypeDefinition> head = addFragment(alias, contrib);
070                contributionUpdated(alias, head.merge(this), contrib);
071            }
072        }
073    }
074
075    /**
076     * Overridden to use equals method when removing elements.
077     *
078     * @since 7.2
079     */
080    @Override
081    public synchronized void removeContribution(LayoutTypeDefinition contrib) {
082        removeContribution(contrib, true);
083    }
084
085    @Override
086    // overridden to handle aliases
087    public synchronized void removeContribution(LayoutTypeDefinition contrib, boolean useEqualsMethod) {
088        super.removeContribution(contrib, useEqualsMethod);
089        List<String> aliases = contrib.getAliases();
090        if (aliases != null) {
091            for (String alias : aliases) {
092                FragmentList<LayoutTypeDefinition> head = removeFragment(alias, contrib, useEqualsMethod);
093                if (head != null) {
094                    LayoutTypeDefinition result = head.merge(this);
095                    if (result != null) {
096                        contributionUpdated(alias, result, contrib);
097                    } else {
098                        contributionRemoved(alias, contrib);
099                    }
100                }
101            }
102        }
103    }
104
105}