All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.vergne.data.storage.impl.SimpleStorage Maven / Gradle / Ivy

package fr.vergne.data.storage.impl;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import fr.vergne.data.storage.ModifiableStorage;
import fr.vergne.data.storage.ReactiveStorage;

/**
 * A {@link SimpleStorage} provide a basic implementation of
 * {@link ModifiableStorage}. In order to allow a maximal customization, it also
 * implements {@link ReactiveStorage}.
 * 
 * @author Matthieu Vergne 
 * 
 * @param 
 */
public class SimpleStorage implements ModifiableStorage,
		ReactiveStorage {

	private final Map map = new HashMap();
	private final Set> listeners = new HashSet>();

	@Override
	public Set getKeys() {
		return map.keySet();
	}

	@Override
	public Object get(Key key) {
		return map.get(key);
	}

	@Override
	public void set(Key key, Object value) {
		Object oldValue;
		if (value == null) {
			oldValue = map.remove(key);
		} else {
			oldValue = map.put(key, value);
		}
		for (OperationListener listener : listeners) {
			listener.entrySet(key, oldValue, value);
		}
	}

	@Override
	public void remove(Key key) {
		set(key, null);
	}

	@Override
	public List getAll(List keys) {
		List values = new LinkedList();
		for (Key key : keys) {
			values.add(get(key));
		}
		return values;
	}

	@Override
	public void setAll(
			Iterable> entries) {
		for (Entry entry : entries) {
			set(entry.getKey(), entry.getValue());
		}
	}

	@Override
	public void removeAll(Collection keys) {
		for (Key key : keys) {
			remove(key);
		}
	}

	@Override
	public Iterator> iterator() {
		return map.entrySet().iterator();
	}

	@Override
	public void clear() {
		removeAll(new LinkedList(getKeys()));
	}

	@Override
	public Collection> getOperationListeners() {
		return listeners;
	}

	@Override
	public void addOperationListener(OperationListener listener) {
		listeners.add(listener);
	}

	@Override
	public void removeOperationListener(OperationListener listener) {
		listeners.remove(listener);
	}
}