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

com.almende.eve.instantiation.InstantiationService Maven / Gradle / Ivy

The newest version!
/*
 * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands
 * License: The Apache Software License, Version 2.0
 */
package com.almende.eve.instantiation;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.almende.eve.capabilities.Capability;
import com.almende.eve.capabilities.handler.Handler;
import com.almende.eve.state.State;
import com.almende.eve.state.StateBuilder;
import com.almende.eve.state.StateConfig;
import com.almende.eve.state.StateService;
import com.almende.util.TypeUtil;
import com.almende.util.jackson.JOM;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * The Class InstantiationService.
 */
public class InstantiationService implements Capability {
	private static final Logger							LOG					= Logger.getLogger(InstantiationService.class
																					.getName());
	private static final TypeUtil	INSTANTIATIONENTRY	= new TypeUtil() {};
	private ObjectNode									myParams			= null;
	private String										myId				= null;
	private Map				entries				= new HashMap();
	private StateService								stateService		= null;
	private ClassLoader									cl					= null;

	/**
	 * Instantiates a new wake service.
	 */
	public InstantiationService() {};

	/**
	 * Instantiates a new InstantiationService.
	 *
	 * @param params
	 *            the params, containing at least a "state" field, with a
	 *            specific State configuration.
	 * @param cl
	 *            the cl
	 */
	public InstantiationService(final ObjectNode params, final ClassLoader cl) {
		this.cl = cl;
		myParams = params;
		final State state = new StateBuilder().withConfig(
				(ObjectNode) myParams.get("state")).build();
		stateService = state.getService();
		myId = state.getId();
		InstantiationServiceBuilder.getServices().put(myId, this);
		load();
	}

	@Override
	public void delete() {
		// TODO: clear out all state files
		final State state = new StateBuilder().withConfig(
				(ObjectNode) myParams.get("state")).build();
		if (state != null) {
			state.delete();
		}
	}

	/**
	 * Gets the my params.
	 * 
	 * @return the my params
	 */
	public ObjectNode getMyParams() {
		return myParams;
	}

	/**
	 * Sets the my params.
	 * 
	 * @param myParams
	 *            the new my params
	 */
	public void setMyParams(final ObjectNode myParams) {
		this.myParams = myParams;
		load();
	}

	/**
	 * Boot.
	 */
	@JsonIgnore
	public void boot() {
		load();
		for (final String key : entries.keySet()) {
			init(key, true);
		}
	}

	/**
	 * Exists.
	 *
	 * @param wakeKey
	 *            the wake key
	 * @return true, if successful
	 */
	public boolean exists(final String wakeKey) {
		return entries.containsKey(wakeKey);
	}

	/**
	 * Init a specific initable.
	 *
	 * @param wakeKey
	 *            the wake key
	 * @return the initable
	 */
	public Initable init(final String wakeKey) {
		return init(wakeKey, false);
	}

	/**
	 * Wake.
	 *
	 * @param wakeKey
	 *            the wake key
	 * @param onBoot
	 *            the on boot
	 * @return the initable
	 */
	@JsonIgnore
	public Initable init(final String wakeKey, final boolean onBoot) {
		InstantiationEntry entry = entries.get(wakeKey);
		if (entry == null) {
			entry = load(wakeKey);
			entries.put(wakeKey, entry);
		}
		if (entry != null) {
			final String className = entry.getClassName();
			Initable instance = null;
			Handler oldHandler = entry.getHandler();
			if (oldHandler != null) {
				instance = oldHandler.getNoWait();
			}
			if (instance == null) {
				try {
					Class clazz = null;
					if (cl != null) {
						clazz = cl.loadClass(className);
					} else {
						clazz = Class.forName(className);
					}
					instance = (Initable) clazz.newInstance();
					instance.init(entry.getParams(), onBoot);
				} catch (final Exception e) {
					LOG.log(Level.WARNING, "Failed to instantiate entry:'"
							+ wakeKey + "'", e);
				}
			}
			if (instance != null){
			    entry.setHandler(instance.getHandler());
			    if (oldHandler != null) {
				oldHandler.update(instance.getHandler());
			    }
			    entries.put(wakeKey, entry);
			}
			return instance;
		} else {
			LOG.warning("Sorry, I don't know any entry called:'" + wakeKey
					+ "'");
		}
		return null;
	}

	/**
	 * Register.
	 *
	 * @param wakeKey
	 *            the wake key
	 * @param className
	 *            the class name
	 */
	@JsonIgnore
	public void register(final String wakeKey, final String className) {
		final InstantiationEntry entry = new InstantiationEntry(wakeKey, null,
				className);
		entries.put(wakeKey, entry);
		store();
	}

	/**
	 * Register.
	 *
	 * @param wakeKey
	 *            the wake key
	 * @param params
	 *            the params
	 * @param className
	 *            the class name
	 */
	@JsonIgnore
	public void register(final String wakeKey, final ObjectNode params,
			final String className) {
		final InstantiationEntry entry = new InstantiationEntry(wakeKey,
				params, className);
		entries.put(wakeKey, entry);
		store(wakeKey, entry);
	}

	/**
	 * Deregister.
	 *
	 * @param wakeKey
	 *            the wake key
	 */
	public void deregister(final String wakeKey) {
		final InstantiationEntry entry = entries.remove(wakeKey);
		remove(wakeKey, entry);
	}

	/**
	 * Store.
	 *
	 * @param key
	 *            the key
	 * @param val
	 *            the val
	 */
	private void store(final String key, final InstantiationEntry val) {
		State innerState = null;
		if (val != null) {
			innerState = val.getState();
		}
		if (innerState == null) {
			innerState = new StateBuilder().withConfig(
					new StateConfig((ObjectNode) myParams.get("state")).put(
							"id", key)).build();
		}
		if (innerState != null) {
			innerState.put("entry", JOM.getInstance().valueToTree(val));
		}
	}

	/**
	 * Removes the specific state.
	 *
	 * @param key
	 *            the key
	 * @param val
	 *            the val
	 */
	private void remove(final String key, final InstantiationEntry val) {
		State innerState = null;
		if (val != null) {
			innerState = val.getState();
		}
		if (innerState == null) {
			innerState = new StateBuilder().withConfig(
					new StateConfig((ObjectNode) myParams.get("state")).put(
							"id", key)).build();
		}
		if (innerState != null) {
			innerState.delete();
		}
	}

	/**
	 * Load.
	 *
	 * @param key
	 *            the key
	 * @return the instantiation entry
	 */
	private InstantiationEntry load(final String key) {
		final State innerState = new StateBuilder().withConfig(
				new StateConfig((ObjectNode) myParams.get("state")).put("id",
						key)).build();
		final InstantiationEntry result = innerState.get("entry",
				INSTANTIATIONENTRY);
		if(result!=null) {
		    result.setState(innerState);
		}
		return result;
	}

	/**
	 * Store.
	 */
	private void store() {
		for (Entry entry : entries.entrySet()) {
			if (entry.getValue() != null) {
				store(entry.getKey(), entry.getValue());
			}
		}
	}

	/**
	 * Load.
	 */
	private void load() {
		final Set stateIds = stateService.getStateIds();
		for (String key : stateIds) {
			if (key.equals(myId)) {
				continue;
			}
			entries.put(key, null);
		}
	}

	/*
	 * (non-Javadoc)
	 * @see com.almende.eve.capabilities.Capability#getParams()
	 */
	@Override
	public ObjectNode getParams() {
		return myParams;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy