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

com.almende.eve.agent.log.LogAgent 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.agent.log;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import com.almende.eve.agent.Agent;
import com.almende.eve.rpc.annotation.Access;
import com.almende.eve.rpc.annotation.AccessType;
import com.almende.eve.rpc.annotation.Name;
import com.almende.eve.rpc.jsonrpc.JSONRPCException;
import com.almende.eve.rpc.jsonrpc.JSONRequest;
import com.almende.util.TypeUtil;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * The Class LogAgent.
 */
@Access(AccessType.PUBLIC)
public class LogAgent extends Agent {
	private static final long	TIMETOLIVE	= 20 * 60 * 1000;	// milliseconds
																
	/**
	 * Config.
	 *
	 * @param agentUrl the agent url
	 * @throws IOException Signals that an I/O exception has occurred.
	 * @throws JSONRPCException the jSONRPC exception
	 */
	public void config(final URI agentUrl) throws IOException, JSONRPCException {
		getEventsFactory().subscribe(agentUrl, "*", "eventLog");
	}
	
	/**
	 * Event log.
	 *
	 * @param event the event
	 * @param params the params
	 * @throws IOException Signals that an I/O exception has occurred.
	 */
	public void eventLog(@Name("event") final String event,
			@Name("params") final ObjectNode params) throws IOException {
		final String agentId = getId().replaceFirst("_logagent_", "");
		log(new Log(agentId, event, params));
	}
	
	/**
	 * Log.
	 *
	 * @param log the log
	 */
	public void log(final Log log) {
		// TODO: use a database instead of the state - when you register
		// more and more logs this will be very unreliable.
		ArrayList logs = getState().get("logs",
				new TypeUtil>() {
				});
		if (logs == null) {
			logs = new ArrayList();
		}
		logs.add(log);
		
		// TODO: limit to a maximum number and age of the logs?
		
		getState().put("logs", logs);
	}
	
	/**
	 * Gets the logs.
	 *
	 * @param since the since
	 * @return the logs
	 */
	public List getLogs(final Long since) {
		final ArrayList logs = getState().get("logs",
				new TypeUtil>() {
				});
		
		// TODO: use a database for the logs. It is very inefficient to
		// retrieve them all and then filter them.
		final List output = new ArrayList();
		if (logs != null) {
			for (final Log log : logs) {
				if (((since == null) || (log.getTimestamp() > since))) {
					output.add(log);
				}
			}
		}
		
		// reset the time to live for the agent. It will stay alive when
		// regularly requested for logs
		setTimeToLive(TIMETOLIVE);
		
		return output;
	}
	
	/**
	 * Remove existing time to live.
	 */
	public void cancelTimeToLive() {
		final String timeoutId = getState().get("timeoutId", String.class);
		if (timeoutId != null) {
			getScheduler().cancelTask(timeoutId);
		}
		getState().remove("timeoutId");
	}
	
	/**
	 * Set a time-to-live for the LogAgent. After this timeout, it will
	 * delete itself.
	 * This is useful for a temporary LogAgent used for a single session in a
	 * browser.
	 *
	 * @param interval interval in milliseconds
	 */
	public void setTimeToLive(final long interval) {
		// remove existing timeout
		cancelTimeToLive();
		
		// create a new timeout
		final JSONRequest request = new JSONRequest("killMe", null);
		final String timeoutId = getScheduler().createTask(request, interval);
		getState().put("timeoutId", timeoutId);
	}
	
	/**
	 * Delete the log agent.
	 *
	 * @throws JSONRPCException the jSONRPC exception
	 * @throws ClassNotFoundException the class not found exception
	 * @throws InstantiationException the instantiation exception
	 * @throws IllegalAccessException the illegal access exception
	 * @throws InvocationTargetException the invocation target exception
	 * @throws NoSuchMethodException the no such method exception
	 */
	public void killMe() throws JSONRPCException, ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			InvocationTargetException, NoSuchMethodException {
		getAgentHost().deleteAgent(getId());
	}
	
	/* (non-Javadoc)
	 * @see com.almende.eve.agent.Agent#getDescription()
	 */
	@Override
	public String getDescription() {
		return "The LogAgent can temporarily log events of an agent. "
				+ "The agent is meant for internal use by the AgentHost.";
	}
	
	/* (non-Javadoc)
	 * @see com.almende.eve.agent.Agent#getVersion()
	 */
	@Override
	public String getVersion() {
		return "0.1";
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy