Java tutorial
/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.eve.state.memory; import java.io.Serializable; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; import com.almende.eve.state.AbstractState; import com.almende.eve.state.State; import com.almende.eve.state.StateService; import com.fasterxml.jackson.databind.node.ObjectNode; /** * The Class MemoryState. * * @author jos * @class MemoryState * * A state for an Eve Agent, which stores the data in memory. * (After a restart of the application, the data will be gone!) * * The state provides general information for the agent (about itself, * the environment, and the system configuration), and the agent can * store its * state in the state. * The state extends a standard Java Map. * * <b>Warning, this implementation is not thread-safe!</b> * * Usage:<br> * AgentHost factory = AgentHost.getInstance(config);<br> * FileState state = new State("agentId");<br> * state.put("key", "value");<br> * System.out.println(state.get("key")); // "value"<br> */ public class MemoryState extends AbstractState<Serializable> implements State { private static final Logger LOG = Logger.getLogger(MemoryState.class.getName()); private final Map<String, Serializable> properties = new ConcurrentHashMap<String, Serializable>(10); /** * Instantiates a new memory state. */ public MemoryState() { } /** * Instantiates a new memory state. * * @param agentId * the agent id * @param service * the service * @param params * the params */ public MemoryState(final String agentId, final StateService service, final ObjectNode params) { super(agentId, service, params); } /* * (non-Javadoc) * * @see com.almende.eve.state.State#clear() */ @Override public void clear() { properties.clear(); } /* * (non-Javadoc) * * @see com.almende.eve.state.State#keySet() */ @Override public Set<String> keySet() { return new HashSet<String>(properties.keySet()); } /* * (non-Javadoc) * * @see com.almende.eve.state.State#containsKey(java.lang.String) */ @Override public boolean containsKey(final String key) { return properties.containsKey(key); } /* * (non-Javadoc) * * @see com.almende.eve.state.AbstractState#get(java.lang.String) */ @Override public Serializable get(final String key) { try { return properties.get(key); } catch (final Exception e) { LOG.log(Level.WARNING, "Couldn't clone object: " + key + ", returning pointer to original object.", e); return properties.get(key); } } /** * Checks if is empty. * * @return true, if is empty */ public boolean isEmpty() { return properties.isEmpty(); } /* * (non-Javadoc) * * @see com.almende.eve.state.AbstractState#locPut(java.lang.String, * java.io.Serializable) */ @Override public Serializable locPut(final String key, final Serializable value) { return properties.put(key, value); } /* * (non-Javadoc) * * @see * com.almende.eve.state.AbstractState#locPutIfUnchanged(java.lang.String, * java.io.Serializable, java.io.Serializable) */ @Override public boolean locPutIfUnchanged(final String key, final Serializable newVal, final Serializable oldVal) { boolean result = false; if (!(oldVal == null && properties.containsKey(key) && properties.get(key) != null) || (properties.get(key) != null && properties.get(key).equals(oldVal))) { properties.put(key, newVal); result = true; } return result; } /* * (non-Javadoc) * * @see com.almende.eve.state.State#remove(java.lang.String) */ @Override public Serializable remove(final String key) { return properties.remove(key); } /* * (non-Javadoc) * * @see com.almende.eve.state.State#size() */ @Override public int size() { return properties.size(); } }