From 56b0ccda794718896611ba788b22a8afa47a0b0a Mon Sep 17 00:00:00 2001 From: liuhaoran <736519589@qq.com> Date: Mon, 13 Mar 2017 12:57:36 +0800 Subject: [PATCH] =?UTF-8?q?//=E7=9B=AE=E5=89=8D=E6=8F=92=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gitignore | 4 + .../pom.xml | 168 + .../readme.md | 28 + .../IDEMetadataDashboardWidget.java | 57 + .../idemetadata/IDEMetadataMetrics.java | 257 ++ .../idemetadata/IDEMetadataPlugin.java | 35 + .../idemetadata/IDEMetadataSensor.java | 176 + .../analyzers/AnalyzerException.java | 50 + .../analyzers/EclipseAnalyzer.java | 297 ++ .../idemetadata/analyzers/package-info.java | 8 + .../idemetadata/model/ProjectInfo.java | 595 +++ .../idemetadata/model/package-info.java | 7 + .../sonarqube/idemetadata/package-info.java | 8 + .../src/main/resources/.gitignore | 1 + .../idemetadata/idemetadata_widget.html.erb | 157 + .../resources/static/check-round-no-small.png | Bin 0 -> 8255 bytes .../static/check-round-yes-small.png | Bin 0 -> 7718 bytes .../idemetadata/IDEMetadataMetricsTest.java | 20 + .../idemetadata/IDEMetadataPluginTest.java | 20 + .../analyzers/EclipseAnalyzerTest.java | 105 + .../idemetadata/model/ProjectInfoTest.java | 3568 +++++++++++++++++ 类图和开发视图.vsdx | Bin 0 -> 81305 bytes 22 files changed, 5561 insertions(+) create mode 100644 deors.plugins.sonarqube.idemetadata-master/.gitignore create mode 100644 deors.plugins.sonarqube.idemetadata-master/pom.xml create mode 100644 deors.plugins.sonarqube.idemetadata-master/readme.md create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataDashboardWidget.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetrics.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPlugin.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataSensor.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/AnalyzerException.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzer.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/package-info.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfo.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/package-info.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/package-info.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/resources/.gitignore create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/resources/deors/plugins/sonarqube/idemetadata/idemetadata_widget.html.erb create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/resources/static/check-round-no-small.png create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/main/resources/static/check-round-yes-small.png create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetricsTest.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPluginTest.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzerTest.java create mode 100644 deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfoTest.java create mode 100644 类图和开发视图.vsdx diff --git a/deors.plugins.sonarqube.idemetadata-master/.gitignore b/deors.plugins.sonarqube.idemetadata-master/.gitignore new file mode 100644 index 0000000..beef00d --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/.gitignore @@ -0,0 +1,4 @@ +.classpath +.project +.settings +target diff --git a/deors.plugins.sonarqube.idemetadata-master/pom.xml b/deors.plugins.sonarqube.idemetadata-master/pom.xml new file mode 100644 index 0000000..ae603a6 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/pom.xml @@ -0,0 +1,168 @@ + + + + 4.0.0 + + deors.plugins.sonarqube.idemetadata + deors.plugins + deors.plugins.sonarqube.idemetadata + 1.0 + sonar-plugin + + + UTF-8 + + 1.8 + 5.1 + 1.0 + 1.7.5 + 1.2.16 + 1.4.3 + + 4.12 + + 0.7.5.201505241946 + ${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar + ${project.build.directory}/jacoco.exec + ${project.build.directory}/jacoco.itest + -javaagent:${jacoco.path}=destfile=${jacoco.utReport} + -javaagent:${jacoco.path}=destfile=${jacoco.itReport} + + 3.5 + + ${jacoco.itReport} + false + ${project.basedir}/findbugs-filter.xml + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + ${jacoco.utAgentConfig} + + **/it/*TestCase.java + + + + listener + org.sonar.java.jacoco.JUnitListener + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.18.1 + + ${jacoco.itAgentConfig} + + **/it/*TestCase.java + + + + + integration-test + integration-test + + integration-test + + + + + + org.codehaus.sonar + sonar-packaging-maven-plugin + 1.13 + true + + idemetadata + deors.plugins.sonarqube.idemetadata.IDEMetadataPlugin + SonarQube IDE Metadata plugin + Gathers and displays information from IDE metadata files, including project type (based on natures/facets) and dependencies. + + + + + + + + org.codehaus.sonar + sonar-plugin-api + ${sonarqube.version} + provided + + + + org.glassfish + javax.json + ${json.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + log4j + log4j + ${log4j.version} + + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + runtime + + + + + org.codehaus.sonar + sonar-testing-harness + ${sonarqube.version} + test + + + junit + junit + ${junit.version} + test + + + org.jacoco + org.jacoco.agent + ${jacoco.version} + runtime + test + + + org.sonarsource.java + sonar-jacoco-listeners + ${jacoco-listeners.version} + test + + + + diff --git a/deors.plugins.sonarqube.idemetadata-master/readme.md b/deors.plugins.sonarqube.idemetadata-master/readme.md new file mode 100644 index 0000000..031d07a --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/readme.md @@ -0,0 +1,28 @@ +deors.plugins.sonarqube.idemetadata +=================================== + +SonarQube IDE Metadata plugin gathers and displays information from IDE metadata files, +including project type (based on natures/facets) and dependencies. + +Introduction +------------ + +This is an example of a simple SonarQube plug-in that declares a few metrics at the +project level containing information extracted from IDE Metadata configuration files +(currently only Eclipse IDE is supported but other extractors can be easily created). + +To install this plug-in, follow these steps: + +A) Create the plug-in binary with this command: + + mvn clean package + +B) Copy the file to your SonarQube installation: + + copy target/deors.plugins.sonarqube.idemetadata-1.0.jar $SONARQUBE_HOME/extensions/plugins + +C) Restart SonarQube + +D) Add the widget to a dashboard + +E) Analyse a project and enjoy! diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataDashboardWidget.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataDashboardWidget.java new file mode 100644 index 0000000..c872020 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataDashboardWidget.java @@ -0,0 +1,57 @@ +package deors.plugins.sonarqube.idemetadata; + +import org.sonar.api.web.AbstractRubyTemplate; +import org.sonar.api.web.Description; +import org.sonar.api.web.RubyRailsWidget; +import org.sonar.api.web.UserRole; + +/** + * IDE Metadata plugin widget definition. + * + * @author jorge.hidalgo + * @version 1.0 + */ +@UserRole(UserRole.USER) +@Description("Shows IDE metadata configuration for the project, including project type, language support and configured frameworks") +public class IDEMetadataDashboardWidget + extends AbstractRubyTemplate + implements RubyRailsWidget { + + /** + * Default constructor. + */ + public IDEMetadataDashboardWidget() { + super(); + } + + /** + * Returns the widget id. + * + * @return the widget id + */ + public String getId() { + return "idemetadata"; + } + + /** + * Returns the widget title. + * + * @return the widget title + */ + public String getTitle() { + return "IDE Metadata"; + } + + /** + * Returns the path to the widget Ruby file. + * + * @return the path to the widget Ruby file + */ + @Override + protected String getTemplatePath() { + String templatePath = "/deors/plugins/sonarqube/idemetadata/idemetadata_widget.html.erb"; + // uncomment next line to enable change reloading during development + //templatePath = "c:/projects/deors.plugins/deors.plugins.sonarqube.idemetadata/src/main/resources" + templatePath; + return templatePath; + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetrics.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetrics.java new file mode 100644 index 0000000..cdc85a0 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetrics.java @@ -0,0 +1,257 @@ +package deors.plugins.sonarqube.idemetadata; + +import java.util.Arrays; +import java.util.List; + +import org.sonar.api.measures.CoreMetrics; +import org.sonar.api.measures.Metric; +import org.sonar.api.measures.Metrics; + +/** + * IDE Metadata plugin metrics definition. + * + * @author jorge.hidalgo + * @version 1.0 + */ +public class IDEMetadataMetrics implements Metrics { + + /** + * The project name (as configured in the IDE). + */ + public static final Metric IDE_PRJ_NAME = + new Metric.Builder( + "ide_prj_name", + "Project name in IDE", + Metric.ValueType.STRING) + .setDescription("The project name (as configured in the IDE)") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as Java in the IDE. + */ + public static final Metric IDE_IS_JAVA = + new Metric.Builder( + "ide_is_java", + "Java project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as Java in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as EAR in the IDE. + */ + public static final Metric IDE_IS_EAR = + new Metric.Builder( + "ide_is_ear", + "Enterprise Application project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as EAR in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as EJB in the IDE. + */ + public static final Metric IDE_IS_EJB = + new Metric.Builder( + "ide_is_ejb", + "Enterprise JavaBeans project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as EJB in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as Web in the IDE. + */ + public static final Metric IDE_IS_WEB = + new Metric.Builder( + "ide_is_web", + "Web Application project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as Web in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as GWT in the IDE. + */ + public static final Metric IDE_IS_GWT = + new Metric.Builder( + "ide_is_gwt", + "Google Web Toolkit project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as GWT in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as GAE in the IDE. + */ + public static final Metric IDE_IS_GAE = + new Metric.Builder( + "ide_is_gae", + "Google App Engine project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as GAE in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as Groovy in the IDE. + */ + public static final Metric IDE_IS_GROOVY = + new Metric.Builder( + "ide_is_groovy", + "Groovy project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as Groovy in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as Grails in the IDE. + */ + public static final Metric IDE_IS_GRAILS = + new Metric.Builder( + "ide_is_grails", + "Grails project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as Grails in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as PDE in the IDE. + */ + public static final Metric IDE_IS_PDE = + new Metric.Builder( + "ide_is_pde", + "Eclipse Plugin Development project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as PDE in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Whether the project is configured as JET in the IDE. + */ + public static final Metric IDE_IS_JET = + new Metric.Builder( + "ide_is_jet", + "Java Emitter Templates project", + Metric.ValueType.BOOL) + .setDescription("Whether the project is configured as JET in the IDE") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * The list of declared dependencies for the project. + */ + public static final Metric IDE_DEPENDENCIES = + new Metric.Builder( + "ide_dependencies", + "List of declared dependencies", + Metric.ValueType.STRING) + .setDescription("The list of declared dependencies for the project") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * The list of configured classpath entries for the project. + */ + public static final Metric IDE_CLASSPATH = + new Metric.Builder( + "ide_classpath", + "List of configured classpath entries", + Metric.ValueType.STRING) + .setDescription("The list of configured classpath entries for the project") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /*add code for our project*/ + + public static final Metric IDE_FILE_NUMBER = + new Metric.Builder( + "ide_classpath", + "Number of project files", + Metric.ValueType.STRING) + .setDescription("Number of project files") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + public static final Metric IDE_CLASS_NUMBER = + new Metric.Builder( + "ide_classpath", + "Number of classes that is created in the project", + Metric.ValueType.STRING) + .setDescription("Number of classes that is created in the project") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + public static final Metric WA_IS_NAMEPBM = + new Metric.Builder( + "ide_classpath", + "List of problem that named badly", + Metric.ValueType.STRING) + .setDescription("List of problem that named badly for the showed information") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + public static final Metric WA_IS_COMMENTARY = + new Metric.Builder( + "ide_classpath", + "Problem caused by less or too much commentary of code", + Metric.ValueType.STRING) + .setDescription("Problem caused by less or too much commentary of code for the showed information") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + public static final Metric WA_IS_THREAT = + new Metric.Builder( + "ide_classpath", + "Potential threat caused by Bad programming style", + Metric.ValueType.STRING) + .setDescription("Problem caused by less or too much commentary of code for the showed information") + .setQualitative(false) + .setDomain(CoreMetrics.DOMAIN_GENERAL) + .create(); + + /** + * Default constructor. + */ + public IDEMetadataMetrics() { + super(); + } + + /** + * Defines the plugin metrics. + * + * @return the list of this plugin metrics + */ + public List getMetrics() { + return Arrays.asList( + IDE_PRJ_NAME, IDE_IS_JAVA, IDE_IS_EAR, IDE_IS_EJB, IDE_IS_WEB, + IDE_IS_GWT, IDE_IS_GAE, IDE_IS_GROOVY, IDE_IS_GRAILS, + IDE_IS_PDE, IDE_IS_JET, IDE_DEPENDENCIES, IDE_CLASSPATH); + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPlugin.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPlugin.java new file mode 100644 index 0000000..278d81a --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPlugin.java @@ -0,0 +1,35 @@ +package deors.plugins.sonarqube.idemetadata; + +import java.util.Arrays; +import java.util.List; + +import org.sonar.api.Extension; +import org.sonar.api.SonarPlugin; + +/** + * IDE Metadata plugin definition. + * + * @author jorge.hidalgo + * @version 1.0 + */ +public class IDEMetadataPlugin extends SonarPlugin { + + /** + * Default constructor. + */ + public IDEMetadataPlugin() { + super(); + } + + /** + * Defines the plugin extensions: metrics, sensor and dashboard widget. + * + * @return the list of extensions for this plugin + */ + public List> getExtensions() { + return Arrays.asList( + IDEMetadataMetrics.class, + IDEMetadataSensor.class, + IDEMetadataDashboardWidget.class); + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataSensor.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataSensor.java new file mode 100644 index 0000000..a33ffef --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/IDEMetadataSensor.java @@ -0,0 +1,176 @@ +package deors.plugins.sonarqube.idemetadata; + +import java.io.File; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.batch.Sensor; +import org.sonar.api.batch.SensorContext; +import org.sonar.api.batch.fs.FileSystem; +import org.sonar.api.measures.Measure; +import org.sonar.api.resources.Project; + +import deors.plugins.sonarqube.idemetadata.analyzers.AnalyzerException; +import deors.plugins.sonarqube.idemetadata.analyzers.EclipseAnalyzer; +import deors.plugins.sonarqube.idemetadata.model.ProjectInfo; + +/** + * IDE Metadata plugin sensor. It analyses project directory in search for + * IDE metadata configuration files and extracts relevant information. + * + * @author jorge.hidalgo + * @version 1.0 + */ +public class IDEMetadataSensor implements Sensor { + + /** + * The file system object for the project being analysed. + */ + private final FileSystem fileSystem; + + /** + * The logger object for the sensor. + */ + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + /** + * Constructor that sets the file system object for the + * project being analysed. + * + * @param fileSystem the project file system + */ + public IDEMetadataSensor(FileSystem fileSystem) { + this.fileSystem = fileSystem; + } + + /** + * Determines whether the sensor should run or not for the given project. + * + * @param project the project being analysed + * @return always true + */ + public boolean shouldExecuteOnProject(Project project) { + // this sensor is executed on any type of project + return true; + } + + /** + * Analyses project directory in search for IDE metadata configuration files + * and extracts relevant information. + * + * @param project the project being analysed + * @param sensorContext the sensor context + */ + public void analyse(Project project, SensorContext sensorContext) { + + File rootDir = fileSystem.baseDir(); + + log.info("Analysing project root in search for IDE Metadata files: " + rootDir.getAbsolutePath()); + + EclipseAnalyzer analyzer = new EclipseAnalyzer(rootDir); + ProjectInfo projectInfo; + + try { + projectInfo = analyzer.analyze(); + + log.info("Analysis done"); + log.debug("this is what we've found: " + projectInfo); + + saveMainInfo(sensorContext, projectInfo); + saveDependencies(sensorContext, projectInfo); + saveClasspath(sensorContext, projectInfo); + + } catch (AnalyzerException ae) { + log.error("Error while running EclipseAnalyzer", ae); + } + } + + /** + * Saves measures corresponding to main project information. + * + * @param sensorContext the sensor context + * @param projectInfo the project information bean + */ + private void saveMainInfo(SensorContext sensorContext, ProjectInfo projectInfo) { + + log.debug("saving measures for main project information"); + + Measure measure; + + measure = new Measure(IDEMetadataMetrics.IDE_PRJ_NAME, projectInfo.getProjectName()); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_JAVA, projectInfo.isJavaProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_EAR, projectInfo.isEarProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_EJB, projectInfo.isEjbProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_WEB, projectInfo.isWebProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_GWT, projectInfo.isGwtProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_GAE, projectInfo.isGaeProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_GROOVY, projectInfo.isGroovyProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_GRAILS, projectInfo.isGrailsProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_PDE, projectInfo.isPdeProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + measure = new Measure(IDEMetadataMetrics.IDE_IS_JET, projectInfo.isJetProject() ? 1d : 0d); + sensorContext.saveMeasure(measure); + + log.debug("measures saved"); + } + + /** + * Saves measures corresponding to project dependencies information. + * + * @param sensorContext the sensor context + * @param projectInfo the project information bean + */ + private void saveDependencies(SensorContext sensorContext, ProjectInfo projectInfo) { + + log.debug("saving measure for project dependencies"); + + sensorContext.saveMeasure(new Measure( + IDEMetadataMetrics.IDE_DEPENDENCIES, projectInfo.getProjectDependencies().toString())); + + log.debug("measure saved"); + } + + /** + * Saves measures corresponding to project classpath information. + * + * @param sensorContext the sensor context + * @param projectInfo the project information bean + */ + private void saveClasspath(SensorContext sensorContext, ProjectInfo projectInfo) { + + log.debug("saving measure for project classpath"); + + sensorContext.saveMeasure(new Measure( + IDEMetadataMetrics.IDE_CLASSPATH, projectInfo.getProjectClasspath().toString())); + + log.debug("measure saved"); + } + + /** + * Returns the name of the sensor as it will be used in logs during analysis. + * + * @return the name of the sensor + */ + public String toString() { + return "IDEMetadataSensor"; + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/AnalyzerException.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/AnalyzerException.java new file mode 100644 index 0000000..cccf02b --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/AnalyzerException.java @@ -0,0 +1,50 @@ +package deors.plugins.sonarqube.idemetadata.analyzers; + +/** + * Analyzer Exception type. + * + * @author jorge.hidalgo + * @version 1.0 + */ +public class AnalyzerException extends Exception { + + /** + * Serialization id. + */ + private static final long serialVersionUID = -1644223223242751568L; + + /** + * Default constructor. + */ + public AnalyzerException() { + super(); + } + + /** + * Exception constructor from a given message. + * + * @param message the exception message + */ + public AnalyzerException(String message) { + super(message); + } + + /** + * Exception constructor from a given root cause. + * + * @param rootCause the exception root cause + */ + public AnalyzerException(Throwable rootCause) { + super(rootCause); + } + + /** + * Exception constructor from a given message and root cause. + * + * @param message the exception message + * @param rootCause the exception root cause + */ + public AnalyzerException(String message, Throwable rootCause) { + super(message, rootCause); + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzer.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzer.java new file mode 100644 index 0000000..c9b67bf --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzer.java @@ -0,0 +1,297 @@ +package deors.plugins.sonarqube.idemetadata.analyzers; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import deors.plugins.sonarqube.idemetadata.model.ProjectInfo; + +/** + * Eclipse IDE Metadata Analyzer. + * + * This tool searches for project and classpath metadata generated by Eclipse IDE + * and derived IDE's and extracts the project basic information and dependencies. + * The tool detects Java, Web, EJB, EAR, Google Web Toolkit, Google App Engine, + * Groovy, Grails, Eclipse PDE and Eclipse JET projects. + * + * @author jorge.hidalgo + * @version 1.0 + */ +public class EclipseAnalyzer { + + /** + * The project root directory. + */ + private final File rootDir; + + /** + * Bean with analysis results. + */ + private ProjectInfo projectInfo; + + /** + * XPath expression used to parse Eclipse project files. + */ + private static final String XPATH_PROJECT_NAME = "/projectDescription/name/text()"; //$NON-NLS-1$ + + /** + * XPath expression used to parse Eclipse project files. + */ + private static final String XPATH_PROJECT_DEPENDENCIES = "/projectDescription/projects/project/text()"; //$NON-NLS-1$ + + /** + * XPath expression used to parse Eclipse project files. + */ + private static final String XPATH_PROJECT_NATURES = "/projectDescription/natures/nature/text()"; //$NON-NLS-1$ + + /** + * XPath expression used to parse Eclipse facet config files. + */ + private static final String XPATH_FACET_FIXED = "/faceted-project/fixed/@facet"; //$NON-NLS-1$ + + /** + * XPath expression used to parse Eclipse facet config files. + */ + private static final String XPATH_FACET_INSTALLED = "/faceted-project/installed/@facet"; //$NON-NLS-1$ + + /** + * XPath expression used to parse Eclipse classpath files. + */ + private static final String XPATH_CLASSPATH_LIB = "/classpath/classpathentry[@kind='lib']/@path"; //$NON-NLS-1$ + + /** + * XPath expression used to parse Eclipse classpath files. + */ + private static final String XPATH_CLASSPATH_SRC = "/classpath/classpathentry[@kind='src']/@path"; //$NON-NLS-1$ + + /** + * The Eclipse project file name. + */ + private static final String PROJECT_FILE = ".project"; //$NON-NLS-1$ + + /** + * The Eclipse classpath file name. + */ + private static final String CLASSPATH_FILE = ".classpath"; //$NON-NLS-1$ + + /** + * The WST facet configuration file name. + */ + private static final String FACET_CONFIG_FILE = ".settings\\org.eclipse.wst.common.project.facet.core.xml"; //$NON-NLS-1$ + + /** + * The logger. + */ + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + /** + * Analyzer constructor. + * + * @param rootDir the project root directory + */ + public EclipseAnalyzer(final File rootDir) { + super(); + this.rootDir = rootDir; + } + + /** + * Analyzes the metadata files. + * + * @return the project information extracted from metadata files + * @throws AnalyzerException any error occurred while analyzing the metadata + * files, typically a parsing error in XML files + */ + public ProjectInfo analyze() + throws AnalyzerException { + + projectInfo = new ProjectInfo(); + + analyzeProjectFile(); + analyzeFacetsFile(); + analyzeClasspathFile(); + + return projectInfo; + } + + /** + * Analyzes the .project file. + * + * @throws AnalyzerException any error occurred while analyzing the metadata + * files, typically a parsing error in XML files + */ + private void analyzeProjectFile() + throws AnalyzerException { + + List projectDependencies = new ArrayList<>(); + List projectNatures = new ArrayList<>(); + + try { + // parses .project file + File projectFile = new File(rootDir, PROJECT_FILE); + if (!projectFile.exists()) { + return; + } + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + XPathFactory xpathFactory = XPathFactory.newInstance(); + XPath xpath = xpathFactory.newXPath(); + + Document projectDocument = builder.parse(projectFile); + + // gets project name + XPathExpression xpathProjectName = xpath.compile(XPATH_PROJECT_NAME); + NodeList projectNameNodes = (NodeList) xpathProjectName.evaluate(projectDocument, XPathConstants.NODESET); + String projectName = projectNameNodes.item(0).getNodeValue(); + + log.debug("project name = " + projectName); + + // gets project dependencies + XPathExpression xpathProjectDependencies = xpath.compile(XPATH_PROJECT_DEPENDENCIES); + NodeList projectDependenciesNodes = (NodeList) xpathProjectDependencies.evaluate(projectDocument, XPathConstants.NODESET); + for (int i = 0, n = projectDependenciesNodes.getLength(); i < n; i++) { + String supplier = projectDependenciesNodes.item(i).getNodeValue(); + projectDependencies.add(supplier); + } + + // gets project natures + XPathExpression xpathProjectNatures = xpath.compile(XPATH_PROJECT_NATURES); + NodeList projectNaturesNodes = (NodeList) xpathProjectNatures.evaluate(projectDocument, XPathConstants.NODESET); + for (int i = 0, n = projectNaturesNodes.getLength(); i < n; i++) { + projectNatures.add(projectNaturesNodes.item(i).getNodeValue()); + } + + projectInfo.setProjectName(projectName); + projectInfo.setProjectDependencies(projectDependencies); + projectInfo.setProjectNatures(projectNatures); + + } catch (ParserConfigurationException | + SAXException | + XPathExpressionException | + IOException ex) { + log.error("error parsing project file", ex); + throw new AnalyzerException("error parsing project file", ex); + } + } + + /** + * Analyzes the facet configuration file. + * + * @throws AnalyzerException any error occurred while analyzing the metadata + * files, typically a parsing error in XML files + */ + private void analyzeFacetsFile() + throws AnalyzerException { + + List projectFacets = new ArrayList<>(); + + try { + // for faceted projects, parses facet config file + File facetConfigFile = new File(rootDir, FACET_CONFIG_FILE); + if (!facetConfigFile.exists()) { + return; + } + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + XPathFactory xpathFactory = XPathFactory.newInstance(); + XPath xpath = xpathFactory.newXPath(); + + Document facetConfigDocument = builder.parse(facetConfigFile); + + // get fixed facets + XPathExpression xpathFixedFacetEntry = xpath.compile(XPATH_FACET_FIXED); + NodeList fixedFacetEntryNodes = (NodeList) xpathFixedFacetEntry.evaluate(facetConfigDocument, XPathConstants.NODESET); + for (int i = 0, n = fixedFacetEntryNodes.getLength(); i < n; i++) { + projectFacets.add(fixedFacetEntryNodes.item(i).getNodeValue()); + } + + // get installed facets + XPathExpression xpathInstalledFacetEntry = xpath.compile(XPATH_FACET_INSTALLED); + NodeList installedFacetEntryNodes = (NodeList) xpathInstalledFacetEntry.evaluate(facetConfigDocument, XPathConstants.NODESET); + for (int i = 0, n = installedFacetEntryNodes.getLength(); i < n; i++) { + projectFacets.add(installedFacetEntryNodes.item(i).getNodeValue()); + } + + projectInfo.setProjectFacets(projectFacets); + + } catch (ParserConfigurationException | + SAXException | + XPathExpressionException | + IOException ex) { + log.error("error parsing project file", ex); + throw new AnalyzerException("error parsing project file", ex); + } + } + + /** + * Analyze the classpath file. + * + * @throws AnalyzerException any error occurred while analyzing the metadata + * files, typically a parsing error in XML files + */ + private void analyzeClasspathFile() + throws AnalyzerException { + + List projectClasspath = new ArrayList<>(); + + try { + // parses .classpath file + File classpathFile = new File(rootDir, CLASSPATH_FILE); + if (!classpathFile.exists()) { + return; + } + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + XPathFactory xpathFactory = XPathFactory.newInstance(); + XPath xpath = xpathFactory.newXPath(); + + Document classpathDocument = builder.parse(classpathFile); + + // get libraries in classpath + XPathExpression xpathClasspathLibEntry = xpath.compile(XPATH_CLASSPATH_LIB); + NodeList classpathLibEntryNodes = (NodeList) xpathClasspathLibEntry.evaluate(classpathDocument, XPathConstants.NODESET); + for (int i = 0, n = classpathLibEntryNodes.getLength(); i < n; i++) { + String libName = classpathLibEntryNodes.item(i).getNodeValue(); + projectClasspath.add(libName); + } + + // get source folders in classpath + XPathExpression xpathClasspathSrcEntry = xpath.compile(XPATH_CLASSPATH_SRC); + NodeList classpathSrcEntryNodes = (NodeList) xpathClasspathSrcEntry.evaluate(classpathDocument, XPathConstants.NODESET); + for (int i = 0, n = classpathSrcEntryNodes.getLength(); i < n; i++) { + String srcName = classpathSrcEntryNodes.item(i).getNodeValue(); + projectClasspath.add(srcName); + } + + projectInfo.setProjectClasspath(projectClasspath); + + } catch (ParserConfigurationException | + SAXException | + XPathExpressionException | + IOException ex) { + log.error("error parsing project file", ex); + throw new AnalyzerException("error parsing project file", ex); + } + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/package-info.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/package-info.java new file mode 100644 index 0000000..4a4d9d1 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/analyzers/package-info.java @@ -0,0 +1,8 @@ +/** + * Sonar IDE Metadata plugin analyzers package. Contains analyzers + * for different IDE metadata (currently only Eclipse is supported). + * + * @author jorge.hidalgo + * @version 1.0 + */ +package deors.plugins.sonarqube.idemetadata.analyzers; diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfo.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfo.java new file mode 100644 index 0000000..b600dac --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfo.java @@ -0,0 +1,595 @@ +package deors.plugins.sonarqube.idemetadata.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObjectBuilder; + +/** + * The project information bean. + * + * @author jorge.hidalgo + * @version 1.2 + */ +public class ProjectInfo { + + /** + * An EAR nature identifier. + */ + static final String IBM_ETOOLS_EAR_NATURE = "com.ibm.etools.j2ee.EAR13Nature"; //$NON-NLS-1$ + + /** + * An EJB nature identifier. + */ + static final String IBM_ETOOLS_EJB_NATURE = "com.ibm.etools.j2ee.EJB2_0Nature"; //$NON-NLS-1$ + + /** + * A Java nature identifier. + */ + static final String IBM_ETOOLS_JAVA_NATURE = "com.ibm.etools.ctc.javaprojectnature"; //$NON-NLS-1$ + + /** + * A Web nature identifier. + */ + static final String IBM_ETOOLS_WEB_NATURE = "com.ibm.etools.j2ee.WebNature"; //$NON-NLS-1$ + + /** + * An EJB nature identifier. + */ + static final String IBM_WTP_EJB_NATURE = "com.ibm.wtp.ejb.EJBNature"; //$NON-NLS-1$ + + /** + * A Web nature identifier. + */ + static final String IBM_WTP_WEB_NATURE = "com.ibm.wtp.web.WebNature"; //$NON-NLS-1$ + + /** + * A Java nature identifier. + */ + static final String JAVA_NATURE = "org.eclipse.jdt.core.javanature"; //$NON-NLS-1$ + + /** + * A Faceted project nature identifier. + */ + static final String FACET_NATURE = "org.eclipse.wst.common.project.facet.core.nature"; //$NON-NLS-1$ + + /** + * A Google Web Toolkit nature identifier. + */ + static final String GWT_NATURE = "com.google.gwt.eclipse.core.gwtNature"; //$NON-NLS-1$ + + /** + * A Google App Engine nature identifier. + */ + static final String GAE_NATURE = "com.google.appengine.eclipse.core.gaeNature"; //$NON-NLS-1$ + + /** + * A Groovy nature identifier. + */ + static final String GROOVY_NATURE = "org.eclipse.jdt.groovy.core.groovyNature"; //$NON-NLS-1$ + + /** + * A Grails nature identifier. + */ + static final String GRAILS_NATURE = "com.springsource.sts.grails.core.nature"; //$NON-NLS-1$ + + /** + * An Eclipse plug-in nature identifier. + */ + static final String PDE_NATURE = "org.eclipse.pde.PluginNature"; //$NON-NLS-1$ + + /** + * A JET nature identifier. + */ + static final String JET_NATURE = "org.eclipse.jet.jet2Nature"; //$NON-NLS-1$ + + /** + * A Web facet identifier. + */ + static final String WEB_FACET = "jst.web"; //$NON-NLS-1$ + + /** + * An EJB facet identifier. + */ + static final String EJB_FACET = "jst.ejb"; //$NON-NLS-1$ + + /** + * An EAR facet identifier. + */ + static final String EAR_FACET = "jst.ear"; //$NON-NLS-1$ + + /** + * A Grails facet identifier. + */ + static final String GRAILS_FACET = "grails.app"; //$NON-NLS-1$ + + /** + * The project classpath list. + */ + private List projectClasspath; + + /** + * The project dependencies list. + */ + private List projectDependencies; + + /** + * The project name. + */ + private String projectName; + + /** + * The project natures list. + */ + private List projectNatures; + + /** + * The project facets list. + */ + private List projectFacets; + + /** + * Default constructor. + */ + public ProjectInfo() { + + super(); + + this.projectName = "DEFAULT"; //$NON-NLS-1$ + this.projectClasspath = new ArrayList<>(); + this.projectDependencies = new ArrayList<>(); + this.projectNatures = new ArrayList<>(); + this.projectFacets = new ArrayList<>(); + } + + /** + * Constructor that sets the project name. + * + * @param projectName the project name + */ + public ProjectInfo(String projectName) { + + this(); + + this.projectName = projectName; + } + + /** + * Adds a project classpath entry. + * + * @param classpathEntry the classpath entry + */ + public void addProjectClasspathEntry(String classpathEntry) { + + projectClasspath.add(classpathEntry); + } + + /** + * Adds a project dependency. + * + * @param dependencyName the dependency name + */ + public void addProjectDependency(String dependencyName) { + + projectDependencies.add(dependencyName); + } + + /** + * Adds a project nature. + * + * @param natureName the nature name + */ + public void addProjectNature(String natureName) { + + projectNatures.add(natureName); + } + + /** + * Adds a project facet. + * + * @param facetName the facet name + */ + public void addProjectFacet(String facetName) { + + projectFacets.add(facetName); + } + + /** + * Compares equality between this object and the given object. + * + * @param target the object to compare with + * + * @return whether this object and the given object are equal + */ + public boolean equals(Object target) { + + if (target == null) { + return false; + } + + if (!(target instanceof ProjectInfo)) { + return false; + } + + ProjectInfo casted = (ProjectInfo) target; + + return projectName.equals(casted.projectName); + } + + /** + * Return the hash code of this object. It is calculated using + * the AND logical operator over property values. + * + * @return the hash code + */ + public int hashCode() { + + return projectName.hashCode(); + } + + /** + * Returns the value of the property projectClasspath. + * + * @return the value of the property + */ + public List getProjectClasspath() { + + return projectClasspath; + } + + /** + * Returns the value of the property projectDependencies. + * + * @return the value of the property + */ + public List getProjectDependencies() { + + return projectDependencies; + } + + /** + * Returns the value of the property projectName. + * + * @return the value of the property + */ + public String getProjectName() { + + return projectName; + } + + /** + * Returns the value of the property projectNatures. + * + * @return the value of the property + */ + public List getProjectNatures() { + + return projectNatures; + } + + /** + * Returns the value of the property projectFacets. + * + * @return the value of the property + */ + public List getProjectFacets() { + + return projectFacets; + } + + /** + * Returns whether the project has a Java nature. + * + * @return the Java nature flag + */ + public boolean isJavaProject() { + + for (String nature : projectNatures) { + if (JAVA_NATURE.equals(nature) + || IBM_ETOOLS_JAVA_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Returns whether the project has an EAR nature. + * + * @return the EAR nature flag + */ + public boolean isEarProject() { + + for (String nature : projectNatures) { + if (IBM_ETOOLS_EAR_NATURE.equals(nature)) { + return true; + } + } + + if (isFacetedProject()) { + for (String facet : projectFacets) { + if (EAR_FACET.equals(facet)) { + return true; + } + } + } + + return false; + } + + /** + * Returns whether the project has an EJB nature. + * + * @return the EJB nature flag + */ + public boolean isEjbProject() { + + for (String nature : projectNatures) { + if (IBM_ETOOLS_EJB_NATURE.equals(nature) + || IBM_WTP_EJB_NATURE.equals(nature)) { + return true; + } + } + + if (isFacetedProject()) { + for (String facet : projectFacets) { + if (EJB_FACET.equals(facet)) { + return true; + } + } + } + + return false; + } + + /** + * Returns whether the project has a Web nature. + * + * @return the Web nature flag + */ + public boolean isWebProject() { + + for (String nature : projectNatures) { + if (IBM_ETOOLS_WEB_NATURE.equals(nature) + || IBM_WTP_WEB_NATURE.equals(nature) + || GWT_NATURE.equals(nature) + || GRAILS_NATURE.equals(nature)) { + return true; + } + } + + if (isFacetedProject()) { + for (String facet : projectFacets) { + if (WEB_FACET.equals(facet) + || GRAILS_FACET.equals(facet)) { + return true; + } + } + } + + return false; + } + + /** + * Returns whether the project has a Faceted project nature. + * + * @return the Faceted project nature flag + */ + public boolean isFacetedProject() { + + for (String nature : projectNatures) { + if (FACET_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Returns whether the project has a GWT nature. + * + * @return the GWT nature flag + */ + public boolean isGwtProject() { + + for (String nature : projectNatures) { + if (GWT_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Returns whether the project has a GAE nature. + * + * @return the GAE nature flag + */ + public boolean isGaeProject() { + + for (String nature : projectNatures) { + if (GAE_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Returns whether the project has a Groovy nature. + * + * @return the Groovy nature flag + */ + public boolean isGroovyProject() { + + for (String nature : projectNatures) { + if (GROOVY_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Returns whether the project has a Grails nature. + * + * @return the Grails nature flag + */ + public boolean isGrailsProject() { + + for (String nature : projectNatures) { + if (GRAILS_NATURE.equals(nature)) { + return true; + } + } + + if (isFacetedProject()) { + for (String facet : projectFacets) { + if (GRAILS_FACET.equals(facet)) { + return true; + } + } + } + + return false; + } + + /** + * Returns whether the project has an Eclipse plug-in nature. + * + * @return the Eclipse plug-in nature flag + */ + public boolean isPdeProject() { + + for (String nature : projectNatures) { + if (PDE_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Returns whether the project has a JET nature. + * + * @return the GraiJETls nature flag + */ + public boolean isJetProject() { + + for (String nature : projectNatures) { + if (JET_NATURE.equals(nature)) { + return true; + } + } + + return false; + } + + /** + * Changes the value of the property projectClasspath. + * + * @param projectClasspath the new value for the property + */ + public void setProjectClasspath(List projectClasspath) { + + this.projectClasspath = projectClasspath; + } + + /** + * Changes the value of the property projectDependencies. + * + * @param projectDependencies the new value for the property + */ + public void setProjectDependencies(List projectDependencies) { + + this.projectDependencies = projectDependencies; + } + + /** + * Changes the value of the property projectName. + * + * @param projectName the new value for the property + */ + public void setProjectName(String projectName) { + + this.projectName = projectName; + } + + /** + * Changes the value of the property projectNatures. + * + * @param projectNatures the new value for the property + */ + public void setProjectNatures(List projectNatures) { + + this.projectNatures = projectNatures; + } + + /** + * Changes the value of the property projectFacets. + * + * @param projectFacets the new value for the property + */ + public void setProjectFacets(List projectFacets) { + + this.projectFacets = projectFacets; + } + + /** + * Returns a JSON representation of this object. + * + * @return the JSON representation + */ + public String toJson() { + + JsonObjectBuilder jsb = Json.createObjectBuilder() + .add("name", getProjectName()); //$NON-NLS-1$ + + if (!projectDependencies.isEmpty()) { + JsonArrayBuilder jab = Json.createArrayBuilder(); + for (String dep : projectDependencies) { + jab.add(dep); + } + jsb.add("dependencies", jab); //$NON-NLS-1$ + } + + jsb.add("isJava", isJavaProject()); //$NON-NLS-1$ + jsb.add("isEar", isEarProject()); //$NON-NLS-1$ + jsb.add("isEjb", isEjbProject()); //$NON-NLS-1$ + jsb.add("isWeb", isWebProject()); //$NON-NLS-1$ + jsb.add("isGwt", isGwtProject()); //$NON-NLS-1$ + jsb.add("isGae", isGaeProject()); //$NON-NLS-1$ + jsb.add("isGroovy", isGroovyProject()); //$NON-NLS-1$ + jsb.add("isGrails", isGrailsProject()); //$NON-NLS-1$ + jsb.add("isPde", isPdeProject()); //$NON-NLS-1$ + jsb.add("isJet", isJetProject()); //$NON-NLS-1$ + + return jsb.build().toString(); + } + + /** + * Returns a string representation of this object. + * + * @return the string representation + */ + public String toString() { + + return projectName + + " dependencies " //$NON-NLS-1$ + + projectDependencies + + " natures " //$NON-NLS-1$ + + projectNatures + + " facets " //$NON-NLS-1$ + + projectFacets + + " classpath " //$NON-NLS-1$ + + projectClasspath; + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/package-info.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/package-info.java new file mode 100644 index 0000000..613d89b --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/model/package-info.java @@ -0,0 +1,7 @@ +/** + * Contains model beans for IDE Metadata plugin. + * + * @author jorge.hidalgo + * @version 1.0 + */ +package deors.plugins.sonarqube.idemetadata.model; diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/package-info.java b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/package-info.java new file mode 100644 index 0000000..3d39240 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/java/deors/plugins/sonarqube/idemetadata/package-info.java @@ -0,0 +1,8 @@ +/** + * Sonar IDE Metadata plugin root package. Contains plugin definition, + * metrics definition, sensor and dashboard widget. + * + * @author jorge.hidalgo + * @version 1.0 + */ +package deors.plugins.sonarqube.idemetadata; diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/resources/.gitignore b/deors.plugins.sonarqube.idemetadata-master/src/main/resources/.gitignore new file mode 100644 index 0000000..17ae84b --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/resources/.gitignore @@ -0,0 +1 @@ +rebel.xml diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/resources/deors/plugins/sonarqube/idemetadata/idemetadata_widget.html.erb b/deors.plugins.sonarqube.idemetadata-master/src/main/resources/deors/plugins/sonarqube/idemetadata/idemetadata_widget.html.erb new file mode 100644 index 0000000..cae3bba --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/main/resources/deors/plugins/sonarqube/idemetadata/idemetadata_widget.html.erb @@ -0,0 +1,157 @@ +<% + def check_image(metric_or_measure) + html = '' + + if metric_or_measure.is_a? ProjectMeasure + m = metric_or_measure + elsif @snapshot + m = @snapshot.measure(metric_or_measure) + end + + if m.nil? + return '' + end + + if m && m.metric + if m.value == 1 + html = image_tag(url_for_static(:plugin => 'idemetadata', :path => 'check-round-yes-small.png'), :size => '16x16', :style => 'vertical-align:middle') + elsif + html = image_tag(url_for_static(:plugin => 'idemetadata', :path => 'check-round-no-small.png'), :size => '16x16', :style => 'vertical-align:middle') + end + end + + html + end + + def remove_brackets(metric_or_measure) + out = '' + + if metric_or_measure.is_a? ProjectMeasure + m = metric_or_measure + elsif @snapshot + m = @snapshot.measure(metric_or_measure) + end + + if m.nil? + return '' + end + + if m && m.metric + out = m.data[1..-2] + end + + out + end +%> +
+

Project name (as configured in the IDE):

+

+ + <%= format_measure('ide_prj_name') %> + +

+
+
+ + + + + + + +
+

Project type and active frameworks:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ <%= check_image('ide_is_java') -%> + Java VM +
+ <%= check_image('ide_is_ear') -%> + Java Enterprise Application (EAR) +
+ <%= check_image('ide_is_ejb') -%> + Enterprise JavaBeans (EJB) +
+ <%= check_image('ide_is_web') -%> + Web +
+ <%= check_image('ide_is_gwt') -%> + Google Web Toolkit +
+ <%= check_image('ide_is_gae') -%> + Google App Engine +
+ <%= check_image('ide_is_groovy') -%> + Groovy +
+ <%= check_image('ide_is_grails') -%> + Grails +
+ <%= check_image('ide_is_pde') -%> + Eclipse Plug-in +
+ <%= check_image('ide_is_jet') -%> + Eclipse JET code generator +
+
+

Declared dependencies:

+ + + <% remove_brackets('ide_dependencies').split(/, /).each do |it| %> + + + + <% end %> + +
+ <%= image_tag('bullet_black.png', :style => 'vertical-align:middle') -%> + <%= it -%> +
+
+

Configured source folders:

+ + + <% remove_brackets('ide_classpath').split(/, /).each do |it| %> + + + + <% end %> + +
+ <%= image_tag('bullet_black.png', :style => 'vertical-align:middle') -%> + <%= it -%> +
+
+
diff --git a/deors.plugins.sonarqube.idemetadata-master/src/main/resources/static/check-round-no-small.png b/deors.plugins.sonarqube.idemetadata-master/src/main/resources/static/check-round-no-small.png new file mode 100644 index 0000000000000000000000000000000000000000..39e8c987cba4857cb258003691f5edb874cd5990 GIT binary patch literal 8255 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 literal 0 HcmV?d00001 diff --git a/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetricsTest.java b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetricsTest.java new file mode 100644 index 0000000..22c658a --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataMetricsTest.java @@ -0,0 +1,20 @@ +package deors.plugins.sonarqube.idemetadata; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class IDEMetadataMetricsTest { + + public IDEMetadataMetricsTest() { + super(); + } + + @Test + public void testMetricsDefinition() { + + IDEMetadataMetrics metrics = new IDEMetadataMetrics(); + + assertEquals("plug-in should have 13 metrics defined", 13, metrics.getMetrics().size()); + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPluginTest.java b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPluginTest.java new file mode 100644 index 0000000..004e320 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/IDEMetadataPluginTest.java @@ -0,0 +1,20 @@ +package deors.plugins.sonarqube.idemetadata; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class IDEMetadataPluginTest { + + public IDEMetadataPluginTest() { + super(); + } + + @Test + public void testPluginDefinition() { + + IDEMetadataPlugin plugin = new IDEMetadataPlugin(); + + assertEquals("plug-in should have 3 extensions defined", 3, plugin.getExtensions().size()); + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzerTest.java b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzerTest.java new file mode 100644 index 0000000..e9ee0b0 --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/analyzers/EclipseAnalyzerTest.java @@ -0,0 +1,105 @@ +package deors.plugins.sonarqube.idemetadata.analyzers; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; + +import org.junit.Test; + +import deors.plugins.sonarqube.idemetadata.model.ProjectInfo; + + +public class EclipseAnalyzerTest { + public EclipseAnalyzerTest() { + super(); + } + + @Test + public void testMissingProject() throws AnalyzerException { + + EclipseAnalyzer ea = new EclipseAnalyzer(new File("missing-dir")); + + ProjectInfo projectInfo = ea.analyze(); + + assertFalse("project should not be Java", projectInfo.isJavaProject()); + } + + @Test + public void testUnfacetedJavaProject() throws URISyntaxException, AnalyzerException { + + URL settingsUrl = this.getClass().getResource("/project1"); + File settingsDir = new File(settingsUrl.toURI()); + + EclipseAnalyzer ea = new EclipseAnalyzer(settingsDir); + + ProjectInfo projectInfo = ea.analyze(); + + assertFalse("project should not be faceted", projectInfo.isFacetedProject()); + assertTrue("project should be Java", projectInfo.isJavaProject()); + } + + @Test + public void testFacetedJavaWebProject() throws URISyntaxException, AnalyzerException { + + URL settingsUrl = this.getClass().getResource("/project2"); + File settingsDir = new File(settingsUrl.toURI()); + + EclipseAnalyzer ea = new EclipseAnalyzer(settingsDir); + + ProjectInfo projectInfo = ea.analyze(); + + assertTrue("project should be faceted", projectInfo.isFacetedProject()); + assertTrue("project should be Java", projectInfo.isJavaProject()); + assertTrue("project should be Web", projectInfo.isWebProject()); + } + + @Test + public void testProjectWithDependencies() throws URISyntaxException, AnalyzerException { + + URL settingsUrl = this.getClass().getResource("/project3"); + File settingsDir = new File(settingsUrl.toURI()); + + EclipseAnalyzer ea = new EclipseAnalyzer(settingsDir); + + ProjectInfo projectInfo = ea.analyze(); + + assertFalse("project should have dependencies", projectInfo.getProjectDependencies().isEmpty()); + assertFalse("project should depend on classpath libraries", projectInfo.getProjectClasspath().isEmpty()); + } + + @Test(expected = AnalyzerException.class) + public void testProjectWithBadFiles1() throws URISyntaxException, AnalyzerException { + + URL settingsUrl = this.getClass().getResource("/badproject1"); + File settingsDir = new File(settingsUrl.toURI()); + + EclipseAnalyzer ea = new EclipseAnalyzer(settingsDir); + + ea.analyze(); + } + + @Test(expected = AnalyzerException.class) + public void testProjectWithBadFiles2() throws URISyntaxException, AnalyzerException { + + URL settingsUrl = this.getClass().getResource("/badproject2"); + File settingsDir = new File(settingsUrl.toURI()); + + EclipseAnalyzer ea = new EclipseAnalyzer(settingsDir); + + ea.analyze(); + } + + @Test(expected = AnalyzerException.class) + public void testProjectWithBadFiles3() throws URISyntaxException, AnalyzerException { + + URL settingsUrl = this.getClass().getResource("/badproject3"); + File settingsDir = new File(settingsUrl.toURI()); + + EclipseAnalyzer ea = new EclipseAnalyzer(settingsDir); + + ea.analyze(); + } +} diff --git a/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfoTest.java b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfoTest.java new file mode 100644 index 0000000..ace62cf --- /dev/null +++ b/deors.plugins.sonarqube.idemetadata-master/src/test/java/deors/plugins/sonarqube/idemetadata/model/ProjectInfoTest.java @@ -0,0 +1,3568 @@ +package deors.plugins.sonarqube.idemetadata.model; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Vector; +import org.junit.*; +import static org.junit.Assert.*; + +/** + * The class ProjectInfoTest contains tests for the class {@link ProjectInfo}. + * + * @generatedBy CodePro at 14/06/13 23:26 + * @author jorge.hidalgo + * @version $Revision: 1.0 $ + */ +public class ProjectInfoTest { + + private ProjectInfo fixture1; + + private ProjectInfo fixture2; + + private ProjectInfo fixture3; + + private ProjectInfo fixture4; + + private ProjectInfo fixture5; + + private ProjectInfo fixture6; + + private ProjectInfo fixture7; + + private ProjectInfo fixture8; + + private ProjectInfo fixture9; + + private ProjectInfo fixture10; + + private ProjectInfo fixture11; + + private ProjectInfo fixture12; + + public ProjectInfo getFixture3() { + if (fixture3 == null) { + fixture3 = new ProjectInfo("PRJ3"); + fixture3.addProjectDependency("DEP3"); + fixture3.addProjectNature(ProjectInfo.GAE_NATURE); + fixture3.addProjectNature(ProjectInfo.JAVA_NATURE); + fixture3.addProjectNature(ProjectInfo.FACET_NATURE); + fixture3.addProjectNature(ProjectInfo.GRAILS_NATURE); + fixture3.addProjectNature(ProjectInfo.GROOVY_NATURE); + fixture3.addProjectNature(ProjectInfo.GWT_NATURE); + fixture3.addProjectNature(ProjectInfo.JET_NATURE); + fixture3.addProjectNature(ProjectInfo.PDE_NATURE); + fixture3.addProjectFacet(ProjectInfo.EAR_FACET); + fixture3.addProjectFacet(ProjectInfo.EJB_FACET); + fixture3.addProjectFacet(ProjectInfo.WEB_FACET); + } + return fixture3; + } + + public ProjectInfo getFixture4() { + if (fixture4 == null) { + fixture4 = new ProjectInfo("PRJ4"); + fixture4.addProjectDependency("DEP4"); + fixture4.addProjectNature(ProjectInfo.IBM_ETOOLS_JAVA_NATURE); + fixture4.addProjectNature(ProjectInfo.IBM_ETOOLS_EAR_NATURE); + fixture4.addProjectNature(ProjectInfo.IBM_ETOOLS_EJB_NATURE); + } + return fixture4; + } + + public ProjectInfo getFixture5() { + if (fixture5 == null) { + fixture5 = new ProjectInfo("PRJ5"); + fixture5.addProjectDependency("DEP5"); + fixture5.addProjectNature(ProjectInfo.IBM_WTP_EJB_NATURE); + } + return fixture5; + } + + public ProjectInfo getFixture6() { + if (fixture6 == null) { + fixture6 = new ProjectInfo("PRJ6"); + fixture6.addProjectDependency("DEP6"); + fixture6.addProjectNature(ProjectInfo.FACET_NATURE); + fixture6.addProjectFacet(ProjectInfo.EJB_FACET); + } + return fixture6; + } + + public ProjectInfo getFixture7() { + if (fixture7 == null) { + fixture7 = new ProjectInfo("PRJ7"); + fixture7.addProjectDependency("DEP7"); + fixture7.addProjectNature(ProjectInfo.FACET_NATURE); + fixture7.addProjectFacet(ProjectInfo.EAR_FACET); + } + return fixture7; + } + + public ProjectInfo getFixture8() { + if (fixture8 == null) { + fixture8 = new ProjectInfo("PRJ8"); + fixture8.addProjectDependency("DEP8"); + fixture8.addProjectNature(ProjectInfo.GWT_NATURE); + } + return fixture8; + } + + public ProjectInfo getFixture9() { + if (fixture9 == null) { + fixture9 = new ProjectInfo("PRJ9"); + fixture9.addProjectDependency("DEP9"); + fixture9.addProjectNature(ProjectInfo.IBM_WTP_WEB_NATURE); + } + return fixture9; + } + + public ProjectInfo getFixture10() { + if (fixture10 == null) { + fixture10 = new ProjectInfo("PRJ10"); + fixture10.addProjectDependency("DEP10"); + fixture10.addProjectNature(ProjectInfo.IBM_ETOOLS_WEB_NATURE); + } + return fixture10; + } + + public ProjectInfo getFixture11() { + if (fixture11 == null) { + fixture11 = new ProjectInfo("PRJ11"); + fixture11.addProjectDependency("DEP11"); + fixture11.addProjectNature(ProjectInfo.FACET_NATURE); + fixture11.addProjectFacet(ProjectInfo.WEB_FACET); + } + return fixture11; + } + + public ProjectInfo getFixture12() { + if (fixture12 == null) { + fixture12 = new ProjectInfo("PRJ12"); + fixture12.addProjectDependency("DEP12"); + fixture12.addProjectNature(ProjectInfo.FACET_NATURE); + fixture12.addProjectFacet(ProjectInfo.GRAILS_FACET); + } + return fixture12; + } + + @Test + public void testisGaeProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isGaeProject(); + assertEquals(true, result); + } + + @Test + public void testisGaeProject_fixture4() + throws Exception { + ProjectInfo projectInfo = getFixture4(); + boolean result = projectInfo.isGaeProject(); + assertEquals(false, result); + } + + @Test + public void testIsEarProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isEarProject(); + assertEquals(true, result); + } + + @Test + public void testIsEarProject_fixture4() + throws Exception { + ProjectInfo projectInfo = getFixture4(); + boolean result = projectInfo.isEarProject(); + assertEquals(true, result); + } + + @Test + public void testIsEarProject_fixture6() + throws Exception { + ProjectInfo projectInfo = getFixture6(); + boolean result = projectInfo.isEarProject(); + assertEquals(false, result); + } + + @Test + public void testIsEarProject_fixture7() + throws Exception { + ProjectInfo projectInfo = getFixture7(); + boolean result = projectInfo.isEarProject(); + assertEquals(true, result); + } + + @Test + public void testIsEjbProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isEjbProject(); + assertEquals(true, result); + } + + @Test + public void testIsEjbProject_fixture4() + throws Exception { + ProjectInfo projectInfo = getFixture4(); + boolean result = projectInfo.isEjbProject(); + assertEquals(true, result); + } + + @Test + public void testIsEjbProject_fixture5() + throws Exception { + ProjectInfo projectInfo = getFixture5(); + boolean result = projectInfo.isEjbProject(); + assertEquals(true, result); + } + + @Test + public void testIsEjbProject_fixture7() + throws Exception { + ProjectInfo projectInfo = getFixture7(); + boolean result = projectInfo.isEjbProject(); + assertEquals(false, result); + } + + @Test + public void testIsFacetedProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isFacetedProject(); + assertEquals(true, result); + } + + @Test + public void testIsGrailsProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isGrailsProject(); + assertEquals(true, result); + } + + @Test + public void testIsGroovyProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isGroovyProject(); + assertEquals(true, result); + } + + @Test + public void testIsGwtProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isGwtProject(); + assertEquals(true, result); + } + + @Test + public void testIsJavaProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isJavaProject(); + assertEquals(true, result); + } + + @Test + public void testIsJavaProjectfixture4() + throws Exception { + ProjectInfo projectInfo = getFixture4(); + boolean result = projectInfo.isJavaProject(); + assertEquals(true, result); + } + + @Test + public void testIsJetProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isJetProject(); + assertEquals(true, result); + } + + @Test + public void testIsPdeProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isPdeProject(); + assertEquals(true, result); + } + + @Test + public void testIsWebProject_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + boolean result = projectInfo.isWebProject(); + assertEquals(true, result); + } + + @Test + public void testIsWebProject_fixture7() + throws Exception { + ProjectInfo projectInfo = getFixture7(); + boolean result = projectInfo.isWebProject(); + assertEquals(false, result); + } + + @Test + public void testIsWebProject_fixture8() + throws Exception { + ProjectInfo projectInfo = getFixture8(); + boolean result = projectInfo.isWebProject(); + assertEquals(true, result); + } + + @Test + public void testIsWebProject_fixture9() + throws Exception { + ProjectInfo projectInfo = getFixture9(); + boolean result = projectInfo.isWebProject(); + assertEquals(true, result); + } + + @Test + public void testIsWebProject_fixture10() + throws Exception { + ProjectInfo projectInfo = getFixture10(); + boolean result = projectInfo.isWebProject(); + assertEquals(true, result); + } + + @Test + public void testIsWebProject_fixture11() + throws Exception { + ProjectInfo projectInfo = getFixture11(); + boolean result = projectInfo.isWebProject(); + assertEquals(true, result); + } + + @Test + public void testIsGrailsProject_fixture11() + throws Exception { + ProjectInfo projectInfo = getFixture11(); + boolean result = projectInfo.isGrailsProject(); + assertEquals(false, result); + } + + @Test + public void testIsWebProject_fixture12() + throws Exception { + ProjectInfo projectInfo = getFixture12(); + boolean result = projectInfo.isWebProject(); + assertEquals(true, result); + } + + @Test + public void testIsGrailsProject_fixture12() + throws Exception { + ProjectInfo projectInfo = getFixture12(); + boolean result = projectInfo.isGrailsProject(); + assertEquals(true, result); + } + + @Test + public void testToJson_fixture3() + throws Exception { + ProjectInfo projectInfo = getFixture3(); + String result = projectInfo.toJson(); + assertEquals("{\"name\":\"PRJ3\",\"dependencies\":[\"DEP3\"],\"isJava\":true,\"isEar\":true,\"isEjb\":true,\"isWeb\":true,\"isGwt\":true,\"isGae\":true,\"isGroovy\":true,\"isGrails\":true,\"isPde\":true,\"isJet\":true}", result); + } + + /** + * Return an instance of the class being tested. + * + * @return an instance of the class being tested + * + * @see ProjectInfo + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + public ProjectInfo getFixture1() + throws Exception { + if (fixture1 == null) { + fixture1 = new ProjectInfo(""); + } + return fixture1; + } + + /** + * Return an instance of the class being tested. + * + * @return an instance of the class being tested + * + * @see ProjectInfo + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + public ProjectInfo getFixture2() + throws Exception { + if (fixture2 == null) { + fixture2 = new ProjectInfo(); + } + return fixture2; + } + + /** + * Run the ProjectInfo() constructor test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testProjectInfo_1() + throws Exception { + + ProjectInfo result = new ProjectInfo(); + + // add additional test code here + assertNotNull(result); + assertEquals("DEFAULT dependencies [] natures [] facets [] classpath []", result.toString()); + assertEquals("DEFAULT", result.getProjectName()); + assertEquals(false, result.isJavaProject()); + assertEquals(false, result.isFacetedProject()); + assertEquals(false, result.isGroovyProject()); + assertEquals(false, result.isEjbProject()); + assertEquals(false, result.isGwtProject()); + assertEquals(false, result.isEarProject()); + assertEquals("{\"name\":\"DEFAULT\",\"isJava\":false,\"isEar\":false,\"isEjb\":false,\"isWeb\":false,\"isGwt\":false,\"isGae\":false,\"isGroovy\":false,\"isGrails\":false,\"isPde\":false,\"isJet\":false}", result.toJson()); + assertEquals(false, result.isJetProject()); + assertEquals(false, result.isPdeProject()); + assertEquals(false, result.isWebProject()); + assertEquals(false, result.isGrailsProject()); + assertEquals(false, result.isGaeProject()); + } + + /** + * Run the ProjectInfo(String) constructor test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testProjectInfo_2() + throws Exception { + String projectName = ""; + + ProjectInfo result = new ProjectInfo(projectName); + + // add additional test code here + assertNotNull(result); + assertEquals(" dependencies [] natures [] facets [] classpath []", result.toString()); + assertEquals("", result.getProjectName()); + assertEquals(false, result.isJavaProject()); + assertEquals(false, result.isFacetedProject()); + assertEquals(false, result.isGroovyProject()); + assertEquals(false, result.isEjbProject()); + assertEquals(false, result.isGwtProject()); + assertEquals(false, result.isEarProject()); + assertEquals("{\"name\":\"\",\"isJava\":false,\"isEar\":false,\"isEjb\":false,\"isWeb\":false,\"isGwt\":false,\"isGae\":false,\"isGroovy\":false,\"isGrails\":false,\"isPde\":false,\"isJet\":false}", result.toJson()); + assertEquals(false, result.isJetProject()); + assertEquals(false, result.isPdeProject()); + assertEquals(false, result.isWebProject()); + assertEquals(false, result.isGrailsProject()); + assertEquals(false, result.isGaeProject()); + } + + /** + * Run the ProjectInfo(String) constructor test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testProjectInfo_3() + throws Exception { + String projectName = "0123456789"; + + ProjectInfo result = new ProjectInfo(projectName); + + // add additional test code here + assertNotNull(result); + assertEquals("0123456789 dependencies [] natures [] facets [] classpath []", result.toString()); + assertEquals("0123456789", result.getProjectName()); + assertEquals(false, result.isJavaProject()); + assertEquals(false, result.isFacetedProject()); + assertEquals(false, result.isGroovyProject()); + assertEquals(false, result.isEjbProject()); + assertEquals(false, result.isGwtProject()); + assertEquals(false, result.isEarProject()); + assertEquals("{\"name\":\"0123456789\",\"isJava\":false,\"isEar\":false,\"isEjb\":false,\"isWeb\":false,\"isGwt\":false,\"isGae\":false,\"isGroovy\":false,\"isGrails\":false,\"isPde\":false,\"isJet\":false}", result.toJson()); + assertEquals(false, result.isJetProject()); + assertEquals(false, result.isPdeProject()); + assertEquals(false, result.isWebProject()); + assertEquals(false, result.isGrailsProject()); + assertEquals(false, result.isGaeProject()); + } + + /** + * Run the void addProjectClasspathEntry(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectClasspathEntry_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + String classpathEntry = ""; + + fixture.addProjectClasspathEntry(classpathEntry); + + // add additional test code here + } + + /** + * Run the void addProjectClasspathEntry(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectClasspathEntry_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + String classpathEntry = "0123456789"; + + fixture.addProjectClasspathEntry(classpathEntry); + + // add additional test code here + } + + /** + * Run the void addProjectClasspathEntry(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectClasspathEntry_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + String classpathEntry = ""; + + fixture.addProjectClasspathEntry(classpathEntry); + + // add additional test code here + } + + /** + * Run the void addProjectClasspathEntry(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectClasspathEntry_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + String classpathEntry = "0123456789"; + + fixture.addProjectClasspathEntry(classpathEntry); + + // add additional test code here + } + + /** + * Run the void addProjectDependency(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectDependency_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + String dependencyName = ""; + + fixture.addProjectDependency(dependencyName); + + // add additional test code here + } + + /** + * Run the void addProjectDependency(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectDependency_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + String dependencyName = "0123456789"; + + fixture.addProjectDependency(dependencyName); + + // add additional test code here + } + + /** + * Run the void addProjectDependency(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectDependency_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + String dependencyName = ""; + + fixture.addProjectDependency(dependencyName); + + // add additional test code here + } + + /** + * Run the void addProjectDependency(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectDependency_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + String dependencyName = "0123456789"; + + fixture.addProjectDependency(dependencyName); + + // add additional test code here + } + + /** + * Run the void addProjectFacet(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectFacet_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + String facetName = ""; + + fixture.addProjectFacet(facetName); + + // add additional test code here + } + + /** + * Run the void addProjectFacet(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectFacet_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + String facetName = "0123456789"; + + fixture.addProjectFacet(facetName); + + // add additional test code here + } + + /** + * Run the void addProjectFacet(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectFacet_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + String facetName = ""; + + fixture.addProjectFacet(facetName); + + // add additional test code here + } + + /** + * Run the void addProjectFacet(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectFacet_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + String facetName = "0123456789"; + + fixture.addProjectFacet(facetName); + + // add additional test code here + } + + /** + * Run the void addProjectNature(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectNature_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + String natureName = ""; + + fixture.addProjectNature(natureName); + + // add additional test code here + } + + /** + * Run the void addProjectNature(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectNature_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + String natureName = "0123456789"; + + fixture.addProjectNature(natureName); + + // add additional test code here + } + + /** + * Run the void addProjectNature(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectNature_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + String natureName = ""; + + fixture.addProjectNature(natureName); + + // add additional test code here + } + + /** + * Run the void addProjectNature(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testAddProjectNature_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + String natureName = "0123456789"; + + fixture.addProjectNature(natureName); + + // add additional test code here + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + Object target = "1"; + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + Object target = null; + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + Object target = new ProjectInfo(""); + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(true, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + Object target = new ProjectInfo(); + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(true, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture2_3() + throws Exception { + ProjectInfo fixture = getFixture2(); + Object target = "1"; + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture1_3() + throws Exception { + ProjectInfo fixture = getFixture1(); + Object target = null; + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture2_4() + throws Exception { + ProjectInfo fixture = getFixture2(); + Object target = new ProjectInfo(""); + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean equals(Object) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testEquals_fixture1_4() + throws Exception { + ProjectInfo fixture = getFixture1(); + Object target = new ProjectInfo(); + + boolean result = fixture.equals(target); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the List getProjectClasspath() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectClasspath_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + List result = fixture.getProjectClasspath(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the List getProjectClasspath() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectClasspath_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + List result = fixture.getProjectClasspath(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the List getProjectDependencies() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectDependencies_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + List result = fixture.getProjectDependencies(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the List getProjectDependencies() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectDependencies_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + List result = fixture.getProjectDependencies(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the List getProjectFacets() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectFacets_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + List result = fixture.getProjectFacets(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the List getProjectFacets() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectFacets_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + List result = fixture.getProjectFacets(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the String getProjectName() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectName_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + String result = fixture.getProjectName(); + + // add additional test code here + assertEquals("", result); + } + + /** + * Run the String getProjectName() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectName_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + String result = fixture.getProjectName(); + + // add additional test code here + assertEquals("DEFAULT", result); + } + + /** + * Run the List getProjectNatures() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectNatures_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + List result = fixture.getProjectNatures(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the List getProjectNatures() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testGetProjectNatures_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + List result = fixture.getProjectNatures(); + + // add additional test code here + assertNotNull(result); + assertEquals(0, result.size()); + } + + /** + * Run the int hashCode() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testHashCode_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + int result = fixture.hashCode(); + + // add additional test code here + assertEquals(0, result); + } + + /** + * Run the int hashCode() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testHashCode_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + int result = fixture.hashCode(); + + // add additional test code here + assertEquals(-2032180703, result); + } + + /** + * Run the boolean isEarProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsEarProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isEarProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isEarProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsEarProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isEarProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isEjbProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsEjbProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isEjbProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isEjbProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsEjbProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isEjbProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isFacetedProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsFacetedProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isFacetedProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isFacetedProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsFacetedProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isFacetedProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGaeProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGaeProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isGaeProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGaeProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGaeProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isGaeProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGrailsProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGrailsProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isGrailsProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGrailsProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGrailsProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isGrailsProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGroovyProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGroovyProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isGroovyProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGroovyProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGroovyProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isGroovyProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGwtProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGwtProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isGwtProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isGwtProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsGwtProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isGwtProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isJavaProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsJavaProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isJavaProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isJavaProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsJavaProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isJavaProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isJetProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsJetProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isJetProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isJetProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsJetProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isJetProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isPdeProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsPdeProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isPdeProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isPdeProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsPdeProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isPdeProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isWebProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsWebProject_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + boolean result = fixture.isWebProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the boolean isWebProject() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testIsWebProject_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + boolean result = fixture.isWebProject(); + + // add additional test code here + assertEquals(false, result); + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectClasspath = new ArrayList(); + projectClasspath.add(""); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectClasspath = new ArrayList(); + projectClasspath.add(""); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectClasspath = new ArrayList(); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectClasspath = new LinkedList(); + projectClasspath.add(""); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_3() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectClasspath = new LinkedList(); + projectClasspath.add(""); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_3() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectClasspath = new LinkedList(); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_4() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectClasspath = new Vector(); + projectClasspath.add(""); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_4() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectClasspath = new Vector(); + projectClasspath.add(""); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_5() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectClasspath = new Vector(); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_5() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectClasspath = new ArrayList(); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_6() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectClasspath = new LinkedList(); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_6() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectClasspath = new Vector(); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_7() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectClasspath = new ArrayList(); + projectClasspath.add(""); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_7() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectClasspath = new ArrayList(); + projectClasspath.add(""); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_8() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectClasspath = new ArrayList(); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_8() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectClasspath = new LinkedList(); + projectClasspath.add(""); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_9() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectClasspath = new LinkedList(); + projectClasspath.add(""); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_9() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectClasspath = new LinkedList(); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_10() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectClasspath = new Vector(); + projectClasspath.add(""); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_10() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectClasspath = new Vector(); + projectClasspath.add(""); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_11() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectClasspath = new Vector(); + projectClasspath.add("0123456789"); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_11() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectClasspath = new ArrayList(); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture2_12() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectClasspath = new LinkedList(); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectClasspath(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectClasspath_fixture1_12() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectClasspath = new Vector(); + + fixture.setProjectClasspath(projectClasspath); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectDependencies = new ArrayList(); + projectDependencies.add(""); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectDependencies = new ArrayList(); + projectDependencies.add(""); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectDependencies = new ArrayList(); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectDependencies = new LinkedList(); + projectDependencies.add(""); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_3() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectDependencies = new LinkedList(); + projectDependencies.add(""); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_3() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectDependencies = new LinkedList(); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_4() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectDependencies = new Vector(); + projectDependencies.add(""); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_4() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectDependencies = new Vector(); + projectDependencies.add(""); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_5() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectDependencies = new Vector(); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_5() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectDependencies = new ArrayList(); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_6() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectDependencies = new LinkedList(); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_6() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectDependencies = new Vector(); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_7() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectDependencies = new ArrayList(); + projectDependencies.add(""); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_7() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectDependencies = new ArrayList(); + projectDependencies.add(""); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_8() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectDependencies = new ArrayList(); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_8() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectDependencies = new LinkedList(); + projectDependencies.add(""); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_9() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectDependencies = new LinkedList(); + projectDependencies.add(""); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_9() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectDependencies = new LinkedList(); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_10() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectDependencies = new Vector(); + projectDependencies.add(""); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_10() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectDependencies = new Vector(); + projectDependencies.add(""); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_11() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectDependencies = new Vector(); + projectDependencies.add("0123456789"); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_11() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectDependencies = new ArrayList(); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture2_12() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectDependencies = new LinkedList(); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectDependencies(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectDependencies_fixture1_12() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectDependencies = new Vector(); + + fixture.setProjectDependencies(projectDependencies); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectFacets = new ArrayList(); + projectFacets.add(""); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectFacets = new ArrayList(); + projectFacets.add(""); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectFacets = new ArrayList(); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectFacets = new LinkedList(); + projectFacets.add(""); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_3() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectFacets = new LinkedList(); + projectFacets.add(""); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_3() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectFacets = new LinkedList(); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_4() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectFacets = new Vector(); + projectFacets.add(""); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_4() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectFacets = new Vector(); + projectFacets.add(""); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_5() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectFacets = new Vector(); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_5() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectFacets = new ArrayList(); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_6() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectFacets = new LinkedList(); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_6() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectFacets = new Vector(); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_7() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectFacets = new ArrayList(); + projectFacets.add(""); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_7() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectFacets = new ArrayList(); + projectFacets.add(""); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_8() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectFacets = new ArrayList(); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_8() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectFacets = new LinkedList(); + projectFacets.add(""); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_9() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectFacets = new LinkedList(); + projectFacets.add(""); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_9() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectFacets = new LinkedList(); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_10() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectFacets = new Vector(); + projectFacets.add(""); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_10() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectFacets = new Vector(); + projectFacets.add(""); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_11() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectFacets = new Vector(); + projectFacets.add("0123456789"); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_11() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectFacets = new ArrayList(); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture2_12() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectFacets = new LinkedList(); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectFacets(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectFacets_fixture1_12() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectFacets = new Vector(); + + fixture.setProjectFacets(projectFacets); + + // add additional test code here + } + + /** + * Run the void setProjectName(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectName_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + String projectName = ""; + + fixture.setProjectName(projectName); + + // add additional test code here + } + + /** + * Run the void setProjectName(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectName_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + String projectName = "0123456789"; + + fixture.setProjectName(projectName); + + // add additional test code here + } + + /** + * Run the void setProjectName(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectName_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + String projectName = ""; + + fixture.setProjectName(projectName); + + // add additional test code here + } + + /** + * Run the void setProjectName(String) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectName_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + String projectName = "0123456789"; + + fixture.setProjectName(projectName); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectNatures = new ArrayList(); + projectNatures.add(""); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectNatures = new ArrayList(); + projectNatures.add(""); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_2() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectNatures = new ArrayList(); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_2() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectNatures = new LinkedList(); + projectNatures.add(""); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_3() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectNatures = new LinkedList(); + projectNatures.add(""); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_3() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectNatures = new LinkedList(); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_4() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectNatures = new Vector(); + projectNatures.add(""); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_4() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectNatures = new Vector(); + projectNatures.add(""); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_5() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectNatures = new Vector(); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_5() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectNatures = new ArrayList(); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_6() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectNatures = new LinkedList(); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_6() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectNatures = new Vector(); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_7() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectNatures = new ArrayList(); + projectNatures.add(""); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_7() + throws Exception { + ProjectInfo fixture = getFixture1(); + ArrayList projectNatures = new ArrayList(); + projectNatures.add(""); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_8() + throws Exception { + ProjectInfo fixture = getFixture2(); + ArrayList projectNatures = new ArrayList(); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_8() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectNatures = new LinkedList(); + projectNatures.add(""); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_9() + throws Exception { + ProjectInfo fixture = getFixture2(); + LinkedList projectNatures = new LinkedList(); + projectNatures.add(""); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_9() + throws Exception { + ProjectInfo fixture = getFixture1(); + LinkedList projectNatures = new LinkedList(); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_10() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectNatures = new Vector(); + projectNatures.add(""); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_10() + throws Exception { + ProjectInfo fixture = getFixture1(); + Vector projectNatures = new Vector(); + projectNatures.add(""); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_11() + throws Exception { + ProjectInfo fixture = getFixture2(); + Vector projectNatures = new Vector(); + projectNatures.add("0123456789"); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_11() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectNatures = new ArrayList(); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture2_12() + throws Exception { + ProjectInfo fixture = getFixture2(); + List projectNatures = new LinkedList(); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the void setProjectNatures(List) method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testSetProjectNatures_fixture1_12() + throws Exception { + ProjectInfo fixture = getFixture1(); + List projectNatures = new Vector(); + + fixture.setProjectNatures(projectNatures); + + // add additional test code here + } + + /** + * Run the String toJson() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testToJson_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + String result = fixture.toJson(); + + // add additional test code here + assertEquals("{\"name\":\"\",\"isJava\":false,\"isEar\":false,\"isEjb\":false,\"isWeb\":false,\"isGwt\":false,\"isGae\":false,\"isGroovy\":false,\"isGrails\":false,\"isPde\":false,\"isJet\":false}", result); + } + + /** + * Run the String toJson() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testToJson_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + String result = fixture.toJson(); + + // add additional test code here + assertEquals("{\"name\":\"DEFAULT\",\"isJava\":false,\"isEar\":false,\"isEjb\":false,\"isWeb\":false,\"isGwt\":false,\"isGae\":false,\"isGroovy\":false,\"isGrails\":false,\"isPde\":false,\"isJet\":false}", result); + } + + /** + * Run the String toString() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testToString_fixture1_1() + throws Exception { + ProjectInfo fixture = getFixture1(); + + String result = fixture.toString(); + + // add additional test code here + assertEquals(" dependencies [] natures [] facets [] classpath []", result); + } + + /** + * Run the String toString() method test. + * + * @throws Exception + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Test + public void testToString_fixture2_1() + throws Exception { + ProjectInfo fixture = getFixture2(); + + String result = fixture.toString(); + + // add additional test code here + assertEquals("DEFAULT dependencies [] natures [] facets [] classpath []", result); + } + + /** + * Perform pre-test initialization. + * + * @throws Exception + * if the initialization fails for some reason + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @Before + public void setUp() + throws Exception { + // add additional set up code here + } + + /** + * Perform post-test clean-up. + * + * @throws Exception + * if the clean-up fails for some reason + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + @After + public void tearDown() + throws Exception { + // Add additional tear down code here + } + + /** + * Launch the test. + * + * @param args the command line arguments + * + * @generatedBy CodePro at 26/06/13 21:36 + */ + public static void main(String[] args) { + new org.junit.runner.JUnitCore().run(ProjectInfoTest.class); + } +} diff --git a/类图和开发视图.vsdx b/类图和开发视图.vsdx new file mode 100644 index 0000000000000000000000000000000000000000..95c006a5d91260ebb4f3f261568bd32f152b4e86 GIT binary patch literal 81305 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

@3e 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