001/*
002 * Copyright (c) 2006-2015 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 Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Bogdan Stefanescu
011 *     Florent Guillaume
012 *     Thierry Delprat
013 */
014package org.nuxeo.ecm.core;
015
016import java.util.Collection;
017import java.util.LinkedHashMap;
018import java.util.Map;
019
020import org.nuxeo.ecm.core.versioning.DefaultVersionRemovalPolicy;
021import org.nuxeo.ecm.core.versioning.OrphanVersionRemovalFilter;
022import org.nuxeo.ecm.core.versioning.VersionRemovalPolicy;
023import org.nuxeo.runtime.model.ComponentContext;
024import org.nuxeo.runtime.model.ComponentInstance;
025import org.nuxeo.runtime.model.DefaultComponent;
026
027/**
028 * Service used to register version removal policies.
029 */
030public class CoreService extends DefaultComponent {
031
032    private static final String VERSION_REMOVAL_POLICY_XP = "versionRemovalPolicy";
033
034    private static final String ORPHAN_VERSION_REMOVAL_FILTER_XP = "orphanVersionRemovalFilter";
035
036    protected static final DefaultVersionRemovalPolicy DEFAULT_VERSION_REMOVAL_POLICY = new DefaultVersionRemovalPolicy();
037
038    protected Map<CoreServicePolicyDescriptor, VersionRemovalPolicy> versionRemovalPolicies = new LinkedHashMap<>();
039
040    protected Map<CoreServiceOrphanVersionRemovalFilterDescriptor, OrphanVersionRemovalFilter> orphanVersionRemovalFilters = new LinkedHashMap<>();
041
042    protected ComponentContext context;
043
044    @Override
045    public void activate(ComponentContext context) {
046        this.context = context;
047    }
048
049    @Override
050    public void deactivate(ComponentContext context) {
051        this.context = null;
052    }
053
054    @Override
055    public void registerContribution(Object contrib, String point, ComponentInstance contributor) {
056        if (VERSION_REMOVAL_POLICY_XP.equals(point)) {
057            registerVersionRemovalPolicy((CoreServicePolicyDescriptor) contrib);
058        } else if (ORPHAN_VERSION_REMOVAL_FILTER_XP.equals(point)) {
059            registerOrphanVersionRemovalFilter((CoreServiceOrphanVersionRemovalFilterDescriptor) contrib);
060        } else {
061            throw new RuntimeException("Unknown extension point: " + point);
062        }
063    }
064
065    @Override
066    public void unregisterContribution(Object contrib, String point, ComponentInstance contributor) {
067        if (VERSION_REMOVAL_POLICY_XP.equals(point)) {
068            unregisterVersionRemovalPolicy((CoreServicePolicyDescriptor) contrib);
069        } else if (ORPHAN_VERSION_REMOVAL_FILTER_XP.equals(point)) {
070            unregisterOrphanVersionRemovalFilter((CoreServiceOrphanVersionRemovalFilterDescriptor) contrib);
071        }
072    }
073
074    protected void registerVersionRemovalPolicy(CoreServicePolicyDescriptor contrib) {
075        String klass = contrib.getKlass();
076        try {
077            VersionRemovalPolicy policy = (VersionRemovalPolicy) context.getRuntimeContext().loadClass(klass).newInstance();
078            versionRemovalPolicies.put(contrib, policy);
079        } catch (ReflectiveOperationException e) {
080            throw new RuntimeException("Failed to instantiate " + VERSION_REMOVAL_POLICY_XP + ": " + klass, e);
081        }
082    }
083
084    protected void unregisterVersionRemovalPolicy(CoreServicePolicyDescriptor contrib) {
085        versionRemovalPolicies.remove(contrib);
086    }
087
088    protected void registerOrphanVersionRemovalFilter(CoreServiceOrphanVersionRemovalFilterDescriptor contrib) {
089        String klass = contrib.getKlass();
090        try {
091            OrphanVersionRemovalFilter filter = (OrphanVersionRemovalFilter) context.getRuntimeContext().loadClass(
092                    klass).newInstance();
093            orphanVersionRemovalFilters.put(contrib, filter);
094        } catch (ReflectiveOperationException e) {
095            throw new RuntimeException("Failed to instantiate " + ORPHAN_VERSION_REMOVAL_FILTER_XP + ": " + klass, e);
096        }
097    }
098
099    protected void unregisterOrphanVersionRemovalFilter(CoreServiceOrphanVersionRemovalFilterDescriptor contrib) {
100        orphanVersionRemovalFilters.remove(contrib);
101    }
102
103    /** Gets the last version removal policy registered. */
104    public VersionRemovalPolicy getVersionRemovalPolicy() {
105        if (versionRemovalPolicies.isEmpty()) {
106            return DEFAULT_VERSION_REMOVAL_POLICY;
107        } else {
108            VersionRemovalPolicy versionRemovalPolicy = null;
109            for (VersionRemovalPolicy policy : versionRemovalPolicies.values()) {
110                versionRemovalPolicy = policy;
111            }
112            return versionRemovalPolicy;
113        }
114    }
115
116    /** Gets all the orphan version removal filters registered. */
117    public Collection<OrphanVersionRemovalFilter> getOrphanVersionRemovalFilters() {
118        return orphanVersionRemovalFilters.values();
119    }
120
121}