package com.googlecode.objectify.impl;

import com.googlecode.objectify.Key;
import com.googlecode.objectify.util.ResultNow;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * The basic session cache.  A lot easier than passing the generic arguments around!
 *
 * @author Jeff Schnitzer <jeff@infohazard.org>
 */
public class Session
{
	/** */
	private static final Logger log = Logger.getLogger(Session.class.getName());

	/** */
	private Map<Key<?>, SessionValue<?>> map = new HashMap<>();

	/**
	 * Add/overwrite a SV.
	 */
	public void add(Key<?> key, SessionValue<?> value) {
		if (log.isLoggable(Level.FINEST))
			log.finest("Adding to session: " + key + " -> " + value.getResult());

		map.put(key, value);
	}

	/**
	 * Convenience method
	 */
	public void addValue(Key<?> key, Object value) {
		add(key, new SessionValue<>(new ResultNow<Object>(value)));
	}

	/** Add all entries in the other session to this one */
	public void addAll(Session other) {
		if (log.isLoggable(Level.FINEST))
			log.finest("Adding all values to session: " + other.map.keySet());

		map.putAll(other.map);
	}

	/** */
	@SuppressWarnings("unchecked")
	public <T> SessionValue<T> get(Key<T> key) {
		return (SessionValue<T>)map.get(key);
	}

	/** */
	public boolean contains(Key<?> key) {
		return map.containsKey(key);
	}

	/** */
	public void clear() {
		if (log.isLoggable(Level.FINEST))
			log.finest("Clearing session");

		map.clear();
	}

	/** Convenient for debugging */
	@Override
	public String toString() {
		return map.toString();
	}
}

package com.googlecode.objectify.impl;

import com.googlecode.objectify.Key;
import com.googlecode.objectify.util.ResultNow;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * The basic session cache.  A lot easier than passing the generic arguments around!
 *
 * @author Jeff Schnitzer <jeff@infohazard.org>
 */
public class Session
{
	/** */
	private static final Logger log = Logger.getLogger(Session.class.getName());

	/** */
	private Map<Key<?>, SessionValue<?>> map = new HashMap<>();

	/**
	 * Add/overwrite a SV.
	 */
	public void add(Key<?> key, SessionValue<?> value) {
		if (log.isLoggable(Level.FINEST))
			log.finest("Adding to session: " + key + " -> " + value.getResult());

		map.put(key, value);
	}

	/**
	 * Convenience method
	 */
	public void addValue(Key<?> key, Object value) {
		add(key, new SessionValue<>(new ResultNow<Object>(value)));
	}

	/** Add all entries in the other session to this one */
	public void addAll(Session other) {
		if (log.isLoggable(Level.FINEST))
			log.finest("Adding all values to session: " + other.map.keySet());

		map.putAll(other.map);
	}

	/** */
	@SuppressWarnings("unchecked")
	public <T> SessionValue<T> get(Key<T> key) {
		return (SessionValue<T>)map.get(key);
	}

	/** */
	public boolean contains(Key<?> key) {
		return map.containsKey(key);
	}

	/** */
	public void clear() {
		if (log.isLoggable(Level.FINEST))
			log.finest("Clearing session");

		map.clear();
	}

	/** Convenient for debugging */
	@Override
	public String toString() {
		return map.toString();
	}

	/**
	 * @return all the keys currently in the session. If you really want this data, subclass ObjectifyImpl and
	 * use the protected getSession() method.
	 */
	public Set<Key<?>> keys() { return map.keySet(); }
}

Add method Session.keys()