From af74a28073f151295339bbe92d2255cf5a2d02e5 Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nie@informatik.uni-kiel.de>
Date: Fri, 23 Mar 2012 21:35:07 +0100
Subject: [PATCH] Continued with the analysis control; Removed some bugs.

---
 .../beans/session/AnalysisControllerBean.java | 61 +++++++++++-----
 .../webgui/common/PluginClassLoader.java      | 33 ++++++---
 .../src/main/webapp/handleAnalysis.xhtml      | 71 ++++++++++++-------
 3 files changed, 111 insertions(+), 54 deletions(-)

diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AnalysisControllerBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AnalysisControllerBean.java
index dff9cdd0..f19fd1ed 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AnalysisControllerBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AnalysisControllerBean.java
@@ -43,9 +43,9 @@ public class AnalysisControllerBean {
 	 * The logger within this class.
 	 */
 	private static final Log LOG = LogFactory.getLog(AnalysisControllerBean.class);
-    /**
-     * The controller instance stored within this bean.
-     */
+	/**
+	 * The controller instance stored within this bean.
+	 */
 	private AnalysisController controller;
 
 	/**
@@ -56,36 +56,41 @@ public class AnalysisControllerBean {
 		 * No code necessary.
 		 */
 	}
-    
-    /**
-     * Delivers the controller stored within this bean.
-     * @return  The current controller in this bean.
-     */
+
+	/**
+	 * Delivers the controller stored within this bean.
+	 * 
+	 * @return The current controller in this bean.
+	 */
 	public AnalysisController getController() {
 		return this.controller;
 	}
 
-    /**
-     * Sets the controller stored within this bean to a new value.
-     * @param controller  The new controller.
-     */
+	/**
+	 * Sets the controller stored within this bean to a new value.
+	 * 
+	 * @param controller
+	 *            The new controller.
+	 */
 	public void setController(final AnalysisController controller) {
 		this.controller = controller;
 	}
 
-    /**
-     * This method tries to instantiate a new controller using the given project. If the project is null, nothing happens.
-     * @param mProject  The project used to create a new analysis controller.
-     */
+	/**
+	 * This method tries to instantiate a new controller using the given project. If the project is null, nothing happens.
+	 * 
+	 * @param mProject
+	 *            The project used to create a new analysis controller.
+	 */
 	public void instantiate(final MIProject mProject) {
 		if (mProject != null) {
 			try {
-                /* Create a temporary file and store the model instance in it. */
+				/* Create a temporary file and store the model instance in it. */
 				final File tempFile = File.createTempFile("java", ".tmp");
 				AnalysisController.saveToFile(tempFile, mProject);
-                /* Try to create the controller. */
+				/* Try to create the controller. */
 				this.controller = new AnalysisController(tempFile, PluginClassLoader.getInstance());
-                /* Don't forget to remove the temporary file. */
+				/* Don't forget to remove the temporary file. */
 				tempFile.delete();
 			} catch (final IOException ex) {
 				AnalysisControllerBean.LOG.error("Could not create analysis controller.", ex);
@@ -94,4 +99,22 @@ public class AnalysisControllerBean {
 			}
 		}
 	}
+
+	public void start() {
+		new Thread() {
+			@Override
+			public void run() {
+				AnalysisControllerBean.this.controller.run();
+			}
+		}.start();
+	}
+
+	public void stop() {
+		new Thread() {
+			@Override
+			public void run() {
+				AnalysisControllerBean.this.controller.terminate();
+			}
+		}.start();
+	}
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginClassLoader.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginClassLoader.java
index e4880b59..905fc698 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginClassLoader.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginClassLoader.java
@@ -20,15 +20,20 @@
 
 package kieker.webgui.common;
 
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import kieker.analysis.AnalysisController;
+import kieker.analysis.model.analysisMetaModel.MIDependency;
+import kieker.common.logging.Log;
+import kieker.common.logging.LogFactory;
 
 /**
  * This singleton class is responsible for the dynamic loading of classes. Unlike a normal <code>URLClassLoader</code> it is possible to dynamically add and remove
@@ -39,6 +44,10 @@ import kieker.analysis.AnalysisController;
  */
 public final class PluginClassLoader extends ClassLoader {
 
+	/**
+	 * The logger within this class.
+	 */
+	private static final Log LOG = LogFactory.getLog(PluginClassLoader.class);
 	/**
 	 * The singleton instance of this class.
 	 */
@@ -49,10 +58,18 @@ public final class PluginClassLoader extends ClassLoader {
 	private final Map<String, URLClassLoader> classLoaders = new HashMap<String, URLClassLoader>();
 
 	/**
-	 * The default constructor of this class.
+	 * The default constructor of this class. During the creation all available libraries will be added to the class loader.
 	 */
 	private PluginClassLoader() {
-		/* No code necessary. */
+		/* Make sure that all libs are loaded. */
+		final List<MIDependency> libs = FileManager.getInstance().loadAllDependencies();
+		for (final MIDependency lib : libs) {
+			try {
+				addURL(new URL("file", "localhost", FileManager.getInstance().getFullPath(lib)));
+			} catch (MalformedURLException ex) {
+				LOG.warn("Could not load library.", ex);
+			}
+		}
 	}
 
 	/**
@@ -103,13 +120,13 @@ public final class PluginClassLoader extends ClassLoader {
 	 * @throws ClassNotFoundException
 	 *             If a class with the given name could not be found.
 	 */
-    @Override
+	@Override
 	public Class<?> loadClass(final String name) throws ClassNotFoundException {
-        try {
-            return ClassLoader.getSystemClassLoader().loadClass(name);
-        } catch (ClassNotFoundException ex) {
-            /* Ignore exception. */
-        }
+		try {
+			return ClassLoader.getSystemClassLoader().loadClass(name);
+		} catch (ClassNotFoundException ex) {
+			/* Ignore exception. */
+		}
 		synchronized (this) {
 			/* Run through all available class loaders and try to find the correct class. */
 			final Iterator<URLClassLoader> classLoaderIter = this.classLoaders.values().iterator();
diff --git a/Kieker.WebGUI/src/main/webapp/handleAnalysis.xhtml b/Kieker.WebGUI/src/main/webapp/handleAnalysis.xhtml
index 0c2dad27..517fce4c 100644
--- a/Kieker.WebGUI/src/main/webapp/handleAnalysis.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/handleAnalysis.xhtml
@@ -19,42 +19,59 @@
                 <p:layoutUnit header="Navigation" position="north" collapsible="true" resizable="true">
                     <!-- The control panel to get back. -->
                     <h:form>
+                        <c:if test="#{empty selectedProjectBean.selectedProject}">
+                            No project selected. 
+                        </c:if>
                         Click
                         <h:link outcome="/main">here</h:link>
                         to get back to the main menu.
                     </h:form>
                 </p:layoutUnit>
 
-                <p:layoutUnit  position="center" >
-                    <h:form id="centerForm">
-                        <ui:repeat id="centerRepeat" value="#{selectedProjectBean.selectedProject.plugins}" var="plugin">
-                            <p:panel header="#{plugin.name}"  toggleSpeed="200" toggleable="true" id="plugin" style="width: 20%">
-                                <p:commandLink ajax="true" value="Show Data"/>
-                            </p:panel> 
-                            <p:draggable for="plugin">
-                            </p:draggable>
-                        </ui:repeat>
-                    </h:form>
-                </p:layoutUnit>
+                <c:choose>
+                    <c:when test="#{empty selectedProjectBean.selectedProject}">
+                        <p:layoutUnit  position="center" >
+                        </p:layoutUnit>
+                    </c:when>
+                    <c:otherwise>
 
+                        <p:layoutUnit  position="center" >
+                            <h:form id="centerForm">
+                                <ui:repeat id="centerRepeat" value="#{selectedProjectBean.selectedProject.plugins}" var="plugin">
+                                    <p:panel header="#{plugin.name}"  toggleSpeed="200" toggleable="true" id="plugin" style="width: 20%">
+                                        <p:commandLink ajax="true" value="Show Data"/>
+                                    </p:panel> 
+                                    <p:draggable for="plugin">
+                                    </p:draggable>
+                                </ui:repeat>
+                            </h:form>
+                        </p:layoutUnit>
 
-                <p:layoutUnit position="south" header="Analysis" resizable="true" collapsible="true">
-                    <h:form id="analysisForm">
-                        <p:commandButton value="Instantiate Analysis" action="#{analysisControllerBean.instantiate(selectedProjectBean.selectedProject)}" update=":analysisForm"/>
-                        <p:commandButton value="Start Analysis"  action="#{analysisControllerBean.controller.run()}" disabled="#{empty analysisControllerBean.controller}" update=":analysisForm"/>
-                        <p:commandButton value="Stop Analysis"  action="#{analysisControllerBean.controller.terminate()}" disabled="#{empty analysisControllerBean.controller}" update=":analysisForm"/>
-                        <p:spacer height="0px" width="150px"/>
-                        <c:choose>
-                            <c:when test="#{empty analysisControllerBean.controller}">
-                                <h:outputText value="Analysis State: N/A"/>
-                            </c:when>
-                            <c:otherwise>
-                                <h:outputText value="Analysis State: #{analysisControllerBean.controller.state}"/>
-                            </c:otherwise>
-                        </c:choose>     
-                    </h:form>
-                </p:layoutUnit>
+
+                        <p:layoutUnit position="south" header="Analysis" resizable="true" collapsible="true">
+                            <h:form id="analysisForm">
+                                <p:commandButton value="Instantiate Analysis" action="#{analysisControllerBean.instantiate(selectedProjectBean.selectedProject)}" update=":analysisForm:analysisStateText"/>
+                                <p:commandButton value="Start Analysis" async="true"  action="#{analysisControllerBean.controller.run()}" disabled="#{empty analysisControllerBean.controller}"/>
+                                <p:commandButton value="Stop Analysis" async="true" action="#{analysisControllerBean.controller.terminate()}" disabled="#{empty analysisControllerBean.controller}"/>
+                                <p:spacer height="0px" width="150px"/>
+                                <c:choose>
+                                    <c:when test="#{empty analysisControllerBean.controller}">
+                                        <h:outputText id="analysisStateText" value="Analysis State: N/A"/><br/>
+                                    </c:when>
+                                    <c:otherwise>
+                                        <h:outputText id="analysisStateText" value="Analysis State: #{analysisControllerBean.controller.state}"/>
+                                    </c:otherwise>
+                                </c:choose>   
+                                <p:poll interval="2" update=":analysisForm:analysisStateText"/>
+                            </h:form>
+
+                        </p:layoutUnit>
+
+                    </c:otherwise>
+                </c:choose>
             </p:layout>
+
+
         </h:body>
     </f:view>
 
-- 
GitLab