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

com.almende.util.tokens.TokenStore Maven / Gradle / Ivy

There is a newer version: 3.1.1
Show newest version
/*
 * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands
 * License: The Apache Software License, Version 2.0
 */
package com.almende.util.tokens;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.joda.time.DateTime;

import com.almende.eve.agent.AgentHost;
import com.almende.eve.state.State;
import com.almende.eve.state.StateFactory;
import com.almende.util.uuid.UUID;

/**
 * Simple token system: Each outbound call gets a token, which is newly
 * generated each hour. Last 5 tokens are
 * kept in memory. If remote peer wants to check if this host has actually send
 * the call, it can request a resend of the
 * token at time X.
 * 
 * 
 * @author ludo
 * 
 */
public final class TokenStore {
	private static final Logger	LOG		= Logger.getLogger(TokenStore.class
												.getCanonicalName());
	private static final int	SIZE	= 5;
	private static State		tokens;
	private static DateTime		last	= DateTime.now();
	
	static {
		final AgentHost host = AgentHost.getInstance();
		
		StateFactory factory = null;
		if (host.getConfig() != null) {
			factory = host
					.getStateFactoryFromConfig(host.getConfig(), "tokens");
		}
		if (factory == null) {
			factory = host.getStateFactory();
		}
		if (factory.exists("_TokenStore")) {
			tokens = factory.get("_TokenStore");
		} else {
			try {
				tokens = factory.create("_TokenStore");
				tokens.setAgentType(TokenStore.class);
			} catch (final Exception e) {
				LOG.log(Level.WARNING, "", e);
			}
		}
	}
	
	/**
	 * Instantiates a new token store.
	 */
	private TokenStore() {
	};
	
	/**
	 * Gets the.
	 *
	 * @param time the time
	 * @return the string
	 */
	public static String get(final String time) {
		try {
			return tokens.get(time, String.class);
		} catch (final Exception e) {
			LOG.log(Level.WARNING, "Exception during TokenStore get:", e);
			return null;
		}
	}
	
	/**
	 * Creates the.
	 *
	 * @return the token ret
	 */
	public static TokenRet create() {
		synchronized (tokens) {
			TokenRet result;
			if (tokens.size() == 0
					|| tokens.get(last.toString(), String.class) == null
					|| last.plus(3600000).isBeforeNow()) {
				final DateTime now = DateTime.now();
				final String token = new UUID().toString();
				result = new TokenRet(token, now);
				tokens.put(now.toString(), token);
				last = now;
				
				if (tokens.size() > SIZE + 2) {
					DateTime oldest = last;
					for (final String time : tokens.keySet()) {
						try {
							if (time.equals(State.KEY_AGENT_TYPE)) {
								continue;
							}
							if (DateTime.parse(time).isBefore(oldest)) {
								oldest = DateTime.parse(time);
							}
						} catch (final Exception e) {
							LOG.log(Level.WARNING,
									"Failed in eviction of tokens:", e);
						}
					}
					tokens.remove(oldest.toString());
				}
			} else {
				result = new TokenRet(
						tokens.get(last.toString(), String.class), last);
			}
			return result;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy