diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableProjectsBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableProjectsBean.java index 3607d3693ad00670a26d6448988642e29d208e69..67116d109a3c81f2c5b294081fd6845cdf06ff74 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableProjectsBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableProjectsBean.java @@ -25,6 +25,7 @@ import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import javax.faces.context.FacesContext; +import kieker.analysis.model.analysisMetaModel.MIPlugin; import kieker.analysis.model.analysisMetaModel.MIProject; import kieker.analysis.model.analysisMetaModel.impl.MAnalysisMetaModelFactory; import kieker.webgui.beans.session.SelectedProjectBean; @@ -98,20 +99,23 @@ public class AvailableProjectsBean { final TreeNode projectNode = new DefaultTreeNode("project", project, root); final TreeNode dependenciesNode = new DefaultTreeNode("dependencies", "Dependencies", projectNode); final TreeNode usedPluginsNode = new DefaultTreeNode("usedPlugins", "Used Plugins", projectNode); + for (final MIPlugin plugin : project.getPlugins()) { + final TreeNode usedPluginNode = new DefaultTreeNode("usedPlugin", plugin.getClassname(), usedPluginsNode); + } } return root; } - - public synchronized void saveProject(final MIProject project) { - - } - - public synchronized void deleteProject(final MIProject project) { - - } - - public synchronized void resetProject(final MIProject project) { - - } + + public synchronized void saveProject(final MIProject project) { + + } + + public synchronized void deleteProject(final MIProject project) { + + } + + public synchronized void resetProject(final MIProject project) { + + } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/SelectedDependenciesBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/SelectedDependenciesBean.java index 812fdfd0363ae659d3937065591232d2cbee7a86..a285362e9d48e73f593ae4b3d81f59497cd069ce 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/SelectedDependenciesBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/SelectedDependenciesBean.java @@ -25,6 +25,12 @@ import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; +import javax.faces.context.FacesContext; + +import kieker.analysis.model.analysisMetaModel.MIDependency; +import kieker.analysis.model.analysisMetaModel.MIProject; +import kieker.webgui.beans.application.AvailableDependenciesBean; +import kieker.webgui.beans.session.SelectedProjectBean; import org.primefaces.model.DualListModel; @@ -32,19 +38,47 @@ import org.primefaces.model.DualListModel; @RequestScoped public class SelectedDependenciesBean { - private DualListModel<String> dependencies; + private DualListModel<MIDependency> dependencies; + private final MIProject project; + private final FacesContext context; /** * Creates a new instance of this class. */ public SelectedDependenciesBean() { - final List<String> source = new ArrayList<String>(); - final List<String> target = new ArrayList<String>(); + final List<MIDependency> source = new ArrayList<MIDependency>(); + final List<MIDependency> target = new ArrayList<MIDependency>(); + + this.dependencies = new DualListModel<MIDependency>(source, target); + + this.context = FacesContext.getCurrentInstance(); - source.add("Lib 1"); - source.add("Lib 2"); + final SelectedProjectBean selProjBean = this.context.getApplication().evaluateExpressionGet(this.context, "#{selectedProjectBean}", + SelectedProjectBean.class); + if (selProjBean != null) { + this.project = selProjBean.getSelectedProject(); + } else { + this.project = null; + } - this.dependencies = new DualListModel<String>(source, target); + /* Get all available libs. */ + + final AvailableDependenciesBean availDepBean = this.context.getApplication().evaluateExpressionGet(this.context, "#{availableDependenciesBean}", + AvailableDependenciesBean.class); + this.dependencies.getSource().clear(); + if (availDepBean != null) { + this.dependencies.getSource().addAll(availDepBean.getDependencies()); + } + this.dependencies.getTarget().clear(); + + /* Now move the already selected to the right side. */ + if (this.project != null) { + final List<MIDependency> projectLibs = this.project.getDependencies(); + for (final MIDependency lib : projectLibs) { + this.dependencies.getSource().remove(lib); + this.dependencies.getTarget().add(lib); + } + } } /** @@ -52,7 +86,7 @@ public class SelectedDependenciesBean { * * @return The dependencies dual model. */ - public DualListModel<String> getDependencies() { + public DualListModel<MIDependency> getDependencies() { return this.dependencies; } @@ -62,8 +96,15 @@ public class SelectedDependenciesBean { * @param dependencies * The new dependencies dual model. */ - public void setDependencies(final DualListModel<String> dependencies) { + public void setDependencies(final DualListModel<MIDependency> dependencies) { + System.out.println(dependencies); this.dependencies = dependencies; + + /* Remember the selected libs. */ + if (this.project != null) { + this.project.getDependencies().clear(); + this.project.getDependencies().addAll(dependencies.getTarget()); + } } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java index 5a98fdba23d930e76b79337167139ea8c19562c2..ad8d394bc136f881d9668fc6e897057bca1a4700 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java @@ -59,5 +59,5 @@ public class StringBean { public void setString(final String string) { this.string = string; } - + } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java index 00dea2e73dbcb6af1cd60699a01e093bc4873c66..657543c9c85c797616a326cef65eb002c8d4f1fe 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java @@ -202,7 +202,7 @@ public final class FileManager { * @return The new dependency iff the uploading was sucesfull, null * otherwise. */ - public MIDependency uploadDependency(final UploadedFile file) { + public synchronized MIDependency uploadDependency(final UploadedFile file) { final File depFile = new File(FileManager.LIB_DIR, file.getFileName()); InputStream in = null; @@ -251,7 +251,7 @@ public final class FileManager { * * @return The singleton instance of this class. */ - public static FileManager getInstance() { + public synchronized static FileManager getInstance() { return FileManager.INSTANCE; } @@ -260,7 +260,7 @@ public final class FileManager { * * @return A list containing all available dependencies. If there are no files, an empty list will be returned. */ - public List<MIDependency> loadAllDependencies() { + public synchronized List<MIDependency> loadAllDependencies() { final List<MIDependency> resultList = new ArrayList<MIDependency>(); /* * Try to get all files within the library directory. @@ -288,7 +288,7 @@ public final class FileManager { * The dependency to be removed. * @return true iff the dependency exists and the removal was succesful. */ - public boolean deleteDependency(final MIDependency dependency) { + public synchronized boolean deleteDependency(final MIDependency dependency) { final File file = new File(dependency.getFilePath()); if (file.isFile()) { return file.delete(); 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 2bc674e8b27d9b7ca30b49b10227cb82cccb12be..40774f64ded60e27420bbed6f0e52aa017e7742c 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java @@ -77,6 +77,7 @@ public final class PluginFinder { * If it is a class and has the annotation - put it into our * list. */ + // TODO It seems like the classloader knows two annotations with the same name... if (c.isAnnotationPresent(Plugin.class)) { result.add(c); } @@ -85,6 +86,7 @@ public final class PluginFinder { } return result; } catch (final IOException ex) { + ex.printStackTrace(); return null; } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..0a6d726db42ddd8918c44e0e915b37f63eeb01f8 --- /dev/null +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java @@ -0,0 +1,72 @@ +/*************************************************************************** + * 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.converter; + +import java.io.File; +import java.net.MalformedURLException; + +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.FacesConverter; + +import kieker.analysis.model.analysisMetaModel.MIDependency; +import kieker.webgui.common.PluginFinder; + +/** + * This converter can be used to convert an instance of <i>MIDependency</i> to + * the size (in MiBByte) of the dependency, but of course <b>not</b> vice versa. + * + * @author Nils Christian Ehmke + */ +@FacesConverter(value = MIDependencyToCountPluginsConverter.NAME) +public class MIDependencyToCountPluginsConverter implements Converter { + + public static final String NAME = "kieker.webgui.converter.MIDependencyToCountPluginsConverter"; + + /** + * Creates a new instance of this class. + */ + public MIDependencyToCountPluginsConverter() {} + + /** + * Delivers always null + */ + @Override + public Object getAsObject(final FacesContext fc, final UIComponent uic, final String string) { + return null; + } + + @Override + public String getAsString(final FacesContext fc, final UIComponent uic, final Object o) { + if (o == null || !(o instanceof MIDependency)) { + return ""; + } else { + try { + // TODO check why toURI().toURL() does not work instead of toURL() + return Integer.toString(PluginFinder.getAllPluginsWithinJar(new File(((MIDependency) o).getFilePath()).toURL()).size()); + } catch (final MalformedURLException ex) { + return ""; + } catch (final NullPointerException ex) { + return ""; + } + } + } +} diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java similarity index 89% rename from Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java rename to Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java index 56754181097e2a9f32f6cc40cef15f306f992fb8..107eeaef69ab32137e96a8a5ed261794d6e4d488 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java @@ -35,16 +35,16 @@ import kieker.analysis.model.analysisMetaModel.MIDependency; * * @author Nils Christian Ehmke */ -@FacesConverter(value = MIDependencyToIntConverter.NAME) -public class MIDependencyToIntConverter implements Converter { +@FacesConverter(value = MIDependencyToSizeConverter.NAME) +public class MIDependencyToSizeConverter implements Converter { - public static final String NAME = "kieker.webgui.converter.MIDependencyToIntConverter"; + public static final String NAME = "kieker.webgui.converter.MIDependencyToSizeConverter"; private static final double FACTOR = 1.0 / 1024 / 1024; /** * Creates a new instance of this class. */ - public MIDependencyToIntConverter() {} + public MIDependencyToSizeConverter() {} /** * Delivers always null @@ -57,10 +57,10 @@ public class MIDependencyToIntConverter implements Converter { @Override public String getAsString(final FacesContext fc, final UIComponent uic, final Object o) { if (o == null || !(o instanceof MIDependency)) { - return null; + return ""; } else { final long size = new File(((MIDependency) o).getFilePath()).length(); - return new DecimalFormat("#.##").format(size * MIDependencyToIntConverter.FACTOR).concat(" [MiByte]"); + return new DecimalFormat("#.##").format(size * MIDependencyToSizeConverter.FACTOR).concat(" [MiByte]"); } } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java index f4d4cf12110f7489aa1afd95fcae42564c053f99..6b210c3e7c7429d51fee3c281e6caab3dec14c95 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java @@ -84,7 +84,7 @@ public class MIDependencyToStringConverter implements Converter { * Make sure that the given object is well-defined. */ if (o == null || !(o instanceof MIDependency)) { - return null; + return ""; } else { return new File(((MIDependency) o).getFilePath()).getName(); } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java index 254dbaadd8b1482e76057b93e30658b6bc86ca18..6f62b36333b42d33d184c9f0fcff97d825cf91c9 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java @@ -82,7 +82,7 @@ public class MIProjectToStringConverter implements Converter { * Make sure that the given object is well-defined. */ if (o == null || !(o instanceof MIProject)) { - return null; + return ""; } else { return ((MIProject) o).getName(); } diff --git a/Kieker.WebGUI/src/main/webapp/main.xhtml b/Kieker.WebGUI/src/main/webapp/main.xhtml index 76e06c9ef09545d9055a771b9e7dcdb346638008..181095107d9e0844818631a2cebb3f9a296e18e0 100644 --- a/Kieker.WebGUI/src/main/webapp/main.xhtml +++ b/Kieker.WebGUI/src/main/webapp/main.xhtml @@ -72,14 +72,17 @@ <h:outputText value="#{node}" /> </p:treeNode> + <p:treeNode type="usedPlugin"> + <h:outputText value="#{node}" /> + </p:treeNode> </p:tree> <p:contextMenu for="projectsTree" nodeType="project"> - <p:menuitem value="Save Project" ajax="true" action="#{availableProjectsBean.saveProject(selectedProjectBean.getSelectedProject)}" update=":projectsForm" /> + <p:menuitem value="Save Project" ajax="true" action="#{availableProjectsBean.saveProject(selectedProjectBean.getSelectedProject())}" update=":projectsForm" /> <p:menuitem value="Set as Main Project" ajax="true" action="#{selectedProjectBean.setMainProject(selectedProjectBean.getSelectedProject())}" update=":projectsForm" /> <p:separator /> - <p:menuitem value="Delete Project" ajax="true" action="#{availableProjectsBean.deleteProject(selectedProjectBean.getSelectedProject)}" update=":projectsForm" /> - <p:menuitem value="Reset Project" ajax="true" action="#{availableProjectsBean.resetProject(selectedProjectBean.getSelectedProject)}" update=":projectsForm" /> + <p:menuitem value="Delete Project" ajax="true" action="#{availableProjectsBean.deleteProject(selectedProjectBean.getSelectedProject())}" update=":projectsForm" /> + <p:menuitem value="Reset Project" ajax="true" action="#{availableProjectsBean.resetProject(selectedProjectBean.getSelectedProject())}" update=":projectsForm" /> <p:separator /> <p:menuitem value="Configure Dependencies" ajax="false" url="/Kieker.WebGUI/projectDependencies" /> </p:contextMenu> diff --git a/Kieker.WebGUI/src/main/webapp/manageDependencies.xhtml b/Kieker.WebGUI/src/main/webapp/manageDependencies.xhtml index 7e389e972b120cba58ecf8d825a48a6548a11561..44a75feeb2e6e521f96870c27c1a366ea35c5fad 100644 --- a/Kieker.WebGUI/src/main/webapp/manageDependencies.xhtml +++ b/Kieker.WebGUI/src/main/webapp/manageDependencies.xhtml @@ -45,17 +45,28 @@ </f:facet> <div align="center"> <h:outputText value="#{dependency}" > - <f:converter converterId="kieker.webgui.converter.MIDependencyToIntConverter" /> + <f:converter converterId="kieker.webgui.converter.MIDependencyToSizeConverter" /> </h:outputText> </div> </p:column> - <p:column style="width:40px"> - <f:facet name="header"> + <p:column> + <f:facet name="header"> + # Plugins + </f:facet> + <div align="center"> + <h:outputText value="#{dependency}" > + <f:converter converterId="kieker.webgui.converter.MIDependencyToCountPluginsConverter" /> + </h:outputText> + </div> + </p:column> + + <p:column style="width:40px"> + <f:facet name="header"> </f:facet> <div align="center"> <p:commandButton ajax="true" update="currentDependenciesForm" icon="ui-icon-trash" title="Delete" - action="#{availableDependenciesBean.deleteDependency(dependency)}"/> + action="#{availableDependenciesBean.deleteDependency(dependency)}"/> </div> </p:column> </p:dataTable> diff --git a/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml b/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml index 6df8485c91d668d9956a6f1316ebdf516387345e..b8bea451a3f01ca32c8a52f60bf56fc24ed0d22a 100644 --- a/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml +++ b/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml @@ -27,9 +27,10 @@ <p:layoutUnit header="Currently used Dependencies" position="center" > <div align="center"> <p:pickList id="pickList" value="#{selectedDependenciesBean.dependencies}" var="dependency" - itemLabel="#{dependency}" itemValue="#{dependency}" > + itemLabel="#{dependency.getFilePath()}" itemValue="#{dependency}" + converter="kieker.webgui.converter.MIDependencyToStringConverter" > <f:facet name="sourceCaption">Available</f:facet> - <f:facet name="targetCaption">Project</f:facet> + <f:facet name="targetCaption">Project</f:facet> </p:pickList> </div> </p:layoutUnit>