001/* 002 * (C) Copyright 2013 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 * Vladimir Pasquier <vpasquier@nuxeo.com> 016 */ 017package org.nuxeo.ecm.automation.core.impl; 018 019import org.nuxeo.ecm.automation.AutomationFilter; 020import org.nuxeo.ecm.automation.OperationException; 021import org.nuxeo.runtime.model.ContributionFragmentRegistry; 022 023import java.util.HashMap; 024import java.util.Map; 025 026/** 027 * @since 5.7.3 028 */ 029public class AutomationFilterRegistry extends ContributionFragmentRegistry<AutomationFilter> { 030 031 /** 032 * Modifiable exception chain registry. Modifying the registry is using a lock and it's thread safe. Modifications 033 * are removing the cache. 034 */ 035 protected final Map<String, AutomationFilter> automationFilters = new HashMap<>(); 036 037 /** 038 * Read only cache for exception chain lookup. Thread safe. Not using synchronization if cache already created. 039 */ 040 protected volatile Map<String, AutomationFilter> lookup; 041 042 public synchronized void addContribution(AutomationFilter automationFilter, boolean replace) 043 throws OperationException { 044 if (!replace && automationFilters.containsKey(automationFilter.getId())) { 045 throw new OperationException("An automation filter is already bound to: " + automationFilter.getId() 046 + ". Use 'replace=true' to replace an existing automation filter"); 047 } 048 super.addContribution(automationFilter); 049 } 050 051 @Override 052 public boolean isSupportingMerge() { 053 return false; 054 } 055 056 @Override 057 public String getContributionId(AutomationFilter contrib) { 058 return contrib.getId(); 059 } 060 061 @Override 062 public void contributionUpdated(String id, AutomationFilter contrib, AutomationFilter newOrigContrib) { 063 automationFilters.put(id, contrib); 064 lookup = null; 065 } 066 067 @Override 068 public void contributionRemoved(String id, AutomationFilter origContrib) { 069 automationFilters.remove(id); 070 lookup = null; 071 } 072 073 @Override 074 public AutomationFilter clone(AutomationFilter orig) { 075 throw new UnsupportedOperationException(); 076 } 077 078 @Override 079 public void merge(AutomationFilter src, AutomationFilter dst) { 080 throw new UnsupportedOperationException(); 081 } 082 083 public Map<String, AutomationFilter> lookup() { 084 Map<String, AutomationFilter> _lookup = lookup; 085 if (_lookup == null) { 086 synchronized (this) { 087 lookup = new HashMap<>(automationFilters); 088 _lookup = lookup; 089 } 090 } 091 return _lookup; 092 } 093 094 public AutomationFilter getAutomationFilter(String id) { 095 return automationFilters.get(id); 096 } 097}