001/*
002 * (C) Copyright 2006-2015 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Bogdan Stefanescu
018 *     Florent Guillaume
019 *     Thierry Delprat
020 */
021package org.nuxeo.ecm.core;
022
023import java.util.Collection;
024import java.util.LinkedHashMap;
025import java.util.Map;
026
027import org.nuxeo.ecm.core.versioning.DefaultVersionRemovalPolicy;
028import org.nuxeo.ecm.core.versioning.OrphanVersionRemovalFilter;
029import org.nuxeo.ecm.core.versioning.VersionRemovalPolicy;
030import org.nuxeo.runtime.model.ComponentContext;
031import org.nuxeo.runtime.model.ComponentInstance;
032import org.nuxeo.runtime.model.DefaultComponent;
033
034/**
035 * Service used to register version removal policies.
036 */
037public class CoreService extends DefaultComponent {
038
039    private static final String VERSION_REMOVAL_POLICY_XP = "versionRemovalPolicy";
040
041    private static final String ORPHAN_VERSION_REMOVAL_FILTER_XP = "orphanVersionRemovalFilter";
042
043    protected static final DefaultVersionRemovalPolicy DEFAULT_VERSION_REMOVAL_POLICY = new DefaultVersionRemovalPolicy();
044
045    protected Map<CoreServicePolicyDescriptor, VersionRemovalPolicy> versionRemovalPolicies = new LinkedHashMap<>();
046
047    protected Map<CoreServiceOrphanVersionRemovalFilterDescriptor, OrphanVersionRemovalFilter> orphanVersionRemovalFilters = new LinkedHashMap<>();
048
049    protected ComponentContext context;
050
051    @Override
052    public void activate(ComponentContext context) {
053        this.context = context;
054    }
055
056    @Override
057    public void deactivate(ComponentContext context) {
058        this.context = null;
059    }
060
061    @Override
062    public void registerContribution(Object contrib, String point, ComponentInstance contributor) {
063        if (VERSION_REMOVAL_POLICY_XP.equals(point)) {
064            registerVersionRemovalPolicy((CoreServicePolicyDescriptor) contrib);
065        } else if (ORPHAN_VERSION_REMOVAL_FILTER_XP.equals(point)) {
066            registerOrphanVersionRemovalFilter((CoreServiceOrphanVersionRemovalFilterDescriptor) contrib);
067        } else {
068            throw new RuntimeException("Unknown extension point: " + point);
069        }
070    }
071
072    @Override
073    public void unregisterContribution(Object contrib, String point, ComponentInstance contributor) {
074        if (VERSION_REMOVAL_POLICY_XP.equals(point)) {
075            unregisterVersionRemovalPolicy((CoreServicePolicyDescriptor) contrib);
076        } else if (ORPHAN_VERSION_REMOVAL_FILTER_XP.equals(point)) {
077            unregisterOrphanVersionRemovalFilter((CoreServiceOrphanVersionRemovalFilterDescriptor) contrib);
078        }
079    }
080
081    protected void registerVersionRemovalPolicy(CoreServicePolicyDescriptor contrib) {
082        String klass = contrib.getKlass();
083        try {
084            VersionRemovalPolicy policy = (VersionRemovalPolicy) context.getRuntimeContext().loadClass(klass).newInstance();
085            versionRemovalPolicies.put(contrib, policy);
086        } catch (ReflectiveOperationException e) {
087            throw new RuntimeException("Failed to instantiate " + VERSION_REMOVAL_POLICY_XP + ": " + klass, e);
088        }
089    }
090
091    protected void unregisterVersionRemovalPolicy(CoreServicePolicyDescriptor contrib) {
092        versionRemovalPolicies.remove(contrib);
093    }
094
095    protected void registerOrphanVersionRemovalFilter(CoreServiceOrphanVersionRemovalFilterDescriptor contrib) {
096        String klass = contrib.getKlass();
097        try {
098            OrphanVersionRemovalFilter filter = (OrphanVersionRemovalFilter) context.getRuntimeContext().loadClass(
099                    klass).newInstance();
100            orphanVersionRemovalFilters.put(contrib, filter);
101        } catch (ReflectiveOperationException e) {
102            throw new RuntimeException("Failed to instantiate " + ORPHAN_VERSION_REMOVAL_FILTER_XP + ": " + klass, e);
103        }
104    }
105
106    protected void unregisterOrphanVersionRemovalFilter(CoreServiceOrphanVersionRemovalFilterDescriptor contrib) {
107        orphanVersionRemovalFilters.remove(contrib);
108    }
109
110    /** Gets the last version removal policy registered. */
111    public VersionRemovalPolicy getVersionRemovalPolicy() {
112        if (versionRemovalPolicies.isEmpty()) {
113            return DEFAULT_VERSION_REMOVAL_POLICY;
114        } else {
115            VersionRemovalPolicy versionRemovalPolicy = null;
116            for (VersionRemovalPolicy policy : versionRemovalPolicies.values()) {
117                versionRemovalPolicy = policy;
118            }
119            return versionRemovalPolicy;
120        }
121    }
122
123    /** Gets all the orphan version removal filters registered. */
124    public Collection<OrphanVersionRemovalFilter> getOrphanVersionRemovalFilters() {
125        return orphanVersionRemovalFilters.values();
126    }
127
128}