/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.util.store; import org.mule.runtime.api.exception.MuleRuntimeException; import org.mule.runtime.core.api.store.ListableObjectStore; import org.mule.runtime.api.store.ObjectStoreException; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Adapts the object store interface to a map interface so the client doesn't have to deal with all the ObjectStoreExceptions * thrown by ObjectStore. * <p> * This class provides limited functionality from the Map interface. It does not support some methods (see methods javadoc) that * can have a big impact in performance due the underlying object store being used. * <p> * The object store provided will be access for completing the map operations but the whole lifecycle of the provided object store * must be handled by the user. * <p> * Operations of this map are not thread safe so the user must synchronize access to this map properly. * * @param <T> the generic type of the instances contained in the {@link ListableObjectStore} */ public abstract class ObjectStoreToMapAdapter<T extends Serializable> implements Map<Serializable, T> { protected abstract ListableObjectStore<T> getObjectStore(); @Override public int size() { try { return getObjectStore().allKeys().size(); } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } @Override public boolean isEmpty() { try { return getObjectStore().allKeys().isEmpty(); } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } @Override public boolean containsKey(Object key) { try { return getObjectStore().contains((Serializable) key); } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } @Override public boolean containsValue(Object value) { throw new UnsupportedOperationException("Map adapter for object store does not support contains value"); } @Override public T get(Object key) { try { if (!getObjectStore().contains((Serializable) key)) { return null; } return getObjectStore().retrieve((Serializable) key); } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } @Override public T put(Serializable key, T value) { T previousValue = null; try { if (getObjectStore().contains(key)) { previousValue = getObjectStore().retrieve(key); getObjectStore().remove(key); } if (value != null) { getObjectStore().store(key, value); } return previousValue; } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } @Override public T remove(Object key) { try { if (getObjectStore().contains((Serializable) key)) { return getObjectStore().remove((Serializable) key); } } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } return null; } @Override public void putAll(Map<? extends Serializable, ? extends T> mapToAdd) { for (Serializable key : mapToAdd.keySet()) { put(key, mapToAdd.get(key)); } } @Override public void clear() { try { getObjectStore().clear(); } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } @Override public Set<Serializable> keySet() { try { final List<Serializable> allKeys = getObjectStore().allKeys(); return new HashSet(allKeys); } catch (ObjectStoreException e) { throw new MuleRuntimeException(e); } } /** * This method is not supported for performance reasons */ @Override public Collection<T> values() { throw new UnsupportedOperationException("ObjectStoreToMapAdapter does not support values() method"); } /** * This method is not supported for performance reasons */ @Override public Set<Entry<Serializable, T>> entrySet() { throw new UnsupportedOperationException("ObjectStoreToMapAdapter does not support entrySet() method"); } }