/* * Copyright Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.ehcache.jsr107; import java.io.Closeable; import java.io.IOException; import java.util.Collections; import java.util.List; import javax.cache.Cache; import javax.cache.configuration.CacheEntryListenerConfiguration; import javax.cache.configuration.Factory; import javax.cache.event.CacheEntryEventFilter; import javax.cache.event.CacheEntryListener; /** * ListenerResources */ class ListenerResources<K, V> implements Closeable { private final CacheEntryListener<? super K, ? super V> listener; private final CacheEntryEventFilter<? super K, ? super V> filter; private List<EventListenerAdaptors.EventListenerAdaptor<K, V>> ehListeners = null; @SuppressWarnings("unchecked") static <K, V> ListenerResources<K, V> createListenerResources(CacheEntryListenerConfiguration<K, V> listenerConfig, MultiCacheException mce) { CacheEntryListener<? super K, ? super V> listener = listenerConfig.getCacheEntryListenerFactory().create(); // create the filter, closing the listener above upon exception CacheEntryEventFilter<? super K, ? super V> filter; try { Factory<CacheEntryEventFilter<? super K, ? super V>> filterFactory = listenerConfig .getCacheEntryEventFilterFactory(); if (filterFactory != null) { filter = listenerConfig.getCacheEntryEventFilterFactory().create(); } else { filter = (CacheEntryEventFilter<? super K, ? super V>) NullCacheEntryEventFilter.INSTANCE; } } catch (Throwable t) { mce.addThrowable(t); CacheResources.close(listener, mce); throw mce; } try { return new ListenerResources<K, V>(listener, filter); } catch (Throwable t) { mce.addThrowable(t); CacheResources.close(filter, mce); CacheResources.close(listener, mce); throw mce; } } ListenerResources(CacheEntryListener<? super K, ? super V> listener, CacheEntryEventFilter<? super K, ? super V> filter) { this.listener = listener; this.filter = filter; } CacheEntryEventFilter<? super K, ? super V> getFilter() { return filter; } CacheEntryListener<? super K, ? super V> getListener() { return listener; } synchronized List<EventListenerAdaptors.EventListenerAdaptor<K, V>> getEhcacheListeners(Cache<K, V> source, boolean requestsOld) { if (ehListeners == null) { ehListeners = EventListenerAdaptors.ehListenersFor(listener, filter, source, requestsOld); } return Collections.unmodifiableList(ehListeners); } @Override public void close() throws IOException { MultiCacheException mce = new MultiCacheException(); CacheResources.close(listener, mce); CacheResources.close(filter, mce); mce.throwIfNotEmpty(); } }