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}