initial commit of simple monitoring plugin
diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.classpath b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.classpath
new file mode 100755
index 0000000..b1dabee
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry kind="src" path="src"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.gitignore b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.gitignore
new file mode 100755
index 0000000..5e56e04
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.gitignore
@@ -0,0 +1 @@
+/bin
diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.project b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.project
new file mode 100755
index 0000000..b634bf1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>org.eclipse.soa.mangrove.monitoring</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.jdt.core.javabuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.ManifestBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.SchemaBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.pde.PluginNature</nature>

+		<nature>org.eclipse.jdt.core.javanature</nature>

+	</natures>

+</projectDescription>

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..11f6e46
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1

+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7

+org.eclipse.jdt.core.compiler.compliance=1.7

+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error

+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

+org.eclipse.jdt.core.compiler.source=1.7

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/META-INF/MANIFEST.MF b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..5fca354
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mangrove Monitoring
+Bundle-SymbolicName: org.eclipse.soa.mangrove.monitoring
+Bundle-Version: 0.0.5.qualifier
+Bundle-Activator: org.eclipse.soa.mangrove.monitoring.Activator
+Bundle-Vendor: Xerox
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.soa.mangrove
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.soa.mangrove.monitoring
diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/build.properties b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/build.properties
new file mode 100755
index 0000000..41eb6ad
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/build.properties
@@ -0,0 +1,4 @@
+source.. = src/

+output.. = bin/

+bin.includes = META-INF/,\

+               .

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/Activator.java b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/Activator.java
new file mode 100755
index 0000000..bc350b9
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/Activator.java
@@ -0,0 +1,50 @@
+package org.eclipse.soa.mangrove.monitoring;

+

+import org.eclipse.ui.plugin.AbstractUIPlugin;

+import org.osgi.framework.BundleContext;

+

+/**

+ * The activator class controls the plug-in life cycle

+ */

+public class Activator extends AbstractUIPlugin {

+

+	// The plug-in ID

+	public static final String PLUGIN_ID = "org.eclipse.soa.mangrove.monitoring"; //$NON-NLS-1$

+

+	// The shared instance

+	private static Activator plugin;

+	

+	/**

+	 * The constructor

+	 */

+	public Activator() {

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)

+	 */

+	public void start(BundleContext context) throws Exception {

+		super.start(context);

+		plugin = this;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)

+	 */

+	public void stop(BundleContext context) throws Exception {

+		plugin = null;

+		super.stop(context);

+	}

+

+	/**

+	 * Returns the shared instance

+	 *

+	 * @return the shared instance

+	 */

+	public static Activator getDefault() {

+		return plugin;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/ActivityMonitoringData.java b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/ActivityMonitoringData.java
new file mode 100755
index 0000000..da9149a
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/ActivityMonitoringData.java
@@ -0,0 +1,64 @@
+package org.eclipse.soa.mangrove.monitoring;

+

+/**

+ * @author Adrian Mos

+ * Holder for monitoring data for BPMS activities

+ */

+public class ActivityMonitoringData {

+	public String getProcName() {

+		return procName;

+	}

+	public void setProcName(String procName) {

+		this.procName = procName;

+	}

+	public String getProcID() {

+		return procID;

+	}

+	public void setProcID(String procID) {

+		this.procID = procID;

+	}

+	public String getActivityName() {

+		return activityName;

+	}

+	public void setActivityName(String activityName) {

+		this.activityName = activityName;

+	}

+	public String getGrantedRole() {

+		return grantedRole;

+	}

+	public void setGrantedRole(String grantedRole) {

+		this.grantedRole = grantedRole;

+	}

+	public String getUser() {

+		return user;

+	}

+	public void setUser(String user) {

+		this.user = user;

+	}

+	public long getLastExecTime() {

+		return lastExecTime;

+	}

+	public void setLastExecTime(long l) {

+		this.lastExecTime = l;

+	}

+	public long getAvgExecTime() {

+		return avgExecTime;

+	}

+	public void setAvgExecTime(long l) {

+		this.avgExecTime = l;

+	}

+	public String getTimeStamp() {

+		return timeStamp;

+	}

+	public void setTimeStamp(String timeStamp) {

+		this.timeStamp = timeStamp;

+	}

+	private String procName;

+	private String procID;

+	private String activityName;

+	private String grantedRole;

+	private String user;

+	private long lastExecTime;

+	private long avgExecTime;

+	private String timeStamp;

+}

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/BPMSMonitoringHandler.java b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/BPMSMonitoringHandler.java
new file mode 100755
index 0000000..9b304b0
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/BPMSMonitoringHandler.java
@@ -0,0 +1,226 @@
+package org.eclipse.soa.mangrove.monitoring;

+

+import java.io.IOException;

+import java.nio.file.Path;

+import java.nio.file.Paths;

+import java.util.HashMap;

+import java.util.Scanner;

+import java.util.Vector;

+

+/**

+ * @author Adrian Mos

+ * Helper class to deal with monitoring data from BPMS

+ */

+public class BPMSMonitoringHandler {

+

+	String activityFileName = "C:\\XRCE_PushMonitoring_FileStore\\monitoring_Activity.info";

+	String processFileName = "C:\\XRCE_PushMonitoring_FileStore\\monitoring_Process.info";

+	private Path activityFile;

+	private Path processFile;

+	private HashMap<String, ActivityMonitoringData> activityExecMap; //maps activity names composed of ProcessName+ActivityName to activity execution details

+	private HashMap<String, Vector<Long>> activityExecHistoryMap; //maps activity names composed of ProcessName+ActivityName to activity execution history 

+	private HashMap<String, ProcessMonitoringData> processExecMap; //maps activity names composed of ProcessName+ActivityName to activity execution details

+	private HashMap<String, Vector<Long>> processExecHistoryMap; //maps activity names composed of ProcessName+ActivityName to activity execution history 

+

+	

+	

+	public BPMSMonitoringHandler() {

+		activityFile = Paths.get(activityFileName);

+		processFile = Paths.get(processFileName);

+		initializeActivityDataStructures();

+		initializeProcessDataStructures();

+		try {

+			processActivityMonitoringFile();

+			processProcessMonitoringFile();

+		} catch (IOException e) {

+			System.err.println("Could not process the monitoring file at " + activityFileName);

+		}

+		try {

+			processProcessMonitoringFile();

+		} catch (IOException e) {

+			System.err.println("Could not process the monitoring file at " + processFileName);

+		}

+		

+	}

+	

+	private void processProcessMonitoringFile() throws IOException {

+		Scanner s = new Scanner(processFile);

+		initializeProcessDataStructures();

+		while (s.hasNextLine()){

+			ProcessMonitoringData data = processProcessLine (s.nextLine());

+			if (null!=data){

+				processExecMap.put(data.getProcessName(), data);

+			}

+		}

+		s.close();

+		//this.printDataStructures();

+		

+	}

+

+	private ProcessMonitoringData processProcessLine(String nextLine) {

+		ProcessMonitoringData data = new ProcessMonitoringData();

+		Scanner ls = new Scanner(nextLine);

+		ls.useDelimiter("::");

+		try{

+			if (ls.hasNext()){

+				data.setProcessName(ls.next());

+				data.setProcID(ls.next());

+				

+				// add the list of activities

+				Vector<String> activityNames = new Vector<String>();

+				Scanner aNames = new Scanner(ls.next());

+				aNames.useDelimiter(";");

+				while(aNames.hasNext()) activityNames.add(aNames.next());

+				data.setPerformedActivityNames(activityNames);

+				aNames.close();

+				

+				data.setUser(ls.next());

+				data.setLastExecTime(ls.nextLong());

+				data.setAvgExecTime(ls.nextLong());

+				data.setTimeStamp(ls.next());

+				

+				String key = data.getProcessName();

+				Vector<Long> v;

+				if (processExecHistoryMap.containsKey(key)) v = processExecHistoryMap.get(key);

+				else v = new Vector<Long>();

+				v.add(data.getLastExecTime());

+				processExecHistoryMap.put(key, v);

+			}

+		} catch (Exception e){

+			data = null;

+		}

+

+		ls.close();

+		return data;

+	}

+

+	private void initializeActivityDataStructures(){

+		activityExecMap = new HashMap<String, ActivityMonitoringData>();

+		activityExecHistoryMap = new HashMap<String, Vector<Long>>();

+	}

+	

+	private void initializeProcessDataStructures(){

+		processExecMap = new HashMap<String, ProcessMonitoringData>();

+		processExecHistoryMap = new HashMap<String, Vector<Long>>();		

+	}

+	

+	public static void main(String[] args) {

+		BPMSMonitoringHandler h = new BPMSMonitoringHandler();

+		try {

+			ActivityMonitoringData d = h.findLatestActivityMonitoringData("TimeSheetBP_1", "ViewTimeSheets");

+			if (null!=d) System.out.println("FOUND Latest Activity Data: " + d.getAvgExecTime());

+			Vector v = h.getActivityExecutionTimes("TimeSheetBP_1", "ViewTimeSheets");

+			System.out.println(v);

+			

+			ProcessMonitoringData p = h.findLatestProcessMonitoringData("TimeSheetBP_1");

+			if (null!=p) {

+				System.out.println("FOUND Latest Data: " + p.getAvgExecTime());

+				Vector act = p.getPerformedActivityNames();

+				System.out.println("Executed activities for last instance " + p.getProcID() + ": " + act);

+			}

+			Vector vp = h.getProcessExecutionTimes("TimeSheetBP_1");

+			System.out.println(vp);

+			

+		} catch (IOException e) {

+			// TODO Auto-generated catch block

+			e.printStackTrace();

+		}

+	}

+	

+	private void processActivityMonitoringFile() throws IOException{

+		Scanner s = new Scanner(activityFile);

+		initializeActivityDataStructures();

+		while (s.hasNextLine()){

+			ActivityMonitoringData data = processActivityLine (s.nextLine());

+			if (null!=data){

+				//System.out.println(data.getActivityName() + " executed in " + data.getLastExecTime() + " at " + data.getTimeStamp());

+				activityExecMap.put(data.getProcName() + "::" + data.getActivityName(), data);

+			}

+		}

+		s.close();

+		//this.printDataStructures();

+	}

+	

+	private void printDataStructures(){

+		System.out.println("Printing Activity TO Execution Data HashMap");

+		for (String key : activityExecMap.keySet()){

+			System.out.println("Activity: " + key + " :: "+ activityExecMap.get(key));

+		}

+		

+		System.out.println("Printing Activity TO Execution History HashMap");

+		for (String key : activityExecHistoryMap.keySet()){

+			System.out.println("Activity: " + key + " :: "+ activityExecHistoryMap.get(key));

+		}

+

+		

+	}

+

+	/**

+	 * @param processName

+	 * @param activityName

+	 * @return the object containing execution details for the last execution of this activity regardless of process instance

+	 * @throws IOException

+	 */

+	public ActivityMonitoringData findLatestActivityMonitoringData(String processName, String activityName) throws IOException{

+		ActivityMonitoringData data = null;

+		String key = processName + "::" + activityName; //our convention, used also when storing values in the map

+		this.processActivityMonitoringFile(); //updates the contents of the map (only the last values will be stored) due to the nature of the map

+		if (activityExecMap.containsKey(key)) data = activityExecMap.get(key);

+		return data;

+	}

+	

+	public Vector<Long> getActivityExecutionTimes(String processName, String activityName) {

+		//System.out.println("LOOKING FOR EXECUTION TIMES FOR ACTIVITY: " + activityName + " IN PROCESS: " + processName);

+		Vector<Long> v = null;

+		String key = processName + "::" + activityName; //our convention, used also when storing values in the map

+		if (activityExecHistoryMap.containsKey(key)) v = activityExecHistoryMap.get(key);

+		//System.out.println("FOUND these values: " + v);

+		return v;

+	}

+	

+	public ProcessMonitoringData findLatestProcessMonitoringData(String processName) throws IOException{

+		ProcessMonitoringData data = null;

+		this.processProcessMonitoringFile(); //updates the contents of the map (only the last values will be stored) due to the nature of the map

+		if (processExecMap.containsKey(processName)) data = processExecMap.get(processName);

+		return data;

+	}

+	

+	public Vector<Long> getProcessExecutionTimes(String processName) {

+		//System.out.println("LOOKING FOR EXECUTION TIMES FOR PROCESS: " + processName);

+		Vector<Long> v = null;

+		if (processExecHistoryMap.containsKey(processName)) v = processExecHistoryMap.get(processName);

+		//System.out.println("FOUND these values: " + v);

+		return v;

+	}

+	

+	private ActivityMonitoringData processActivityLine(String nextLine) {

+		ActivityMonitoringData data = new ActivityMonitoringData();

+		Scanner ls = new Scanner(nextLine);

+		ls.useDelimiter("::");

+		try{

+			if (ls.hasNext()){

+				data.setProcName(ls.next());

+				data.setProcID(ls.next());

+				data.setActivityName(ls.next());

+				data.setGrantedRole(ls.next());

+				data.setUser(ls.next());

+				data.setLastExecTime(ls.nextLong());

+				data.setAvgExecTime(ls.nextLong());

+				data.setTimeStamp(ls.next());

+				

+				String key = data.getProcName() + "::" + data.getActivityName(); //our convention, used also when storing values in the map

+				Vector<Long> v;

+				if (activityExecHistoryMap.containsKey(key)) v = activityExecHistoryMap.get(key);

+				else v = new Vector<Long>();

+				v.add(data.getLastExecTime());

+				activityExecHistoryMap.put(key, v);

+			}

+		} catch (Exception e){

+			data = null;

+		}

+

+		ls.close();

+		return data;

+	}

+	

+}

diff --git a/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/ProcessMonitoringData.java b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/ProcessMonitoringData.java
new file mode 100755
index 0000000..efbaa05
--- /dev/null
+++ b/org.eclipse.soa.mangrove.roots/trunk/org.eclipse.soa.mangrove.monitoring/src/org/eclipse/soa/mangrove/monitoring/ProcessMonitoringData.java
@@ -0,0 +1,59 @@
+package org.eclipse.soa.mangrove.monitoring;

+

+import java.util.Vector;

+

+/**

+ * @author Adrian Mos

+ * Holder for monitoring data for BPMS processes

+ */

+public class ProcessMonitoringData {

+	public String getProcessName() {

+		return procName;

+	}

+	public void setProcessName(String procName) {

+		this.procName = procName;

+	}

+	public String getProcID() {

+		return procID;

+	}

+	public void setProcID(String procID) {

+		this.procID = procID;

+	}

+	public Vector<String> getPerformedActivityNames() {

+		return performedActivityNames;

+	}

+	public void setPerformedActivityNames(Vector<String> performedAactivityNames) {

+		this.performedActivityNames = performedAactivityNames;

+	}

+	public String getUser() {

+		return user;

+	}

+	public void setUser(String user) {

+		this.user = user;

+	}

+	public long getLastExecTime() {

+		return lastExecTime;

+	}

+	public void setLastExecTime(long lastExecTime) {

+		this.lastExecTime = lastExecTime;

+	}

+	public long getAvgExecTime() {

+		return avgExecTime;

+	}

+	public void setAvgExecTime(long avgExecTime) {

+		this.avgExecTime = avgExecTime;

+	}

+	public String getTimeStamp() {

+		return timeStamp;

+	}

+	public void setTimeStamp(String timeStamp) {

+		this.timeStamp = timeStamp;

+	}

+	private String procName;

+	private String procID;

+	private Vector<String> performedActivityNames;

+	private String user;

+	private long lastExecTime;

+	private long avgExecTime;

+	private String timeStamp;

+}