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 decd02f1e946fd4f752ceea4a0b957cf0d390701..5f211f539983f2772ba473b2750b6e08d0625d7a 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 @@ -326,21 +326,34 @@ public final class CurrentAnalysisEditorBean { @SuppressWarnings("unchecked") private void addContentsToToolPalette(final List<Class<AbstractPlugin>> plugins, final List<Class<AbstractRepository>> repositories) { synchronized (this) { - // Now run through the available classes and add all non-abstract classes to our lists + // Now run through the available classes and add all non-abstract classes to our lists. for (final Class<AbstractRepository> repository : repositories) { if (!Modifier.isAbstract(repository.getModifiers())) { - this.availableRepositories.add(repository); + // Make also sure that the current repository is not "programmaticOnly" + final Annotation annotationRepository = repository.getAnnotation(this.classAndMethodContainer.getRepositoryAnnotationClass()); + final boolean programmaticOnly = (Boolean) ClassAndMethodContainer.invokeMethod( + this.classAndMethodContainer.getRepositoryProgrammaticOnlyMethod(), + annotationRepository, false); + if (!programmaticOnly) { + this.availableRepositories.add(repository); + } } } 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.getAbstractFilterPluginClass().isAssignableFrom(plugin)) { - this.availableFilters.add((Class<AbstractFilterPlugin>) plugin); - } else { - if (this.classAndMethodContainer.getAbstractReaderPluginClass().isAssignableFrom(plugin)) { - this.availableReaders.add((Class<AbstractReaderPlugin>) plugin); + // Make also sure that the current plugin is not "programmaticOnly" + final Annotation annotationPlugin = plugin.getAnnotation(this.classAndMethodContainer.getPluginAnnotationClass()); + final boolean programmaticOnly = (Boolean) ClassAndMethodContainer.invokeMethod(this.classAndMethodContainer.getPluginProgrammaticOnlyMethod(), + annotationPlugin, false); + if (!programmaticOnly) { + // The following cast results in the unchecked-cast-warnings, but we know that the cast should be correct. + if (this.classAndMethodContainer.getAbstractFilterPluginClass().isAssignableFrom(plugin)) { + this.availableFilters.add((Class<AbstractFilterPlugin>) plugin); + } else { + if (this.classAndMethodContainer.getAbstractReaderPluginClass().isAssignableFrom(plugin)) { + this.availableReaders.add((Class<AbstractReaderPlugin>) plugin); + } } } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassAndMethodContainer.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassAndMethodContainer.java index cf785bfcead05e14e617ca4bb5ad132c7d5d5804..2097e237742f9eab1eb5650664430b5d041b060b 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassAndMethodContainer.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassAndMethodContainer.java @@ -222,6 +222,8 @@ public final class ClassAndMethodContainer { private final Method displayDescriptionMethod; private final Method pluginDependenciesMethod; private final Method repositoryDependenciesMethod; + private final Method pluginProgrammaticOnlyMethod; + private final Method repositoryProgrammaticOnlyMethod; /** * This is the constructor for {@link AnalysisControllerThread}, which gets an instance of {@link AnalysisController}. */ @@ -280,6 +282,8 @@ public final class ClassAndMethodContainer { this.displayDescriptionMethod = this.displayAnnotationClass.getMethod("description", new Class<?>[0]); this.pluginDependenciesMethod = this.pluginAnnotationClass.getMethod("dependencies", new Class<?>[0]); this.repositoryDependenciesMethod = this.repositoryAnnotationClass.getMethod("dependencies", new Class<?>[0]); + this.pluginProgrammaticOnlyMethod = this.pluginAnnotationClass.getMethod("programmaticOnly", new Class<?>[0]); + this.repositoryProgrammaticOnlyMethod = this.repositoryAnnotationClass.getMethod("programmaticOnly", new Class<?>[0]); // This is a special case as we need to load some additional classes to search for the correct method final Class<?> miProjectClass = classLoader.loadClass(MIProject.class.getName()); this.analysisControllerLoadFromFile = this.analysisControllerClass.getMethod("loadFromFile", File.class); @@ -699,6 +703,14 @@ public final class ClassAndMethodContainer { return this.repositoryDependenciesMethod; } + public Method getPluginProgrammaticOnlyMethod() { + return this.pluginProgrammaticOnlyMethod; + } + + public Method getRepositoryProgrammaticOnlyMethod() { + return this.repositoryProgrammaticOnlyMethod; + } + /** * This method can be used to invoke a given method with given parameters, without having to mind about the exceptions. If an exception occurs, the given default * value will be returned.