From 79aab89a00ddb12ae904d171789f0688890088e9 Mon Sep 17 00:00:00 2001 From: Nils Christian Ehmke <nie@informatik.uni-kiel.de> Date: Fri, 3 Feb 2012 17:48:14 +0100 Subject: [PATCH] Added an overview diagram; Added configuration files for findbugs, checkstyle and pmd; Added maven-plugins to support these quality-tools; Moved some code; Modified some code for checkstyle; Added the kieker-header within the files. --- Kieker.WebGUI/.classpath | 1 - .../org.eclipse.core.resources.prefs | 3 +- Kieker.WebGUI/doc/Overview.pdf | Bin 0 -> 75040 bytes Kieker.WebGUI/pom.xml | 588 ++++---- Kieker.WebGUI/quality-config/cs-conf.xml | 1190 +++++++++++++++++ Kieker.WebGUI/quality-config/fb-filter.xml | 73 + Kieker.WebGUI/quality-config/pmdrules.xml | 83 ++ .../AvailableDependenciesBean.java | 69 +- .../application/AvailableProjectsBean.java | 33 +- .../beans/application/ThemeSwitcherBean.java | 20 + .../request/SelectedDependenciesBean.java | 20 + .../webgui/beans/request/StringBean.java | 20 + .../beans/session/AvailablePluginsBean.java | 32 - .../beans/session/CurrentThemeBean.java | 20 + .../session/DependencyUploadController.java | 44 +- .../beans/session/SelectedProjectBean.java | 73 +- .../kieker/webgui/common/FileManager.java | 473 +++---- .../kieker/webgui/common/PluginFinder.java | 113 +- .../converter/MIDependencyToIntConverter.java | 56 +- .../MIDependencyToStringConverter.java | 65 +- .../converter/MIProjectToStringConverter.java | 21 + Kieker.WebGUI/src/main/webapp/main.xhtml | 2 +- .../src/main/webapp/projectDependencies.css | 22 + .../src/main/webapp/projectDependencies.xhtml | 55 +- 24 files changed, 2393 insertions(+), 683 deletions(-) create mode 100644 Kieker.WebGUI/doc/Overview.pdf create mode 100644 Kieker.WebGUI/quality-config/cs-conf.xml create mode 100644 Kieker.WebGUI/quality-config/fb-filter.xml create mode 100644 Kieker.WebGUI/quality-config/pmdrules.xml delete mode 100644 Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AvailablePluginsBean.java create mode 100644 Kieker.WebGUI/src/main/webapp/projectDependencies.css diff --git a/Kieker.WebGUI/.classpath b/Kieker.WebGUI/.classpath index da5037b3..595a5bf4 100644 --- a/Kieker.WebGUI/.classpath +++ b/Kieker.WebGUI/.classpath @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" output="target/classes" path="src/main/java"/> - <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/> <classpathentry kind="output" path="target/classes"/> diff --git a/Kieker.WebGUI/.settings/org.eclipse.core.resources.prefs b/Kieker.WebGUI/.settings/org.eclipse.core.resources.prefs index 4b31b758..f8e2785f 100644 --- a/Kieker.WebGUI/.settings/org.eclipse.core.resources.prefs +++ b/Kieker.WebGUI/.settings/org.eclipse.core.resources.prefs @@ -1,5 +1,4 @@ -#Sat Jan 21 18:45:36 CET 2012 +#Fri Feb 03 16:06:50 CET 2012 eclipse.preferences.version=1 encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 encoding/<project>=UTF-8 diff --git a/Kieker.WebGUI/doc/Overview.pdf b/Kieker.WebGUI/doc/Overview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cab2c5f6c432327b9ab3a4f69454ebea80cb795 GIT binary patch literal 75040 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 AN&o-= literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/pom.xml b/Kieker.WebGUI/pom.xml index c7654be5..64d59079 100644 --- a/Kieker.WebGUI/pom.xml +++ b/Kieker.WebGUI/pom.xml @@ -1,283 +1,324 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> - <groupId>kieker</groupId> - <artifactId>Kieker.WebGUI</artifactId> - <version>1.0-SNAPSHOT</version> - <packaging>war</packaging> + <groupId>kieker</groupId> + <artifactId>Kieker.WebGUI</artifactId> + <version>1.0-SNAPSHOT</version> + <packaging>war</packaging> - <name>Kieker.WebGUI</name> + <name>Kieker.WebGUI</name> - <properties> - <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> + <properties> + <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> - <dependencies> - <dependency> - <groupId>org.mortbay.jetty</groupId> - <artifactId>jetty-maven-plugin</artifactId> - <version>8.1.0.RC1</version> - </dependency> - <dependency> - <groupId>com.ocpsoft</groupId> - <artifactId>prettyfaces-jsf2</artifactId> - <version>3.3.2</version> - </dependency> - <dependency> - <groupId>com.sun.faces</groupId> - <artifactId>jsf-api</artifactId> - <version>2.1.6</version> - </dependency> - <dependency> - <groupId>com.sun.faces</groupId> - <artifactId>jsf-impl</artifactId> - <version>2.1.6</version> - </dependency> - <dependency> - <groupId>org.eclipse.emf</groupId> - <artifactId>org.eclipse.emf.common</artifactId> - <version>2.6.0.v20100614-1136</version> - </dependency> - <dependency> - <groupId>org.eclipse.emf</groupId> - <artifactId>ecore-xmi</artifactId> - <version>2.2.3</version> - </dependency> - <dependency> - <groupId>org.eclipse.emf</groupId> - <artifactId>org.eclipse.emf.ecore</artifactId> - <version>2.6.0.v20100614-1136</version> - </dependency> - <dependency> - <groupId>javax</groupId> - <artifactId>javaee-web-api</artifactId> - <version>6.0</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.primefaces</groupId> - <artifactId>primefaces</artifactId> - <version>3.0.RC1</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>black-tie</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>blitzer</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>bluesky</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>casablanca</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>cupertino</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>dark-hive</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>dot-luv</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>eggplant</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>excite-bike</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>flick</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>hot-sneaks</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>humanity</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>le-frog</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>midnight</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>mint-choc</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>overcast</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>pepper-grinder</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>redmond</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>rocket</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>sam</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>smoothness</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>south-street</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>start</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>sunny</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>swanky-purse</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>trontastic</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>ui-darkness</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>ui-lightness</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>vader</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.primefaces.themes</groupId> - <artifactId>glass-x</artifactId> - <version>1.0.2</version> - </dependency> + <dependencies> + <dependency> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + <version>8.1.0.RC1</version> + </dependency> + <dependency> + <groupId>com.ocpsoft</groupId> + <artifactId>prettyfaces-jsf2</artifactId> + <version>3.3.2</version> + </dependency> + <dependency> + <groupId>com.sun.faces</groupId> + <artifactId>jsf-api</artifactId> + <version>2.1.6</version> + </dependency> + <dependency> + <groupId>com.sun.faces</groupId> + <artifactId>jsf-impl</artifactId> + <version>2.1.6</version> + </dependency> + <dependency> + <groupId>org.eclipse.emf</groupId> + <artifactId>org.eclipse.emf.common</artifactId> + <version>2.6.0.v20100614-1136</version> + </dependency> + <dependency> + <groupId>org.eclipse.emf</groupId> + <artifactId>ecore-xmi</artifactId> + <version>2.2.3</version> + </dependency> + <dependency> + <groupId>org.eclipse.emf</groupId> + <artifactId>org.eclipse.emf.ecore</artifactId> + <version>2.6.0.v20100614-1136</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <version>2.8</version> + </dependency> + <dependency> + <groupId>org.codehaus.mojo</groupId> + <artifactId>findbugs-maven-plugin</artifactId> + <version>2.4.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-pmd-plugin</artifactId> + <version>2.6</version> + </dependency> + <dependency> + <groupId>javax</groupId> + <artifactId>javaee-web-api</artifactId> + <version>6.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.primefaces</groupId> + <artifactId>primefaces</artifactId> + <version>3.0.RC1</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>black-tie</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>blitzer</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>bluesky</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>casablanca</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>cupertino</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>dark-hive</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>dot-luv</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>eggplant</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>excite-bike</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>flick</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>hot-sneaks</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>humanity</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>le-frog</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>midnight</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>mint-choc</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>overcast</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>pepper-grinder</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>redmond</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>rocket</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>sam</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>smoothness</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>south-street</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>start</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>sunny</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>swanky-purse</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>trontastic</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>ui-darkness</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>ui-lightness</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>vader</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>glass-x</artifactId> + <version>1.0.2</version> + </dependency> - <dependency> - <groupId>kieker</groupId> - <artifactId>kieker</artifactId> - <version>1.5-SNAPSHOT</version> - <scope>system</scope> - <systemPath>${project.basedir}/lib/kieker-1.5-SNAPSHOT.jar</systemPath> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>1.3.2</version> - </dependency> - <dependency> - <groupId>commons-fileupload</groupId> - <artifactId>commons-fileupload</artifactId> - <version>1.2.1</version> - </dependency> - </dependencies> + <dependency> + <groupId>kieker</groupId> + <artifactId>kieker</artifactId> + <version>1.5-SNAPSHOT</version> + <scope>system</scope> + <systemPath>${project.basedir}/lib/kieker-1.5-SNAPSHOT.jar</systemPath> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>1.3.2</version> + </dependency> + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + <version>1.2.1</version> + </dependency> + </dependencies> - <repositories> - <repository> - <id>prime-repo</id> - <name>PrimeFaces Maven Repository</name> - <url>http://repository.primefaces.org</url> - <layout>default</layout> - </repository> - </repositories> + <repositories> + <repository> + <id>prime-repo</id> + <name>PrimeFaces Maven Repository</name> + <url>http://repository.primefaces.org</url> + <layout>default</layout> + </repository> + </repositories> - <build> - <plugins> - <plugin> - <groupId>org.mortbay.jetty</groupId> - <artifactId>jetty-maven-plugin</artifactId> - <version>8.1.0.RC1</version> - <configuration> - <scanIntervalSeconds>5</scanIntervalSeconds> - <connectors> - <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> - <port>8080</port> - <maxIdleTime>600000</maxIdleTime> <!-- 10 minutes in milliseconds! --> - <lowResourcesMaxIdleTime>600000</lowResourcesMaxIdleTime> - </connector> - </connectors> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>2.3.2</version> - <configuration> - <source>1.6</source> - <target>1.6</target> - <compilerArguments> - <endorseddirs>${endorsed.dir}</endorseddirs> - </compilerArguments> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <version>2.1.1</version> - <configuration> - <failOnMissingWebXml>false</failOnMissingWebXml> - </configuration> - </plugin> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <version>2.8</version> + <configuration> + <configLocation>quality-config/cs-conf.xml</configLocation> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>findbugs-maven-plugin</artifactId> + <version>2.4.0</version> + <configuration> + <effort>Max</effort> + <threshold>Low</threshold> + <includeFilterFile>quality-config/fb-filter.xml</includeFilterFile> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-pmd-plugin</artifactId> + <version>2.6</version> + <configuration> + <rulesets>quality-config/pmdrules.xml</rulesets> + </configuration> + </plugin> + <plugin> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + <version>8.1.0.RC1</version> + <configuration> + <scanIntervalSeconds>5</scanIntervalSeconds> + <connectors> + <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> + <port>8080</port> + <maxIdleTime>600000</maxIdleTime> <!-- 10 minutes in milliseconds! --> + <lowResourcesMaxIdleTime>600000</lowResourcesMaxIdleTime> + </connector> + </connectors> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>2.3.2</version> + <configuration> + <source>1.6</source> + <target>1.6</target> + <compilerArguments> + <endorseddirs>${endorsed.dir}</endorseddirs> + </compilerArguments> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>2.1.1</version> + <configuration> + <failOnMissingWebXml>false</failOnMissingWebXml> + </configuration> + </plugin> <!--<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.1</version> <executions> <execution> <phase>validate</phase> <goals> <goal>copy</goal> </goals> <configuration> <outputDirectory>${endorsed.dir}</outputDirectory> @@ -285,7 +326,8 @@ <artifactId>javaee-endorsed-api</artifactId> <version>6.0</version> <type>jar</type> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> --> - </plugins> - </build> + </plugins> + </build> + </project> diff --git a/Kieker.WebGUI/quality-config/cs-conf.xml b/Kieker.WebGUI/quality-config/cs-conf.xml new file mode 100644 index 00000000..e0c075ac --- /dev/null +++ b/Kieker.WebGUI/quality-config/cs-conf.xml @@ -0,0 +1,1190 @@ +<?xml version="1.0"?> +<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.1//EN" "http://www.puppycrawl.com/dtds/configuration_1_1.dtd"> + +<module name="Checker"> + + <!-- KIEKER default is warning instead of error --> + <property name="severity" value="warning"/> + + <!-- KIEKER Filter --> + <module name="SuppressWithNearbyCommentFilter"> + <property name="commentFormat" value="NOCS"/> + <property name="checkFormat" value=".*"/> + <property name="influenceFormat" value="0"/> + </module> + + <!-- + <property name="basedir" value=""/> + <property name="localeCountry" value=""/> JVM locale country + <property name="localeLanguage" value=""/> JVM locale language + <property name="charset" value=""/> JVM file.encoding property + !--> + + + <!-- + !________________________________________________________________________________________ + ! + ! D U P L I C A T E S + !________________________________________________________________________________________ + !--> + <!-- Performs a line-by-line comparison of all code lines and reports duplicate code. !--> + <!-- See http://checkstyle.sf.net/config_duplicates.html !--> + <!-- KIEKER Does not work with headers!! + <module name="StrictDuplicateCode"> + <property name="min" value="12"/> + <property name="fileExtensions" value=""/> + </module> + --> + + <!-- + !________________________________________________________________________________________ + ! + ! H E A D E R S + !________________________________________________________________________________________ + !--> + <!-- NOTE: You may enable zero or one of these header checks, but not both. !--> + + <!-- Checks that a source file begins with a specified header. !--> + <!-- See http://checkstyle.sf.net/config_header.html !--> + <!-- KIEKER !--> + <module name="Header"> + <!--<property name="headerFile" value="lib/checkstyle-5.4/header.txt"/>--> + <!--<property name="charset" value=""/>--> + <property name="header" value="/***************************************************************************\n * Copyright 2011 by\n * + Christian-Albrechts-University of Kiel\n * + Department of Computer Science\n * + Software Engineering Group \n * and others.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n"/> + <property name="ignoreLines" value="2"/> + <property name="fileExtensions" value="java"/> + </module> + + <!-- Checks the header of a source file against a header file that contains a regular expression !--> + <!-- for each line of the source header. !--> + <!-- See http://checkstyle.sf.net/config_header.html !--> + <!-- Default: OFF + <module name="RegexpHeader"> + <property name="headerFile" value=""/> + <property name="charset" value=""/> + <property name="header" value=""/> + <property name="multiLines" value=""/> + <property name="fileExtensions" value=""/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! J A V A D O C S + !________________________________________________________________________________________ + !--> + <!-- Checks that each Java package has a Javadoc file used for commenting. !--> + <!-- See http://checkstyle.sourceforge.net/config_javadoc.html#JavadocPackage !--> + <module name="JavadocPackage"> + <property name="severity" value="info"/> + <property name="allowLegacy" value="false"/> + </module> + + <!-- + !________________________________________________________________________________________ + ! + ! R E G E X P + !________________________________________________________________________________________ + !--> + <!-- A check for detecting that matches across multiple lines. Works with any file type. !--> + <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpMultiline !--> + <!-- Default: OFF + <module name="RegexpMultiline"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="ignoreCase" value="false"/> + <property name="minimum" value="0"/> + <property name="maximum" value="0"/> + <property name="fileExtensions" value=""/> + </module> + !--> + + <!-- A check for detecting single lines that match a supplied regular expression. Works with any file type. !--> + <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpSingleline !--> + <!-- Default: OFF + <module name="RegexpSingleline"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="ignoreCase" value="false"/> + <property name="minimum" value="0"/> + <property name="maximum" value="0"/> + <property name="fileExtensions" value=""/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! M I S C E L L A N E O U S + !________________________________________________________________________________________ + !--> + <!-- Checks whether files end with a new line. !--> + <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile !--> + <module name="NewlineAtEndOfFile"> + <property name="lineSeparator" value="system"/> + <property name="fileExtensions" value="*.*"/> + </module> + + <!-- Checks that property files contain the same keys. !--> + <!-- See http://checkstyle.sf.net/config_misc.html#Translation !--> + <module name="Translation"> + <property name="fileExtensions" value="properties"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! S I Z E V I O L A T I O N S + !________________________________________________________________________________________ + !--> + <!-- Checks for long source files. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <module name="FileLength"> + <property name="max" value="2000"/> + <property name="fileExtensions" value=""/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! W H I T E S P A C E + !________________________________________________________________________________________ + !--> + <!-- Checks that there are no tab characters ('\t') in the source code. !--> + <!-- See http://checkstyle.sourceforge.net/config_whitespace.html#FileTabCharacter !--> + <!-- KIEKER we use TABs + <module name="FileTabCharacter"> + <property name="eachLine" value="false"/> + <property name="fileExtensions" value=""/> + </module> + --> + + <module name="TreeWalker"> + <!-- KIEKER --> + <property name="tabWidth" value="4"/> + <module name="FileContentsHolder"/> + + <!-- + !________________________________________________________________________________________ + ! + ! A N N O T A T I O N S + !________________________________________________________________________________________ + !--> + <!-- This check controls the usage style of annotations. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#AnnotationUseStyle !--> + <module name ="AnnotationUseStyle"> + <property name="elementStyle" value="compact_no_array"/> + <property name="closingParens" value="never"/> + <property name="trailingArrayComma" value="never"/> + </module> + + <!-- Verifies that both the java.lang.Deprecated import is present and the @deprecated Javadoc tag is present when either is present. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#MissingDeprecated !--> + <!-- KIEKER --> + <module name="MissingDeprecated"> + <property name="severity" value="info"/> + </module> + + <!-- Verifies that the java.lang.Override annotation is present when the {@inheritDoc} javadoc tag is present. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#MissingOverride !--> + <module name="MissingOverride"> + <property name="javaFiveCompatibility" value="false"/> + </module> + + <!-- This check makes sure that all package annotations are in the package-info.java file. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#PackageAnnotation !--> + <module name="PackageAnnotation"/> + + <!-- This check allows you to specify what warnings that SuppressWarnings is not allowed to suppress. !--> + <!-- You can also specify a list of TokenTypes that the configured warning(s) cannot be suppressed on. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#SuppressWarnings !--> + <module name="SuppressWarnings"> + <property name="format" value="^$|^\s+$"/> + <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, + ANNOTATION_FIELD_DEF, ENUM_CONSTANT_DEF, PARAMETER_DEF, + VARIABLE_DEF, METHOD_DEF, CTOR_DEF"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! B L O C K S + !________________________________________________________________________________________ + !--> + <!-- Finds nested blocks, i.e. blocks that are used freely in the code. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <!-- KIEKER allowInSwitchCase !--> + <module name="AvoidNestedBlocks"> + <property name="allowInSwitchCase" value="true"/> + </module> + + <!-- Checks for empty blocks. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <!-- KIEKER removed LITERAL_CATCH !--> + <module name="EmptyBlock"> + <property name="option" value="stmt"/> + <property name="tokens" value="LITERAL_DO, + LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF, LITERAL_FOR, + LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/> + </module> + + <!-- Checks for the placement of left curly braces ('{') for code blocks. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <module name="LeftCurly"> + <property name="option" value="eol"/> + <property name="maxLineLength" value="165"/> + <property name="tokens" value="CLASS_DEF, CTOR_DEF, + INTERFACE_DEF, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, + LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_SWITCH, + LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, + METHOD_DEF"/> + </module> + + <!-- Checks for braces around code blocks. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <module name="NeedBraces"> + <property name="tokens" value="LITERAL_DO, LITERAL_ELSE, LITERAL_IF, LITERAL_FOR, LITERAL_WHILE"/> + </module> + + <!-- Checks the placement of right curly braces ('}') for else, try, and catch tokens. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <module name="RightCurly"> + <property name="option" value="same"/> + <property name="tokens" value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE"/> + <property name="shouldStartLine" value="true"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! C L A S S D E S I G N + !________________________________________________________________________________________ + !--> + <!-- Checks that classes are designed for extension. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <!-- Default: OFF + <module name="DesignForExtension"/> + !--> + + <!-- Checks that a class which has only private constructors is declared as final. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="FinalClass"/> + + <!-- Make sure that utility classes (classes that contain only static methods) do not have a public constructor. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="HideUtilityClassConstructor"/> + + <!-- Check nested (internal) classes/interfaces are declared at the bottom of the class after all method and field declarations. !--> + <!-- See http://checkstyle.sourceforge.net/config_design.html#InnerTypeLast !--> + <module name="InnerTypeLast"/> + + <!-- Implements Bloch, Effective Java, Item 17 - Use Interfaces only to define types. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="InterfaceIsType"> + <property name="allowMarkerInterfaces" value="true"/> + </module> + + <!-- Ensures that exceptions (defined as any class name conforming to some regular expression) are immutable. !--> + <!-- That is, have only final fields. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="MutableException"> + <property name="format" value="^.*Exception$|^.*Error$"/> + </module> + + <!-- Restricts throws statements to a specified count. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <!-- KIEKER off + <module name="ThrowsCount"> + <property name="max" value="1"/> + </module> + !--> + + <!-- Checks visibility of class members. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="VisibilityModifier"> + <property name="packageAllowed" value="false"/> + <property name="protectedAllowed" value="true"/> + <property name="publicMemberPattern" value="^serialVersionUID$"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! C O D I N G + !________________________________________________________________________________________ + !--> + <!-- Checks that array initialization contains a trailing comma. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="ArrayTrailingComma"/> + + <!-- Detects inline conditionals. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="AvoidInlineConditionals"/> + + <!-- Checks that classes that define a covariant equals() method also override method equals(java.lang.Object). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="CovariantEquals"/> + + <!-- Checks declaration order according to Code Conventions for the Java Programming Language. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="DeclarationOrder"> + <property name="ignoreConstructors" value="false"/> + <property name="ignoreMethods" value="false"/> + <property name="ignoreModifiers" value="false"/> + </module> + + <!-- Check that the default is after all the cases in a switch statement. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="DefaultComesLast"/> + + <!-- The "double-checked locking" idiom (DCL) tries to avoid the runtime cost of synchronization. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="DoubleCheckedLocking"/> + + <!-- Detects empty statements (standalone ;). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="EmptyStatement"/> + + <!-- Checks that any combination of String literals with optional assignment is on the left side of an equals() comparison. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#EqualsAvoidNull !--> + <module name="EqualsAvoidNull"/> + + <!-- Checks that classes that override equals() also override hashCode(). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="EqualsHashCode"/> + + <!-- Checks if any class or object member explicitly initialized to default for its type value. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER off + <module name="ExplicitInitialization"/> + !--> + + <!-- Checks for fall through in switch statements Finds locations where a case contains Java code ... !--> + <!-- but lacks a break, return, throw or continue statement. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="FallThrough"> + <property name="checkLastCaseGroup" value="false"/> + <property name="reliefPattern" value="fallthru|falls??through"/> + </module> + + <!-- Checks that local variables that never have their values changed are declared final. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="FinalLocalVariable"> + <property name="tokens" value="VARIABLE_DEF"/> + </module> + + <!-- Checks that a local variable or a parameter does not shadow a field that is defined in the same class. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER ignoreConstructorParameter, ignoreSetter --> + <module name="HiddenField"> + <property name="tokens" value="PARAMETER_DEF, VARIABLE_DEF"/> + <!-- + <property name="ignoreFormat" value=""/> + !--> + <property name="ignoreConstructorParameter" value="true"/> + <property name="ignoreSetter" value="true"/> + <property name="ignoreAbstractMethods" value="false"/> + </module> + + <!-- Catching java.lang.Exception, java.lang.Error or java.lang.RuntimeException is almost never acceptable. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="IllegalCatch"> + <property name="illegalClassNames" value="java.lang.Exception, java.lang.Throwable, java.lang.RuntimeException"/> + </module> + + <!-- Checks for illegal instantiations where a factory method is preferred. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER on for ??? !--> + <module name="IllegalInstantiation"> + <property name="classes" value="java.lang.Boolean"/> + </module> + + <!-- This check can be used to ensure that types are not declared to be thrown. !--> + <!-- Declaring to throw java.lang.Error or java.lang.RuntimeException is almost never acceptable. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#IllegalThrows !--> + <module name="IllegalThrows"> + <property name="illegalClassNames" value="java.lang.Throwable, java.lang.Error, java.lang.RuntimeException"/> + </module> + + <!-- Checks for illegal tokens. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER off + <module name="IllegalToken"> + <property name="tokens" value="LITERAL_SWITCH, POST_INC, POST_DEC"/> + </module> + !--> + + <!-- Checks for illegal token text. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- Default: OFF + <module name="IllegalTokenText"> + <property name="tokens" value=""/> + <property name="format" value=""/> + <property name="ignoreCase" value="false"/> + <property name="message" value=""/> + </module> + !--> + + <!-- Checks that particular classes are never used as types in variable declarations, return values or parameters. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER removed format value="^(.*[\\.])?Abstract.*$" !--> + <module name="IllegalType"> + <property name="tokens" value="PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF"/> + <property name="illegalClassNames" value="java.util.GregorianCalendar, java.util.Hashtable, + java.util.HashSet, java.util.HashMap, java.util.ArrayList, + java.util.LinkedList, java.util.LinkedHashMap, + java.util.LinkedHashSet, java.util.TreeSet, + java.util.TreeMap, java.util.Vector"/> + <property name="legalAbstractClassNames" value=""/> + <property name="ignoredMethodNames" value="getInitialContext, getEnvironment"/> + <property name="format" value="XXX"/> + </module> + + <!-- Checks for assignments in subexpressions, such as in String s = Integer.toString(i = 2);. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="InnerAssignment"> + <property name="tokens" value="ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN, + DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, + SR_ASSIGN, STAR_ASSIGN"/> + </module> + + <!-- Ensures that the setUp(), tearDown()methods are named correctly, have no arguments, !--> + <!-- return void and are either public or protected. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="JUnitTestCase"/> + + <!-- Checks that there are no "magic numbers", where a magic number is a numeric literal !--> + <!-- that is not defined as a constant. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MagicNumber"> + <property name="tokens" value="NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG"/> + <property name="ignoreNumbers" value="-1, 0, 1, 2"/> + <property name="ignoreHashCodeMethod" value="false"/> + </module> + + <!-- Checks that classes (except abtract one) define a ctor and don't rely on the default one. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MissingCtor"/> + + <!-- Checks that switch statement has "default" clause. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MissingSwitchDefault"/> + + <!-- Check for ensuring that for loop control variables are not modified inside the for block. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#ModifiedControlVariable !--> + <module name="ModifiedControlVariable"/> + + <!-- Checks for multiple occurrences of the same string literal within a single file. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#MultipleStringLiterals !--> + <!-- KIEKER off for now + <module name="MultipleStringLiterals"> + <property name="allowedDuplicates" value="1"/> + <property name="ignoreStringsRegexp" value='^""$'/> + <property name="ignoreOccurrenceContext" value="ANNOTATION"/> + </module> + !--> + + <!-- Checks that each variable declaration is in its own statement and on its own line. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MultipleVariableDeclarations"/> + + <!-- Restricts nested for blocks to a specified depth. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#NestedForDepth !--> + <module name="NestedForDepth"> + <property name="max" value="1"/> + </module> + + <!-- Restricts nested if-else blocks to a specified depth. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="NestedIfDepth"> + <property name="max" value="1"/> + </module> + + <!-- Restricts nested try-catch blocks to a specified depth. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="NestedTryDepth"> + <property name="max" value="1"/> + </module> + + <!-- Checks that the clone method is not overridden from the Object class. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#NoClone !--> + <module name="NoClone"/> + + <!-- Verifies there are no finalize() methods defined in a class. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#NoFinalizer !--> + <module name="NoFinalizer"/> + + <!-- Checks there is only one statement per line. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#OneStatementPerLine !--> + <module name="OneStatementPerLine"/> + + <!-- Ensure a class has a package declaration. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="PackageDeclaration"> + <property name="ignoreDirectoryName" value="false"/> + </module> + + <!-- Disallow assignment of parameters. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="ParameterAssignment"/> + + <!-- Checks for redundant exceptions declared in throws clause such as duplicates, !--> + <!-- unchecked exceptions or subclasses of another declared exception. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="RedundantThrows"> + <property name="allowUnchecked" value="true"/> + <property name="allowSubclasses" value="false"/> + <property name="logLoadErrors" value="true"/> + <property name="suppressLoadErrors" value="false"/> + </module> + + <!-- Checks that code doesn't rely on the "this." default. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="RequireThis"> + <property name="checkFields" value="true"/> + <property name="checkMethods" value="true"/> + </module> + + <!-- Restrict the number of return statements. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="ReturnCount"> + <property name="max" value="2"/> + <property name="format" value=""/> + </module> + + <!-- Checks for overly complicated boolean expressions. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SimplifyBooleanExpression"/> + + <!-- Checks for overly complicated boolean return statements. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SimplifyBooleanReturn"/> + + <!-- Checks that string literals are not used with == or !=. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="StringLiteralEquality"/> + + <!-- Checks that an overriding clone() method invokes super.clone(). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SuperClone"/> + + <!-- Checks that an overriding finalize() method invokes super.finalize(). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SuperFinalize"/> + + <!-- Checks for the use of unnecessary parentheses. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="UnnecessaryParentheses"/> + + + <!-- + !________________________________________________________________________________________ + ! + ! I M P O R T S + !________________________________________________________________________________________ + !--> + <!-- Checks that there are no import statements that use the * notation. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="AvoidStarImport"> + <property name="excludes" value=""/> + <property name="allowClassImports" value="false"/> + <property name="allowStaticMemberImports" value="false"/> + </module> + + <!-- Checks that there are no static import statements. !--> + <!-- See http://checkstyle.sourceforge.net/config_imports.html#AvoidStaticImport !--> + <module name="AvoidStaticImport"> + <property name="excludes" value=""/> + </module> + + <!-- Checks for imports from a set of illegal packages. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="IllegalImport"> + <property name="illegalPkgs" value="sun"/> + <property name="illegalPkgs" value="org.apache.commons.logging"/> + </module> + + <!-- Controls what can be imported in each package. Useful for ensuring that application layering rules !--> + <!-- are not violated, especially on large projects. !--> + <!-- See http://checkstyle.sourceforge.net/config_imports.html#ImportControl !--> + <!-- Default: OFF + <module name="ImportControl"> + <property name="file" value=""/> + <property name="url" value=""/> + </module> + !--> + + <!-- Checks the ordering/grouping of imports. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="ImportOrder"> + <property name="option" value="under"/> + <property name="groups" value=""/> + <property name="ordered" value="true"/> + <property name="separated" value="false"/> + <property name="caseSensitive" value="true"/> + </module> + + <!-- Checks for redundant import statements. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="RedundantImport"/> + + <!-- Checks for unused import statements. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="UnusedImports"/> + + + <!-- + !________________________________________________________________________________________ + ! + ! J A V A D O C S + !________________________________________________________________________________________ + !--> + <!-- Checks to ensure that the javadoc tags exist (if required) !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocMethod !--> + <module name="JavadocMethod"> + <property name="severity" value="info"/> + <property name="scope" value="private"/> + <!-- + <property name="excludeScope" value=""/> + !--> + <property name="allowUndeclaredRTE" value="false"/> + <property name="allowThrowsTagsForSubclasses" value="false"/> + <property name="allowMissingParamTags" value="false"/> + <property name="allowMissingThrowsTags" value="false"/> + <property name="allowMissingReturnTag" value="false"/> + <property name="allowMissingJavadoc" value="false"/> + <property name="allowMissingPropertyJavadoc" value="false"/> + <property name="logLoadErrors" value="true"/> + <property name="suppressLoadErrors" value="false"/> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + + <!-- Validates Javadoc comments to help ensure they are well formed. !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocStyle !--> + <module name="JavadocStyle"> + <property name="severity" value="info"/> + <property name="scope" value="private"/> + <!-- + <property name="excludeScope" value=""/> + !--> + <property name="checkFirstSentence" value="true"/> +<!--TODO: <property name="endOfSentenceFormat" value="([.?!][ \t\n\r\f<])|([.?!]$)"/> !--> + <property name="checkEmptyJavadoc" value="false"/> + <property name="checkHtml" value="true"/> + <property name="tokens" value="INTERFACE_DEF, CLASS_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/> + </module> + + <!-- Checks Javadoc comments for class and interface definitions. !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocType !--> + <module name="JavadocType"> + <property name="severity" value="info"/> + <property name="scope" value="private"/> + <!-- + <property name="excludeScope" value=""/> + !--> + <property name="authorFormat" value=""/> + <property name="versionFormat" value=""/> + <property name="allowMissingParamTags" value="false"/> + <property name="allowUnknownTags" value="false"/> + <property name="tokens" value="INTERFACE_DEF, CLASS_DEF"/> + </module> + + <module name="JavadocType"> + <property name="severity" value="warning"/> + <property name="scope" value="package"/> + <property name="authorFormat" value="\S"/> + </module> + + <!-- Checks that variables have Javadoc comments. !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocVariable !--> + <module name="JavadocVariable"> + <property name="severity" value="info"/> + <property name="scope" value="private"/> + <!-- + <property name="excludeScope" value=""/> + !--> + </module> + + <!-- Outputs a JavaDoc tag as information. !--> + <!-- See http://checkstyle.sourceforge.net/config_javadoc.html#WriteTag !--> + <!-- KIEKER + <module name="WriteTag"> + <property name="severity" value="info"/> + <property name="tag" value=""/> + <property name="tagFormat" value=""/> + <property name="tagSeverity" value="info"/> + </module> + --> + + + <!-- + !________________________________________________________________________________________ + ! + ! M E T R I C S + !________________________________________________________________________________________ + !--> + <!-- Restrict the number of number of &&, || and ^ in an expression. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <module name="BooleanExpressionComplexity"> + <property name="severity" value="info"/> + <property name="max" value="3"/> + <property name="tokens" value="LAND, BAND, LOR, BOR, BXOR"/> + </module> + + <!-- This metric measures the number of instantiations of other classes within the given class. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <module name="ClassDataAbstractionCoupling"> + <property name="severity" value="info"/> + <property name="max" value="7"/> + </module> + + <!-- The number of other classes a given class relies on. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <module name="ClassFanOutComplexity"> + <property name="severity" value="info"/> + <property name="max" value="20"/> + </module> + + <!-- Checks cyclomatic complexity against a specified limit. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <module name="CyclomaticComplexity"> + <property name="severity" value="info"/> + <property name="max" value="10"/> + </module> + + <!-- Determines complexity of methods, classes and files by counting the Non Commenting Source Statements (NCSS). !--> + <!-- See http://checkstyle.sourceforge.net/config_metrics.html#JavaNCSS !--> + <module name="JavaNCSS"> + <property name="severity" value="info"/> + <property name="methodMaximum" value="50"/> + <property name="classMaximum" value="1500"/> + <property name="fileMaximum" value="2000"/> + </module> + + <!-- The NPATH metric computes the number of possible execution paths through a function. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <module name="NPathComplexity"> + <property name="severity" value="info"/> + <property name="max" value="200"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! M I S C E L L A N E O U S + !________________________________________________________________________________________ + !--> + <!-- Checks the style of array type definitions. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="ArrayTypeStyle"> + <property name="javaStyle" value="true"/> + </module> + + <!-- Checks for restricted tokens beneath other tokens. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- Default: OFF + <module name="DescendantToken"> + <property name="tokens" value=""/> + <property name="limitedTokens" value=""/> + <property name="minimumDepth" value="0"/> + <property name="maximumDepth" value="java.lang.Integer.MAX_VALUE"/> + <property name="minimumNumber" value="0"/> + <property name="maximumNumber" value="java.lang.Integer.MAX_VALUE"/> + <property name="sumTokenCounts" value="false"/> + <property name="minimumMessage" value="descendant.token.min"/> + <property name="maximumMessage" value="descendant.token.max"/> + </module> + !--> + + <!-- Check that method/constructor parameters are final. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="FinalParameters"> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + + <!-- A generic check for code problems - the user can search for any pattern. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- Default: OFF + <module name="GenericIllegalRegexp"> + <property name="format" value="\S\s+$"/> + <property name="message" value="Line has trailing spaces."/> + <property name="ignoreCase" value="false"/> + <property name="ignoreComments" value="false"/> + </module> + !--> + + <!-- Checks correct indentation of Java Code. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- KIEKER --> + <module name="Indentation"> + <property name="severity" value="info"/> + <property name="basicOffset" value="4"/> + <property name="braceAdjustment" value="0"/> + <property name="caseIndent" value="0"/> + </module> + + <!-- Checks that the outer type name and the file name match. !--> + <!-- See http://checkstyle.sourceforge.net/config_misc.html#OuterTypeFilename !--> + <module name="OuterTypeFilename"/> + + <!-- A check for TODO: comments. Actually it is a generic regular expression matcher on Java comments. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- Kieker !--> + <module name="TodoComment"> + <property name="format" value="TODO"/> + </module> + + <!-- The check to ensure that requires that comments be the only thing on a line. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- KIEKER we use them + <module name="TrailingComment"> + <property name="format" value="^[\\s\\}\\);]*$"/> + <property name="legalComment" value=""/> + </module> + --> + + <!-- Checks for uncommented main() methods (debugging leftovers). !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="UncommentedMain"> + <property name="severity" value="info"/> + <property name="excludedClasses" value="Main$"/> + </module> + + <!-- Checks that long constants are defined with an upper ell. That is 'L' and not 'l'. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="UpperEll"/> + + + <!-- + !________________________________________________________________________________________ + ! + ! M O D I F I E R S + !________________________________________________________________________________________ + !--> + <!-- Checks that the order of modifiers conforms to the suggestions in the Java Language specification, !--> + <!-- sections 8.1.1, 8.3.1 and 8.4.3. !--> + <!-- See http://checkstyle.sf.net/config_modifiers.html !--> + <module name="ModifierOrder"/> + + <!-- Checks that there are no redundant modifiers. !--> + <!-- See http://checkstyle.sf.net/config_modifiers.html !--> + <!-- KIEKER off + <module name="RedundantModifier"> + <property name="tokens" value="METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! N A M I N G C O N V E N T I O N S + !________________________________________________________________________________________ + !--> + <!-- Checks for abstract class name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <!-- KIEKER removed |^.*Factory$ --> + <module name="AbstractClassName"> + <property name="format" value="^Abstract.*$"/> + <property name="ignoreModifier" value="false"/> + <property name="ignoreName" value="false"/> + </module> + + <!-- Checks for class type parameter name naming conventions. !--> + <!-- See http://checkstyle.sourceforge.net/config_naming.html#ClassTypeParameterName !--> + <module name="ClassTypeParameterName"> + <property name="format" value="^[A-Z]$"/> + </module> + + <!-- Checks for constant name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="ConstantName"> + <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <!-- Checks for local final variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="LocalFinalVariableName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="tokens" value="VARIABLE_DEF, PARAMETER_DEF"/> + </module> + + <!-- Checks for local variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="LocalVariableName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="tokens" value="PARAMETER_DEF"/> + </module> + + <!-- Checks for member variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="MemberName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <!-- Checks for method name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="MethodName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + </module> + + <!-- Checks for method type parameter name naming conventions. !--> + <!-- See http://checkstyle.sourceforge.net/config_naming.html#MethodTypeParameterName !--> + <module name="MethodTypeParameterName"> + <property name="format" value="^[A-Z]$"/> + </module> + + <!-- Checks for package name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="PackageName"> + <property name="format" value="^[a-z]+(\.[a-zA-Z_][a-zA-Z0-9_]*)*$"/> + </module> + + <!-- Checks for parameter name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="ParameterName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + </module> + + <!-- Checks for static variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="StaticVariableName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <!-- Checks for type name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <!-- KIEKER: modded --> + <module name="TypeName"> + <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/> + <property name="tokens" value="CLASS_DEF"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <module name="TypeName"> + <property name="format" value="^I[A-Z][a-zA-Z0-9]*$"/> + <property name="tokens" value="INTERFACE_DEF"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! R E G E X P + !________________________________________________________________________________________ + !--> + <!-- A check that makes sure that a specified pattern exists, exists less than a set number of times, !--> + <!-- or does not exist in the file. !--> + <!-- See http://checkstyle.sourceforge.net/config_misc.html#Regexp !--> + <!-- Default: OFF + <module name="Regexp"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="illegalPattern" value="false"/> + <property name="duplicateLimit" value="-1"/> + <property name="errorLimit" value="100"/> + <property name="ignoreComments" value="false"/> + </module> + !--> + + <!-- This class is variation on RegexpSingleline for detecting single lines that match a !--> + <!-- supplied regular expression in Java files. It supports suppressing matches in Java comments. !--> + <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpSinglelineJava !--> + <!-- Default: OFF + <module name="RegexpSinglelineJava"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="ignoreCase" value="false"/> + <property name="minimum" value="0"/> + <property name="maximum" value="0"/> + <property name="ignoreComments" value="false"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! S I Z E V I O L A T I O N S + !________________________________________________________________________________________ + !--> + <!-- Checks for long anonymous inner classes. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <module name="AnonInnerLength"> + <property name="severity" value="info"/> + <property name="max" value="20"/> + </module> + + <!-- Restricts the number of executable statements to a specified limit. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- KIEKER off + <module name="ExecutableStatementCount"> + <property name="severity" value="info"/> + <property name="max" value="30"/> + <property name="tokens" value="CTOR_DEF, METHOD_DEF, INSTANCE_INIT, STATIC_INIT"/> + </module> + !--> + + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- Checks for long lines. !--> + <module name="LineLength"> + <property name="severity" value="info"/> + <property name="ignorePattern" value="^$"/> + <property name="max" value="165"/> + </module> + + <!-- Checks the number of methods declared in each type. This includes the number of each scope !--> + <!-- (private, package, protected and public) as well as an overall total. !--> + <!-- See http://checkstyle.sourceforge.net/config_sizes.html#MethodCount !--> + <module name="MethodCount"> + <property name="severity" value="info"/> + <property name="maxTotal" value="100"/> + <property name="maxPrivate" value="100"/> + <property name="maxPackage" value="100"/> + <property name="maxProtected" value="100"/> + <property name="maxPublic" value="100"/> + </module> + + <!-- Checks for long methods and constructors. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <module name="MethodLength"> + <property name="severity" value="info"/> + <property name="max" value="150"/> + <property name="countEmpty" value="true"/> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + + <!-- Checks for the number of types declared at the outer (or root) level in a file. !--> + <!-- See http://checkstyle.sourceforge.net/config_sizes.html#OuterTypeNumber !--> + <!-- KIEKER 2 !--> + <module name="OuterTypeNumber"> + <property name="max" value="2"/> + </module> + + <!-- Checks the number of parameters of a method or constructor. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- KIEKER off + <module name="ParameterNumber"> + <property name="severity" value="info"/> + <property name="max" value="7"/> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! W H I T E S P A C E + !________________________________________________________________________________________ + !--> + <!-- Checks the padding of an empty for initializer. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="EmptyForInitializerPad"> + <property name="option" value="nospace"/> + </module> + + <!-- Checks the padding of an empty for iterator. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="EmptyForIteratorPad"> + <property name="option" value="nospace"/> + </module> + + <!-- Checks that the whitespace around the Generic tokens < and > is correct to the typical convention. !--> + <!-- See http://checkstyle.sourceforge.net/config_whitespace.html#GenericWhitespace !--> + <module name="GenericWhitespace"/> + + <!-- Checks the padding between the identifier of a method definition, !--> + <!-- constructor definition, method call, or constructor invocation; and the left parenthesis of the parameter list. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="MethodParamPad"> + <property name="allowLineBreaks" value="false"/> + <property name="option" value="nospace"/> + <property name="tokens" value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF, SUPER_CTOR_CALL "/> + </module> + + <!-- Checks that there is no whitespace after a token. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <!-- KIEKER removed ARRAY_INIT !--> + <module name="NoWhitespaceAfter"> + <property name="allowLineBreaks" value="true"/> + <property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS"/> + </module> + + <!-- Checks that there is no whitespace before a token. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="NoWhitespaceBefore"> + <property name="allowLineBreaks" value="false"/> + <property name="tokens" value="SEMI, POST_DEC, POST_INC"/> + </module> + + <!-- Checks the policy on how to wrap lines on operators. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="OperatorWrap"> + <property name="option" value="nl"/> + <property name="tokens" value="ASSIGN, BAND, BOR, BSR, BXOR, COLON, DIV, + EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, + LOR, LT, MINUS, MOD, NOT_EQUAL, + PLUS, QUESTION, SL, SR, STAR"/> + </module> + + <!-- Checks the policy on the padding of parentheses. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="ParenPad"> + <property name="option" value="nospace"/> + <property name="tokens" value="CTOR_CALL, LPAREN, METHOD_CALL, RPAREN, SUPER_CTOR_CALL"/> + </module> + + <!-- Checks the policy on the padding of parentheses for typecasts. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="TypecastParenPad"> + <property name="option" value="nospace"/> + <property name="tokens" value="TYPECAST, RPAREN"/> + </module> + + <!-- Checks that a token is followed by whitespace. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="WhitespaceAfter"> + <property name="tokens" value="COMMA, SEMI, TYPECAST"/> + </module> + + <!-- Checks that a token is surrounded by whitespace. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="WhitespaceAround"> + <property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, + BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, + LCURLY, LE, LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, + LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, + LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, + MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, + QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN"/> + <property name="allowEmptyConstructors" value="true"/> + <property name="allowEmptyMethods" value="true"/> + </module> + + </module> + +</module> diff --git a/Kieker.WebGUI/quality-config/fb-filter.xml b/Kieker.WebGUI/quality-config/fb-filter.xml new file mode 100644 index 00000000..d1e9e128 --- /dev/null +++ b/Kieker.WebGUI/quality-config/fb-filter.xml @@ -0,0 +1,73 @@ +<FindBugsFilter> +<!-- Example: http://findbugs.sourceforge.net/manual/filter.html#d0e2103 --> + + <Match> + <Class name="kieker.analysis.reader.jmx.JMXReader" /> + <Method name="read2" params="" returns="boolean" /> + <Bug pattern="DE_MIGHT_IGNORE" /> + </Match> + + <Match> + <Class name="kieker.common.logging.LogFactory" /> + <Bug pattern="DE_MIGHT_IGNORE" /> + </Match> + + <Match> + <Class name="kieker.analysis.reader.filesystem.FSReader" /> + <Method name="read" params="" returns="boolean" /> + <Bug pattern="NN_NAKED_NOTIFY" /> + </Match> + + <Match> + <Class name="kieker.analysis.reader.filesystem.FSReader" /> + <Method name="newMonitoringRecord" params="kieker.common.record.IMonitoringRecord" returns="boolean" /> + <Bug pattern="WA_NOT_IN_LOOP" /> + </Match> + + <Match> + <Class name="kieker.analysis.reader.filesystem.FSReader" /> + <Method name="newMonitoringRecord" params="kieker.common.record.IMonitoringRecord" returns="boolean" /> + <Bug pattern="UW_UNCOND_WAIT" /> + </Match> + + <Match> + <Class name="kieker.monitoring.core.registry.Registry" /> + <Field name="eArrayCached" /> + <Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" /> + </Match> + + <Match> + <Class name="org.apache.commons.logging.impl.Jdk14LoggerPatched" /> + <Method name="getLog" params="java.lang.String" returns="org.apache.commons.logging.Log" /> + <Bug pattern="REC_CATCH_EXCEPTION" /> + </Match> + + <Match> + <Class name="kieker.analysis.reader.filesystem.FSDirectoryReader" /> + <Method name="processNormalInputFile" params="java.io.File" returns="void" /> + <Bug pattern="REC_CATCH_EXCEPTION" /> + </Match> + + <Match> + <Class name="kieker.analysis.reader.filesystem.FSDirectoryReader" /> + <Method name="processBinaryInputFile" params="java.io.File" returns="void" /> + <Bug pattern="REC_CATCH_EXCEPTION" /> + </Match> + + <Match> + <Class name="kieker.monitoring.core.controller.JMXController" /> + <Method name="<init>" params="kieker.common.configuration.Configuration" returns="void" /> + <Bug pattern="REC_CATCH_EXCEPTION" /> + </Match> + + <Match> + <Class name="kieker.tools.traceAnalysis.TraceAnalysisTool" /> + <Method name="dispatchTasks" params="" returns="boolean" /> + <Bug pattern="REC_CATCH_EXCEPTION" /> + </Match> + + <Match> + <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" /> + </Match> + +</FindBugsFilter> \ No newline at end of file diff --git a/Kieker.WebGUI/quality-config/pmdrules.xml b/Kieker.WebGUI/quality-config/pmdrules.xml new file mode 100644 index 00000000..825a629c --- /dev/null +++ b/Kieker.WebGUI/quality-config/pmdrules.xml @@ -0,0 +1,83 @@ +<?xml version="1.0"?> +<ruleset name="Kieker PMD ruleset" + xmlns="http://pmd.sf.net/ruleset/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" + xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> + <description> + This ruleset is checked for Kieker automatically. + </description> + + <!-- We'll use the following rulesets --> + <rule ref="rulesets/basic.xml"> + <exclude name="UnnecessaryFinalModifier"/> + </rule> + + <rule ref="rulesets/braces.xml"/> + + <rule ref="rulesets/clone.xml"/> + + <!--<rule ref="rulesets/codesize.xml">--> + + <rule ref="rulesets/controversial.xml"> + <exclude name="AvoidFinalLocalVariable"/> + <exclude name="AvoidLiteralsInIfCondition"/> + <exclude name="AvoidUsingVolatile"/> + <exclude name="CallSuperInConstructor"/> + <exclude name="DataflowAnomalyAnalysis"/> + <exclude name="OnlyOneReturn"/> + <exclude name="UnusedModifier"/> + <exclude name="UnnecessaryConstructor"/> + </rule> + + <!--<rule ref="rulesets/coupling.xml">--> + + <rule ref="rulesets/design.xml"> + <exclude name="ConfusingTernary"/> + </rule> + + <rule ref="rulesets/finalizers.xml"/> + + <rule ref="rulesets/imports.xml"/> + + <rule ref="rulesets/junit.xml"/> + + <rule ref="rulesets/logging-jakarta-commons.xml"/> + + <rule ref="rulesets/migrating_to_13.xml"/> + <rule ref="rulesets/migrating_to_14.xml"/> + <rule ref="rulesets/migrating_to_15.xml"/> + <rule ref="rulesets/migrating_to_junit4.xml"/> + + <rule ref="rulesets/naming.xml"> + <exclude name="LongVariable"/> + <exclude name="PackageCase"/> + <exclude name="ShortVariable"/> + </rule> + + <rule ref="rulesets/optimizations.xml"/> + + <rule ref="rulesets/strictexception.xml"> + <exclude name="AvoidCatchingNPE"/> + <exclude name="AvoidThrowingNullPointerException"/> + <exclude name="SignatureDeclareThrowsException"/> + </rule> + + <rule ref="rulesets/strings.xml"> + <exclude name="AvoidDuplicateLiterals"/> + </rule> + <rule ref="rulesets/strings.xml/AvoidDuplicateLiterals"> + <properties> + <property name="skipAnnotations" value="true"/> + </properties> + </rule> + + <rule ref="rulesets/sunsecure.xml"/> + + <rule ref="rulesets/typeresolution.xml"> + <exclude name="SignatureDeclareThrowsException"/> + </rule> + + <rule ref="rulesets/unusedcode.xml"/> + +</ruleset> \ No newline at end of file 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 d2655e0a..2132b640 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 @@ -1,41 +1,60 @@ +/*************************************************************************** + * 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.beans.application; -import java.util.ArrayList; import java.util.List; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import kieker.analysis.model.analysisMetaModel.MIDependency; -import kieker.analysis.model.analysisMetaModel.impl.MAnalysisMetaModelFactory; import kieker.webgui.common.FileManager; + import org.primefaces.model.UploadedFile; @ManagedBean @ApplicationScoped public class AvailableDependenciesBean { - private final List<MIDependency> dependencies; - private final MAnalysisMetaModelFactory factory; - - public AvailableDependenciesBean() { - this.dependencies = FileManager.getInstance().loadAllDependencies(); - factory = new MAnalysisMetaModelFactory(); - } - - public List<MIDependency> getDependencies() { - return dependencies; - } - - public void upload(final UploadedFile file) { - FileManager.getInstance().uploadDependency(file); - this.dependencies.clear(); - this.dependencies.addAll(FileManager.getInstance().loadAllDependencies()); - } - - public void delete(final MIDependency dependency) { - FileManager.getInstance().deleteDependency(dependency); - this.dependencies.clear(); - this.dependencies.addAll(FileManager.getInstance().loadAllDependencies()); - } + private final List<MIDependency> dependencies; + + public AvailableDependenciesBean() { + this.dependencies = FileManager.getInstance().loadAllDependencies(); + } + + public List<MIDependency> getDependencies() { + return dependencies; + } + + public void upload(final UploadedFile file) { + final MIDependency dependency = FileManager.getInstance().uploadDependency(file); + if (dependency != null) { + this.dependencies.add(dependency); + } + } + + public void delete(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 bbd85e30..fde98d72 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 @@ -1,8 +1,24 @@ +/************************************************************************** + * 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.beans.application; import java.util.List; -import javax.faces.application.FacesMessage; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import javax.faces.context.FacesContext; @@ -33,13 +49,20 @@ public class AvailableProjectsBean { } public synchronized void addProject(final String projectName) { - /* Create a new project. */ + /* + * Create a new project. + */ final MIProject project = factory.createProject(); project.setName(projectName); - /* Try to save the project. */ + /* + * Try to save the project. + */ if (FileManager.getInstance().saveNewProject(project)) { - /* Set the new project as the main project, if the current user doesn't have one. */ + /* + * Set the new project as the main project, if the current user + * doesn't have one. + */ FacesContext context = FacesContext.getCurrentInstance(); SelectedProjectBean bean = (SelectedProjectBean) context.getApplication().evaluateExpressionGet(context, "#{selectedProjectBean}", SelectedProjectBean.class); @@ -51,7 +74,7 @@ public class AvailableProjectsBean { } } - @SuppressWarnings(value = { "unused" }) + @SuppressWarnings("unused") public synchronized TreeNode getProjectsRoot() { TreeNode root = new DefaultTreeNode("Root", null); 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 8357c651..7f0424a7 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 @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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.beans.application; import java.util.Map; 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 438655a5..df6337a8 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 @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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.beans.request; import java.util.ArrayList; 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 bb5fda66..c61a58bd 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 @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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.beans.request; import javax.faces.bean.ManagedBean; diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AvailablePluginsBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AvailablePluginsBean.java deleted file mode 100644 index 20c98807..00000000 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/AvailablePluginsBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package kieker.webgui.beans.session; - -import javax.enterprise.context.SessionScoped; -import javax.faces.bean.ManagedBean; - -import org.primefaces.model.DefaultTreeNode; -import org.primefaces.model.TreeNode; - -/** - * This bean can be used to store and read the currently available plugins for the current main project. - * - * @author Nils Christian Ehmke - */ -@ManagedBean -@SessionScoped -public class AvailablePluginsBean { - - /** - * Delivers the available plugins. - * - * @return A tree with the available plugins. - */ - @SuppressWarnings(value = { "unused" }) - public TreeNode getAvailablePluginsRoot() { - TreeNode root = new DefaultTreeNode("Root", null); - - final TreeNode readerNode = new DefaultTreeNode("Reader", root); - final TreeNode analysisPluginsNode = new DefaultTreeNode("AnalysisPlugins", root); - - return root; - } -} 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 65b67e3c..8f0aefcc 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 @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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.beans.session; import java.util.Map; 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 f73d1ae1..036c651e 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 @@ -1,33 +1,51 @@ +/*************************************************************************** + * 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.beans.session; -import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; -import javax.faces.context.FacesContext; import kieker.webgui.common.FileManager; import org.primefaces.model.UploadedFile; /** - * + * * @author Nils Christian Ehmke */ @ManagedBean @SessionScoped public class DependencyUploadController { - private UploadedFile file; + private UploadedFile file; - public UploadedFile getFile() { - return file; - } + public UploadedFile getFile() { + return file; + } - public void setFile(UploadedFile file) { - this.file = file; - } + public void setFile(UploadedFile file) { + this.file = file; + } - public void upload() { - FileManager.getInstance().uploadDependency(file); - } + public void upload() { + FileManager.getInstance().uploadDependency(file); + } } 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 85dcf550..0a6e68e3 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 @@ -1,16 +1,34 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ +/*************************************************************************** + * 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.beans.session; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import kieker.analysis.model.analysisMetaModel.MIProject; + +import org.primefaces.model.DefaultTreeNode; import org.primefaces.model.TreeNode; /** - * This bean can be used to store the currently selected project and the current main project for the user within a session. + * This bean can be used to store the currently selected project and the current + * main project for the user within a session. * * @author Nils Christian Ehmke */ @@ -22,19 +40,40 @@ public class SelectedProjectBean { private MIProject selectedProject; private MIProject mainProject; + /** + * Creates a new instance of this class. + */ + public SelectedProjectBean() {} + + /** + * Delivers the main project of the current user. It can be null. + * + * @return The user's main project. + */ public MIProject getMainProject() { return mainProject; } - public void setMainProject(MIProject mainProject) { + /** + * Sets the main project of the current user. + * + * @param mainProject + * The new main project of the current user. + */ + public void setMainProject(final MIProject mainProject) { this.mainProject = mainProject; } + /** + * Delivers the project currently selected by the user. It can be null. + * + * @return The user's currently selected project. + */ public MIProject getSelectedProject() { return selectedProject; } - public void setSelectedProject(MIProject selectedProject) { + public void setSelectedProject(final MIProject selectedProject) { this.selectedProject = selectedProject; } @@ -42,7 +81,7 @@ public class SelectedProjectBean { return selectedNode; } - public void setSelectedNode(TreeNode selectedNode) { + public void setSelectedNode(final TreeNode selectedNode) { this.selectedNode = selectedNode; if (selectedNode != null && selectedNode.getData() instanceof MIProject) { setSelectedProject((MIProject) selectedNode.getData()); @@ -51,7 +90,21 @@ public class SelectedProjectBean { } } - public String getFontWeight(MIProject project) { - return (project == mainProject) ? "bold" : "normal"; + public String getFontWeight(final MIProject project) { + return (project == this.mainProject) ? "bold" : "normal"; + } + + /** + * Delivers the available plugins. + * + * @return A tree with the available plugins. + */ + public TreeNode getAvailablePluginsRoot() { + TreeNode root = new DefaultTreeNode("Root", null); + + final TreeNode readerNode = new DefaultTreeNode("default", "Reader", root); + final TreeNode analysisPluginsNode = new DefaultTreeNode("default", "AnalysisPlugins", root); + + return root; } } 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 26ba8ae5..56459e0b 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/FileManager.java @@ -1,3 +1,20 @@ +/************************************************************************* + * 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; import java.io.File; @@ -22,234 +39,242 @@ import kieker.common.logging.LogFactory; * This is a singleton class for the access to the file system. It makes sure * that the necessary directories for the execution of the application exist. * <b>Do not</b> remove directories created from this manager during runtime! - * Directories are created during first access to the class.<br> Currently + * Directories are created during first access to the class.<br> + * Currently * nearly all methods are synchronized. A fine grained synchronization should be * implemented in the future. - * + * * @author Nils Christian Ehmke */ public final class FileManager { - private static final Log LOG = LogFactory.getLog(FileManager.class); - private static final String ROOT_DIR = "data"; - private static final String PROJECT_DIR = ROOT_DIR + File.separator + "projects"; - private static final String LIB_DIR = ROOT_DIR + File.separator + "libraries"; - private static final String EXTENSION = ".kax"; - private static final String JAR_EXTENSION = ".jar"; - private static final int BUF_SIZE = 1024; - private static final FileManager instance = new FileManager(); - - private FileManager() { - checkAndCreateDirectories(); - } - - private synchronized void checkAndCreateDirectories() { - /* - * Make sure that the directories exist and create them if necessary. - */ - final File dirProj = new File(PROJECT_DIR); - final File dirLib = new File(LIB_DIR); - boolean couldCreated = true; - - if (!dirProj.exists()) { - couldCreated &= dirProj.mkdirs(); - } - if (!dirLib.exists()) { - couldCreated &= dirLib.mkdirs(); - } - - if (!couldCreated) { - FileManager.LOG.error("Could not create the necessary directories for the application"); - } - } - - /** - * This method saves a given project using the name of the project as the - * project-directory. The project-directory must already exist. - * - * @param project The project to be stored. - * @return true iff the project-directory does already exist and the storage - * was successful. - */ - public synchronized boolean saveProject(final MIProject project) { - final String projectName = project.getName(); - - final File dirProject = new File(PROJECT_DIR + File.separator + projectName); - - /* - * Make sure that the directory for the project exists. - */ - if (!dirProject.exists()) { - return false; - } else { - /* - * Try to save the project. - */ - final File fileProject = new File(dirProject, projectName + FileManager.EXTENSION); - try { - final AnalysisController controller = new AnalysisController(project); - return controller.saveToFile(fileProject, projectName); - } catch (final Exception ex) { - FileManager.LOG.error("Could not save project '" + projectName + "'."); - return false; - } - } - } - - /** - * This method saves a given project using the name of the project as the - * project-directory. THe project-directory must not already exist. - * - * @param project The project to be stored. - * @return true iff the project-directory does not already exist and the - * storage was successful. - */ - public synchronized boolean saveNewProject(final MIProject project) { - final String projectName = project.getName(); - - final File dirProject = new File(PROJECT_DIR + File.separator + projectName); - - /* - * Make sure that the project does not already exist and create the - * project directory. - */ - if (dirProject.exists() || !dirProject.mkdir()) { - return false; - } else { - /* - * The directory should exist now. Store the project. - */ - return saveProject(project); - } - } - - /** - * This method can be used to load all currently saved projects. - * - * @return A list containing the loaded projects. If something went wrong, - * an empty list will be returned, never null. - */ - public synchronized List<MIProject> loadAllProjects() { - List<MIProject> resultList = new ArrayList<MIProject>(); - - /* - * Try to get all directories within the project directory. - */ - final File directories[] = new File(PROJECT_DIR).listFiles(); - if (directories != null) { - for (File directory : directories) { - if (directory.isDirectory()) { - /* - * If there is a project file within the directory, we know - * the name of it. - */ - final File projectFile = new File(directory, directory.getName() + FileManager.EXTENSION); - if (projectFile.exists()) { - try { - /* - * Try to load the project. - */ - MIProject project = AnalysisController.loadFromFile(projectFile); - if (project != null) { - resultList.add(project); - } - } catch (Exception ex) { - FileManager.LOG.error("Could not load project '" + directory.getName() + "'."); - } - } - } - } - } - - return resultList; - } - - /** - * This method uploads a given file as a new dependency. The file is stored - * within the lib-directory of this application. If a file with the same - * name does already exist, it will be replaces. - * - * @param file The file to be uploaded. - * @return true iff the file has been uploaded successfully. - */ - public boolean uploadDependency(final UploadedFile file) { - final File depFile = new File(LIB_DIR, file.getFileName()); - - InputStream in = null; - OutputStream out = null; - try { - /* - * Get the streams. - */ - in = file.getInputstream(); - out = new FileOutputStream(depFile); - final byte buf[] = new byte[BUF_SIZE]; - int count; - - /* - * Transfer the file. - */ - while ((count = in.read(buf)) != -1) { - out.write(buf, 0, count); - } - - } catch (final IOException ex) { - FileManager.LOG.error("Could not transfer file '" + file.getFileName() + "'"); - return false; - } finally { - /* - * Try to make sure that the streams will be closed. - */ - try { - if (in != null) { - in.close(); - } - if (out != null) { - out.close(); - } - } catch (IOException ex) { - // Ignore - } - } - - return true; - } - - /** - * Delivers the only instance of this class. - * - * @return The singleton instance of this class. - */ - public static FileManager getInstance() { - return instance; - } - - public List<MIDependency> loadAllDependencies() { - final List<MIDependency> resultList = new ArrayList<MIDependency>(); - final MAnalysisMetaModelFactory factory = new MAnalysisMetaModelFactory(); - /* - * Try to get all files within the library directory. - */ - final File files[] = new File(LIB_DIR).listFiles(); - if (files != null) { - for (File file : files) { - if (file.isFile()) { - if (file.getName().endsWith(JAR_EXTENSION)) { - MIDependency dependency = factory.createDependency(); - dependency.setFilePath(file.getAbsolutePath()); - resultList.add(dependency); - } - } - } - } - - return resultList; - } - - public void deleteDependency(final MIDependency dependency) { - File file = new File(dependency.getFilePath()); - if (file.isFile()) { - file.delete(); - } - } + private static final Log LOG = LogFactory.getLog(FileManager.class); + private static final String ROOT_DIR = "data"; + private static final String PROJECT_DIR = ROOT_DIR + File.separator + "projects"; + private static final String LIB_DIR = ROOT_DIR + File.separator + "libraries"; + private static final String EXTENSION = ".kax"; + private static final String JAR_EXTENSION = ".jar"; + private static final int BUF_SIZE = 1024; + private static final FileManager instance = new FileManager(); + private final MAnalysisMetaModelFactory factory; + + private FileManager() { + checkAndCreateDirectories(); + this.factory = new MAnalysisMetaModelFactory(); + } + + private synchronized void checkAndCreateDirectories() { + /* + * Make sure that the directories exist and create them if necessary. + */ + final File dirProj = new File(PROJECT_DIR); + final File dirLib = new File(LIB_DIR); + boolean couldCreated = true; + + if (!dirProj.exists()) { + couldCreated &= dirProj.mkdirs(); + } + if (!dirLib.exists()) { + couldCreated &= dirLib.mkdirs(); + } + + if (!couldCreated) { + FileManager.LOG.error("Could not create the necessary directories for the application"); + } + } + + /** + * This method saves a given project using the name of the project as the + * project-directory. The project-directory must already exist. + * + * @param project + * The project to be stored. + * @return true iff the project-directory does already exist and the storage + * was successful. + */ + public synchronized boolean saveProject(final MIProject project) { + final String projectName = project.getName(); + + final File dirProject = new File(PROJECT_DIR + File.separator + projectName); + + /* + * Make sure that the directory for the project exists. + */ + if (!dirProject.exists()) { + return false; + } else { + /* + * Try to save the project. + */ + final File fileProject = new File(dirProject, projectName + FileManager.EXTENSION); + try { + final AnalysisController controller = new AnalysisController(project); + return controller.saveToFile(fileProject, projectName); + } catch (final Exception ex) { + FileManager.LOG.error("Could not save project '" + projectName + "'."); + return false; + } + } + } + + /** + * This method saves a given project using the name of the project as the + * project-directory. THe project-directory must not already exist. + * + * @param project + * The project to be stored. + * @return true iff the project-directory does not already exist and the + * storage was successful. + */ + public synchronized boolean saveNewProject(final MIProject project) { + final String projectName = project.getName(); + + final File dirProject = new File(PROJECT_DIR + File.separator + projectName); + + /* + * Make sure that the project does not already exist and create the + * project directory. + */ + if (dirProject.exists() || !dirProject.mkdir()) { + return false; + } else { + /* + * The directory should exist now. Store the project. + */ + return saveProject(project); + } + } + + /** + * This method can be used to load all currently saved projects. + * + * @return A list containing the loaded projects. If something went wrong, + * an empty list will be returned, never null. + */ + public synchronized List<MIProject> loadAllProjects() { + List<MIProject> resultList = new ArrayList<MIProject>(); + + /* + * Try to get all directories within the project directory. + */ + final File[] directories = new File(PROJECT_DIR).listFiles(); + if (directories != null) { + for (File directory : directories) { + if (directory.isDirectory()) { + /* + * If there is a project file within the directory, we know + * the name of it. + */ + final File projectFile = new File(directory, directory.getName() + FileManager.EXTENSION); + if (projectFile.exists()) { + try { + /* + * Try to load the project. + */ + MIProject project = AnalysisController.loadFromFile(projectFile); + if (project != null) { + resultList.add(project); + } + } catch (Exception ex) { + FileManager.LOG.error("Could not load project '" + directory.getName() + "'."); + } + } + } + } + } + + return resultList; + } + + /** + * This method uploads a given file as a new dependency. The file is stored + * within the lib-directory of this application. If a file with the same + * name does already exist, it will be replaces. + * + * @param file + * The file to be uploaded. + * @return The new dependency iff the uploading was sucesfull, null + * otherwise. + */ + public MIDependency uploadDependency(final UploadedFile file) { + final File depFile = new File(LIB_DIR, file.getFileName()); + + InputStream in = null; + OutputStream out = null; + try { + /* + * Get the streams. + */ + in = file.getInputstream(); + out = new FileOutputStream(depFile); + final byte[] buf = new byte[BUF_SIZE]; + int count; + + /* + * Transfer the file. + */ + while ((count = in.read(buf)) != -1) { + out.write(buf, 0, count); + } + + } catch (final IOException ex) { + FileManager.LOG.error("Could not transfer file '" + file.getFileName() + "'"); + return null; + } finally { + /* + * Try to make sure that the streams will be closed. + */ + try { + if (in != null) { + in.close(); + } + if (out != null) { + out.close(); + } + } catch (IOException ex) { + // Ignore + } + } + final MIDependency dependency = factory.createDependency(); + dependency.setFilePath(depFile.getAbsolutePath()); + return dependency; + } + + /** + * Delivers the only instance of this class. + * + * @return The singleton instance of this class. + */ + public static FileManager getInstance() { + return instance; + } + + public List<MIDependency> loadAllDependencies() { + final List<MIDependency> resultList = new ArrayList<MIDependency>(); + /* + * Try to get all files within the library directory. + */ + final File[] files = new File(LIB_DIR).listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + if (file.getName().endsWith(JAR_EXTENSION)) { + MIDependency dependency = factory.createDependency(); + dependency.setFilePath(file.getAbsolutePath()); + resultList.add(dependency); + } + } + } + } + + return resultList; + } + + public boolean deleteDependency(final MIDependency dependency) { + File file = new File(dependency.getFilePath()); + if (file.isFile()) { + return file.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 b5ac3306..4970badc 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/PluginFinder.java @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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; import java.io.File; @@ -16,50 +36,51 @@ import kieker.analysis.plugin.port.Plugin; */ public class PluginFinder { - /** - * This method delivers all classes which are available in the given jar and - * has the Plugin-Annotation from the Kieker framework. - * - * @param url The url for the jar. - * @return A list containing all available plugin-classes or null, if an - * exception occured. - */ - public static List<Class<?>> getAllPluginsWithinJar(final URL url) { - try { - /* - * 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()); - /* - * Open the jar file and run through all entries within this file. - */ - final JarFile jarFile = new JarFile(new File(url.getPath())); - final List<Class<?>> result = new ArrayList<Class<?>>(); - Enumeration<JarEntry> jarEntries = jarFile.entries(); - while (jarEntries.hasMoreElements()) { - JarEntry jarEntry = (JarEntry) jarEntries.nextElement(); - try { - String name = jarEntry.toString(); - name = name.replace('/', '.'); - name = name.replace(".class", ""); - /* - * Try to find a class with the same name. - */ - Class<?> c = classLoader.loadClass(name); - /* - * If it is a class and has the annotation - put it into our - * list. - */ - if (c.isAnnotationPresent(Plugin.class)) { - result.add(c); - } - } catch (Throwable ex) { - } - } - return result; - } catch (IOException ex) { - return null; - } - } + /** + * This method delivers all classes which are available in the given jar and + * has the Plugin-Annotation from the Kieker framework. + * + * @param url + * The url for the jar. + * @return A list containing all available plugin-classes or null, if an + * exception occured. + */ + public static List<Class<?>> getAllPluginsWithinJar(final URL url) { + try { + /* + * 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()); + /* + * Open the jar file and run through all entries within this file. + */ + final JarFile jarFile = new JarFile(new File(url.getPath())); + final List<Class<?>> result = new ArrayList<Class<?>>(); + Enumeration<JarEntry> jarEntries = jarFile.entries(); + while (jarEntries.hasMoreElements()) { + JarEntry jarEntry = (JarEntry) jarEntries.nextElement(); + try { + String name = jarEntry.toString(); + name = name.replace('/', '.'); + name = name.replace(".class", ""); + /* + * Try to find a class with the same name. + */ + Class<?> c = classLoader.loadClass(name); + /* + * If it is a class and has the annotation - put it into our + * list. + */ + if (c.isAnnotationPresent(Plugin.class)) { + result.add(c); + } + } catch (Throwable ex) { + } + } + return result; + } catch (IOException ex) { + return null; + } + } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java index c4b3d1f0..1103a930 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToIntConverter.java @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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; @@ -11,29 +31,29 @@ import kieker.analysis.model.analysisMetaModel.MIDependency; /** * 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 = MIDependencyToIntConverter.NAME) public class MIDependencyToIntConverter implements Converter { - public static final String NAME = "kieker.webgui.converter.MIDependencyToIntConverter"; + public static final String NAME = "kieker.webgui.converter.MIDependencyToIntConverter"; - /** - * Delivers always null - */ - @Override - public Object getAsObject(FacesContext fc, UIComponent uic, String string) { - return null; - } + /** + * Delivers always null + */ + @Override + public Object getAsObject(FacesContext fc, UIComponent uic, String string) { + return null; + } - @Override - public String getAsString(FacesContext fc, UIComponent uic, Object o) { - if (o == null || !(o instanceof MIDependency)) { - return null; - } else { - long size = new File(((MIDependency) o).getFilePath()).length(); - return new DecimalFormat("#.##").format(size / 1024f / 1024).concat(" [MiByte]"); - } - } + @Override + public String getAsString(FacesContext fc, UIComponent uic, Object o) { + if (o == null || !(o instanceof MIDependency)) { + return null; + } else { + long size = new File(((MIDependency) o).getFilePath()).length(); + return new DecimalFormat("#.##").format(size / 1024f / 1024).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 f84d6af5..b503c342 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIDependencyToStringConverter.java @@ -1,3 +1,21 @@ +/** + * ************************************************************************* + * 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; @@ -10,24 +28,45 @@ import kieker.analysis.model.analysisMetaModel.MIDependency; /** * This converter can be used to convert an instance of <i>MIDependency</i> to a * human readable string, but <b>not</b> vice versa. - * + * * @author Nils Christian Ehmke */ @FacesConverter(value = MIDependencyToStringConverter.NAME) public class MIDependencyToStringConverter implements Converter { - public static final String NAME = "kieker.webgui.converter.MIDependencyToStringConverter"; + public static final String NAME = "kieker.webgui.converter.MIDependencyToStringConverter"; - /** - * Delivers always null - */ - @Override - public Object getAsObject(FacesContext fc, UIComponent uic, String string) { - return null; - } + /** + * This method delivers always null and should not be used. + * + * @param fc + * The faces context. + * @param uic + * The component. + * @param string + * The string to be converted. + * @return null + */ + @Override + public Object getAsObject(final FacesContext fc, final UIComponent uic, final String string) { + return null; + } - @Override - public String getAsString(FacesContext fc, UIComponent uic, Object o) { - return (o == null || !(o instanceof MIDependency)) ? null : (new File(((MIDependency) o).getFilePath()).getName()); - } + /** + * This method converts the given object (on condition that it is an + * instance of the class <code>MIDependency</code>) to a human readable string. + * + * @param fc + * The faces context. + * @param uic + * The component. + * @param o + * The object to be converted. + * @return A human readable represantation of the given object or null, of + * the object is from the wrong class. + */ + @Override + public String getAsString(final FacesContext fc, final UIComponent uic, final Object o) { + return (o == null || !(o instanceof MIDependency)) ? null : (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 34e1475f..104b8ecd 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/converter/MIProjectToStringConverter.java @@ -1,3 +1,23 @@ +/*************************************************************************** + * 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 javax.faces.component.UIComponent; @@ -15,6 +35,7 @@ import kieker.analysis.model.analysisMetaModel.MIProject; public class MIProjectToStringConverter implements Converter { public static final String NAME = "kieker.webgui.converter.MIProjectToStringConverter"; + /** * Delivers always null */ diff --git a/Kieker.WebGUI/src/main/webapp/main.xhtml b/Kieker.WebGUI/src/main/webapp/main.xhtml index 3cef4dc5..4f108d78 100644 --- a/Kieker.WebGUI/src/main/webapp/main.xhtml +++ b/Kieker.WebGUI/src/main/webapp/main.xhtml @@ -151,7 +151,7 @@ resizable="true" collapsible="true"> <h:form> <p:tree style="width: auto" - value="#{availablePluginsBean.availablePluginsRoot}" var="node"> + value="#{selectedProjectBean.availablePluginsRoot}" var="node"> <p:treeNode> <h:outputText value="#{node}" /> </p:treeNode> diff --git a/Kieker.WebGUI/src/main/webapp/projectDependencies.css b/Kieker.WebGUI/src/main/webapp/projectDependencies.css new file mode 100644 index 00000000..22b55ec2 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/projectDependencies.css @@ -0,0 +1,22 @@ +@charset "UTF-8"; + +.ui-button { + font-size: 15px; +} + +.ui-layout-center { + font-size: 15px; +} + +.ui-layout-north { + font-size: 15px; +} + +.ui-panel { + font-size: 15px; +} + +.my-picklist .ui-picklist .ui-picklist-list { + height: 120px; + width: 520px; +} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml b/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml index a4813ae3..6df8485c 100644 --- a/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml +++ b/Kieker.WebGUI/src/main/webapp/projectDependencies.xhtml @@ -1,26 +1,41 @@ <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:h="http://java.sun.com/jsf/html" - xmlns:f="http://java.sun.com/jsf/core" - xmlns:p="http://primefaces.org/ui"> + xmlns:h="http://java.sun.com/jsf/html" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:p="http://primefaces.org/ui"> -<f:view contentType="text/html"> - <h:head> - <title>Kieker.WebGUI - Project Dependencies</title> - <link rel="stylesheet" title="Standard-Stylesheet" type="text/css" - href="main.css" /> - </h:head> - <body> - <h:form> - <p:pickList id="pickList" value="#{selectedDependenciesBean.dependencies}" var="dependency" - itemLabel="#{dependency}" itemValue="#{dependency}" /> - <p:commandButton value="Ok" /> - <p:commandButton value="Accept" /> - <p:commandButton value="Cancel" /> - <p:commandButton value="Reset" /> - </h:form> - </body> -</f:view> + <f:view contentType="text/html"> + <h:head> + <title>Kieker.WebGUI - Project Dependencies</title> + <link rel="stylesheet" title="Standard-Stylesheet" type="text/css" + href="../projectDependencies.css" /> + </h:head> + <body> + <p:layout fullPage="true"> + <p:layoutUnit header="Navigation" position="north" collapsible="true" resizable="true"> + <!-- The control panel to get back. --> + <h:form> + Click + <p:commandLink ajax="false" action="/main"> + <h:outputText value="here" /> + </p:commandLink> + to get back to the main menu. + </h:form> + </p:layoutUnit> + + <p:layoutUnit header="Currently used Dependencies" position="center" > + <div align="center"> + <p:pickList id="pickList" value="#{selectedDependenciesBean.dependencies}" var="dependency" + itemLabel="#{dependency}" itemValue="#{dependency}" > + <f:facet name="sourceCaption">Available</f:facet> + <f:facet name="targetCaption">Project</f:facet> + </p:pickList> + </div> + </p:layoutUnit> + + </p:layout> + </body> + </f:view> </html> \ No newline at end of file -- GitLab