From 9e95b83f9522b6733dd104e5d13bafc358edfad0 Mon Sep 17 00:00:00 2001 From: nie <nie@informatik.uni-kiel.de> Date: Thu, 9 Feb 2012 11:56:26 +0100 Subject: [PATCH] Some minor bugfixing; Changed some code for quality reasons. --- .../AvailableDependenciesBean.java | 12 +++++- .../application/AvailableProjectsBean.java | 8 +++- .../beans/application/ThemeSwitcherBean.java | 1 + .../beans/application/package-info.java | 1 + .../request/SelectedDependenciesBean.java | 1 + .../webgui/beans/request/StringBean.java | 1 + .../beans/session/CurrentThemeBean.java | 1 + .../session/DependencyUploadController.java | 1 + .../beans/session/SelectedProjectBean.java | 1 + .../kieker/webgui/common/FileManager.java | 42 ++++++++++++++++--- .../kieker/webgui/common/PluginFinder.java | 9 ++-- .../MIDependencyToCountPluginsConverter.java | 39 ++++++++++++++--- .../MIDependencyToSizeConverter.java | 1 + .../MIDependencyToStringConverter.java | 1 + .../converter/MIProjectToStringConverter.java | 1 + 15 files changed, 101 insertions(+), 19 deletions(-) diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableDependenciesBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableDependenciesBean.java index 1840faf7..2158483d 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableDependenciesBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/AvailableDependenciesBean.java @@ -30,10 +30,18 @@ import kieker.webgui.common.FileManager; import org.primefaces.model.UploadedFile; +/** + * + * @author Nils Christian Ehmke + * @version 1.0 + */ @ManagedBean @ApplicationScoped public class AvailableDependenciesBean { + /** + * The list containing the depenencies. + */ private final List<MIDependency> dependencies; /** @@ -58,7 +66,7 @@ public class AvailableDependenciesBean { * @param file * The file to be uploaded. */ - public void uploadDependency(final UploadedFile file) { + public synchronized void uploadDependency(final UploadedFile file) { final MIDependency dependency = FileManager.getInstance().uploadDependency(file); if (dependency != null) { /* @@ -80,7 +88,7 @@ public class AvailableDependenciesBean { * @param dependency * The dependency to be removed. */ - public void deleteDependency(final MIDependency dependency) { + public synchronized void deleteDependency(final MIDependency dependency) { final boolean result = FileManager.getInstance().deleteDependency(dependency); if (result) { this.dependencies.remove(dependency); 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 435f6063..3173feb2 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 @@ -38,6 +38,7 @@ import org.primefaces.model.TreeNode; * This bean can be used to handle all available projects within the program. * * @author Nils Christian Ehmke + * @version 1.0 */ @ManagedBean @ApplicationScoped @@ -121,7 +122,7 @@ public class AvailableProjectsBean { * The project to be saved. */ public synchronized void saveProject(final MIProject project) { - // TODO Fill method + FileManager.getInstance().saveProject(project); } /** @@ -131,7 +132,10 @@ public class AvailableProjectsBean { * The project to be removed. */ public synchronized void deleteProject(final MIProject project) { - // TODO Fill method + final boolean result = FileManager.getInstance().deleteProject(project); + if (result) { + this.projects.remove(project); + } } /** diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java index bd61b5cc..44295e53 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java @@ -33,6 +33,7 @@ import javax.faces.bean.ManagedBean; * import new themes during runtime. * * @author Nils Christian Ehmke + * @version 1.0 */ @ManagedBean @ApplicationScoped diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java index 3fd1c061..4f845854 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java @@ -22,3 +22,4 @@ * This package contains all beans with application scope. */ package kieker.webgui.beans.application; + 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 e248b5da..e11bee3c 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 @@ -38,6 +38,7 @@ import org.primefaces.model.DualListModel; * This bean contains the currently choosen dependencies. * * @author Nils Christian Ehmke + * @version 1.0 */ @ManagedBean @RequestScoped 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 1f9cf3f2..7c262f19 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 @@ -27,6 +27,7 @@ import javax.faces.bean.RequestScoped; * This simple bean can be used to store a string. It can be used for a single request. * * @author Nils Christian Ehmke + * @version 1.0 */ @ManagedBean @RequestScoped diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentThemeBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentThemeBean.java index fd015ad4..f7c4adf3 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentThemeBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentThemeBean.java @@ -37,6 +37,7 @@ import kieker.webgui.beans.application.ThemeSwitcherBean; * @author Nils Christian Ehmke * * @see ThemeSwitcherBean + * @version 1.0 */ @ManagedBean @SessionScoped diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/DependencyUploadController.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/DependencyUploadController.java index f88d4c87..8817b703 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/DependencyUploadController.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/DependencyUploadController.java @@ -31,6 +31,7 @@ import org.primefaces.model.UploadedFile; /** * * @author Nils Christian Ehmke + * @version 1.0 */ @ManagedBean @SessionScoped diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/SelectedProjectBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/SelectedProjectBean.java index 5e2eb636..4ed3136e 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/SelectedProjectBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/SelectedProjectBean.java @@ -33,6 +33,7 @@ import org.primefaces.model.TreeNode; * main project for the user within a session. * * @author Nils Christian Ehmke + * @version 1.0 */ @ManagedBean @SessionScoped 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 b611ea37..a49fe2c9 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java @@ -19,11 +19,11 @@ ***************************************************************************/ package kieker.webgui.common; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -46,6 +46,7 @@ import org.primefaces.model.UploadedFile; * implemented in the future. * * @author Nils Christian Ehmke + * @version 1.0 */ public final class FileManager { @@ -232,14 +233,14 @@ public final class FileManager { public final synchronized MIDependency uploadDependency(final UploadedFile file) { final File depFile = new File(FileManager.LIB_DIR, file.getFileName()); - InputStream in = null; - OutputStream out = null; + BufferedInputStream in = null; + BufferedOutputStream out = null; try { /* * Get the streams. */ - in = file.getInputstream(); - out = new FileOutputStream(depFile); + in = new BufferedInputStream(file.getInputstream()); + out = new BufferedOutputStream(new FileOutputStream(depFile)); final byte[] buf = new byte[FileManager.BUF_SIZE]; int count; @@ -261,6 +262,10 @@ public final class FileManager { if (in != null) { in.close(); } + } catch (final IOException ex) { + FileManager.LOG.warn("Error while uploading dependency '" + file.getFileName() + "'."); + } + try { if (out != null) { out.close(); } @@ -320,4 +325,29 @@ public final class FileManager { } return false; } + + /** + * This method tries to delete a project, by removing the directory of + * the project and its contents. If something went wrong, the integrity + * of the folder structure is not guaruanteed. + * + * @param project + * The project to be removed. + * @return true iff the project has been removed sucessfully. + */ + public final synchronized boolean deleteProject(final MIProject project) { + final String projectName = project.getName(); + + final File dirProject = new File(FileManager.PROJECT_DIR + File.separator + projectName); + if (dirProject.isDirectory()) { + final File[] files = dirProject.listFiles(); + for (File file : files) { + if (!file.delete()) { + return false; + } + } + return dirProject.delete(); + } + return false; + } } 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 3b1be94f..5e105706 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java @@ -19,6 +19,7 @@ ***************************************************************************/ package kieker.webgui.common; +import edu.umd.cs.findbugs.ba.AnalysisContext; import java.io.File; import java.io.IOException; import java.net.URL; @@ -28,6 +29,7 @@ import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import kieker.analysis.AnalysisController; import kieker.analysis.plugin.port.Plugin; import kieker.common.logging.Log; @@ -35,6 +37,7 @@ import kieker.common.logging.LogFactory; /** * @author Nils Christian Ehmke + * @version 1.0 */ public final class PluginFinder { @@ -63,7 +66,7 @@ public final class PluginFinder { * Get a classloader and make sure that it has the system class * loader as parent and that it knows the url. */ - final ClassLoader classLoader = new URLClassLoader(new URL[] { url }, ClassLoader.getSystemClassLoader()); + final ClassLoader classLoader = new URLClassLoader(new URL[] { url }, AnalysisController.class.getClassLoader()); /* * Open the jar file and run through all entries within this file. */ @@ -84,14 +87,14 @@ 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); } } catch (final Throwable ex) { - PluginFinder.LOG.error("Error while scanning jar-file '" + url.getFile() + "'."); + /* Ignore error. */ } } + jarFile.close(); return result; } catch (final IOException ex) { ex.printStackTrace(); diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java index c16d8981..929d2a67 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToCountPluginsConverter.java @@ -21,6 +21,9 @@ package kieker.webgui.converter; import java.io.File; import java.net.MalformedURLException; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; @@ -32,9 +35,12 @@ 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. + * the number of plugins within the dependency, but of course <b>not</b> vice + * versa. The number is cached to avoid that the converter holds the file + * permanently. * * @author Nils Christian Ehmke + * @version 1.0 */ @FacesConverter(value = MIDependencyToCountPluginsConverter.NAME) public class MIDependencyToCountPluginsConverter implements Converter { @@ -44,11 +50,22 @@ public class MIDependencyToCountPluginsConverter implements Converter { */ public static final String NAME = "kieker.webgui.converter.MIDependencyToCountPluginsConverter"; + /** + * The maximal number of dependencies stored within the cache. + */ + private static final int MAX_CACHE_SIZE = 20; + + /** + * This map is the cache and contains the number of plugins within the + * dependencies. + */ + private final Map<MIDependency, String> cache; + /** * Creates a new instance of this class. */ public MIDependencyToCountPluginsConverter() { - /* No code necessary. */ + this.cache = new HashMap<MIDependency, String>(); } /** @@ -87,14 +104,24 @@ public class MIDependencyToCountPluginsConverter implements Converter { if (!(o instanceof MIDependency)) { return ""; } else { + /* Try to find the library within the cache. */ + if (this.cache.containsKey((MIDependency) o)) { + return this.cache.get((MIDependency) o); + } + /* If the cache is too big, remove one of the objects. */ + if (this.cache.size() > MIDependencyToCountPluginsConverter.MAX_CACHE_SIZE) { + this.cache.remove(this.cache.keySet().iterator().next()); + } + String result; try { - // TODO check why toURI().toURL() does not work instead of toURL() - return Integer.toString(PluginFinder.getAllPluginsWithinJar(new File(((MIDependency) o).getFilePath()).toURL()).size()); + result = Integer.toString(PluginFinder.getAllPluginsWithinJar(new File(((MIDependency) o).getFilePath()).toURL()).size()); } catch (final MalformedURLException ex) { - return ""; + result = ""; } catch (final NullPointerException ex) { - return ""; + result = ""; } + this.cache.put((MIDependency) o, result); + return result; } } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java index e811ce98..f63bbcca 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToSizeConverter.java @@ -34,6 +34,7 @@ import kieker.analysis.model.analysisMetaModel.MIDependency; * the size (in MiBByte) of the dependency, but of course <b>not</b> vice versa. * * @author Nils Christian Ehmke + * @version 1.0 */ @FacesConverter(value = MIDependencyToSizeConverter.NAME) public class MIDependencyToSizeConverter implements Converter { 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 240a44a2..ef439027 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java @@ -33,6 +33,7 @@ import kieker.analysis.model.analysisMetaModel.MIDependency; * human readable string, but <b>not</b> vice versa. * * @author Nils Christian Ehmke + * @version 1.0 */ @FacesConverter(value = MIDependencyToStringConverter.NAME) public class MIDependencyToStringConverter implements Converter { 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 e0b6a480..b9b5cf31 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java @@ -31,6 +31,7 @@ import kieker.analysis.model.analysisMetaModel.MIProject; * human readable string, but <b>not</b> vice versa. * * @author Nils Christian Ehmke + * @version 1.0 */ @FacesConverter(value = MIProjectToStringConverter.NAME) public class MIProjectToStringConverter implements Converter { -- GitLab