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}