From 12577e63c0ceeb11e8d974c3fbd9ecb8082de093 Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nie@informatik.uni-kiel.de>
Date: Fri, 7 Sep 2012 18:25:47 +0200
Subject: [PATCH] Moved some code for code quality reasons; Updated the
 example; Filters and repositories can now be added correctly; Connections
 should now be handled correctly

---
 .../Bookstore-Example/Bookstore-Example.kax   |  39 ++-
 .../lib/BookstoreApplication.jar              | Bin 16623 -> 16558 bytes
 .../beans/view/ClassAndMethodContainer.java   | 193 +++++++++++++
 .../beans/view/CurrentAnalysisEditorBean.java | 255 +++++-------------
 .../view/CurrentAnalysisEditorGraphBean.java  |  63 +++--
 .../kieker/webgui/common/PluginFinder.java    |  29 +-
 .../exception/ProjectLoadException.java       |  19 ++
 .../src/main/webapp/AnalysisEditor.xhtml      |   2 -
 8 files changed, 357 insertions(+), 243 deletions(-)
 create mode 100644 Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/ClassAndMethodContainer.java

diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax b/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax
index 69649c9e..23dbdb89 100644
--- a/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax
+++ b/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax
@@ -1,47 +1,42 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Project xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="platform:/resource/Kieker/model/AnalysisMetaModel.ecore">
-  <plugins xsi:type="Filter" name="Response Time Filter" classname="kieker.examples.userguide.ch3and4bookstore.MyResponseTimeFilter">
+  <plugins xsi:type="Filter" name="FSReader" classname="kieker.analysis.plugin.reader.filesystem.FSReader">
+    <properties name="inputDirs" value="testdata"/>
+    <properties name="ignoreUnknownRecordTypes" value="false"/>
+    <outputPorts name="monitoringRecords" subscribers="//@plugins.1/@inputPorts.0 //@plugins.4/@inputPorts.0"/>
+  </plugins>
+  <plugins xsi:type="Filter" name="MyResponseTimeFilter" classname="kieker.examples.userguide.ch3and4bookstore.MyResponseTimeFilter">
     <properties name="thresholdNanos" value="1900000"/>
-    <outputPorts name="validResponseTimes" subscribers="//@plugins.1/@inputPorts.0 //@plugins.5/@inputPorts.0"/>
-    <outputPorts name="invalidResponseTimes" subscribers="//@plugins.2/@inputPorts.0 //@plugins.6/@inputPorts.0"/>
+    <outputPorts name="validResponseTimes" subscribers="//@plugins.5/@inputPorts.0 //@plugins.2/@inputPorts.0"/>
+    <outputPorts name="invalidResponseTimes" subscribers="//@plugins.6/@inputPorts.0 //@plugins.3/@inputPorts.0"/>
     <inputPorts name="newResponseTime"/>
   </plugins>
-  <plugins xsi:type="Filter" name="Print valid" classname="kieker.examples.userguide.ch3and4bookstore.MyResponseTimeOutputPrinter">
+  <plugins xsi:type="Filter" name="Valid Printer" classname="kieker.examples.userguide.ch3and4bookstore.MyResponseTimeOutputPrinter">
     <properties name="validOutput" value="true"/>
     <inputPorts name="newEvent"/>
   </plugins>
-  <plugins xsi:type="Filter" name="Print invalid" classname="kieker.examples.userguide.ch3and4bookstore.MyResponseTimeOutputPrinter">
-    <properties name="validOutput" value="false"/>
-    <inputPorts name="newEvent"/>
-  </plugins>
-  <plugins xsi:type="Reader" name="File System Reader" classname="kieker.analysis.plugin.reader.filesystem.FSReader">
-    <properties name="ignoreUnknownRecordTypes" value="false"/>
-    <properties name="inputDirs" value="testdata"/>
-    <outputPorts name="monitoringRecords" subscribers="//@plugins.0/@inputPorts.0 //@plugins.4/@inputPorts.0"/>
-  </plugins>
-  <plugins xsi:type="Filter" name="Counter1" classname="kieker.analysis.plugin.filter.forward.CountingFilter">
+  <plugins xsi:type="Filter" name="Invalid Counter" classname="kieker.analysis.plugin.filter.forward.CountingFilter">
     <outputPorts name="relayedEvents"/>
     <outputPorts name="currentEventCount"/>
     <displays name="Counter Display"/>
     <inputPorts name="inputEvents"/>
   </plugins>
-  <plugins xsi:type="Filter" name="Counter2" classname="kieker.analysis.plugin.filter.forward.CountingFilter">
+  <plugins xsi:type="Filter" name="Global Counter" classname="kieker.analysis.plugin.filter.forward.CountingFilter">
     <outputPorts name="relayedEvents"/>
     <outputPorts name="currentEventCount"/>
     <displays name="Counter Display"/>
     <inputPorts name="inputEvents"/>
   </plugins>
-  <plugins xsi:type="Filter" name="Counter3" classname="kieker.analysis.plugin.filter.forward.CountingFilter">
+  <plugins xsi:type="Filter" name="Valid Counter" classname="kieker.analysis.plugin.filter.forward.CountingFilter">
     <outputPorts name="relayedEvents"/>
     <outputPorts name="currentEventCount"/>
     <displays name="Counter Display"/>
     <inputPorts name="inputEvents"/>
   </plugins>
+  <plugins xsi:type="Filter" name="Invalid Printer" classname="kieker.examples.userguide.ch3and4bookstore.MyResponseTimeOutputPrinter">
+    <properties name="validOutput" value="false"/>
+    <inputPorts name="newEvent"/>
+  </plugins>
   <dependencies filePath="BookstoreApplication.jar"/>
-  <dependencies filePath="kieker-1.6-SNAPSHOT_emf.jar"/>
-  <views name="View" description="No description available.">
-    <displayConnectors name="FS Counter" display="//@plugins.4/@displays.0"/>
-    <displayConnectors name="Valid Counter" display="//@plugins.5/@displays.0"/>
-    <displayConnectors name="Invalid Counter" display="//@plugins.6/@displays.0"/>
-  </views>
+  <dependencies filePath="commons-cli-1.2.jar"/>
 </Project>
diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/lib/BookstoreApplication.jar b/Kieker.WebGUI/bin/data/Bookstore-Example/lib/BookstoreApplication.jar
index 620d8a18d9fd304960034fe0a9e7a61b75478a79..36f7e73732cb5dd887275451074486430e44c7da 100644
GIT binary patch
delta 4490
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

delta 4522
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

diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/ClassAndMethodContainer.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/ClassAndMethodContainer.java
new file mode 100644
index 00000000..2fb36790
--- /dev/null
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/ClassAndMethodContainer.java
@@ -0,0 +1,193 @@
+/***************************************************************************
+ * Copyright 2012 by
+ *  + Christian-Albrechts-University of Kiel
+ *    + Department of Computer Science
+ *      + Software Engineering Group 
+ *  and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package kieker.webgui.beans.view;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import kieker.analysis.display.annotation.Display;
+import kieker.analysis.plugin.AbstractPlugin;
+import kieker.analysis.plugin.annotation.InputPort;
+import kieker.analysis.plugin.annotation.OutputPort;
+import kieker.analysis.plugin.annotation.Plugin;
+import kieker.analysis.plugin.annotation.Property;
+import kieker.analysis.plugin.annotation.RepositoryPort;
+import kieker.analysis.plugin.filter.AbstractFilterPlugin;
+import kieker.analysis.plugin.reader.AbstractReaderPlugin;
+import kieker.analysis.repository.AbstractRepository;
+import kieker.analysis.repository.annotation.Repository;
+import kieker.common.logging.Log;
+import kieker.common.logging.LogFactory;
+import kieker.webgui.common.exception.ProjectLoadException;
+
+public final class ClassAndMethodContainer {
+
+	private static final Log LOG = LogFactory.getLog(ClassAndMethodContainer.class);
+
+	private final Class<?> abstractRepositoryClass;
+	private final Class<?> abstractPluginClass;
+	private final Class<?> abstractFilterPluginClass;
+	private final Class<?> abstractReaderPluginClass;
+	private final Class<? extends Annotation> pluginAnnotationClass;
+	private final Class<? extends Annotation> repositoryAnnotationClass;
+	private final Class<? extends Annotation> propertyAnnotationClass;
+	private final Class<? extends Annotation> outputPortAnnotationClass;
+	private final Class<? extends Annotation> inputPortAnnotationClass;
+	private final Class<? extends Annotation> repositoryPortAnnotationClass;
+	private final Class<? extends Annotation> displayAnnotationClass;
+	private final Method pluginDescriptionMethod;
+	private final Method repositoryDescriptionMethod;
+	private final Method pluginConfigurationMethod;
+	private final Method repositoryConfigurationMethod;
+	private final Method pluginOutputPortsMethod;
+	private final Method pluginRepositoryPortsMethod;
+	private final Method displayNameMethod;
+	private final Method inputPortNameMethod;
+	private final Method outputPortNameMethod;
+	private final Method repositoryPortNameMethod;
+	private final Method propertyNameMethod;
+	private final Method propertyDefaultValueMethod;
+
+	public ClassAndMethodContainer(final ClassLoader classLoader) throws ProjectLoadException {
+		try {
+			this.abstractFilterPluginClass = classLoader.loadClass(AbstractFilterPlugin.class.getCanonicalName());
+			this.abstractReaderPluginClass = classLoader.loadClass(AbstractReaderPlugin.class.getCanonicalName());
+			this.abstractRepositoryClass = classLoader.loadClass(AbstractRepository.class.getCanonicalName());
+			this.abstractPluginClass = classLoader.loadClass(AbstractPlugin.class.getCanonicalName());
+
+			this.pluginAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Plugin.class.getCanonicalName());
+			this.repositoryAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Repository.class.getCanonicalName());
+			this.propertyAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Property.class.getCanonicalName());
+			this.outputPortAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(OutputPort.class.getCanonicalName());
+			this.inputPortAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(InputPort.class.getCanonicalName());
+			this.repositoryPortAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(RepositoryPort.class.getCanonicalName());
+			this.displayAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Display.class.getCanonicalName());
+
+			this.pluginDescriptionMethod = this.pluginAnnotationClass.getMethod("description", new Class<?>[0]);
+			this.repositoryDescriptionMethod = this.repositoryAnnotationClass.getMethod("description", new Class<?>[0]);
+			this.pluginConfigurationMethod = this.pluginAnnotationClass.getMethod("configuration", new Class<?>[0]);
+			this.repositoryConfigurationMethod = this.repositoryAnnotationClass.getMethod("configuration", new Class<?>[0]);
+			this.pluginOutputPortsMethod = this.pluginAnnotationClass.getMethod("outputPorts", new Class<?>[0]);
+			this.pluginRepositoryPortsMethod = this.pluginAnnotationClass.getMethod("repositoryPorts", new Class<?>[0]);
+			this.displayNameMethod = this.displayAnnotationClass.getMethod("name", new Class<?>[0]);
+			this.inputPortNameMethod = this.inputPortAnnotationClass.getMethod("name", new Class<?>[0]);
+			this.outputPortNameMethod = this.outputPortAnnotationClass.getMethod("name", new Class<?>[0]);
+			this.repositoryPortNameMethod = this.repositoryPortAnnotationClass.getMethod("name", new Class<?>[0]);
+			this.propertyNameMethod = this.propertyAnnotationClass.getMethod("name", new Class<?>[0]);
+			this.propertyDefaultValueMethod = this.propertyAnnotationClass.getMethod("defaultValue", new Class<?>[0]);
+		} catch (final ReflectiveOperationException ex) {
+			ClassAndMethodContainer.LOG.error("An error occured while loading the classes and methods.", ex);
+			throw new ProjectLoadException();
+		}
+	}
+
+	public Class<?> getAbstractFilterPluginClass() {
+		return this.abstractFilterPluginClass;
+	}
+
+	public Class<?> getAbstractReaderPluginClass() {
+		return this.abstractReaderPluginClass;
+	}
+
+	public Class<? extends Annotation> getPluginAnnotationClass() {
+		return this.pluginAnnotationClass;
+	}
+
+	public Class<? extends Annotation> getRepositoryAnnotationClass() {
+		return this.repositoryAnnotationClass;
+	}
+
+	public Class<? extends Annotation> getPropertyAnnotationClass() {
+		return this.propertyAnnotationClass;
+	}
+
+	public Class<? extends Annotation> getOutputPortAnnotationClass() {
+		return this.outputPortAnnotationClass;
+	}
+
+	public Class<? extends Annotation> getInputPortAnnotationClass() {
+		return this.inputPortAnnotationClass;
+	}
+
+	public Class<? extends Annotation> getRepositoryPortAnnotationClass() {
+		return this.repositoryPortAnnotationClass;
+	}
+
+	public Class<? extends Annotation> getDisplayAnnotationClass() {
+		return this.displayAnnotationClass;
+	}
+
+	public Method getPluginDescriptionMethod() {
+		return this.pluginDescriptionMethod;
+	}
+
+	public Method getRepositoryDescriptionMethod() {
+		return this.repositoryDescriptionMethod;
+	}
+
+	public Method getPluginConfigurationMethod() {
+		return this.pluginConfigurationMethod;
+	}
+
+	public Method getRepositoryConfigurationMethod() {
+		return this.repositoryConfigurationMethod;
+	}
+
+	public Method getPluginOutputPortsMethod() {
+		return this.pluginOutputPortsMethod;
+	}
+
+	public Method getPluginRepositoryPortsMethod() {
+		return this.pluginRepositoryPortsMethod;
+	}
+
+	public Method getDisplayNameMethod() {
+		return this.displayNameMethod;
+	}
+
+	public Class<?> getAbstractRepositoryClass() {
+		return this.abstractRepositoryClass;
+	}
+
+	public Class<?> getAbstractPluginClass() {
+		return this.abstractPluginClass;
+	}
+
+	public Method getInputPortNameMethod() {
+		return this.inputPortNameMethod;
+	}
+
+	public Method getOutputPortNameMethod() {
+		return this.outputPortNameMethod;
+	}
+
+	public Method getRepositoryPortNameMethod() {
+		return this.repositoryPortNameMethod;
+	}
+
+	public Method getPropertyNameMethod() {
+		return this.propertyNameMethod;
+	}
+
+	public Method getPropertyDefaultValueMethod() {
+		return this.propertyDefaultValueMethod;
+	}
+
+}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
index cf3b62ef..2f993716 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
@@ -22,16 +22,13 @@ package kieker.webgui.beans.view;
 
 import java.io.IOException;
 import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 import javax.faces.application.FacesMessage;
 import javax.faces.application.FacesMessage.Severity;
@@ -40,7 +37,6 @@ import javax.faces.bean.ManagedProperty;
 import javax.faces.bean.ViewScoped;
 import javax.faces.context.FacesContext;
 
-import kieker.analysis.display.annotation.Display;
 import kieker.analysis.model.analysisMetaModel.MIAnalysisMetaModelFactory;
 import kieker.analysis.model.analysisMetaModel.MIDependency;
 import kieker.analysis.model.analysisMetaModel.MIDisplay;
@@ -55,16 +51,9 @@ import kieker.analysis.model.analysisMetaModel.MIRepository;
 import kieker.analysis.model.analysisMetaModel.MIRepositoryConnector;
 import kieker.analysis.model.analysisMetaModel.impl.MAnalysisMetaModelFactory;
 import kieker.analysis.plugin.AbstractPlugin;
-import kieker.analysis.plugin.annotation.InputPort;
-import kieker.analysis.plugin.annotation.OutputPort;
-import kieker.analysis.plugin.annotation.Plugin;
 import kieker.analysis.plugin.annotation.Property;
-import kieker.analysis.plugin.annotation.RepositoryPort;
-import kieker.analysis.plugin.filter.AbstractFilterPlugin;
 import kieker.analysis.plugin.reader.AbstractReaderPlugin;
 import kieker.analysis.repository.AbstractRepository;
-import kieker.analysis.repository.annotation.Repository;
-import kieker.common.configuration.Configuration;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
 import kieker.webgui.beans.application.ProjectsBean;
@@ -123,18 +112,15 @@ public final class CurrentAnalysisEditorBean {
 	 */
 	private long timeStamp;
 	/**
-	 * This list contains the available repositories for the current project. The list is from the type Class<?> to allow a modular algorithm for the tree
-	 * assembling.
+	 * This list contains the available repositories for the current project.
 	 */
 	private final List<Class<?>> availableRepositories = Collections.synchronizedList(new ArrayList<Class<?>>());
 	/**
-	 * This list contains the available filters for the current project. The list is from the type Class<?> to allow a modular algorithm for the tree
-	 * assembl
+	 * This list contains the available filters for the current project.
 	 */
 	private final List<Class<?>> availableFilters = Collections.synchronizedList(new ArrayList<Class<?>>());
 	/**
-	 * This list contains the available readers for the current project. The list is from the type Class<?> to allow a modular algorithm for the tree
-	 * assembl
+	 * This list contains the available readers for the current project.
 	 */
 	private final List<Class<?>> availableReaders = Collections.synchronizedList(new ArrayList<Class<?>>());
 	/**
@@ -311,10 +297,10 @@ public final class CurrentAnalysisEditorBean {
 		for (final Class<?> plugin : plugins) {
 			if (!Modifier.isAbstract(plugin.getModifiers())) {
 				// The following cast results in the unchecked-cast-warnings, but we know that the cast should be correct.
-				if (this.classAndMethodContainer.abstractFilterPluginClass.isAssignableFrom(plugin)) {
+				if (this.classAndMethodContainer.getAbstractFilterPluginClass().isAssignableFrom(plugin)) {
 					this.availableFilters.add(plugin);
 				} else {
-					if (this.classAndMethodContainer.abstractReaderPluginClass.isAssignableFrom(plugin)) {
+					if (this.classAndMethodContainer.getAbstractReaderPluginClass().isAssignableFrom(plugin)) {
 						this.availableReaders.add(plugin);
 					}
 				}
@@ -398,20 +384,20 @@ public final class CurrentAnalysisEditorBean {
 	public String getDescription(final Class<?> clazz) {
 		try {
 			// Get the two potential annotations
-			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.pluginAnnotationClass);
-			final Annotation annotationRepository = clazz.getAnnotation(this.classAndMethodContainer.repositoryAnnotationClass);
+			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.getPluginAnnotationClass());
+			final Annotation annotationRepository = clazz.getAnnotation(this.classAndMethodContainer.getRepositoryAnnotationClass());
 
 			// Now check which one of them is available
-			if ((annotationPlugin == null) || ((String) this.classAndMethodContainer.pluginDescriptionMethod.invoke(annotationPlugin, new Object[0])).isEmpty()) {
+			if ((annotationPlugin == null) || ((String) this.classAndMethodContainer.getPluginDescriptionMethod().invoke(annotationPlugin, new Object[0])).isEmpty()) {
 				if ((annotationRepository == null)
-						|| ((String) this.classAndMethodContainer.repositoryDescriptionMethod.invoke(annotationRepository, new Object[0])).isEmpty()) {
+						|| ((String) this.classAndMethodContainer.getRepositoryDescriptionMethod().invoke(annotationRepository, new Object[0])).isEmpty()) {
 					// None. Deliver a human readable substitute.
 					return "No description available";
 				} else {
-					return (String) this.classAndMethodContainer.repositoryDescriptionMethod.invoke(annotationRepository, new Object[0]);
+					return (String) this.classAndMethodContainer.getRepositoryDescriptionMethod().invoke(annotationRepository, new Object[0]);
 				}
 			} else {
-				return (String) this.classAndMethodContainer.pluginDescriptionMethod.invoke(annotationPlugin, new Object[0]);
+				return (String) this.classAndMethodContainer.getPluginDescriptionMethod().invoke(annotationPlugin, new Object[0]);
 			}
 		} catch (final ReflectiveOperationException ex) {
 			CurrentAnalysisEditorBean.LOG.warn("Could not invoke method", ex);
@@ -424,8 +410,8 @@ public final class CurrentAnalysisEditorBean {
 
 		try {
 			// Get the two potential annotations
-			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.pluginAnnotationClass);
-			final Annotation annotationRepository = clazz.getAnnotation(this.classAndMethodContainer.repositoryAnnotationClass);
+			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.getPluginAnnotationClass());
+			final Annotation annotationRepository = clazz.getAnnotation(this.classAndMethodContainer.getRepositoryAnnotationClass());
 
 			final Annotation[] properties;
 
@@ -435,10 +421,10 @@ public final class CurrentAnalysisEditorBean {
 					// None.
 					properties = new Property[0];
 				} else {
-					properties = (Annotation[]) this.classAndMethodContainer.repositoryConfigurationMethod.invoke(annotationRepository, new Object[0]);
+					properties = (Annotation[]) this.classAndMethodContainer.getRepositoryConfigurationMethod().invoke(annotationRepository, new Object[0]);
 				}
 			} else {
-				properties = (Annotation[]) this.classAndMethodContainer.pluginConfigurationMethod.invoke(annotationPlugin, new Object[0]);
+				properties = (Annotation[]) this.classAndMethodContainer.getPluginConfigurationMethod().invoke(annotationPlugin, new Object[0]);
 			}
 
 			for (final Annotation property : properties) {
@@ -463,7 +449,7 @@ public final class CurrentAnalysisEditorBean {
 
 		for (final Method method : clazz.getMethods()) {
 			// Get the potential annotation
-			final Annotation annotationPort = method.getAnnotation(this.classAndMethodContainer.inputPortAnnotationClass);
+			final Annotation annotationPort = method.getAnnotation(this.classAndMethodContainer.getInputPortAnnotationClass());
 			// Now check whether it is available
 			if (annotationPort != null) {
 				result.add(annotationPort);
@@ -485,11 +471,11 @@ public final class CurrentAnalysisEditorBean {
 
 		try {
 			// Get the potential annotation
-			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.pluginAnnotationClass);
+			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.getPluginAnnotationClass());
 
 			// Now check whether it is available
 			if (annotationPlugin != null) {
-				for (final Annotation oPort : (Annotation[]) this.classAndMethodContainer.pluginOutputPortsMethod.invoke(annotationPlugin, new Object[0])) {
+				for (final Annotation oPort : (Annotation[]) this.classAndMethodContainer.getPluginOutputPortsMethod().invoke(annotationPlugin, new Object[0])) {
 					result.add(oPort);
 				}
 			}
@@ -511,11 +497,11 @@ public final class CurrentAnalysisEditorBean {
 		final List<Annotation> result = new ArrayList<Annotation>();
 		try {
 			// Get the potential annotation
-			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.pluginAnnotationClass);
+			final Annotation annotationPlugin = clazz.getAnnotation(this.classAndMethodContainer.getPluginAnnotationClass());
 
 			// Now check whether it is available
 			if (annotationPlugin != null) {
-				for (final Annotation rPort : (Annotation[]) this.classAndMethodContainer.pluginRepositoryPortsMethod.invoke(annotationPlugin, new Object[0])) {
+				for (final Annotation rPort : (Annotation[]) this.classAndMethodContainer.getPluginRepositoryPortsMethod().invoke(annotationPlugin, new Object[0])) {
 					result.add(rPort);
 				}
 			}
@@ -530,7 +516,7 @@ public final class CurrentAnalysisEditorBean {
 
 		for (final Method method : clazz.getMethods()) {
 			// Get the potential annotation
-			final Annotation display = method.getAnnotation(this.classAndMethodContainer.displayAnnotationClass);
+			final Annotation display = method.getAnnotation(this.classAndMethodContainer.getDisplayAnnotationClass());
 			// Now check whether it is available
 			if (display != null) {
 				result.add(display);
@@ -653,7 +639,7 @@ public final class CurrentAnalysisEditorBean {
 				final List<Annotation> displays = this.getDisplays(clazz);
 				for (final Annotation display : displays) {
 					final MIDisplay mDisplay = this.factory.createDisplay();
-					mDisplay.setName((String) this.classAndMethodContainer.displayNameMethod.invoke(display, new Object[0]));
+					mDisplay.setName((String) this.classAndMethodContainer.getDisplayNameMethod().invoke(display, new Object[0]));
 					plugin.getDisplays().add(mDisplay);
 				}
 
@@ -683,58 +669,42 @@ public final class CurrentAnalysisEditorBean {
 	private boolean fillPorts(final Class<AbstractPlugin> clazz, final MIPlugin plugin) {
 		synchronized (this) {
 			try {
-				// Try to instantiate the given class, using the special constructor of Kieker.
-				final AbstractPlugin pluginInstance = clazz.getConstructor(Configuration.class).newInstance(new Configuration());
-
-				// Get the port and use them to initialize the model plugin.
-				final String[] inputPortNames = pluginInstance.getAllInputPortNames();
-				final String[] outputPortNames = pluginInstance.getAllOutputPortNames();
-				final String[] repositoryPortNames = pluginInstance.getAllRepositoryPortNames();
+				// Get the ports
+				final List<Annotation> inputPorts = this.getInputPorts(clazz);
+				final List<Annotation> outputPorts = this.getOutputPorts(clazz);
+				final List<Annotation> repositoryPorts = this.getRepositoryPorts(clazz);
 
 				// Add input ports
 				if (plugin instanceof MIFilter) {
-					for (final String inputPortName : inputPortNames) {
+					for (final Annotation inputPort : inputPorts) {
 						final MIInputPort mInputPort = this.factory.createInputPort();
-						mInputPort.setName(inputPortName);
-
+						mInputPort.setName((String) this.classAndMethodContainer.getInputPortNameMethod().invoke(inputPort, new Object[0]));
 						mInputPort.setParent((MIFilter) plugin);
 					}
 				}
 
 				// Add output ports.
-				for (final String outputPortName : outputPortNames) {
+				for (final Annotation outputPort : outputPorts) {
 					final MIOutputPort mOutputPort = this.factory.createOutputPort();
-					mOutputPort.setName(outputPortName);
+					mOutputPort.setName((String) this.classAndMethodContainer.getOutputPortNameMethod().invoke(outputPort, new Object[0]));
 					mOutputPort.setParent(plugin);
 				}
 
 				// Add repository ports.
-				for (final String repositoryPortName : repositoryPortNames) {
+				for (final Annotation repositoryPort : repositoryPorts) {
 					final MIRepositoryConnector mConnector = this.factory.createRepositoryConnector();
-					mConnector.setName(repositoryPortName);
+					mConnector.setName((String) this.classAndMethodContainer.getRepositoryPortNameMethod().invoke(repositoryPort, new Object[0]));
 					plugin.getRepositories().add(mConnector);
 				}
 
 				return true;
 
-			} catch (final InstantiationException ex) {
-				CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the ports of the plugin.", ex);
-				CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the ports of the plugin.");
-				return false;
-			} catch (final IllegalAccessException ex) {
-				CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the ports of the plugin.", ex);
-				CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the ports of the plugin.");
-				return false;
-			} catch (final InvocationTargetException ex) {
-				CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the ports of the plugin.", ex);
-				CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the ports of the plugin.");
-				return false;
-			} catch (final NoSuchMethodException ex) {
-				CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the ports of the plugin.", ex);
+			} catch (final ReflectiveOperationException ex) {
+				CurrentAnalysisEditorBean.LOG.error("An error occured while loading the ports of the plugin.", ex);
 				CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the ports of the plugin.");
 				return false;
-			} catch (final NoClassDefFoundError ex) {
-				CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the ports of the plugin.", ex);
+			} catch (final ClassCastException ex) {
+				CurrentAnalysisEditorBean.LOG.error("An error occured while loading the ports of the plugin.", ex);
 				CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the ports of the plugin.");
 				return false;
 			}
@@ -753,32 +723,25 @@ public final class CurrentAnalysisEditorBean {
 	 */
 	private boolean fillProperties(final Class<AbstractRepository> clazz, final MIRepository repository) {
 		try {
-			// Try to instantiate the given class, using the special constructor of Kieker.
-			final AbstractRepository repositoryInstance = clazz.getConstructor(Configuration.class).newInstance(new Configuration());
-			// Get the current configuration and use it to initialize the model repository, as THIS configuration instance will contain all keys.
-			final Configuration configuration = repositoryInstance.getCurrentConfiguration();
+			// Get the default configuration and use it to initialize the model repository
+			final List<Annotation> properties = this.getProperties(clazz);
+
+			for (final Annotation property : properties) {
+				final MIProperty mProperty = this.factory.createProperty();
 
-			repository.getProperties().addAll(this.extractProperties(configuration));
+				mProperty.setName((String) this.classAndMethodContainer.getPropertyNameMethod().invoke(property, new Object[0]));
+				mProperty.setValue((String) this.classAndMethodContainer.getPropertyDefaultValueMethod().invoke(property, new Object[0]));
+
+				repository.getProperties().add(mProperty);
+			}
 
 			return true;
-		} catch (final InstantiationException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the repository.", ex);
-			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the repository.");
-			return false;
-		} catch (final IllegalAccessException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the repository.", ex);
-			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the repository.");
-			return false;
-		} catch (final InvocationTargetException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the repository.", ex);
-			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the repository.");
-			return false;
-		} catch (final NoSuchMethodException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the repository.", ex);
+		} catch (final ReflectiveOperationException ex) {
+			CurrentAnalysisEditorBean.LOG.error("An error occured while loading the properties of the repository.", ex);
 			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the repository.");
 			return false;
-		} catch (final NoClassDefFoundError ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the repository.", ex);
+		} catch (final ClassCastException ex) {
+			CurrentAnalysisEditorBean.LOG.error("An error occured while loading the properties of the repository.", ex);
 			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the repository.");
 			return false;
 		}
@@ -796,63 +759,30 @@ public final class CurrentAnalysisEditorBean {
 	 */
 	private boolean fillProperties(final Class<AbstractPlugin> clazz, final MIPlugin plugin) {
 		try {
-			// Try to instantiate the given class, using the special constructor of Kieker.
-			final AbstractPlugin pluginInstance = clazz.getConstructor(Configuration.class).newInstance(new Configuration());
-			// Get the current configuration and use it to initialize the model plugin, as THIS configuration instance will contain all keys.
-			final Configuration configuration = pluginInstance.getCurrentConfiguration();
+			// Get the default configuration and use it to initialize the model plugin
+			final List<Annotation> properties = this.getProperties(clazz);
 
-			plugin.getProperties().addAll(this.extractProperties(configuration));
+			for (final Annotation property : properties) {
+				final MIProperty mProperty = this.factory.createProperty();
+
+				mProperty.setName((String) this.classAndMethodContainer.getPropertyNameMethod().invoke(property, new Object[0]));
+				mProperty.setValue((String) this.classAndMethodContainer.getPropertyDefaultValueMethod().invoke(property, new Object[0]));
+
+				plugin.getProperties().add(mProperty);
+			}
 
 			return true;
-		} catch (final InstantiationException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the plugin.", ex);
-			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the plugin.");
-			return false;
-		} catch (final IllegalAccessException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the plugin.", ex);
-			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the plugin.");
-			return false;
-		} catch (final InvocationTargetException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the plugin.", ex);
-			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the plugin.");
-			return false;
-		} catch (final NoSuchMethodException ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the plugin.", ex);
+		} catch (final ReflectiveOperationException ex) {
+			CurrentAnalysisEditorBean.LOG.error("An error occured while loading the properties of the plugin.", ex);
 			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the plugin.");
 			return false;
-		} catch (final NoClassDefFoundError ex) {
-			CurrentAnalysisEditorBean.LOG.error("An errcor occured while loading the properties of the plugin.", ex);
+		} catch (final ClassCastException ex) {
+			CurrentAnalysisEditorBean.LOG.error("An error occured while loading the properties of the plugin.", ex);
 			CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the plugin.");
 			return false;
 		}
 	}
 
-	/**
-	 * This method extracts the properties from the given configuration. In other words: For every key within the configuration, the method creates a model
-	 * counterpart.
-	 * 
-	 * @param configuration
-	 *            The configuration to be used for extraction.
-	 * @return The list containing one {@link MIProperty} for every key within the configuration.
-	 */
-	private List<MIProperty> extractProperties(final Configuration configuration) {
-		final List<MIProperty> result = new ArrayList<MIProperty>();
-
-		// Run through all entries.
-		final Iterator<Map.Entry<Object, Object>> iterator = configuration.entrySet().iterator();
-		while (iterator.hasNext()) {
-			final Map.Entry<Object, Object> entry = iterator.next();
-			// Create a property object for the current entry.
-			final MIProperty property = this.factory.createProperty();
-			property.setName(entry.getKey().toString());
-			property.setValue(entry.getValue().toString());
-
-			result.add(property);
-		}
-
-		return result;
-	}
-
 	/**
 	 * This method adds a new repository to the current model, using the given instance of {@code Class} for it.
 	 * 
@@ -1097,56 +1027,19 @@ public final class CurrentAnalysisEditorBean {
 		}
 	}
 
-	public void edgeCreated(final EObject sourcePort, final EObject targetPort) {
-		((MIOutputPort) sourcePort).getSubscribers().add((MIInputPort) targetPort);
+	public void edgeCreated(final MIOutputPort sourcePort, final MIInputPort targetPort) {
+		sourcePort.getSubscribers().add(targetPort);
 	}
 
-	public void edgeRemoved(final EObject sourcePort, final EObject targetPort) {
-		((MIOutputPort) sourcePort).getSubscribers().remove(targetPort);
+	public void edgeRemoved(final MIOutputPort sourcePort, final MIInputPort targetPort) {
+		sourcePort.getSubscribers().remove(targetPort);
 	}
 
-	private static final class ClassAndMethodContainer {
-
-		public final Class<?> abstractFilterPluginClass;
-		public final Class<?> abstractReaderPluginClass;
-		public final Class<? extends Annotation> pluginAnnotationClass;
-		public final Class<? extends Annotation> repositoryAnnotationClass;
-		public final Class<? extends Annotation> propertyAnnotationClass;
-		public final Class<? extends Annotation> outputPortAnnotationClass;
-		public final Class<? extends Annotation> inputPortAnnotationClass;
-		public final Class<? extends Annotation> repositoryPortAnnotationClass;
-		public final Class<? extends Annotation> displayAnnotationClass;
-		public final Method pluginDescriptionMethod;
-		public final Method repositoryDescriptionMethod;
-		public final Method pluginConfigurationMethod;
-		public final Method repositoryConfigurationMethod;
-		public final Method pluginOutputPortsMethod;
-		public final Method pluginRepositoryPortsMethod;
-		public final Method displayNameMethod;
-
-		public ClassAndMethodContainer(final ClassLoader classLoader) throws ProjectLoadException {
-			try {
-				this.abstractFilterPluginClass = classLoader.loadClass(AbstractFilterPlugin.class.getCanonicalName());
-				this.abstractReaderPluginClass = classLoader.loadClass(AbstractReaderPlugin.class.getCanonicalName());
-				this.pluginAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Plugin.class.getCanonicalName());
-				this.repositoryAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Repository.class.getCanonicalName());
-				this.propertyAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Property.class.getCanonicalName());
-				this.outputPortAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(OutputPort.class.getCanonicalName());
-				this.inputPortAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(InputPort.class.getCanonicalName());
-				this.repositoryPortAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(RepositoryPort.class.getCanonicalName());
-				this.displayAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Display.class.getCanonicalName());
-
-				this.pluginDescriptionMethod = this.pluginAnnotationClass.getMethod("description", new Class<?>[0]);
-				this.repositoryDescriptionMethod = this.repositoryAnnotationClass.getMethod("description", new Class<?>[0]);
-				this.pluginConfigurationMethod = this.pluginAnnotationClass.getMethod("configuration", new Class<?>[0]);
-				this.repositoryConfigurationMethod = this.repositoryAnnotationClass.getMethod("configuration", new Class<?>[0]);
-				this.pluginOutputPortsMethod = this.pluginAnnotationClass.getMethod("outputPorts", new Class<?>[0]);
-				this.pluginRepositoryPortsMethod = this.pluginAnnotationClass.getMethod("repositoryPorts", new Class<?>[0]);
-				this.displayNameMethod = this.displayAnnotationClass.getMethod("name", new Class<?>[0]);
-			} catch (final ReflectiveOperationException ex) {
-				CurrentAnalysisEditorBean.LOG.error("An error occured while loading the classes and methods.", ex);
-				throw new ProjectLoadException();
-			}
-		}
+	public void edgeCreated(final MIRepositoryConnector sourcePort, final MIRepository target) {
+		sourcePort.setRepository(target);
+	}
+
+	public void edgeRemoved(final MIRepositoryConnector sourcePort, final MIRepository target) {
+		sourcePort.setRepository(null);
 	}
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java
index 9a6d9c94..b75cfa92 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java
@@ -115,6 +115,8 @@ public class CurrentAnalysisEditorGraphBean {
 	 * This is the javascript code to rename a node within the graph.
 	 */
 	private static final String JS_CMD_RENAME_NODE = "graph.getNode(%s).name = '%s';";
+	private static final Object REPOSITORY_INPUT_PORT = "R";
+
 	/**
 	 * This map contains all components (plugins, repositories and ports) within the graph to identify them with a unique ID.
 	 */
@@ -137,7 +139,7 @@ public class CurrentAnalysisEditorGraphBean {
 		RequestContext.getCurrentInstance().execute(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_CLICK_LISTENER);
 		RequestContext.getCurrentInstance().execute(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_REMOVE_NODE_LISTENER);
 		RequestContext.getCurrentInstance().execute(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_CREATE_EDGE_LISTENER);
-		RequestContext.getCurrentInstance().execute(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_REMOVE_EDGE_LISTENER);
+		// RequestContext.getCurrentInstance().execute(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_REMOVE_EDGE_LISTENER);
 	}
 
 	/**
@@ -154,8 +156,10 @@ public class CurrentAnalysisEditorGraphBean {
 	 *            The filter which should be added to the graph.
 	 */
 	public void addFilter(final MIFilter filter) {
-		RequestContext.getCurrentInstance().execute(String.format(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_FILTER, 0, 0, this.assembleGraphString(filter),
-				this.assembleGraphRepositoryPortString(filter), this.assembleGraphInputPortString(filter), this.assembleGraphOuputPortString(filter)));
+		RequestContext.getCurrentInstance().execute(
+				String.format(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_FILTER, 0, 0, this.assembleGraphString(filter),
+						this.assembleGraphRepositoryPortString(filter.getRepositories()), this.assembleGraphInputPortString(filter),
+						this.assembleGraphOutputPortString(filter)));
 	}
 
 	/**
@@ -166,7 +170,7 @@ public class CurrentAnalysisEditorGraphBean {
 	 */
 	public void addReader(final MIReader reader) {
 		RequestContext.getCurrentInstance().execute(String.format(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_READER, 0, 0, this.assembleGraphString(reader),
-				this.assembleGraphRepositoryPortString(reader), this.assembleGraphOuputPortString(reader)));
+				this.assembleGraphRepositoryPortString(reader.getRepositories()), this.assembleGraphOutputPortString(reader)));
 	}
 
 	/**
@@ -176,7 +180,8 @@ public class CurrentAnalysisEditorGraphBean {
 	 *            The repository which should be added to the graph.
 	 */
 	public void addRepository(final MIRepository repository) {
-		final String repoPort = String.format(CurrentAnalysisEditorGraphBean.JS_CMD_PORT, CurrentAnalysisEditorGraphBean.JS_CMD_PORT_TYPE_INPUT, "ip1", "N/A");
+		final String repoPort = String.format(CurrentAnalysisEditorGraphBean.JS_CMD_PORT, CurrentAnalysisEditorGraphBean.JS_CMD_PORT_TYPE_INPUT,
+				CurrentAnalysisEditorGraphBean.REPOSITORY_INPUT_PORT, "N/A");
 		RequestContext.getCurrentInstance().execute(String.format(CurrentAnalysisEditorGraphBean.JS_CMD_ADD_REPOSITORY, 0, 0, this.assembleGraphString(repository),
 				repoPort));
 	}
@@ -231,19 +236,19 @@ public class CurrentAnalysisEditorGraphBean {
 	 *            The plugin whose repository ports will be used.
 	 * @return A string containing the JS commands to create the repository ports.
 	 */
-	private String assembleGraphRepositoryPortString(final MIPlugin plugin) {
+	private String assembleGraphRepositoryPortString(final EList<MIRepositoryConnector> ports) {
 
 		final StringBuilder builder = new StringBuilder();
-		final int len = plugin.getRepositories().size();
+		final int len = ports.size();
 
 		for (int i = 0; i < len; i++) {
-			final MIRepositoryConnector port = plugin.getRepositories().get(i);
+			final MIRepositoryConnector port = ports.get(i);
 
 			if (i != 0) {
 				builder.append(',');
 			}
 
-			builder.append(String.format(CurrentAnalysisEditorGraphBean.JS_CMD_PORT, port.getName(), port.getName(), port.getName()));
+			builder.append(String.format(CurrentAnalysisEditorGraphBean.JS_CMD_PORT, port.getName(), this.componentMap.get(port), port.getName()));
 		}
 
 		return builder.toString();
@@ -267,7 +272,7 @@ public class CurrentAnalysisEditorGraphBean {
 	 *            The plugin whose output ports will be used.
 	 * @return A string containing the JS commands to create the output ports.
 	 */
-	private String assembleGraphOuputPortString(final MIPlugin plugin) {
+	private String assembleGraphOutputPortString(final MIPlugin plugin) {
 		return this.assembleGraphPortString(plugin.getOutputPorts());
 	}
 
@@ -339,7 +344,6 @@ public class CurrentAnalysisEditorGraphBean {
 		// Get the parameters
 		final Map<String, String> paramMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
 		final String clickedNodeID = paramMap.get("ID");
-
 		// Now search the correct node
 		try {
 			final EObject selectedNode = this.componentMap.get(Integer.parseInt(clickedNodeID));
@@ -362,10 +366,21 @@ public class CurrentAnalysisEditorGraphBean {
 		// Now search the correct components
 		try {
 			final EObject sourcePort = this.componentMap.get(Integer.parseInt(sourcePortID));
-			final EObject targetPort = this.componentMap.get(Integer.parseInt(targetPortID));
-
-			if ((sourcePort != null) && (targetPort != null) && (this.currentAnalysisEditorBean != null)) {
-				this.currentAnalysisEditorBean.edgeCreated(sourcePort, targetPort);
+			if (CurrentAnalysisEditorGraphBean.REPOSITORY_INPUT_PORT.equals(targetPortID)) {
+				// This is a special case: An edge between a filter and a repository
+				final String targetID = paramMap.get("targetPortID").split("\\.")[0];
+				final EObject targetRepo = this.componentMap.get(Integer.parseInt(targetID));
+
+				if ((sourcePort instanceof MIRepositoryConnector) && (targetRepo instanceof MIRepository) && (this.currentAnalysisEditorBean != null)) {
+					this.currentAnalysisEditorBean.edgeCreated((MIRepositoryConnector) sourcePort, (MIRepository) targetRepo);
+				}
+			} else {
+				// This is the normal case: An edge between two filters
+				final EObject targetPort = this.componentMap.get(Integer.parseInt(targetPortID));
+
+				if ((sourcePort != null) && (targetPort != null) && (this.currentAnalysisEditorBean != null)) {
+					this.currentAnalysisEditorBean.edgeCreated((MIOutputPort) sourcePort, (MIInputPort) targetPort);
+				}
 			}
 		} catch (final NumberFormatException ex) {
 			// Ignore an invalid ID, but log it.
@@ -383,10 +398,20 @@ public class CurrentAnalysisEditorGraphBean {
 		// Now search the correct components
 		try {
 			final EObject sourcePort = this.componentMap.get(Integer.parseInt(sourcePortID));
-			final EObject targetPort = this.componentMap.get(Integer.parseInt(targetPortID));
-
-			if ((sourcePort != null) && (targetPort != null) && (this.currentAnalysisEditorBean != null)) {
-				this.currentAnalysisEditorBean.edgeRemoved(sourcePort, targetPort);
+			if (CurrentAnalysisEditorGraphBean.REPOSITORY_INPUT_PORT.equals(targetPortID)) {
+				// This is a special case: An edge between a filter and a repository
+				final String targetID = paramMap.get("targetPortID").split("\\.")[0];
+				final EObject targetRepo = this.componentMap.get(Integer.parseInt(targetID));
+				if ((sourcePort instanceof MIRepositoryConnector) && (targetRepo instanceof MIRepository) && (this.currentAnalysisEditorBean != null)) {
+					this.currentAnalysisEditorBean.edgeRemoved((MIRepositoryConnector) sourcePort, (MIRepository) targetRepo);
+				}
+			} else {
+				// This is the normal case: An edge between two filters
+				final EObject targetPort = this.componentMap.get(Integer.parseInt(targetPortID));
+
+				if ((sourcePort != null) && (targetPort != null) && (this.currentAnalysisEditorBean != null)) {
+					this.currentAnalysisEditorBean.edgeRemoved((MIOutputPort) sourcePort, (MIInputPort) targetPort);
+				}
 			}
 		} catch (final NumberFormatException ex) {
 			// Ignore an invalid ID, but log it.
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java
index 8c0ff5e7..e2e2dbbe 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java
@@ -20,17 +20,14 @@
 package kieker.webgui.common;
 
 import java.io.IOException;
-import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 
-import kieker.analysis.plugin.AbstractPlugin;
-import kieker.analysis.plugin.annotation.Plugin;
-import kieker.analysis.repository.AbstractRepository;
-import kieker.analysis.repository.annotation.Repository;
+import kieker.webgui.beans.view.ClassAndMethodContainer;
+import kieker.webgui.common.exception.ProjectLoadException;
 
 /**
  * This tool class can be used to find all plugins and repositories within a given jar file - assuming that the given class loader knows these jars.
@@ -40,11 +37,8 @@ import kieker.analysis.repository.annotation.Repository;
  */
 public final class PluginFinder {
 
+	private final ClassAndMethodContainer classAndMethodContainer;
 	private final ClassLoader classLoader;
-	private final Class<? extends Annotation> repositoryAnnotationClass;
-	private final Class<?> abstractRepositoryClass;
-	private final Class<? extends Annotation> pluginAnnotationClass;
-	private final Class<?> abstractPluginClass;
 
 	/**
 	 * Creates a new instance of this class, using the given class loader.
@@ -52,16 +46,11 @@ public final class PluginFinder {
 	 * @param classLoader
 	 *            The {@link ClassLoader} which will be used to load the classes.
 	 * @throws ClassNotFoundException
+	 * @throws ProjectLoadException
 	 */
-	@SuppressWarnings("unchecked")
-	public PluginFinder(final ClassLoader classLoader) throws ClassNotFoundException {
+	public PluginFinder(final ClassLoader classLoader) throws ClassNotFoundException, ProjectLoadException {
 		this.classLoader = classLoader;
-
-		// Load the necessary classes and annotations for a correct comparison
-		this.repositoryAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Repository.class.getCanonicalName());
-		this.abstractRepositoryClass = classLoader.loadClass(AbstractRepository.class.getCanonicalName());
-		this.pluginAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Plugin.class.getCanonicalName());
-		this.abstractPluginClass = classLoader.loadClass(AbstractPlugin.class.getCanonicalName());
+		this.classAndMethodContainer = new ClassAndMethodContainer(classLoader);
 	}
 
 	/**
@@ -81,7 +70,8 @@ public final class PluginFinder {
 			result = new ArrayList<Class<?>>();
 			for (final Class<?> clazz : clazzes) {
 				// This is the cast resulting in an unchecked cast warning.
-				if (clazz.isAnnotationPresent(this.repositoryAnnotationClass) && this.abstractRepositoryClass.isAssignableFrom(clazz)) {
+				if (clazz.isAnnotationPresent(this.classAndMethodContainer.getRepositoryAnnotationClass())
+						&& this.classAndMethodContainer.getAbstractRepositoryClass().isAssignableFrom(clazz)) {
 					result.add(clazz);
 				}
 			}
@@ -108,7 +98,8 @@ public final class PluginFinder {
 			result = new ArrayList<Class<?>>();
 			for (final Class<?> clazz : clazzes) {
 				// This is the cast resulting in an unchecked cast warning.
-				if (clazz.isAnnotationPresent(this.pluginAnnotationClass) && this.abstractPluginClass.isAssignableFrom(clazz)) {
+				if (clazz.isAnnotationPresent(this.classAndMethodContainer.getPluginAnnotationClass())
+						&& this.classAndMethodContainer.getAbstractPluginClass().isAssignableFrom(clazz)) {
 					result.add(clazz);
 				}
 			}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/ProjectLoadException.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/ProjectLoadException.java
index fbcedbbf..3937564d 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/ProjectLoadException.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/ProjectLoadException.java
@@ -1,3 +1,22 @@
+/***************************************************************************
+ * Copyright 2012 by
+ *  + Christian-Albrechts-University of Kiel
+ *    + Department of Computer Science
+ *      + Software Engineering Group 
+ *  and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
 package kieker.webgui.common.exception;
 
 public class ProjectLoadException extends Exception {
diff --git a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml b/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml
index aa389139..bc81a429 100644
--- a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml
@@ -25,8 +25,6 @@
         <script language="javascript" type="text/javascript" src="../js/jit.js"></script>
         <script language="javascript" type="text/javascript" src="../js/flowEditor.js"></script>
 
-        <script type="text/javascript" src="https://getfirebug.com/firebug-lite.js"></script>
-        
         <script>            
             nodeClickListener = function(node, info, e) {
                 nodeClickCommand([{name : 'ID', value : node.id}]);
-- 
GitLab