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 1840faf7ac87b7d43fb2d0da6caf85bec0315910..2158483d2c854f6bcfb461b97c3f86efe157d328 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 435f60632ba1305ff3629351d7298cd2fd5e0369..3173feb2b28dab73690301ac8e10398b0e4ed5bb 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 bd61b5ccad0cb0dbff3dc2b7be65a6c01d608ec6..44295e53236513a2e0d58eda379f62ad98b18595 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 3fd1c061e0306a2da94720f10e9e9e0882bd369f..4f8458542a82969f0bd39038bc00bc6119cc8655 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 e248b5dabc2c154fcc396c09d019070ede1219ce..e11bee3c35289ae436d195abb6a76def3c0497ee 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 1f9cf3f2ab55692e5d8d7ddb63226566d2fd402c..7c262f19620ff7611ab6f7ac02e56a2f6eced928 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 fd015ad48aa8d06b0cec565118cb2136d83d8ad5..f7c4adf335d864bdd6caa1fa49f086bdbd0d0706 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 f88d4c87897efc14d2c60ee6de3cf4948c2ed16e..8817b7033b0eb04f29de4e5d1009addf0ef074f0 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 5e2eb636e76143d6c4db2ef89eadabd9d26747ca..4ed3136e53a74d229b53344a629ef366d885474f 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 b611ea37f96495043054b40702b98decd3efefa2..a49fe2c9a43f632dd9177b1f9eed44375aa93955 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 3b1be94fe245e7a0211a182e68a5c3b91c04dbae..5e1057064c5d9432206ebc0e5a958b4c4e8ea01b 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 c16d8981d779bd03703dbad9829202c137d045c4..929d2a673ee208d7f39979b32d275de12bf5632e 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 e811ce980a563b24cc46788c9e615f0c7a9d1f58..f63bbcca19185c381de6dad2c16407c5680248d4 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 240a44a28ed1718719d1fb980c823711d0a015be..ef439027d4450137edf6a0c4e02c593c719c50d5 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 e0b6a480f6a2ee314dcf7b6d8e693df5388a4302..b9b5cf317af77d0a87c6a56c6bc5f39954b0862c 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 {