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

com.almende.eve.state.redis.RedisState 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.eve.state.redis;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import redis.clients.jedis.Jedis;

import com.almende.eve.state.AbstractState;
import com.almende.eve.state.State;
import com.almende.eve.state.redis.RedisStateBuilder.RedisStateProvider;
import com.almende.util.jackson.JOM;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.NullNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * The Class RedisState.
 */
public class RedisState extends AbstractState implements State {
	private static final Logger			LOG		= Logger.getLogger(RedisState.class
														.getName());
	private final RedisStateProvider	provider;
	private static final String			KEYS	= "Keys";

	private String makeKey(final String key) {
		return getId() + "_" + key;
	}

	/**
	 * Instantiates a new redis state.
	 *
	 * @param id
	 *            the id
	 * @param redisStateProvider
	 *            the redis state provider
	 * @param params
	 *            the params
	 */
	public RedisState(final String id,
			final RedisStateProvider redisStateProvider, final ObjectNode params) {
		super(id, redisStateProvider, params);
		provider = redisStateProvider;
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.state.State#remove(java.lang.String)
	 */
	@Override
	public Object remove(String key) {
		final Jedis redis = provider.getInstance();
		final String nkey = makeKey(key);

		JsonNode res = JOM.createNullNode();
		try {
			res = JOM.getInstance().readTree(redis.get(nkey));
		} catch (JsonProcessingException e) {
			LOG.log(Level.WARNING, "Couldn't read:" + nkey, e);
		} catch (IOException e) {
			LOG.log(Level.WARNING, "Couldn't read:" + nkey, e);
		}
		redis.del(nkey);

		provider.returnInstance(redis);
		return res;
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.state.State#containsKey(java.lang.String)
	 */
	@Override
	public boolean containsKey(String key) {
		return keySet().contains(key);
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.state.State#keySet()
	 */
	@Override
	public Set keySet() {
		final Jedis redis = provider.getInstance();
		Set keys = redis.smembers(getId()+"_"+KEYS);
		provider.returnInstance(redis);
		
		final Set cleanKeys = new HashSet();
		for (String key : keys){
			cleanKeys.add(key.replaceFirst(getId()+"_", ""));
		}
		return cleanKeys;
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.state.State#clear()
	 */
	@Override
	public void clear() {
		final Jedis redis = provider.getInstance();
		Set keys = redis.smembers(getId()+"_"+KEYS);
		for (String key : keys) {
			redis.del(key);
			redis.srem(getId()+"_"+KEYS, key);
		}
		provider.returnInstance(redis);
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.state.State#size()
	 */
	@Override
	public int size() {
		Long res = Long.valueOf(0);
		final Jedis redis = provider.getInstance();
		res = redis.scard(getId()+"_"+KEYS);
		provider.returnInstance(redis);
		return res.intValue();
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.state.AbstractState#get(java.lang.String)
	 */
	@Override
	public JsonNode get(String key) {
		final Jedis redis = provider.getInstance();
		final String nkey = makeKey(key);

		JsonNode res = NullNode.getInstance();
		try {
			final String data = redis.get(nkey);
			if (data != null && !data.trim().isEmpty()) {
				res = JOM.getInstance().readTree(data);
			}
		} catch (JsonProcessingException e) {
			LOG.log(Level.WARNING, "Couldn't read:" + nkey, e);
		} catch (IOException e) {
			LOG.log(Level.WARNING, "Couldn't read:" + nkey, e);
		}
		provider.returnInstance(redis);
		return res;
	}

	@Override
	public JsonNode locPut(final String key, JsonNode value) {
		if (value == null) {
			value = NullNode.getInstance();
		}
		final Jedis redis = provider.getInstance();
		final String nkey = makeKey(key);
		redis.set(nkey, value.toString());
		redis.sadd(getId()+"_"+KEYS, nkey);
		provider.returnInstance(redis);
		return value;
	}

	@Override
	public boolean locPutIfUnchanged(final String key, final JsonNode newVal,
			JsonNode oldVal) {
		boolean result = false;
		final Jedis redis = provider.getInstance();
		try {
			JsonNode cur = get(key);
			if (oldVal == null) {
				oldVal = NullNode.getInstance();
			}
			final String nkey = makeKey(key);
			if (oldVal.equals(cur) || oldVal.toString().equals(cur.toString())) {
				redis.set(nkey, newVal.toString());
				redis.sadd(getId()+"_"+KEYS, nkey);
				result = true;
			}
		} catch (Exception e) {
			LOG.log(Level.WARNING, "", e);
			// Don't let users loop if exception is thrown. They
			// would get into a deadlock....
			result = true;
		}
		provider.returnInstance(redis);
		return result;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy