From 15fb594307ad67e62fbcc524ac2e663745f10407 Mon Sep 17 00:00:00 2001 From: Nils Christian Ehmke <nie@informatik.uni-kiel.de> Date: Sat, 19 May 2012 21:54:33 +0200 Subject: [PATCH] Updated the kieker-jar; Added the possibility to save an existing project and to add components; Added also a new and short README. --- Kieker.WebGUI/README | 1 + Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar | Bin 2029058 -> 2029129 bytes .../session/CurrentWorkSpaceProjectBean.java | 197 +++++++++++++++++- .../java/kieker/webgui/common/FSManager.java | 71 +++++-- .../exception/NewerProjectException.java | 50 +++++ .../src/main/webapp/ProjectWorkSpace.xhtml | 8 +- .../src/main/webapp/css/ProjectWorkSpace.css | 5 + .../dialogs/manageLibrariesDialog.xhtml | 2 +- 8 files changed, 314 insertions(+), 20 deletions(-) create mode 100644 Kieker.WebGUI/README create mode 100644 Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/NewerProjectException.java diff --git a/Kieker.WebGUI/README b/Kieker.WebGUI/README new file mode 100644 index 00000000..234eaefc --- /dev/null +++ b/Kieker.WebGUI/README @@ -0,0 +1 @@ +In order to start the WebGUI use either "mvn jetty:run" or "mvn package" in combination with the corresponding script in the bin-directory. The GUI is available under "http://localhost:8080/Kieker.WebGUI/" after it has been started. \ No newline at end of file diff --git a/Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar b/Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar index e1c53890f254d4bbc0f6c83f5811bbba6960533e..f3a97619cb3f4660770e5aa0466e3ef3cb8ebe40 100644 GIT binary patch delta 44181 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 Od#R$i^*`PiH2x3Gvb<CP delta 43499 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 diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentWorkSpaceProjectBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentWorkSpaceProjectBean.java index 360accae..618cdab9 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentWorkSpaceProjectBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentWorkSpaceProjectBean.java @@ -25,7 +25,9 @@ import java.lang.reflect.Modifier; import java.net.MalformedURLException; 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; @@ -35,7 +37,14 @@ import javax.faces.context.FacesContext; import kieker.analysis.model.analysisMetaModel.MIAnalysisMetaModelFactory; import kieker.analysis.model.analysisMetaModel.MIDependency; +import kieker.analysis.model.analysisMetaModel.MIFilter; +import kieker.analysis.model.analysisMetaModel.MIInputPort; +import kieker.analysis.model.analysisMetaModel.MIOutputPort; +import kieker.analysis.model.analysisMetaModel.MIPlugin; import kieker.analysis.model.analysisMetaModel.MIProject; +import kieker.analysis.model.analysisMetaModel.MIProperty; +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.Plugin; @@ -43,10 +52,12 @@ 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.webgui.common.FSManager; import kieker.webgui.common.Pair; import kieker.webgui.common.PluginFinder; import kieker.webgui.common.exception.LibraryAlreadyExistingException; +import kieker.webgui.common.exception.NewerProjectException; import org.primefaces.event.FileUploadEvent; import org.primefaces.model.UploadedFile; @@ -204,6 +215,9 @@ public final class CurrentWorkSpaceProjectBean { */ private void addLibrariesToModel() { final List<MIDependency> libs = FSManager.getInstance().getModelLibraries(this.projectName); + // Add them, but remove all existing dependencies so far to avoid double entries. This also makes sure that the model - after it has been opened - points + // just to valid dependencies (and to all of them). + this.project.getDependencies().clear(); this.project.getDependencies().addAll(libs); } @@ -248,6 +262,7 @@ public final class CurrentWorkSpaceProjectBean { public String clearProject() { this.project = null; this.projectName = null; + this.classLoader = null; this.timeStamp = 0; return CurrentWorkSpaceProjectBean.PAGE_PROJECT_OVERVIEW; @@ -295,8 +310,9 @@ public final class CurrentWorkSpaceProjectBean { CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_INFO, "Libary uploaded."); // As it seem to have worked, we can add the library to our model. this.project.getDependencies().add(lib); - // Update our class loader + // Update our class loader and the available plugins & repositories this.reloadClassLoader(); + this.addToToolPalette(lib); } catch (final LibraryAlreadyExistingException ex) { CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_WARN, "A library with the same name exists already."); } catch (final IOException ex) { @@ -341,6 +357,185 @@ public final class CurrentWorkSpaceProjectBean { return this.availableRepositories; } + /** + * This method tries to save the current project and informs the user about success or fail. + * + * @param overwriteNewerProject + * This flag determines whether a newer project should be overwritten. + */ + public void saveProject(final boolean overwriteNewerProject) { + try { + FSManager.getInstance().saveProject(this.projectName, this.project, this.timeStamp, overwriteNewerProject); + CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_INFO, "Project saved."); + // Update the time stamp! + this.resetTimeStamp(); + } catch (final IOException ex) { + CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while saving the projct."); + } catch (final NewerProjectException ex) { + CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_WARN, "The project has been modified externally in the meanwhile."); + } + } + + /** + * This method fills the ports of the given plugin. In other words: It tries to instantiate the given class and to extract the ports. If the instantiation fails + * (for various reasons), the method informs the user and executes normally - without an exception. + * + * @param clazz + * The class to be used as a base. + * @param plugin + * The plugin to be filled. + */ + private void fillPorts(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 port and use them to initialize the model plugin. + final String[] inputPortNames = pluginInstance.getAllInputPortNames(); + final String[] outputPortNames = pluginInstance.getAllOutputPortNames(); + final String[] repositoryPortNames = pluginInstance.getAllRepositoryPortNames(); + + // Add input ports + if (plugin instanceof MIFilter) { + for (final String inputPortName : inputPortNames) { + final MIInputPort mInputPort = this.factory.createInputPort(); + mInputPort.setName(inputPortName); + mInputPort.setParent((MIFilter) plugin); + } + } + + // Add output ports. + for (final String outputPortName : outputPortNames) { + final MIOutputPort mOutputPort = this.factory.createOutputPort(); + mOutputPort.setName(outputPortName); + mOutputPort.setParent(plugin); + } + + // Add repository ports. + for (final String repositoryPortName : repositoryPortNames) { + final MIRepositoryConnector mConnector = this.factory.createRepositoryConnector(); + mConnector.setName(repositoryPortName); + plugin.getRepositories().add(mConnector); + } + + } catch (final Exception ex) { + // Inform the user about the fail! + CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the ports of the plugin."); + } + } + + /** + * This method fills the properties of the given repository. In other words: It tries to instantiate the given class and to extract the configuration keys. If + * the instantiation fails (for various reasons), the method informs the user and executes normally - without an exception. + * + * @param clazz + * The class to be used as a base. + * @param repository + * The repository to be filled. + */ + private void 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(); + + repository.getProperties().addAll(this.extractProperties(configuration)); + } catch (final Exception ex) { + // Inform the user about the fail! + CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the repository."); + } + } + + /** + * This method fills the properties of the given plugin. In other words: It tries to instantiate the given class and to extract the configuration keys. If + * the instantiation fails (for various reasons), the method informs the user and executes normally - without an exception. + * + * @param clazz + * The class to be used as a base. + * @param plugin + * The plugin to be filled. + */ + private void 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(); + + plugin.getProperties().addAll(this.extractProperties(configuration)); + } catch (final Exception ex) { + // Inform the user about the fail! + CurrentWorkSpaceProjectBean.showMessage(FacesMessage.SEVERITY_ERROR, "An errcor occured while loading the properties of the plugin."); + } + } + + /** + * 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. + * + * @param clazz + * The class of the repository to be added. + */ + public void addRepository(final Class<AbstractRepository> clazz) { + // Create a new instance for the model + final MIRepository repository = this.factory.createRepository(); + repository.setClassname(clazz.getName()); + repository.setName(clazz.getSimpleName()); + + this.fillProperties(clazz, repository); + // Add it to the project + this.project.getRepositories().add(repository); + } + + /** + * This method adds a new plugin to the current model, using the given instance of {@code Class} for it. + * + * @param clazz + * The class of the plugin to be added. This can be both, a filter or a reader. + */ + public void addPlugin(final Class<AbstractPlugin> clazz) { + // Create a new instance for the model + final MIPlugin plugin; + if (AbstractReaderPlugin.class.isAssignableFrom(clazz)) { + plugin = this.factory.createReader(); + } else { + plugin = this.factory.createFilter(); + } + plugin.setClassname(clazz.getName()); + plugin.setName(clazz.getSimpleName()); + + this.fillProperties(clazz, plugin); + this.fillPorts(clazz, plugin); + // Add it to the project + this.project.getPlugins().add(plugin); + } + /** * This method shows the current user a message by using the growl-component of PrimeFaces. * diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/FSManager.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/FSManager.java index 47c3f517..02d116a7 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/FSManager.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/FSManager.java @@ -46,6 +46,7 @@ import kieker.analysis.model.analysisMetaModel.impl.MAnalysisMetaModelFactory; import kieker.common.logging.Log; import kieker.common.logging.LogFactory; import kieker.webgui.common.exception.LibraryAlreadyExistingException; +import kieker.webgui.common.exception.NewerProjectException; import kieker.webgui.common.exception.ProjectAlreadyExistingException; import org.primefaces.model.UploadedFile; @@ -199,6 +200,42 @@ public final class FSManager { } } + /** + * This method tries to save the given project. + * + * @param projectName + * The name of the project to be saved. + * @param project + * The project to be saved. + * @param timeStamp + * The time stamp, the given project has been opened (necessary to check for a newer version). + * @param overwriteNewerProject + * This flag determines whether a newer project should be overwritten. + * @throws IOException + * If something went wrong during saving the project. + * @throws NewerProjectException + * This exception is raised if the time stamp of the project on the file system is newer than the given one <b>and</b> if the flag + * {@code overwriteNewerProject} is false. If it is true, a newer version will be overwritten. + */ + public void saveProject(final String projectName, final MIProject project, final long timeStamp, final boolean overwriteNewerProject) throws IOException, + NewerProjectException { + // Get the lock + final Object lock = this.getLock(projectName); + synchronized (lock) { + // Check for a newer version first + final long currTimeStamp = this.getCurrTimeStamp(projectName); + if (!overwriteNewerProject && (currTimeStamp > timeStamp)) { + throw new NewerProjectException("The project with the name '" + projectName + "' has a newer version on the FS."); + } + + // Everything seems to be okay (or we should overwrite the current file). Try to save it. Assemble the path to the KAX-file for this purpose. + final File kaxFile = new File(FSManager.ROOT_DIRECTORY + File.separator + projectName + File.separator + projectName + "." + FSManager.KAX_EXTENSION); + + // Try to save it. + AnalysisController.saveToFile(kaxFile, project); + } + } + /** * Returns a list containing all available projects on the FS as a string. * @@ -317,7 +354,7 @@ public final class FSManager { /** * This method delivers all available libraries for the given project as a pair of strings. The first element is the name of the library, the second one the size - * of the lib in MiBytes and as a human readable string. + * of the lib in MiBytes and as a human readable string. If the given name is null, an empty list will be returned. * * @param projectName * The name of the project. @@ -325,21 +362,23 @@ public final class FSManager { */ public List<Pair<String, String>> getLibraries(final String projectName) { final List<Pair<String, String>> result = new ArrayList<Pair<String, String>>(); - // Get the lock for the project - final Object lock = this.getLock(projectName); - - synchronized (lock) { - // Run through the libs and put them into our list. - final File libDir = new File(FSManager.ROOT_DIRECTORY + File.separator + projectName + File.separator + FSManager.LIB_DIRECTORY); - final File files[] = libDir.listFiles(); - if (files != null) { - for (final File file : files) { - if (file.getName().endsWith("." + FSManager.LIB_EXTENSION)) { - final float len = file.length() / 1024.0f / 1024.0f; - final NumberFormat numberFormat = new DecimalFormat("0.00"); - numberFormat.setRoundingMode(RoundingMode.DOWN); - final String lenStr = numberFormat.format(len); - result.add(new Pair<String, String>(file.getName(), lenStr)); + if (projectName != null) { + // Get the lock for the project + final Object lock = this.getLock(projectName); + + synchronized (lock) { + // Run through the libs and put them into our list. + final File libDir = new File(FSManager.ROOT_DIRECTORY + File.separator + projectName + File.separator + FSManager.LIB_DIRECTORY); + final File files[] = libDir.listFiles(); + if (files != null) { + for (final File file : files) { + if (file.getName().endsWith("." + FSManager.LIB_EXTENSION)) { + final float len = file.length() / 1024.0f / 1024.0f; + final NumberFormat numberFormat = new DecimalFormat("0.00"); + numberFormat.setRoundingMode(RoundingMode.DOWN); + final String lenStr = numberFormat.format(len); + result.add(new Pair<String, String>(file.getName(), lenStr)); + } } } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/NewerProjectException.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/NewerProjectException.java new file mode 100644 index 00000000..552be8bd --- /dev/null +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/exception/NewerProjectException.java @@ -0,0 +1,50 @@ +/*************************************************************************** + * 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; + +/** + * This exception shows that an attempt of saving a project has failed, because a newer version is available. In other words: The project has been modified in the + * meanwhile. + * + * @author Nils Christian Ehmke + * @version 1.0 + */ +public class NewerProjectException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + * Creates a new instance of this class. + */ + public NewerProjectException() { + // No code necessary + } + + /** + * Creates a new instance of this class using the given parameters. + * + * @param msg + * The message used for the exception. + */ + public NewerProjectException(final String msg) { + super(msg); + } +} diff --git a/Kieker.WebGUI/src/main/webapp/ProjectWorkSpace.xhtml b/Kieker.WebGUI/src/main/webapp/ProjectWorkSpace.xhtml index 8840130f..a04156a8 100644 --- a/Kieker.WebGUI/src/main/webapp/ProjectWorkSpace.xhtml +++ b/Kieker.WebGUI/src/main/webapp/ProjectWorkSpace.xhtml @@ -22,7 +22,10 @@ <h:form> <p:menubar> <p:submenu label="File"> - <p:menuitem value="Save Project" ajax="true" disabled="#{empty currentWorkSpaceProjectBean.project}"/> + <p:menuitem value="Save Project" update=":messages" ajax="true" action="#{currentWorkSpaceProjectBean.saveProject(false)}" disabled="#{empty currentWorkSpaceProjectBean.project}"/> + <p:menuitem value="Save Project As" update=":messages" ajax="true" disabled="#{empty currentWorkSpaceProjectBean.project}"/> + <p:menuitem styleClass="Force-Save-Project-Button" value="Force Save Project" update=":messages" ajax="true" action="#{currentWorkSpaceProjectBean.saveProject(true)}" disabled="#{empty currentWorkSpaceProjectBean.project}"/> + <p:separator/> <p:menuitem value="Reset Project" ajax="true" disabled="#{empty currentWorkSpaceProjectBean.project}"/> <p:separator/> <p:menuitem value="Manage Libraries" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentWorkSpaceProjectBean.project}"/> @@ -75,7 +78,8 @@ </p:tab> <p:tab title="Repositories"> <ui:repeat value="#{currentWorkSpaceProjectBean.availableRepositories}" var="repository"> - <p:commandLink value="#{repository.simpleName}" update=":centerForm"/><br/> + <p:commandLink id="repositoryLink" value="#{repository.simpleName}" action="#{currentWorkSpaceProjectBean.addRepository(repository)}" update=":centerForm"/><br/> + <p:tooltip style="font-size: 15px" for="repositoryLink" value="#{currentWorkSpaceProjectBean.getDescription(repository)}"/> </ui:repeat> </p:tab> </p:accordionPanel> diff --git a/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css b/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css index e69de29b..dcb71129 100644 --- a/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css +++ b/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css @@ -0,0 +1,5 @@ +@charset "UTF-8"; + +.Force-Save-Project-Button { + white-space: nowrap +} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml index 9e4df244..a0cd9fcc 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml @@ -33,7 +33,7 @@ <br /> <br /> <h:form enctype="multipart/form-data"> - <p:fileUpload auto="true" allowTypes="/(\.|\/)(jar)$/" sizeLimit="104857600" mode="advanced" fileUploadListener="#{currentWorkSpaceProjectBean.handleFileUpload}" update=":dependenciesForm :messages"/> + <p:fileUpload auto="true" allowTypes="/(\.|\/)(jar)$/" sizeLimit="104857600" mode="advanced" fileUploadListener="#{currentWorkSpaceProjectBean.handleFileUpload}" update=":dependenciesForm :messages :toolpalette"/> </h:form> </div> <hr/> -- GitLab