ruper2/src/java/core/org/krysalis/ruper2/monitor Monitor.java,NONE,1.1 IMonitor.java,NONE,1.1 StatisticsMonitor.java,NONE,1.1 StandardMonitor.java,NONE,1.1

[email protected]
Newsgroups gmane.comp.krysalis.metamorphosis.cvs
Message-ID <[email protected]>
Update of /cvsroot/metamorphosis/ruper2/src/java/core/org/krysalis/ruper2/monitor
In directory sc8-pr-cvs1:/tmp/cvs-serv16855/src/java/core/org/krysalis/ruper2/monitor

Added Files:
	Monitor.java IMonitor.java StatisticsMonitor.java 
	StandardMonitor.java 
Log Message:
1) Monitoring (so we can sniff out failures in testing, to improve)
2) First step in removing VFS...

--- NEW FILE: Monitor.java ---
/*
 * Created on Aug 28, 2003
  */
package org.krysalis.ruper2.monitor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;

import org.krysalis.version.util.debug.DebugUtils;

/**
 * @author anou_mana
 */
public class Monitor {

	// Monitor Table...
	private List m_monitors = null;

	//	Chaining...
	private Monitor m_next = null;

	//	The root singleton instance
	private static Monitor l_monitor = null;

	class MonitorContext {
		//
		// The context
		//
		Monitor m_currentMonitor = null;
		Stack m_stack = null;

		MonitorContext(Monitor currentMonitor) {
			m_stack = new Stack();
			push(currentMonitor);
		}

		public void push(Monitor currentMonitor) {
			m_stack.push(currentMonitor);
			m_currentMonitor = (Monitor) m_stack.peek();
		}

		public void pop(Monitor currentMonitor) {
			Monitor currentTop = (Monitor) m_stack.pop();
			// Set current
			m_currentMonitor = (Monitor) m_stack.peek();
			if (currentTop != currentMonitor) {
				//:TODO: But what (safely?) ???
			}
		}
		public Monitor getCurrentMonitor() {
			return m_currentMonitor;
		}
	}

	//
	// One per thread...
	//
	private static ThreadLocal l_context = null;

	//:TODO: Store a Stack/Current Monitor object in a ThreadLocal
	// variable, so can have high level code push a "context" and
	// lower level code will respect it (transparently)
	// Push a Monitor which chains (next) the current Monitor, to
	// get nested context...

	static {
		l_monitor = new Monitor();

		l_context = new ThreadLocal() {
			protected synchronized Object initialValue() {
				return l_monitor.new MonitorContext(l_monitor);
			}
		};
	}

	public Monitor(Monitor next) {
		initClass();
		m_next = next;
	}

	public Monitor() {
		initClass();
		m_next = null;
	}

	private void initClass() {
		m_monitors = new ArrayList();
	}

	public static Monitor getMonitor() {
		return ((MonitorContext) l_context.get()).getCurrentMonitor();
	}

	public static Monitor pushContext(IMonitor monitor) {
		Monitor newMonitor = pushContext();
		// :TODO: Fix level, ask monitor what they want...
		newMonitor.addMonitor(monitor);
		return newMonitor;
	}

	public static Monitor pushContext() {
		MonitorContext context = ((MonitorContext) l_context.get());
		Monitor newMonitor = new Monitor(context.getCurrentMonitor());
		context.push(newMonitor);
		return newMonitor;
	}

	public static Monitor pushContext(Monitor newContext) {
		((MonitorContext) l_context.get()).push(newContext);
		return newContext;
	}

	public static void popContext(Monitor expectedMonitor) {
		((MonitorContext) l_context.get()).pop(expectedMonitor);
	}

	public void addMonitor(IMonitor monitor) {
		m_monitors.add(monitor);
	}

	public void removemonitor(IMonitor monitor) {
		m_monitors.remove(monitor);
	}

	// DEBUG
	public boolean isMonitored() {
		return !m_monitors.isEmpty();
	}

	public void ignored(Object message) {
		notify(m_monitors, false, message);
		if (null != m_next)
			m_next.ignored(message);
	}

	public void failed(Object failed) {
		notify(m_monitors, true, failed);
		if (null != m_next)
			m_next.failed(failed);
	}

	private void notify(List Monitors, boolean failed, Object obj) {

		for (Iterator i = Monitors.iterator(); i.hasNext();) {
			try {
				IMonitor monitor = ((IMonitor) i.next());

				if (!failed)
					monitor.ignored(obj);
				else
					monitor.failed(obj);
			}
			catch (Throwable t) {
				// Their problems are not ours...
			}
		}
	}

	public static void monitorToLog() {
		DebugUtils.enableCommonsLogging();
		getMonitor().addMonitor(new StandardMonitor());
	}
}

--- NEW FILE: IMonitor.java ---
/*
 * Created on Aug 28, 2003
  */
package org.krysalis.ruper2.monitor;

/**
 * @author anou_mana
 */
public interface IMonitor {
	
	//	Filename Processing
	void ignored(Object ignored);
	void failed(Object failed);
}

--- NEW FILE: StatisticsMonitor.java ---
/*
 * Created on Aug 28, 2003
  */
package org.krysalis.ruper2.monitor;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import org.krysalis.version.util.debug.DebugUtils;
import org.krysalis.version.util.debug.Dumpable;

/**
 * @author anou_mana
 */
public class StatisticsMonitor implements IMonitor, Dumpable {

	private int m_failed = 0;
	private List m_failedObjects = null;
	private int m_ignored = 0;
	private List m_ignoredObjects = null;
	
	public StatisticsMonitor()
	{
		initClass();
	}
	
	private void initClass() {
		m_failedObjects = new ArrayList();
		m_ignoredObjects = new ArrayList();
	}

	/* (non-Javadoc)
	 * @see org.krysalis.ruper2.monitor.IMonitor#failed(java.lang.Object)
	 */
	public void failed(Object failed) {
		m_failed++;
		m_failedObjects.add(failed);
	}

	/* (non-Javadoc)
	 * @see org.krysalis.ruper2.monitor.IMonitor#ignored(java.lang.Object)
	 */
	public void ignored(Object ignored) {
		m_ignored++;
		m_ignoredObjects.add(ignored);
	}

	/**
	 * @return
	 */
	public int getFailed() {
		return m_failed;
	}

	/**
	 * @return
	 */
	public int getIgnored() {
		return m_ignored;
	}

	public void dump(PrintWriter out, int depth, boolean verbose) {
		final String indent = DebugUtils.getIndent(depth);
		
		DebugUtils.printSeparator(out,depth);
		out.print(indent);
		out.print("Statistics : " );
		DebugUtils.printSeparator(out,depth);
		
		out.print(indent);
		out.print("Failed : " );
		out.println(m_failed);

		out.print(indent);
		out.print("Ignored : " );
		out.println(m_ignored);

		DebugUtils.printSeparator(out,depth);
		DebugUtils.dump(out,depth,verbose, m_failedObjects);
		
		DebugUtils.printSeparator(out,depth);
		DebugUtils.dump(out,depth,verbose, m_ignoredObjects);
	}
}

--- NEW FILE: StandardMonitor.java ---
/*
 * Created on Aug 28, 2003
  */
package org.krysalis.ruper2.monitor;

import org.krysalis.ruper2.log.Logger;
import org.krysalis.ruper2.util.text.MessageConstants;
import org.krysalis.ruper2.util.text.Messages;

/**
 * @author anou_mana
 */
public class StandardMonitor implements IMonitor {

	/* (non-Javadoc)
	 * @see org.krysalis.ruper2.monitor.IMonitor#failed(java.lang.Object)
	 */
	public void failed(Object failed) {
		Logger.getLog().debug(
			Messages.getString(MessageConstants.FAILED, failed));
	}

	/* (non-Javadoc)
	 * @see org.krysalis.ruper2.monitor.IMonitor#ignored(java.lang.Object)
	 */
	public void ignored(Object ignored) {	
		Logger.getLog().debug(
			Messages.getString(MessageConstants.IGNORE, ignored));
	}

}




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.