[jboss-svn-commits] JBL Code SVN: r15907 - in labs/jbossrules/trunk/drools-analytics: src/main/java/org/drools/analytics and 14 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 18 05:29:17 EDT 2007


Author: Rikkola
Date: 2007-10-18 05:29:17 -0400 (Thu, 18 Oct 2007)
New Revision: 15907

Added:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResult.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResultNormal.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/DataTree.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/ReportModeller.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessage.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessageBase.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsRangeCheckMessage.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Cause.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Gap.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingNumberPattern.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/PartialRedundancy.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/RangeCheckCause.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/AnalyticsMessagesVisitor.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportModeller.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportVisitor.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/MissingRangesReportVisitor.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportModeller.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportVisitor.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/UrlFactory.java
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Notes.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessage.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessages.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/basic.css
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/field.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/frame.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/hdrlogo_drools50px.gif
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/header.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/jbossrules_hdrbkg_blue.gif
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/missingRange.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectType.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectTypes.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/packages.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/ranges.htm
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsDetails.css
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsList.css
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/rule.htm
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/NotesTest.java
Removed:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/
Modified:
   labs/jbossrules/trunk/drools-analytics/.classpath
   labs/jbossrules/trunk/drools-analytics/.project
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsRule.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Field.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/PatternPossibility.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Possibility.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/ReturnValueRestriction.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/RulePossibility.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/VariableRestriction.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Variables.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Patterns.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Restrictions.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckCleanTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RedundancyTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SolversTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SubsumptantPossibilitiesRuleTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java
   labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl
Log:
Some redundancy reports and improvements to html reporting.

Modified: labs/jbossrules/trunk/drools-analytics/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-analytics/.classpath	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/.classpath	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,19 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
-  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
-  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
-  <classpathentry kind="output" path="target/classes"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.4.0/xercesImpl-2.4.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar"/>
-  <classpathentry kind="src" path="/drools-core"/>
-  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
-  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/1.2.8/mvel-1.2.8.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
-  <classpathentry kind="src" path="/drools-compiler"/>
-  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
-</classpath>
\ No newline at end of file
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/test/java"/>
+	<classpathentry excluding="**" kind="src" output="src/main/resources" path="src/main/resources"/>
+	<classpathentry excluding="**" kind="src" output="src/test/resources" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

Modified: labs/jbossrules/trunk/drools-analytics/.project
===================================================================
--- labs/jbossrules/trunk/drools-analytics/.project	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/.project	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,20 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-  <name>drools-analytics</name>
-  <comment>A rule production system</comment>
-  <projects>
-    <project>drools-core</project>
-    <project>drools-compiler</project>
-  </projects>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-    </buildCommand>
-    <buildCommand>
-      <name>org.maven.ide.eclipse.maven2Builder</name>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-    <nature>org.maven.ide.eclipse.maven2Nature</nature>
-  </natures>
-</projectDescription>
\ No newline at end of file
+	<name>drools-analytics</name>
+	<comment>A rule production system</comment>
+	<projects>
+		<project>drools-core</project>
+		<project>drools-compiler</project>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
+	</natures>
+</projectDescription>

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/Analyzer.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -5,12 +5,11 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.analytics.dao.AnalyticsResult;
 import org.drools.analytics.dao.AnalyticsData;
 import org.drools.analytics.dao.AnalyticsDataFactory;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.AnalysisResultNormal;
-import org.drools.analytics.result.ComponentsReportModeller;
-import org.drools.analytics.result.ReportModeller;
+import org.drools.analytics.report.ReportModeller;
+import org.drools.analytics.report.html.ComponentsReportModeller;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.rule.Package;
 
@@ -20,8 +19,6 @@
  */
 public class Analyzer {
 
-	private AnalysisResult result = new AnalysisResultNormal();
-
 	public void addPackageDescr(PackageDescr descr) {
 		try {
 
@@ -37,11 +34,12 @@
 	public void fireAnalysis() {
 		try {
 			AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+			AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
 
 			System.setProperty("drools.accumulate.function.validatePattern",
 					"org.drools.analytics.accumulateFunction.ValidatePattern");
 
-			// load up the rulebase
+			// load up the rule base
 			RuleBase ruleBase = createRuleBase();
 
 			WorkingMemory workingMemory = ruleBase.newStatefulSession();
@@ -51,7 +49,6 @@
 			}
 
 			// Object that returns the results.
-			workingMemory.setGlobal("data", data);
 			workingMemory.setGlobal("result", result);
 			workingMemory.fireAllRules();
 
@@ -66,7 +63,7 @@
 	 * @return Analysis results as plain text.
 	 */
 	public String getResultAsPlainText() {
-		return ReportModeller.writePlainText(result);
+		return ReportModeller.writePlainText();
 	}
 
 	/**
@@ -75,7 +72,7 @@
 	 * @return Analysis results as XML
 	 */
 	public String getResultAsXML() {
-		return ReportModeller.writeXML(result);
+		return ReportModeller.writeXML();
 	}
 
 	/**
@@ -84,24 +81,16 @@
 	 * @return Analysis results as HTML
 	 */
 	public void writeComponentsHTML(String path) {
-		ComponentsReportModeller.writeHTML(path, result);
+		ComponentsReportModeller.writeHTML(path);
 	}
 
 	/**
-	 * Returns the analysis results as HTML.
-	 * 
-	 * @return Analysis results as HTML
-	 */
-	public String getResultAsHTML() {
-		return ReportModeller.writeHTML(result);
-	}
-
-	/**
 	 * Returns the analysis results as <code>AnalysisResult</code> object.
 	 * 
 	 * @return Analysis result
 	 */
-	public AnalysisResult getResult() {
+	public AnalyticsResult getResult() {
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
 		return result;
 	}
 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/RuleLoader.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -60,9 +60,11 @@
 		//
 		// list.add(new InputStreamReader(RuleLoader.class
 		// .getResourceAsStream("redundancy/Patterns.drl")));
+		list.add(new InputStreamReader(RuleLoader.class
+				.getResourceAsStream("redundancy/Restrictions.drl")));
+		list.add(new InputStreamReader(RuleLoader.class
+				.getResourceAsStream("redundancy/Notes.drl")));
 		// list.add(new InputStreamReader(RuleLoader.class
-		// .getResourceAsStream("redundancy/Restrictions.drl")));
-		// list.add(new InputStreamReader(RuleLoader.class
 		// .getResourceAsStream("redundancy/Rules.drl")));
 		list.add(new InputStreamReader(RuleLoader.class
 				.getResourceAsStream("reports/RangeCheckReports.drl")));

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -4,13 +4,23 @@
  * 
  * @author Toni Rikkola
  */
-public abstract class AnalyticsComponent {
+public abstract class AnalyticsComponent implements
+		Comparable<AnalyticsComponent> {
 
 	protected String ruleName;
 	protected int id;
 
 	public abstract AnalyticsComponentType getComponentType();
 
+	@Override
+	public int compareTo(AnalyticsComponent o) {
+		if (id == o.getId()) {
+			return 0;
+		}
+
+		return (id > o.getId() ? 1 : -1);
+	}
+
 	public AnalyticsComponent(int id) {
 		this.id = id;
 	}

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsRule.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsRule.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsRule.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,6 +1,6 @@
 package org.drools.analytics.components;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Field.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Field.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Field.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,6 +1,6 @@
 package org.drools.analytics.components;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/LiteralRestriction.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -4,7 +4,7 @@
 import java.util.Date;
 import java.util.Locale;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Pattern.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,6 +1,6 @@
 package org.drools.analytics.components;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/PatternPossibility.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/PatternPossibility.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/PatternPossibility.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -3,7 +3,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * Instance of this class represents a possible combination of Constraints under

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Possibility.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Possibility.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Possibility.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,7 +2,7 @@
 
 import java.util.Set;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/Restriction.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,6 +1,6 @@
 package org.drools.analytics.components;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/ReturnValueRestriction.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/ReturnValueRestriction.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,6 +1,6 @@
 package org.drools.analytics.components;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/RulePossibility.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/RulePossibility.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/RulePossibility.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -4,7 +4,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * Instance of this class represents a possible combination of

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/VariableRestriction.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/VariableRestriction.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -1,6 +1,6 @@
 package org.drools.analytics.components;
 
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 /**
  * 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsData.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -13,9 +13,6 @@
 import org.drools.analytics.components.RulePackage;
 import org.drools.analytics.components.RulePossibility;
 import org.drools.analytics.components.Variable;
-import org.drools.analytics.result.Gap;
-import org.drools.analytics.result.MissingNumberPattern;
-import org.drools.analytics.result.RangeCheckCause;
 
 /**
  * 
@@ -45,12 +42,6 @@
 
 	public void save(RulePackage rulePackage);
 
-	public void save(Gap gap);
-
-	public void remove(Gap gap);
-
-	public void save(MissingNumberPattern missingNumberPattern);
-
 	public AnalyticsClass getClassByPackageAndName(String name);
 
 	public AnalyticsClass getClassById(int id);
@@ -80,15 +71,7 @@
 
 	public Collection<AnalyticsRule> getRulesByFieldId(int id);
 
-	public Collection<Field> getFieldsWithGaps();
-
-	public Collection<Gap> getGapsByFieldId(int fieldId);
-
 	public RulePackage getRulePackageByName(String name);
 
 	public Collection<Restriction> getRestrictionsByFieldId(int id);
-
-	public Collection<RangeCheckCause> getRangeCheckCauses();
-	
-	public Collection<RangeCheckCause> getRangeCheckCausesByFieldId(int id);
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataFactory.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,12 +2,22 @@
 
 public class AnalyticsDataFactory {
 
-	private static AnalyticsDataMaps map;
+	private static AnalyticsData data;
+	private static AnalyticsResult result;
 
 	public static AnalyticsData getAnalyticsData() {
-		if (map == null) {
-			map = new AnalyticsDataMaps();
+		if (data == null) {
+			data = new AnalyticsDataMaps();
 		}
-		return map;
+
+		return data;
 	}
+
+	public static AnalyticsResult getAnalyticsResult() {
+		if (result == null) {
+			result = new AnalyticsResultNormal();
+		}
+
+		return result;
+	}
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsDataMaps.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -19,9 +19,6 @@
 import org.drools.analytics.components.RulePackage;
 import org.drools.analytics.components.RulePossibility;
 import org.drools.analytics.components.Variable;
-import org.drools.analytics.result.Gap;
-import org.drools.analytics.result.MissingNumberPattern;
-import org.drools.analytics.result.RangeCheckCause;
 
 /**
  * 
@@ -36,27 +33,22 @@
 	private Map<String, AnalyticsClass> classesByName = new TreeMap<String, AnalyticsClass>();
 	private Map<String, Field> fieldsByClassAndFieldName = new TreeMap<String, Field>();
 	private Map<Integer, Field> fieldsById = new TreeMap<Integer, Field>();
-	private Map<Integer, Set<Field>> fieldsByClassId = new TreeMap<Integer, Set<Field>>();
+	private DataTree<Integer, Field> fieldsByClassId = new DataTree<Integer, Field>();
 	private Map<String, FieldClassLink> fieldClassLinkByIds = new TreeMap<String, FieldClassLink>();
 
 	private Map<Integer, AnalyticsRule> rulesById = new TreeMap<Integer, AnalyticsRule>();
 	private Map<Integer, Pattern> patternsById = new TreeMap<Integer, Pattern>();
-	private Map<Integer, Set<Pattern>> patternsByClassId = new TreeMap<Integer, Set<Pattern>>();
-	private Map<String, Set<Pattern>> patternsByRuleName = new TreeMap<String, Set<Pattern>>();
+	private DataTree<Integer, Pattern> patternsByClassId = new DataTree<Integer, Pattern>();
+	private DataTree<String, Pattern> patternsByRuleName = new DataTree<String, Pattern>();
 	private Map<Integer, Constraint> constraintsById = new TreeMap<Integer, Constraint>();
 	private Map<Integer, Restriction> restrictionsById = new TreeMap<Integer, Restriction>();
-	private Map<Integer, Set<Restriction>> restrictionsByFieldId = new TreeMap<Integer, Set<Restriction>>();
+	private DataTree<Integer, Restriction> restrictionsByFieldId = new DataTree<Integer, Restriction>();
 
 	private Map<String, Variable> variablesByRuleAndVariableName = new TreeMap<String, Variable>();
 
 	private Map<Integer, PatternPossibility> patternPossibilitiesById = new TreeMap<Integer, PatternPossibility>();
 	private Map<Integer, RulePossibility> rulePossibilitiesById = new TreeMap<Integer, RulePossibility>();
 
-	private Map<Integer, Gap> gapsById = new TreeMap<Integer, Gap>();
-	private Map<Integer, Set<Gap>> gapsByFieldId = new TreeMap<Integer, Set<Gap>>();
-	private Map<Integer, MissingNumberPattern> missingNumberPatternsById = new TreeMap<Integer, MissingNumberPattern>();
-	private Map<Integer, Set<MissingNumberPattern>> missingNumberPatternsByFieldId = new TreeMap<Integer, Set<MissingNumberPattern>>();
-
 	public void save(AnalyticsClass clazz) {
 		classesById.put(Integer.valueOf(clazz.getId()), clazz);
 		classesByName.put(clazz.getName(), clazz);
@@ -70,15 +62,7 @@
 
 		fieldsById.put(field.getId(), field);
 
-		// Save by class id.
-		if (fieldsByClassId.containsKey(field.getClassId())) {
-			Set<Field> set = fieldsByClassId.get(field.getClassId());
-			set.add(field);
-		} else {
-			Set<Field> set = new HashSet<Field>();
-			set.add(field);
-			fieldsByClassId.put(field.getClassId(), set);
-		}
+		fieldsByClassId.put(field.getClassId(), field);
 	}
 
 	public void save(Variable variable) {
@@ -95,25 +79,8 @@
 	public void save(Pattern pattern) {
 		patternsById.put(Integer.valueOf(pattern.getId()), pattern);
 
-		// Save by class id.
-		if (patternsByClassId.containsKey(pattern.getClassId())) {
-			Set<Pattern> set = patternsByClassId.get(pattern.getClassId());
-			set.add(pattern);
-		} else {
-			Set<Pattern> set = new HashSet<Pattern>();
-			set.add(pattern);
-			patternsByClassId.put(pattern.getClassId(), set);
-		}
-
-		// Save by rule name.
-		if (patternsByRuleName.containsKey(pattern.getRuleName())) {
-			Set<Pattern> set = patternsByRuleName.get(pattern.getRuleName());
-			set.add(pattern);
-		} else {
-			Set<Pattern> set = new HashSet<Pattern>();
-			set.add(pattern);
-			patternsByRuleName.put(pattern.getRuleName(), set);
-		}
+		patternsByClassId.put(pattern.getClassId(), pattern);
+		patternsByRuleName.put(pattern.getRuleName(), pattern);
 	}
 
 	public void save(Constraint constraint) {
@@ -123,16 +90,7 @@
 	public void save(Restriction restriction) {
 		restrictionsById.put(restriction.getId(), restriction);
 
-		// Save by field id.
-		if (restrictionsByFieldId.containsKey(restriction.getFieldId())) {
-			Set<Restriction> set = restrictionsByFieldId.get(restriction
-					.getFieldId());
-			set.add(restriction);
-		} else {
-			Set<Restriction> set = new HashSet<Restriction>();
-			set.add(restriction);
-			restrictionsByFieldId.put(restriction.getFieldId(), set);
-		}
+		restrictionsByFieldId.put(restriction.getFieldId(), restriction);
 	}
 
 	public void save(FieldClassLink link) {
@@ -173,7 +131,7 @@
 	public Collection<AnalyticsClass> getClassesByRuleName(String ruleName) {
 		Set<AnalyticsClass> set = new HashSet<AnalyticsClass>();
 
-		for (Pattern pattern : patternsByRuleName.get(ruleName)) {
+		for (Pattern pattern : patternsByRuleName.getBranch(ruleName)) {
 			AnalyticsClass clazz = getClassById(pattern.getClassId());
 			set.add(clazz);
 		}
@@ -210,13 +168,13 @@
 	}
 
 	public Collection<Field> getFieldsByClassId(int id) {
-		return fieldsByClassId.get(id);
+		return fieldsByClassId.getBranch(id);
 	}
 
 	public Collection<AnalyticsRule> getRulesByClassId(int id) {
 		Set<AnalyticsRule> rules = new HashSet<AnalyticsRule>();
 
-		for (Pattern pattern : patternsByClassId.get(id)) {
+		for (Pattern pattern : patternsByClassId.getBranch(id)) {
 			rules.add(rulesById.get(pattern.getRuleId()));
 		}
 
@@ -231,7 +189,7 @@
 
 		Set<AnalyticsRule> rules = new HashSet<AnalyticsRule>();
 
-		for (Restriction restriction : restrictionsByFieldId.get(id)) {
+		for (Restriction restriction : restrictionsByFieldId.getBranch(id)) {
 			rules.add(rulesById.get(restriction.getRuleId()));
 		}
 
@@ -251,89 +209,7 @@
 		return packagesByName.get(name);
 	}
 
-	public void save(Gap gap) {
-		gapsById.put(gap.getId(), gap);
-
-		// Save by field id.
-		if (gapsByFieldId.containsKey(gap.getField().getId())) {
-			Set<Gap> set = gapsByFieldId.get(gap.getField().getId());
-			set.add(gap);
-		} else {
-			Set<Gap> set = new HashSet<Gap>();
-			set.add(gap);
-			gapsByFieldId.put(gap.getField().getId(), set);
-		}
-	}
-
-	public void remove(Gap gap) {
-		gapsById.remove(gap.getId());
-
-		if (gapsByFieldId.containsKey(gap.getField().getId())) {
-			Set<Gap> set = gapsByFieldId.get(gap.getField().getId());
-			set.remove(gap);
-
-			if (set.isEmpty()) {
-				gapsByFieldId.remove(gap.getField().getId());
-			}
-		}
-	}
-
-	public Collection<Field> getFieldsWithGaps() {
-		Set<Integer> set = gapsByFieldId.keySet();
-		Collection<Field> fields = new ArrayList<Field>();
-
-		for (Integer i : set) {
-			fields.add(fieldsById.get(i));
-		}
-
-		return fields;
-	}
-
-	public Collection<Gap> getGapsByFieldId(int fieldId) {
-		return gapsByFieldId.get(fieldId);
-	}
-
 	public Collection<Restriction> getRestrictionsByFieldId(int id) {
-		return restrictionsByFieldId.get(id);
+		return restrictionsByFieldId.getBranch(id);
 	}
-
-	public Collection<RangeCheckCause> getRangeCheckCauses() {
-		Collection<RangeCheckCause> result = new ArrayList<RangeCheckCause>();
-
-		result.addAll(gapsById.values());
-		result.addAll(missingNumberPatternsById.values());
-
-		return result;
-	}
-
-	public void save(MissingNumberPattern missingNumberPattern) {
-		missingNumberPatternsById.put(missingNumberPattern.getId(),
-				missingNumberPattern);
-
-		// Save by field id.
-		if (missingNumberPatternsByFieldId.containsKey(missingNumberPattern
-				.getField().getId())) {
-			Set<MissingNumberPattern> set = missingNumberPatternsByFieldId
-					.get(missingNumberPattern.getField().getId());
-			set.add(missingNumberPattern);
-		} else {
-			Set<MissingNumberPattern> set = new HashSet<MissingNumberPattern>();
-			set.add(missingNumberPattern);
-			missingNumberPatternsByFieldId.put(missingNumberPattern.getField()
-					.getId(), set);
-		}
-	}
-
-	public Collection<RangeCheckCause> getRangeCheckCausesByFieldId(int id) {
-		Collection<RangeCheckCause> result = new ArrayList<RangeCheckCause>();
-
-		if (gapsByFieldId.containsKey(id)) {
-			result.addAll(gapsByFieldId.get(id));
-		}
-		if (missingNumberPatternsByFieldId.containsKey(id)) {
-			result.addAll(missingNumberPatternsByFieldId.get(id));
-		}
-
-		return result;
-	}
 }

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResult.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResult.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResult.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,40 @@
+package org.drools.analytics.dao;
+
+import java.util.Collection;
+
+import org.drools.analytics.report.components.AnalyticsMessageBase;
+import org.drools.analytics.report.components.Gap;
+import org.drools.analytics.report.components.MissingNumberPattern;
+import org.drools.analytics.report.components.RangeCheckCause;
+import org.drools.analytics.report.components.AnalyticsMessageBase.Severity;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public interface AnalyticsResult {
+
+	public void save(Gap gap);
+
+	public void remove(Gap gap);
+
+	public void save(MissingNumberPattern missingNumberPattern);
+
+	public Collection<RangeCheckCause> getRangeCheckCauses();
+
+	public Collection<RangeCheckCause> getRangeCheckCausesByFieldId(int id);
+
+	public Collection<Gap> getGapsByFieldId(int fieldId);
+
+	public void save(AnalyticsMessageBase note);
+
+	/**
+	 * Return all the items that have given severity value.
+	 * 
+	 * @param severity
+	 *            Severity level of item.
+	 * @return Collection of items or an empty list if none was found.
+	 */
+	public Collection<AnalyticsMessageBase> getBySeverity(Severity severity);
+
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResultNormal.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResultNormal.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/AnalyticsResultNormal.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,95 @@
+package org.drools.analytics.dao;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.drools.analytics.components.Field;
+import org.drools.analytics.report.components.AnalyticsMessageBase;
+import org.drools.analytics.report.components.Gap;
+import org.drools.analytics.report.components.MissingNumberPattern;
+import org.drools.analytics.report.components.RangeCheckCause;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+class AnalyticsResultNormal implements AnalyticsResult {
+	private static final long serialVersionUID = -6207688526236713721L;
+
+	private Map<Integer, Gap> gapsById = new TreeMap<Integer, Gap>();
+	private DataTree<Integer, Gap> gapsByFieldId = new DataTree<Integer, Gap>();
+	private Map<Integer, MissingNumberPattern> missingNumberPatternsById = new TreeMap<Integer, MissingNumberPattern>();
+	private DataTree<Integer, MissingNumberPattern> missingNumberPatternsByFieldId = new DataTree<Integer, MissingNumberPattern>();
+
+	private List<AnalyticsMessageBase> messages = new ArrayList<AnalyticsMessageBase>();
+	private DataTree<AnalyticsMessageBase.Severity, AnalyticsMessageBase> messagesBySeverity = new DataTree<AnalyticsMessageBase.Severity, AnalyticsMessageBase>();
+
+	@Override
+	public void save(AnalyticsMessageBase message) {
+		messages.add(message);
+		messagesBySeverity.put(message.getSeverity(), message);
+	}
+
+	@Override
+	public Collection<AnalyticsMessageBase> getBySeverity(
+			AnalyticsMessageBase.Severity severity) {
+		Collection<AnalyticsMessageBase> result = messagesBySeverity
+				.getBranch(severity);
+
+		if (result == null) {
+			return Collections.emptyList();
+		} else {
+			return result;
+		}
+	}
+
+	public void save(Gap gap) {
+		gapsById.put(gap.getId(), gap);
+
+		// Save by field id.
+		gapsByFieldId.put(gap.getField().getId(), gap);
+	}
+
+	public void remove(Gap gap) {
+		gapsById.remove(gap.getId());
+
+		gapsByFieldId.remove(gap.getField().getId(), gap);
+	}
+
+	public Collection<Gap> getGapsByFieldId(int fieldId) {
+		return gapsByFieldId.getBranch(fieldId);
+	}
+
+	public Collection<RangeCheckCause> getRangeCheckCauses() {
+		Collection<RangeCheckCause> result = new ArrayList<RangeCheckCause>();
+
+		result.addAll(gapsById.values());
+		result.addAll(missingNumberPatternsById.values());
+
+		return result;
+	}
+
+	public void save(MissingNumberPattern missingNumberPattern) {
+		missingNumberPatternsById.put(missingNumberPattern.getId(),
+				missingNumberPattern);
+
+		// Save by field id.
+		missingNumberPatternsByFieldId.put(missingNumberPattern.getField()
+				.getId(), missingNumberPattern);
+	}
+
+	public Collection<RangeCheckCause> getRangeCheckCausesByFieldId(int id) {
+		Collection<RangeCheckCause> result = new ArrayList<RangeCheckCause>();
+
+		result.addAll(gapsByFieldId.getBranch(id));
+
+		result.addAll(missingNumberPatternsByFieldId.getBranch(id));
+
+		return result;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/DataTree.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/DataTree.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/dao/DataTree.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,64 @@
+package org.drools.analytics.dao;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+public class DataTree<K, V> {
+	private Map<K, Set<V>> map = new TreeMap<K, Set<V>>();
+
+	public void put(K key, V value) {
+		if (map.containsKey(key)) {
+			Set<V> set = map.get(key);
+			set.add(value);
+		} else {
+			Set<V> set = new TreeSet<V>();
+			set.add(value);
+			map.put(key, set);
+		}
+	}
+
+	public Set<K> keySet() {
+		return map.keySet();
+	}
+
+	public Set<V> getBranch(K key) {
+		Set<V> set = map.get(key);
+		if (set != null) {
+			return set;
+		} else {
+			return Collections.emptySet();
+		}
+	}
+
+	public Collection<V> values() {
+		Collection<V> values = new ArrayList<V>();
+
+		for (Set<V> set : map.values()) {
+			for (V value : set) {
+				values.add(value);
+			}
+		}
+
+		return values;
+	}
+
+	public boolean remove(K key, V value) {
+		Set<V> set = map.get(key);
+
+		if (set != null) {
+			return set.remove(value);
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	public String toString() {
+		return values().toString();
+	}
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/ReportModeller.java (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/ReportModeller.java)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/ReportModeller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/ReportModeller.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,63 @@
+package org.drools.analytics.report;
+
+import java.util.Collection;
+
+import org.drools.analytics.components.LiteralRestriction;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.report.components.AnalyticsMessageBase;
+import org.drools.analytics.report.components.Gap;
+import org.drools.analytics.report.components.MissingNumberPattern;
+
+import com.thoughtworks.xstream.XStream;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public class ReportModeller {
+
+	public static String writeXML() {
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		XStream xstream = new XStream();
+
+		xstream.alias("result", AnalyticsResult.class);
+		xstream.alias("message", AnalyticsMessage.class);
+
+		xstream.alias("Gap", Gap.class);
+		xstream.alias("MissingNumber", MissingNumberPattern.class);
+
+		xstream.alias("Field", org.drools.analytics.components.Field.class);
+
+		xstream.alias("LiteralRestriction", LiteralRestriction.class);
+
+		return "<?xml version=\"1.0\"?>\n" + xstream.toXML(result);
+	}
+
+	public static String writePlainText() {
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+
+		StringBuffer str = new StringBuffer();
+
+		for (AnalyticsMessage.Severity severity : AnalyticsMessage.Severity
+				.values()) {
+			Collection<AnalyticsMessageBase> messages = result
+					.getBySeverity(severity);
+
+			str.append("************* ");
+			str.append(severity.getTuple());
+			str.append(" ");
+
+			str.append(messages.size());
+			str.append(" ******************\n");
+			for (AnalyticsMessageBase message : messages) {
+				str.append(message);
+				str.append("\n");
+			}
+			str.append("\n");
+		}
+
+		return str.toString();
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessage.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessage.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessage.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,55 @@
+package org.drools.analytics.report.components;
+
+import java.util.Collection;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public class AnalyticsMessage extends AnalyticsMessageBase {
+	private static final long serialVersionUID = 9190003495068712452L;
+
+	protected Collection<Cause> causes;
+
+	public AnalyticsMessage(Severity severity, MessageType messageType,
+			Cause faulty, String message, Collection<Cause> causes) {
+		super(severity, messageType, faulty, message);
+
+		this.causes = causes;
+	}
+
+	public Collection<Cause> getCauses() {
+		return causes;
+	}
+
+	public void setCauses(Collection<Cause> reasons) {
+		this.causes = reasons;
+	}
+
+	@Override
+	public String toString() {
+		StringBuffer str = new StringBuffer(severity.getSingular());
+
+		str.append(" id = ");
+		str.append(id);
+		str.append(":\n");
+
+		if (faulty != null) {
+			str.append("faulty : ");
+			str.append(faulty);
+			str.append(", ");
+		}
+
+		str.append(message);
+		str.append(" \n\tCauses are [ \n");
+
+		for (Cause cause : causes) {
+			str.append("\t\t");
+			str.append(cause);
+			str.append("\n");
+		}
+		str.append("\t]");
+
+		return str.toString();
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessageBase.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessageBase.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsMessageBase.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,129 @@
+package org.drools.analytics.report.components;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+abstract public class AnalyticsMessageBase implements Serializable,
+		Comparable<AnalyticsMessageBase> {
+	private static final long serialVersionUID = 9190003495068712452L;
+
+	private static int index = 0;
+
+	public static enum Severity {
+		NOTE("Note", "Notes"), WARNING("Warning", "Warnings"), ERROR("Error",
+				"Errors");
+
+		private String singular;
+		private String tuple;
+
+		private Severity(String singular, String tuple) {
+			this.singular = singular;
+			this.tuple = tuple;
+		}
+
+		public String getSingular() {
+			return singular;
+		}
+
+		public String getTuple() {
+			return tuple;
+		}
+
+		@Override
+		public String toString() {
+			return singular;
+		}
+	}
+
+	public static enum MessageType {
+		NOT_SPECIFIED, RANGE_CHECK, REDUNDANCY, SUBSUMPTION
+	}
+
+	protected Severity severity;
+	protected MessageType messageType;
+
+	protected int id = index++;
+	protected Cause faulty;
+	protected String message;
+
+	@Override
+	public int compareTo(AnalyticsMessageBase o) {
+		if (id == o.getId()) {
+			return 0;
+		}
+
+		return (id > o.getId() ? 1 : -1);
+	}
+
+	protected AnalyticsMessageBase(Severity severity, MessageType messageType,
+			Cause faulty, String message) {
+		this.severity = severity;
+		this.messageType = messageType;
+		this.faulty = faulty;
+		this.message = message;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public Cause getFaulty() {
+		return faulty;
+	}
+
+	public void setFaulty(Cause faulty) {
+		this.faulty = faulty;
+	}
+
+	public MessageType getMessageType() {
+		return messageType;
+	}
+
+	public void setMessageType(MessageType messageType) {
+		this.messageType = messageType;
+	}
+
+	public Severity getSeverity() {
+		return severity;
+	}
+
+	public void setSeverity(Severity severity) {
+		this.severity = severity;
+	}
+
+	@Override
+	public String toString() {
+		StringBuffer str = new StringBuffer(severity.singular);
+
+		str.append(" id = ");
+		str.append(id);
+		str.append(":\n");
+
+		if (faulty != null) {
+			str.append("faulty : ");
+			str.append(faulty);
+			str.append(", ");
+		}
+
+		str.append(message);
+
+		str.append("\t]");
+
+		return str.toString();
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsRangeCheckMessage.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsRangeCheckMessage.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/AnalyticsRangeCheckMessage.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,24 @@
+package org.drools.analytics.report.components;
+
+import java.util.Collection;
+
+public class AnalyticsRangeCheckMessage extends AnalyticsMessageBase {
+	private static final long serialVersionUID = -2403507929285633672L;
+
+	private Collection<RangeCheckCause> causes;
+
+	public AnalyticsRangeCheckMessage(Severity severity, Cause faulty,
+			String message, Collection<RangeCheckCause> causes) {
+		super(severity, MessageType.RANGE_CHECK, faulty, message);
+
+		this.causes = causes;
+	}
+
+	public Collection<RangeCheckCause> getCauses() {
+		return causes;
+	}
+
+	public void setCauses(Collection<RangeCheckCause> reasons) {
+		this.causes = reasons;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Cause.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Cause.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Cause.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,22 @@
+package org.drools.analytics.report.components;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public interface Cause {
+	public enum CauseType {
+		RULE,
+		FIELD,
+		GAP,
+		PATTERN,
+		RESTRICTION,
+		POSSIBILITY,
+		RANGE_CHECK_CAUSE, 
+		REDUNDANCY
+	}
+	
+	public int getId();
+
+	public CauseType getCauseType();
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Gap.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Gap.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Gap.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,85 @@
+package org.drools.analytics.report.components;
+
+import org.drools.analytics.components.Field;
+import org.drools.analytics.components.LiteralRestriction;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public class Gap extends MissingRange implements RangeCheckCause, Comparable<MissingRange> {
+
+	private LiteralRestriction restriction;
+
+	/**
+	 * Takes the given evaluator e, and returns a reversed version of it.
+	 * 
+	 * @return evaluator
+	 */
+	public static String getReversedEvaluator(String e) {
+		if (e.equals("!=")) {
+			return "==";
+		} else if (e.equals("==")) {
+			return "!=";
+		} else if (e.equals(">")) {
+			return "<=";
+		} else if (e.equals("<")) {
+			return ">=";
+		} else if (e.equals(">=")) {
+			return "<";
+		} else if (e.equals("<=")) {
+			return ">";
+		}
+
+		return e;
+	}
+
+	public int compareTo(MissingRange another) {
+		return super.compareTo(another);
+	}
+
+	public CauseType getCauseType() {
+		return Cause.CauseType.GAP;
+	}
+
+	/**
+	 * 
+	 * @param field
+	 *            Field from where the value is missing.
+	 * @param evaluator
+	 *            Evaluator for the missing value.
+	 * @param cause
+	 *            The restriction that the gap begins from.
+	 */
+	public Gap(Field field, String evaluator, LiteralRestriction restriction) {
+		this.field = field;
+		this.evaluator = evaluator;
+		this.restriction = restriction;
+	}
+
+	public String getRuleName() {
+		return restriction.getRuleName();
+	}
+
+	public LiteralRestriction getRestriction() {
+		return restriction;
+	}
+
+	public void setRestriction(LiteralRestriction restriction) {
+		this.restriction = restriction;
+	}
+
+	public String getValueAsString() {
+		return restriction.getValueAsString();
+	}
+
+	public Object getValueAsObject() {
+		return restriction.getValueAsObject();
+	}
+
+	@Override
+	public String toString() {
+		return "Gap: (" + field + ") " + getEvaluator() + " "
+				+ getValueAsString();
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingNumberPattern.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingNumberPattern.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingNumberPattern.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,84 @@
+package org.drools.analytics.report.components;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import org.drools.analytics.components.Field;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public class MissingNumberPattern extends MissingRange implements
+		RangeCheckCause, Comparable<MissingRange> {
+
+	private Field.FieldType valueType;
+
+	private String value;
+
+	public int compareTo(MissingRange another) {
+		return super.compareTo(another);
+	}
+
+	public CauseType getCauseType() {
+		return Cause.CauseType.RANGE_CHECK_CAUSE;
+	}
+
+	public MissingNumberPattern(Field field, String evaluator,
+			Field.FieldType valueType, String value) {
+		this.field = field;
+		this.evaluator = evaluator;
+		this.valueType = valueType;
+		this.value = value;
+	}
+
+	/**
+	 * Returns alway null, because there is no rule that this is related to.
+	 */
+	public String getRuleName() {
+		return null;
+	}
+
+	public String getValueAsString() {
+		return value;
+	}
+
+	public Object getValueAsObject() {
+		switch (valueType) {
+		case BOOLEAN:
+			return Boolean.valueOf(value);
+		case DATE:
+			try {
+				String fmt = System.getProperty("drools.dateformat");
+				if (fmt == null) {
+					fmt = "dd-MMM-yyyy";
+				}
+
+				return new SimpleDateFormat(fmt, Locale.ENGLISH).parse(value);
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+		case DOUBLE:
+			return Double.valueOf(value);
+		case INT:
+			return Integer.valueOf(value);
+
+		default:
+			return value;
+		}
+	}
+
+	public Field.FieldType getValueType() {
+		return valueType;
+	}
+
+	public void setValueType(Field.FieldType valueType) {
+		this.valueType = valueType;
+	}
+
+	@Override
+	public String toString() {
+		return "Missing restriction " + evaluator + " " + value;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,44 @@
+package org.drools.analytics.report.components;
+
+import org.drools.analytics.components.Field;
+
+public abstract class MissingRange implements Comparable<MissingRange> {
+
+	private static int index = 0;
+	protected int id = index++;
+
+	protected Field field;
+	protected String evaluator;
+
+	private String firedRuleName;
+
+	public int compareTo(MissingRange another) {
+		MissingRange anotherMissingRange = ((MissingRange) another);
+
+		return this.id - anotherMissingRange.getId();
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public Field getField() {
+		return field;
+	}
+
+	public void setField(Field field) {
+		this.field = field;
+	}
+
+	public String getEvaluator() {
+		return evaluator;
+	}
+
+	public String getFiredRuleName() {
+		return firedRuleName;
+	}
+
+	public void setFiredRuleName(String firedRuleName) {
+		this.firedRuleName = firedRuleName;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/PartialRedundancy.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/PartialRedundancy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/PartialRedundancy.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,53 @@
+package org.drools.analytics.report.components;
+
+/**
+ * Partial redundancy between left and right. Redundancy stores the connection
+ * between left and right.
+ * 
+ * @author Toni Rikkola
+ */
+public class PartialRedundancy {
+
+	private Cause left;
+	private Cause right;
+	private Redundancy redundancy;
+
+	/**
+	 * 
+	 * @param left
+	 *            Left side parent.
+	 * @param right
+	 *            Right side parent.
+	 * @param redundancy
+	 *            Connection between left and right.
+	 */
+	public PartialRedundancy(Cause left, Cause right, Redundancy redundancy) {
+		this.left = left;
+		this.right = right;
+		this.redundancy = redundancy;
+	}
+
+	public Cause getLeft() {
+		return left;
+	}
+
+	public void setLeft(Cause left) {
+		this.left = left;
+	}
+
+	public Redundancy getRedundancy() {
+		return redundancy;
+	}
+
+	public void setRedundancy(Redundancy redundancy) {
+		this.redundancy = redundancy;
+	}
+
+	public Cause getRight() {
+		return right;
+	}
+
+	public void setRight(Cause right) {
+		this.right = right;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/RangeCheckCause.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/RangeCheckCause.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/RangeCheckCause.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,18 @@
+package org.drools.analytics.report.components;
+
+import org.drools.analytics.components.Field;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public interface RangeCheckCause extends Cause {
+
+	public Field getField();
+
+	public Object getValueAsObject();
+
+	public String getValueAsString();
+
+	public String getEvaluator();
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,75 @@
+package org.drools.analytics.report.components;
+
+/**
+ * Presents a redundancy between two Causes. The link between them can be WEAK
+ * or STRONG.
+ * 
+ * WEAK redundancy is for example two AnalyticsRules, but not theyr's rule
+ * possibilities. STRONG redundancy includes possibilities.
+ * 
+ * @author Toni Rikkola
+ */
+public class Redundancy implements Cause {
+
+	public enum RedundancyType {
+		WEAK, STRONG
+	}
+
+	private static int index = 0;
+
+	private int id = index++;
+	private RedundancyType type = RedundancyType.WEAK; // By default the
+	// redundancy is weak.
+	private Cause left;
+	private Cause right;
+
+	public Redundancy(Cause left, Cause right) {
+		this.left = left;
+		this.right = right;
+	}
+
+	public Redundancy(RedundancyType type, Cause left, Cause right) {
+		this.type = type;
+		this.left = left;
+		this.right = right;
+	}
+
+	@Override
+	public CauseType getCauseType() {
+		return CauseType.REDUNDANCY;
+	}
+
+	@Override
+	public int getId() {
+		return id;
+	}
+
+	public Cause getLeft() {
+		return left;
+	}
+
+	public void setLeft(Cause left) {
+		this.left = left;
+	}
+
+	public Cause getRight() {
+		return right;
+	}
+
+	public void setRight(Cause right) {
+		this.right = right;
+	}
+
+	public RedundancyType getType() {
+		return type;
+	}
+
+	public void setType(RedundancyType type) {
+		this.type = type;
+	}
+
+	@Override
+	public String toString() {
+		return "Redundacy between: (" + left + ") and (" + right + ").";
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,32 @@
+package org.drools.analytics.report.components;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public class Subsumption {
+
+	private Cause left;
+	private Cause right;
+
+	public Subsumption(Cause left, Cause right) {
+		this.left = left;
+		this.right = right;
+	}
+
+	public Cause getLeft() {
+		return left;
+	}
+
+	public void setLeft(Cause left) {
+		this.left = left;
+	}
+
+	public Cause getRight() {
+		return right;
+	}
+
+	public void setRight(Cause right) {
+		this.right = right;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/AnalyticsMessagesVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/AnalyticsMessagesVisitor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/AnalyticsMessagesVisitor.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,78 @@
+package org.drools.analytics.report.html;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.report.components.AnalyticsMessageBase;
+import org.drools.analytics.report.components.AnalyticsRangeCheckMessage;
+import org.drools.analytics.report.components.Cause;
+import org.mvel.TemplateInterpreter;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+public class AnalyticsMessagesVisitor extends ReportVisitor {
+
+	private static String ANALYSIS_MESSAGES_TEMPLATE = "analyticsMessages.htm";
+	private static String ANALYSIS_MESSAGE_TEMPLATE = "analyticsMessage.htm";
+
+	public static String NOTES = "Notes";
+	public static String WARNINGS = "Warnings";
+	public static String ERRORS = "Errors";
+
+	public static String visitAnalyticsMessagesCollection(String title,
+			Collection<AnalyticsMessageBase> messages) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		Collection<String> messageTemplates = new ArrayList<String>();
+		String myTemplate = readFile(ANALYSIS_MESSAGES_TEMPLATE);
+
+		for (AnalyticsMessageBase message : messages) {
+			messageTemplates.add(visitAnalyticsMessage(message));
+		}
+
+		map.put("title", title);
+		map.put("messages", messageTemplates);
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+
+	public static String visitAnalyticsMessage(AnalyticsMessageBase message) {
+		if (message instanceof AnalyticsRangeCheckMessage) {
+			return visitAnalyticsMessage((AnalyticsRangeCheckMessage) message);
+		} else if (message instanceof AnalyticsMessage) {
+			return visitAnalyticsMessage((AnalyticsMessage) message);
+		}
+
+		return null;
+	}
+
+	public static String visitAnalyticsMessage(
+			AnalyticsRangeCheckMessage message) {
+
+		return MissingRangesReportVisitor.visitRangeCheckMessage(
+				UrlFactory.THIS_FOLDER, message);
+	}
+
+	public static String visitAnalyticsMessage(AnalyticsMessage message) {
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		Collection<String> causeUrls = new ArrayList<String>();
+		String myTemplate = readFile(ANALYSIS_MESSAGE_TEMPLATE);
+
+		// Solve the url's to causes if there is any.
+		for (Cause cause : message.getCauses()) {
+			causeUrls.add(UrlFactory.getUrl(cause));
+		}
+
+		map.put("title", message.getSeverity());
+		map.put("reason", message.getFaulty());
+		map.put("message", message.getMessage());
+		map.put("causes", causeUrls);
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportModeller.java (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportModeller.java)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportModeller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportModeller.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,120 @@
+package org.drools.analytics.report.html;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.drools.analytics.components.AnalyticsClass;
+import org.drools.analytics.components.AnalyticsRule;
+import org.drools.analytics.components.Field;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.AnalyticsMessage;
+
+public class ComponentsReportModeller extends ReportModeller {
+
+	public static void writeHTML(String path) {
+		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+
+		// Source folder
+		File sourceFolder = new File(path + UrlFactory.SOURCE_FOLDER);
+		sourceFolder.mkdir();
+
+		// Base files
+		// index.htm
+		writeToFile(path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.HTML_FILE_INDEX, formPage(UrlFactory.THIS_FOLDER,
+				ComponentsReportVisitor.visitObjectTypeCollection(
+						UrlFactory.THIS_FOLDER, data.getAllClasses())));
+
+		// packages.htm
+		writeToFile(path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.HTML_FILE_PACKAGES, formPage(
+				UrlFactory.THIS_FOLDER, ComponentsReportVisitor
+						.visitRulePackageCollection(UrlFactory.THIS_FOLDER,
+								data.getAllRulePackages())));
+
+		// Rules
+		String ruleFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.RULE_FOLDER;
+		File rulesFolder = new File(ruleFolder);
+		rulesFolder.mkdir();
+		for (AnalyticsRule rule : data.getAllRules()) {
+			writeToFile(ruleFolder + File.separator + rule.getId() + ".htm",
+					formPage(UrlFactory.PREVIOUS_FOLDER,
+							ComponentsReportVisitor.visitRule(
+									UrlFactory.PREVIOUS_FOLDER, rule)));
+		}
+
+		// ObjectTypes
+		String objectTypeFolder = path + UrlFactory.SOURCE_FOLDER
+				+ File.separator + UrlFactory.OBJECT_TYPE_FOLDER;
+		File objectTypesFolder = new File(objectTypeFolder);
+		objectTypesFolder.mkdir();
+		for (AnalyticsClass objectType : data.getAllClasses()) {
+			writeToFile(objectTypeFolder + File.separator + objectType.getId()
+					+ ".htm", formPage(UrlFactory.PREVIOUS_FOLDER,
+					ComponentsReportVisitor.visitObjectType(
+							UrlFactory.PREVIOUS_FOLDER, objectType)));
+		}
+
+		// Fields
+		String fieldFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.FIELD_FOLDER;
+		File fieldsFolder = new File(fieldFolder);
+		fieldsFolder.mkdir();
+		for (Field field : data.getAllFields()) {
+			writeToFile(fieldFolder + File.separator + field.getId() + ".htm",
+					formPage(UrlFactory.PREVIOUS_FOLDER,
+							ComponentsReportVisitor.visitField(
+									UrlFactory.PREVIOUS_FOLDER, field)));
+		}
+
+		// Analytics messages
+		writeMessages(path);
+
+		// css files
+		String cssFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.CSS_FOLDER;
+		File cssesFolder = new File(cssFolder);
+		cssesFolder.mkdir();
+		writeToFile(cssFolder + File.separator + UrlFactory.CSS_FILE_DETAILS,
+				ComponentsReportVisitor.getCss(UrlFactory.CSS_FILE_DETAILS));
+		writeToFile(cssFolder + File.separator + UrlFactory.CSS_FILE_LIST,
+				ComponentsReportVisitor.getCss(UrlFactory.CSS_FILE_LIST));
+
+		// Image files
+		String imagesFolder = path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.IMAGES_FOLDER;
+
+		File imgsFolder = new File(imagesFolder);
+		imgsFolder.mkdir();
+
+		try {
+			copyFile(imagesFolder, "hdrlogo_drools50px.gif");
+			copyFile(imagesFolder, "jbossrules_hdrbkg_blue.gif");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private static void writeMessages(String path) {
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		String errors = AnalyticsMessagesVisitor
+				.visitAnalyticsMessagesCollection(
+						AnalyticsMessage.Severity.ERROR.getTuple(), result
+								.getBySeverity(AnalyticsMessage.Severity.ERROR));
+		String warnings = AnalyticsMessagesVisitor
+				.visitAnalyticsMessagesCollection(
+						AnalyticsMessage.Severity.WARNING.getTuple(),
+						result.getBySeverity(AnalyticsMessage.Severity.WARNING));
+		String notes = AnalyticsMessagesVisitor
+				.visitAnalyticsMessagesCollection(
+						AnalyticsMessage.Severity.NOTE.getTuple(), result
+								.getBySeverity(AnalyticsMessage.Severity.NOTE));
+
+		writeToFile(path + UrlFactory.SOURCE_FOLDER + File.separator
+				+ UrlFactory.HTML_FILE_ANALYTICS_MESSAGES, formPage(
+				UrlFactory.THIS_FOLDER, errors + warnings + notes));
+	}
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportVisitor.java (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/ComponentsReportVisitor.java)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportVisitor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ComponentsReportVisitor.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,123 @@
+package org.drools.analytics.report.html;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.analytics.components.AnalyticsClass;
+import org.drools.analytics.components.AnalyticsRule;
+import org.drools.analytics.components.Field;
+import org.drools.analytics.components.Restriction;
+import org.drools.analytics.components.RulePackage;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.RangeCheckCause;
+import org.mvel.TemplateInterpreter;
+
+public class ComponentsReportVisitor extends ReportVisitor {
+
+	public static String getCss(String fileName) {
+		return readFile(fileName);
+	}
+
+	public static String visitRulePackageCollection(String sourceFolder,
+			Collection<RulePackage> packages) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sourceFolder", sourceFolder);
+		map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+
+		map.put("rulePackages", packages);
+
+		String myTemplate = readFile("packages.htm");
+
+		String result = TemplateInterpreter.evalToString(myTemplate, map);
+
+		return result;
+	}
+
+	public static String visitObjectTypeCollection(String sourceFolder,
+			Collection<AnalyticsClass> objectTypes) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sourceFolder", sourceFolder);
+		map.put("objectTypeFolder", sourceFolder + "/"
+				+ UrlFactory.OBJECT_TYPE_FOLDER);
+		map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+		map.put("objectTypes", objectTypes);
+
+		String myTemplate = readFile("objectTypes.htm");
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+
+	public static String visitRule(String sourceFolder, AnalyticsRule rule) {
+		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+		Collection<AnalyticsClass> objectTypes = data.getClassesByRuleName(rule
+				.getRuleName());
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sourceFolder", sourceFolder);
+		map.put("objectTypeFolder", UrlFactory.OBJECT_TYPE_FOLDER);
+
+		map.put("rule", rule);
+		map.put("objectTypes", objectTypes);
+
+		String myTemplate = readFile("rule.htm");
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+
+	public static String visitObjectType(String sourceFolder,
+			AnalyticsClass objectType) {
+		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+		Collection<AnalyticsRule> rules = data.getRulesByClassId(objectType
+				.getId());
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sourceFolder", sourceFolder);
+		map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+		map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+
+		map.put("objectType", objectType);
+		map.put("rules", rules);
+
+		String myTemplate = readFile("objectType.htm");
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+
+	public static String visitField(String sourceFolder, Field field) {
+		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		AnalyticsClass objectType = data.getClassById(field.getClassId());
+		Collection<AnalyticsRule> rules = data.getRulesByFieldId(field.getId());
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sourceFolder", sourceFolder);
+		map.put("ruleFolder", UrlFactory.RULE_FOLDER);
+		map.put("objectTypeFolder", UrlFactory.OBJECT_TYPE_FOLDER);
+		map.put("fieldFolder", UrlFactory.FIELD_FOLDER);
+
+		map.put("field", field);
+		map.put("objectType", objectType);
+		map.put("rules", rules);
+
+		if (field.getFieldType() == Field.FieldType.DOUBLE
+				|| field.getFieldType() == Field.FieldType.DATE
+				|| field.getFieldType() == Field.FieldType.INT) {
+			Collection<RangeCheckCause> causes = result
+					.getRangeCheckCausesByFieldId(field.getId());
+			Collection<Restriction> restrictions = data
+					.getRestrictionsByFieldId(field.getId());
+			map.put("ranges", "Ranges:"
+					+ MissingRangesReportVisitor.visitRanges(
+							UrlFactory.PREVIOUS_FOLDER, restrictions, causes));
+		} else {
+			map.put("ranges", "");
+		}
+
+		String myTemplate = readFile("field.htm");
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/MissingRangesReportVisitor.java (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/MissingRangesReportVisitor.java)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/MissingRangesReportVisitor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/MissingRangesReportVisitor.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,178 @@
+package org.drools.analytics.report.html;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.drools.analytics.components.Field;
+import org.drools.analytics.components.LiteralRestriction;
+import org.drools.analytics.components.Restriction;
+import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.dao.DataTree;
+import org.drools.analytics.report.components.AnalyticsRangeCheckMessage;
+import org.drools.analytics.report.components.RangeCheckCause;
+import org.mvel.TemplateInterpreter;
+
+public class MissingRangesReportVisitor extends ReportVisitor {
+
+	public static Collection<String> visitRestrictionsCollection(
+			String sourceFolder, Collection<Restriction> restrictions,
+			Collection<RangeCheckCause> causes) {
+		DataTree<Object, DataRow> dt = new DataTree<Object, DataRow>();
+		Collection<String> stringRows = new ArrayList<String>();
+
+		for (RangeCheckCause cause : causes) {
+			dt.put(cause.getValueAsObject(), new DataRow(null, null, cause
+					.getEvaluator(), cause.getValueAsString()));
+		}
+
+		for (Restriction r : restrictions) {
+			if (r instanceof LiteralRestriction) {
+				try {
+					LiteralRestriction restriction = (LiteralRestriction) r;
+
+					dt.put(restriction.getValueAsObject(), new DataRow(
+							restriction.getRuleId(), restriction.getRuleName(),
+							restriction.getEvaluator(), restriction
+									.getValueAsString()));
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		DataRow previous = null;
+		for (Iterator<DataRow> iterator = dt.values().iterator(); iterator
+				.hasNext();) {
+			DataRow current = iterator.next();
+
+			if (previous != null) {
+				// Check if previous and current are from the same rule.
+				if (previous.ruleId == null && current.ruleId == null
+						&& !previous.evaluator.equals("==")
+						&& !previous.evaluator.equals("!=")
+						&& !current.evaluator.equals("==")
+						&& !current.evaluator.equals("!=")) {
+					// Combine these two.
+					stringRows.add("Missing : " + previous + " .. " + current);
+
+					current = iterator.next();
+
+				} else if (previous.ruleId != null
+						&& previous.ruleId.equals(current.ruleId)) {
+					// Combine these two.
+					stringRows.add(UrlFactory.getRuleUrl(sourceFolder,
+							current.ruleId, current.ruleName)
+							+ " : "
+							+ previous.toString()
+							+ " "
+							+ current.toString());
+
+					current = iterator.next();
+
+				} else if (!iterator.hasNext()) { // If this is last row
+					// Print previous and current if they were not merged.
+					processRangeOutput(previous, stringRows, sourceFolder);
+					processRangeOutput(current, stringRows, sourceFolder);
+
+				} else { // If they are not from the same rule
+					// Print previous.
+					processRangeOutput(previous, stringRows, sourceFolder);
+				}
+			} else if (!iterator.hasNext()) {
+				processRangeOutput(current, stringRows, sourceFolder);
+			}
+
+			// Set current as previous.
+			previous = current;
+		}
+
+		return stringRows;
+	}
+
+	public static String visitRanges(String sourceFolder,
+			Collection<Restriction> restrictions,
+			Collection<RangeCheckCause> causes) {
+		Map<String, Object> map = new HashMap<String, Object>();
+
+		map.put("lines", visitRestrictionsCollection(sourceFolder,
+				restrictions, causes));
+
+		String myTemplate = readFile("ranges.htm");
+
+		String result = TemplateInterpreter.evalToString(myTemplate, map);
+
+		return result;
+	}
+
+	private static void processRangeOutput(DataRow dataRow,
+			Collection<String> stringRows, String sourceFolder) {
+
+		if (dataRow.ruleId == null) {
+			stringRows.add("Missing : " + dataRow.toString());
+		} else {
+			stringRows.add(UrlFactory.getRuleUrl(sourceFolder, dataRow.ruleId,
+					dataRow.ruleName)
+					+ " : " + dataRow.toString());
+		}
+	}
+
+	public static String visitRangeCheckMessage(String sourceFolder,
+			AnalyticsRangeCheckMessage message) {
+		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
+		Collection<Restriction> restrictions = data
+				.getRestrictionsByFieldId(message.getFaulty().getId());
+		Field field = (Field) message.getFaulty();
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("header", processHeader(sourceFolder));
+		map.put("sourceFolder", sourceFolder);
+		map.put("fieldFolder", sourceFolder + "/" + UrlFactory.FIELD_FOLDER);
+		map.put("objectTypeFolder", sourceFolder + "/"
+				+ UrlFactory.OBJECT_TYPE_FOLDER);
+		map
+				.put("packageFolder", sourceFolder + "/"
+						+ UrlFactory.PACKAGE_FOLDER);
+		map.put("cssStyle", createStyleTag(sourceFolder + "/"
+				+ UrlFactory.CSS_FOLDER + "/" + UrlFactory.CSS_FILE_LIST));
+
+		map.put("field", field);
+		map.put("objectType", data.getClassById(field.getClassId()));
+		map.put("ranges", visitRanges(UrlFactory.THIS_FOLDER, restrictions,
+				message.getCauses()));
+
+		String myTemplate = readFile("missingRange.htm");
+
+		String result = TemplateInterpreter.evalToString(myTemplate, map);
+
+		return result;
+	}
+}
+
+class DataRow implements Comparable<DataRow> {
+	public String ruleName;
+	protected Integer ruleId;
+	protected String evaluator;
+	protected String value;
+
+	@Override
+	public int compareTo(DataRow o) {
+		return evaluator.compareTo(o.evaluator);
+	}
+
+	public DataRow(Integer ruleId, String ruleName, String evaluator,
+			String valueAsString) {
+		this.ruleId = ruleId;
+		this.ruleName = ruleName;
+		this.evaluator = evaluator;
+		this.value = valueAsString;
+	}
+
+	@Override
+	public String toString() {
+		return evaluator + " " + value;
+	}
+}

Added: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportModeller.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportModeller.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportModeller.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,70 @@
+package org.drools.analytics.report.html;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.mvel.TemplateInterpreter;
+
+public abstract class ReportModeller {
+
+	protected static String formPage(String sourceFolder, String content) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		String myTemplate = AnalyticsMessagesVisitor.readFile("frame.htm");
+
+		map.put("cssStyle", ReportVisitor.createStyleTag(sourceFolder + "/"
+				+ UrlFactory.CSS_FOLDER + "/" + UrlFactory.CSS_FILE_LIST));
+		map.put("sourceFolder", sourceFolder);
+		map.put("header", ReportVisitor.processHeader(sourceFolder));
+		map.put("content", content);
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+
+	public static void copyFile(String destination, String filename)
+			throws IOException {
+
+		File source = new File(ComponentsReportModeller.class.getResource(
+				filename).getFile());
+		File dest = new File(destination + File.separator + filename);
+
+		if (!dest.exists()) {
+			dest.createNewFile();
+		}
+		InputStream in = null;
+		OutputStream out = null;
+		try {
+			in = new FileInputStream(source);
+			out = new FileOutputStream(dest);
+
+			// Transfer bytes from in to out
+			byte[] buf = new byte[1024];
+			int len;
+			while ((len = in.read(buf)) > 0) {
+				out.write(buf, 0, len);
+			}
+		} finally {
+			in.close();
+			out.close();
+		}
+
+	}
+
+	protected static void writeToFile(String fileName, String text) {
+		try {
+			FileWriter fstream = new FileWriter(fileName);
+			BufferedWriter out = new BufferedWriter(fstream);
+			out.write(text);
+			out.close();
+		} catch (Exception e) {
+			System.err.println(e.getMessage());
+		}
+	}
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportVisitor.java (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/ReportVisitor.java)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportVisitor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/ReportVisitor.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,54 @@
+package org.drools.analytics.report.html;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.mvel.TemplateInterpreter;
+
+abstract class ReportVisitor {
+
+	protected static String processHeader(String folder) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sourceFolder", folder);
+
+		map.put("objectTypesFile", UrlFactory.HTML_FILE_INDEX);
+		map.put("packagesFile", UrlFactory.HTML_FILE_PACKAGES);
+		map.put("messagesFile", UrlFactory.HTML_FILE_ANALYTICS_MESSAGES);
+
+		String myTemplate = readFile("header.htm");
+
+		return TemplateInterpreter.evalToString(myTemplate, map);
+	}
+
+	protected static String readFile(String fileName) {
+		StringBuffer str = new StringBuffer("");
+		try {
+			BufferedReader reader = new BufferedReader(new InputStreamReader(
+					ReportVisitor.class.getResourceAsStream(fileName)));
+			String line = null;
+			while ((line = reader.readLine()) != null) {
+				str.append(line);
+				str.append("\n");
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (NullPointerException e) {
+			System.err.println("File " + fileName + " was not found.");
+			e.printStackTrace();
+		}
+		return str.toString();
+	}
+
+	protected static String createStyleTag(String path) {
+		StringBuffer str = new StringBuffer("");
+
+		str.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"");
+		str.append(path);
+		str.append("\" />");
+
+		return str.toString();
+	}
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/UrlFactory.java (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/result/UrlFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/UrlFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/html/UrlFactory.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,53 @@
+package org.drools.analytics.report.html;
+
+import org.drools.analytics.components.AnalyticsRule;
+
+/**
+ * 
+ * @author Toni Rikkola
+ */
+class UrlFactory {
+
+	public static final String THIS_FOLDER = ".";
+	public static final String PREVIOUS_FOLDER = "..";
+
+	public static final String SOURCE_FOLDER = "report";
+	public static final String OBJECT_TYPE_FOLDER = "objectTypes";
+	public static final String FIELD_FOLDER = "fields";
+	public static final String RULE_FOLDER = "rules";
+	public static final String PACKAGE_FOLDER = "packages";
+	public static final String CSS_FOLDER = "css";
+
+	public static final String CSS_FILE_LIST = "relationsList.css";
+	public static final String CSS_FILE_DETAILS = "relationsDetails.css";
+
+	public static final String IMAGES_FOLDER = "images";
+
+	public static final String HTML_FILE_INDEX = "index.htm";
+	public static final String HTML_FILE_PACKAGES = "packages.htm";
+	public static final String HTML_FILE_ANALYTICS_MESSAGES = "analyticsMessages.htm";
+
+	/**
+	 * Finds a link to object if one exists.
+	 * 
+	 * @param o
+	 *            Object that might have a page that can be linked.
+	 * @return Link to objects page or the toString() text if no link could not
+	 *         be created.
+	 */
+	public static String getUrl(Object o) {
+		if (o instanceof AnalyticsRule) {
+			AnalyticsRule rule = (AnalyticsRule) o;
+			return getRuleUrl(UrlFactory.RULE_FOLDER, rule.getId(), rule
+					.getRuleName());
+		}
+
+		return o.toString();
+	}
+
+	static String getRuleUrl(String sourceFolder, int ruleId, String ruleName) {
+		return "<a href=\"" + sourceFolder + "/" + RULE_FOLDER + "/" + ruleId
+				+ ".htm\">" + ruleName + "</a>";
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Clean.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,13 +2,13 @@
 package org.drools.analytics.rangeChecks.cleanUp
 
 import org.drools.analytics.components.*;  
-import org.drools.analytics.result.Gap;  
-import org.drools.analytics.result.MissingNumberPattern;
+import org.drools.analytics.report.components.Gap;  
+import org.drools.analytics.report.components.MissingNumberPattern;
 
-import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsResult;
 
 #declare any global variables here
-global AnalyticsData data;
+global AnalyticsResult result;
 
 #
 # Example: missing ( x >= 10 ) and ( x <= 10 ). This is the same as ( x == 10 )
@@ -25,8 +25,8 @@
 			valueAsString == $g1.valueAsString
 		)		
 	then	
-		data.remove( $g1 );
-		data.remove( $g2 );
+		result.remove( $g1 );
+		result.remove( $g2 );
 		retract( $g1 );
 		retract( $g2 );
 		
@@ -36,7 +36,7 @@
 											$g1.getField().getFieldType(), 
 											$g1.getValueAsString() );
 		mnp.setFiredRuleName( drools.getRule().getName() );
-		data.save( mnp );
+		result.save( mnp );
 		insert( mnp );
 end
 
@@ -79,7 +79,7 @@
 	then
 		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -121,7 +121,7 @@
 	then
 		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -163,7 +163,7 @@
 	then
 		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -205,7 +205,7 @@
 	then
 		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -247,7 +247,7 @@
 	then
 		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -289,7 +289,7 @@
 	then
 		#System.out.println( $lower + " | " + $higher );
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 /*
@@ -333,7 +333,7 @@
 
 	then
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -376,7 +376,7 @@
 
 	then
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 
 #
@@ -419,6 +419,6 @@
 
 	then
 		retract( $gap );
-		data.remove( $gap );
+		result.remove( $gap );
 end
 */

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Dates.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -3,17 +3,17 @@
 
 #list any import classes here.
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 
 import java.util.Date;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
 
-import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsResult;
 
 #declare any global variables here
-global AnalyticsData data;
+global AnalyticsResult result;
 
 function boolean checkDates(Date d1, Date d2, boolean up) {
 		Calendar c1 = new GregorianCalendar();
@@ -54,7 +54,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -86,7 +86,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -127,7 +127,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -168,6 +168,6 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Doubles.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -3,13 +3,13 @@
 
 #list any import classes here.
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 
-import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsResult;
 
 #declare any global variables here
-global AnalyticsData data;
+global AnalyticsResult result;
 
 
 # If all ranges are not checked for a field.
@@ -40,7 +40,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -72,7 +72,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -105,7 +105,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -138,7 +138,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -204,7 +204,7 @@
 	then
 		Gap gap = new Gap( $f, Gap.getReversedEvaluator($r.getEvaluator()), $r );
 		gap.setFiredRuleName( drools.getRule().getName() );
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -238,7 +238,7 @@
 	then
 		Gap gap = new Gap( $f, "<", $r );
 		gap.setFiredRuleName( drools.getRule().getName() );
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -272,7 +272,7 @@
 	then
 		Gap gap = new Gap( $f, ">", $r );
 		gap.setFiredRuleName( drools.getRule().getName() );
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 */

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Integers.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -3,12 +3,12 @@
 
 #list any import classes here.
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 
-import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsResult;
 
-global AnalyticsData data;
+global AnalyticsResult result;
 
 # If all ranges are not checked for a field.
 # 
@@ -38,7 +38,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -70,7 +70,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -111,7 +111,7 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end
 
@@ -152,6 +152,6 @@
 		
 		gap.setFiredRuleName( drools.getRule().getName() );
 		
-		data.save( gap );
+		result.save( gap );
 		insert( gap );
 end

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Patterns.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -5,19 +5,18 @@
 import org.drools.analytics.components.*;
 import org.drools.analytics.accumulateFunction.ValidatePattern;
 import org.drools.analytics.accumulateFunction.ValidatePatternResult;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.MissingNumberPattern;
-import org.drools.analytics.result.Cause;
-import org.drools.analytics.result.AnalysisWarning;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.MissingNumberPattern;
+import org.drools.analytics.report.components.Cause;
 import org.drools.analytics.accumulateFunction.FindMissingNumber;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.drools.analytics.dao.AnalyticsData;
+import org.drools.analytics.dao.AnalyticsResult;
 
 #declare any global variables here
-global AnalyticsData data;
+global AnalyticsResult result;
 
 #
 # If all pattern ranges are not checked for a field.
@@ -55,7 +54,7 @@
 		Number number = FindMissingNumber.testForPattern( $list );
 		if( number != null ){
 			MissingNumberPattern mnp = new MissingNumberPattern( $f, "==", $f.getFieldType(), number.toString() );
-			data.save( mnp );
+			result.save( mnp );
 		}
 end
 
@@ -95,6 +94,6 @@
 		Number number = FindMissingNumber.testForPattern( $list );
 		if( number != null ){
 			MissingNumberPattern mnp = new MissingNumberPattern( $f, "!=", $f.getFieldType(), number.toString() );
-			data.save( mnp );
+			result.save( mnp );
 		}
 end

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Variables.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Variables.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/rangeChecks/Variables.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -4,8 +4,8 @@
 import org.drools.analytics.components.*;
 import org.drools.analytics.accumulateFunction.ValidatePattern;
 import org.drools.analytics.accumulateFunction.ValidatePatternResult;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 
 import java.util.ArrayList;
 import java.util.TreeSet;
@@ -13,7 +13,7 @@
 import java.util.Locale;
 
 #declare any global variables here
-global AnalysisResult result
+global AnalyticsResult result
 
 /*
 # If all ranges are not checked for a field.

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Notes.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Notes.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Notes.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,37 @@
+#created on: 12.10.2007
+package org.drools.analytics.redundancy
+
+#list any import classes here.
+global AnalyticsResult result;
+
+
+
+#declare any global variables here
+import java.util.Collection;
+import java.util.ArrayList;
+
+import org.drools.analytics.components.PatternPossibility;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.report.components.Cause;
+
+
+
+rule "Find redundant restrictions from pattern possibilities"
+	when
+		$r :Redundancy()
+		PatternPossibility(
+			items contains $r.left, 
+			items contains $r.right 
+		)
+	then
+		Collection<Cause> causes = new ArrayList<Cause>();
+		causes.add( $r.getLeft() );
+		causes.add( $r.getRight() );
+		
+		result.save(new AnalyticsMessage( 
+						AnalyticsMessage.Severity.NOTE, AnalyticsMessage.MessageType.REDUNDANCY, 
+						$r, "Same restriction exists twice.", causes ) );
+end
+

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Patterns.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Patterns.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Patterns.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,7 +2,7 @@
 package org.drools.analytics.redundancy.patterns
 
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.Redundancy;
+import org.drools.analytics.report.components.Redundancy;
 
 #
 # Only checks for redundant pattern specifications, 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Possibilities.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,12 +2,12 @@
 package org.drools.analytics.redundancy.possibilities
 
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.Redundancy;
-import org.drools.analytics.result.Redundancy.RedundancyType;
-import org.drools.analytics.result.PartialRedundancy;
-import org.drools.analytics.result.Subsumption;
-import org.drools.analytics.result.Cause;
-import org.drools.analytics.result.Cause.CauseType;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.analytics.report.components.Redundancy.RedundancyType;
+import org.drools.analytics.report.components.PartialRedundancy;
+import org.drools.analytics.report.components.Subsumption;
+import org.drools.analytics.report.components.Cause;
+import org.drools.analytics.report.components.Cause.CauseType;
 
 import java.util.ArrayList;
 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Restrictions.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Restrictions.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Restrictions.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,38 +2,8 @@
 package org.drools.analytics.redundancy.restrictions
 
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.Redundancy;
+import org.drools.analytics.report.components.Redundancy;
 
-# TODO: And from and every object.
-//TODO: Also check that patterns and rules are redundant.
-/*
-rule "Find redundant ReturnValueRestriction"
-	when
-		# Check that Restrictions $left and $right have redundant fields.
-		$left :ReturnValueRestriction()
-		$right :ReturnValueRestriction( 
-			id != $left.id,
-			evaluator == $left.evaluator,
-			classMethodName matches $left.classMethodName,
-			compareStringArrays( declarations, $left.declarations )
-		)
-					
-		# Check that PatternPossibilities $pp1 and $pp2 have redundant fields
-		# and that they contain $left and $right.
-		$pp1 :PatternPossibility( restriction contains $left ) 
-		$pp2 :PatternPossibility( 
-					id != $pp1.id, 
-					restriction contains $right, 
-					exist == $pp1.exist, 
-					notExist == $pp1.notExist,
-					eval( restrictions.size() == $pp1.getRestrictions().size() ) 
-		)
-		# Check that there is not allready a pair with these values.
-		not RedundantPair( left == $left, right == $right )
-	then
-		insert( new RedundantPair( $pp1, $pp2, $left, $right ) );
-end
-*/
 rule "Find redundant VariableRestriction"
 	when
 		# Check that Restrictions $left and $right have redundant fields.
@@ -63,40 +33,7 @@
 		insert( new Redundancy( Redundancy.RedundancyType.STRONG, $left, $right ) );
 end
 
-/*
-XXX: Not sure if this can be done.
-rule "Find redundant QualifiedIdentifierRestriction"
-	when
-		# Check that Restrictions $left and $right have redundant fields.
-		$left :QualifiedIdentifierRestriction()
-		$right :QualifiedIdentifierRestriction( 
-			id != $left.id, 
-			evaluator == $left.evaluator 
-		)
-		
-		# Check that these two variables point to the same object.
-		$v :Variable( id == $left.variableId )
-		Variable( 
-			id == $right.variableId,
-			objectType == $v.objectType,
-			objectId == $v.objectId
-		)
-		
-		# Check that there is not already a pair with these values.
-		not Redundancy( 
-			left == $left, 
-			right == $right 
-		)
-		not Redundancy( 
-			left == $right, 
-			right == $left 
-		)
-	then
-		insert( new Redundancy( $left, $right ) );
-end
-*/
 
-
 rule "Find redundant LiteralRestriction"
 	when
 		# Check that Restrictions $left and $right have redundant fields.
@@ -106,19 +43,22 @@
 				$right :LiteralRestriction( 
 					id != $left.id, 
 					evaluator == $left.evaluator,
+					valueType == $left.valueType,
 					valueType == Field.FieldType.BOOLEAN,
 					booleanValue == $left.booleanValue
 				)
 			or
 				$right :LiteralRestriction( id != $left.id, 
 					evaluator == $left.evaluator,
+					valueType == $left.valueType,
 					valueType == Field.FieldType.STRING,
-					stringValue matches $left.stringValue
+					valueAsString matches $left.valueAsString
 				)
 			or
 				$right :LiteralRestriction( 
 					id != $left.id, 
 					evaluator == $left.evaluator,
+					valueType == $left.valueType,
 					valueType == Field.FieldType.INT,
 					intValue == $left.intValue
 				)
@@ -126,6 +66,7 @@
 				$right :LiteralRestriction( 
 					id != $left.id, 
 					evaluator == $left.evaluator,
+					valueType == $left.valueType,
 					valueType == Field.FieldType.DOUBLE,
 					doubleValue == $left.doubleValue
 				)
@@ -133,6 +74,7 @@
 				$right :LiteralRestriction( 
 					id != $left.id, 
 					evaluator == $left.evaluator,
+					valueType == $left.valueType,
 					valueType == Field.FieldType.DATE,
 					eval( dateValue.equals($left.getDateValue()) )
 				)
@@ -141,6 +83,7 @@
 				$right :LiteralRestriction( 
 					id != $left.id, 
 					evaluator == $left.evaluator,
+					valueType == $left.valueType,
 					valueType == Field.FieldType.VARIABLE
 				)
 				and
@@ -169,3 +112,66 @@
 	then
 		insert( new Redundancy( Redundancy.RedundancyType.STRONG, $left, $right ) );
 end
+
+# TODO: And from and every object.
+//TODO: Also check that patterns and rules are redundant.
+/*
+rule "Find redundant ReturnValueRestriction"
+	when
+		# Check that Restrictions $left and $right have redundant fields.
+		$left :ReturnValueRestriction()
+		$right :ReturnValueRestriction( 
+			id != $left.id,
+			evaluator == $left.evaluator,
+			classMethodName matches $left.classMethodName,
+			compareStringArrays( declarations, $left.declarations )
+		)
+					
+		# Check that PatternPossibilities $pp1 and $pp2 have redundant fields
+		# and that they contain $left and $right.
+		$pp1 :PatternPossibility( restriction contains $left ) 
+		$pp2 :PatternPossibility( 
+					id != $pp1.id, 
+					restriction contains $right, 
+					exist == $pp1.exist, 
+					notExist == $pp1.notExist,
+					eval( restrictions.size() == $pp1.getRestrictions().size() ) 
+		)
+		# Check that there is not allready a pair with these values.
+		not RedundantPair( left == $left, right == $right )
+	then
+		insert( new RedundantPair( $pp1, $pp2, $left, $right ) );
+end
+*/
+/*
+XXX: Not sure if this can be done.
+rule "Find redundant QualifiedIdentifierRestriction"
+	when
+		# Check that Restrictions $left and $right have redundant fields.
+		$left :QualifiedIdentifierRestriction()
+		$right :QualifiedIdentifierRestriction( 
+			id != $left.id, 
+			evaluator == $left.evaluator 
+		)
+		
+		# Check that these two variables point to the same object.
+		$v :Variable( id == $left.variableId )
+		Variable( 
+			id == $right.variableId,
+			objectType == $v.objectType,
+			objectId == $v.objectId
+		)
+		
+		# Check that there is not already a pair with these values.
+		not Redundancy( 
+			left == $left, 
+			right == $right 
+		)
+		not Redundancy( 
+			left == $right, 
+			right == $left 
+		)
+	then
+		insert( new Redundancy( $left, $right ) );
+end
+*/

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/redundancy/Rules.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -2,7 +2,7 @@
 package org.drools.analytics.redundancy.rules
 
 import org.drools.analytics.components.*;
-import org.drools.analytics.result.Redundancy;
+import org.drools.analytics.report.components.Redundancy;
 
 #
 # Only checks for redundant rule specifications, 

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessage.htm
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessage.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessage.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,18 @@
+
+	<table>
+		<tr>
+			<th><h3>@{title}</h3></th>
+		</tr>
+		<tr>
+			<td>
+				@{message}<br/>
+				Reason: @{reason}<br/>
+				<span>Causes:</span>
+				<ul>	
+				@foreach{causes as cause}
+					<li>@{cause}</li>
+				@end{}
+				</ul>
+			</td>
+		</tr>
+	</table>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessages.htm
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessages.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/analyticsMessages.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,9 @@
+
+<div>
+	<h2>@{title}</h2>
+	<div>
+		@foreach{messages as message}
+			@{message}
+		@end{}
+	</div>
+</div>
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/basic.css (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/basic.css)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/basic.css	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/basic.css	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,56 @@
+
+
+table
+{
+	background-color: #d2d7db;
+	text-align: left;
+	border-spacing: 0px;
+	border: 1px solid #aeb3b6;
+	border-collapse: collapse;
+}
+
+table a, table, tbody, tfoot, tr, th, td
+{
+	font-family: georgia, "times new roman", serif;
+	line-height: 1.5em;
+	font-size: 13px;
+	color: #55595c;
+}
+
+table caption
+{
+	border-top: 1px solid #aeb3b6;
+	padding: .5em 0;
+	font-size: 240%;
+	font-style: italic;
+	color: #d2d7db;
+}
+
+table th
+{
+	width: 200px;
+}
+
+tbody th
+{
+	color: #25c1e2;
+	font-style: italic;
+	background-color: #fff;
+	border-bottom: 1px solid #aeb3b6;
+}
+
+td
+{
+	border: 1px dotted #fff;
+	padding: 0 2px;
+}
+
+ul
+{
+	padding:0px 0px 0px 20px;
+	width:600px;
+}
+
+li
+{
+}

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/field.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/field.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/field.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/field.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,21 @@
+
+<div>
+	<h2>Field</h2>
+	<div>
+		Name: @{field.name}<br/>
+		Type: @{field.fieldType}<br/>
+		Belongs to class: <a href="@{sourceFolder}/@{objectTypeFolder}/@{objectType.id}.htm">@{objectType.name}</a>
+	</div>
+	<div>
+		Rules that use this component:
+		<ul>
+			@foreach{rules as rule}
+			<li><a href="@{sourceFolder}/@{ruleFolder}/@{rule.id}.htm">@{rule.ruleName}</a></li>
+			@end{}
+		</ul>
+	</div>
+	<div>
+		@{ranges}
+	</div>
+</div>
+

Added: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/frame.htm
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/frame.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/frame.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,18 @@
+
+<html>
+    <head>
+        <meta name="generator" content="HTML Tidy, see www.w3.org">
+        <meta http-equiv="Content-Type" content=
+        "text/html; charset=iso-8859-1">
+
+        <title>Rule Relations</title>
+		@{cssStyle}
+    </head>
+
+    <body>
+    	<div class="headerBarblue"><img alt="logo" src="@{sourceFolder}/images/hdrlogo_drools50px.gif">  </div>
+    	<div>@{header}</div>
+    	@{content}
+    </body>
+</html>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/hdrlogo_drools50px.gif (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/hdrlogo_drools50px.gif)
===================================================================
(Binary files differ)

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/header.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/header.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/header.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/header.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,15 @@
+<table id="header">
+    <tr>
+        <td><a href=
+        "@{sourceFolder}/@{objectTypesFile}">Object
+        Types</a></td>
+
+        <td><a href=
+        "@{sourceFolder}/@{packagesFile}">Rules by
+        Packages</a></td>
+
+        <td><a href=
+        "@{sourceFolder}/@{messagesFile}">Messages</a></td>
+    </tr>
+</table>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/jbossrules_hdrbkg_blue.gif (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/jbossrules_hdrbkg_blue.gif)
===================================================================
(Binary files differ)

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/missingRange.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/missingRange.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/missingRange.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/missingRange.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,15 @@
+
+        <table>
+        	<tr>
+	            <th><a href=
+	            "@{sourceFolder}/@{objectTypeFolder}/@{objectType.id}.htm">
+	            @{objectType.name}</a> <a href=
+	            "@{sourceFolder}/@{fieldFolder}/@{field.id}.htm">@{field.name}</a></th>
+			</tr>
+            <tr>
+                <td >
+                    @{ranges}
+                </td>
+            </tr>
+        </table>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectType.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/objectType.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectType.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectType.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,30 @@
+
+<div>
+	<h2>Object Type</h2>
+	<div>
+		Name: @{objectType.name}
+	</div>
+	<div>
+		Known fields:
+		@if{objectType.fields != null && !objectType.fields.empty}
+			<ul>
+				@foreach{objectType.fields as field}
+				<li>@{field.fieldType}&nbsp;<a href="@{sourceFolder}/@{fieldFolder}/@{field.id}.htm">@{field.name}</a></li>
+				@end{}
+			</ul>
+		@else{}
+			<p>
+				No known fields.
+			</p>
+		@end{}
+	</div>
+	<div>
+		Rules that use this component:
+		<ul>
+			@foreach{rules as rule}
+			<li><a href="@{sourceFolder}/@{ruleFolder}/@{rule.id}.htm">@{rule.ruleName}</a></li>
+			@end{}
+		</ul>
+	</div>
+</div>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectTypes.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/objectTypes.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectTypes.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/objectTypes.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,21 @@
+
+<div>
+	<h1>Object Types</h1>
+    <table class="objectTypes">
+        <tr>
+            <th>Name</th>
+
+            <th>Fields</th>
+        </tr>
+			@foreach{objectTypes as objectType}
+	    	<tr class="row@{objectType.offset}">
+	                <td><a href="@{sourceFolder}/@{objectTypeFolder}/@{objectType.id}.htm">@{objectType.name}</a></td>
+					<td>
+				@foreach{objectType.fields as field}
+					@{field.fieldType}&nbsp;<a href="@{sourceFolder}/@{fieldFolder}/@{field.id}.htm">@{field.name}</a>@end{","}
+					</td>
+        	</tr>
+			@end{}
+    </table>
+</div>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/packages.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/packages.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/packages.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/packages.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,20 @@
+
+<div>
+	<h1>Rules by Packages</h1>
+    <table class="rulePackages">
+			@foreach{rulePackages as rulePackage}	
+	    	<tr>
+                <th>@{rulePackage.name}</th>
+        	</tr>
+        	<tr>
+        		<td>
+        			<ul>
+					@foreach{rulePackage.rules as rule}
+						<li class="row@{rulePackage.offset}" ><a href="@{sourceFolder}/@{ruleFolder}/@{rule.id}.htm">@{rule.ruleName}</a></li>@end{}
+					</ul>
+				</td>
+        	</tr>
+			@end{}
+    </table>
+</div>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/ranges.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/ranges.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/ranges.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/ranges.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,10 @@
+<ul>
+    @foreach{lines as line}
+		@if{line.startsWith("Missing :")}
+        	<li style="color:Red;">@{line}</li>
+		@elseif{!line.endsWith("is missing")}
+        	<li>@{line}</li>
+		@end{}
+    @end{}
+</ul>
+

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsDetails.css (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/relationsDetails.css)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsDetails.css	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsDetails.css	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,88 @@
+/* JBoss Drools Analytics Style Sheet */
+/* Website: http://labs.jboss.com/jbossrules/ */
+
+ul,p,table
+{
+	padding:0px 0px 0px 20px;
+	width:600px;
+	background-color: #d2d7db;
+	text-align: left;
+	border-spacing: 0px;
+	border: 1px solid #aeb3b6;
+	border-collapse: collapse;
+}
+
+body {
+	font-size:smaller;
+	font-family:"bitstream vera sans","dejavu sans" verdana,helvetica,sans-serif;
+	line-height:1.5em;
+	color:#444;
+	margin:0;
+	padding:0;
+	background:#FFF;
+}
+
+.content
+{
+	padding:0px 0px 10px 10px;
+}
+
+.headerBarBlue {
+	height:60px;
+	background:url(../images/jbossrules_hdrbkg_blue.gif) repeat-x;
+}
+
+table
+{
+	background-color: #d2d7db;
+	text-align: left;
+	border-spacing: 0px;
+	border: 1px solid #aeb3b6;
+	border-collapse: collapse;
+}
+
+table a, table, tbody, tfoot, tr, th, td
+{
+	font-family: georgia, "times new roman", serif;
+	line-height: 1.5em;
+	font-size: 13px;
+	color: #55595c;
+}
+
+table caption
+{
+	border-top: 1px solid #aeb3b6;
+	padding: .5em 0;
+	font-size: 240%;
+	font-style: italic;
+	color: #d2d7db;
+}
+
+table th
+{
+	width: 200px;
+}
+
+tbody th
+{
+	color: #25c1e2;
+	font-style: italic;
+	background-color: #fff;
+	border-bottom: 1px solid #aeb3b6;
+}
+
+td
+{
+	border: 1px dotted #fff;
+	padding: 0 2px;
+}
+
+ul
+{
+	padding:0px 0px 0px 20px;
+	width:600px;
+}
+
+li
+{
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsList.css (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/relationsList.css)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsList.css	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/relationsList.css	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,105 @@
+/* JBoss Drools Analytics Style Sheet */
+/* Website: http://labs.jboss.com/jbossrules/ */
+
+.headerBarBlue {
+	height:60px;
+	background:url(../images/jbossrules_hdrbkg_blue.gif) repeat-x;
+}
+
+ul,p,table
+{
+	padding:0px 0px 0px 20px;
+	width:600px;
+	background-color: #d2d7db;
+	text-align: left;
+	border-spacing: 0px;
+	border: 1px solid #aeb3b6;
+	border-collapse: collapse;
+}
+
+
+body {
+	font-size:smaller;
+	font-family:"bitstream vera sans","dejavu sans" verdana,helvetica,sans-serif;
+	line-height:1.5em;
+	color:#444;
+	margin:0;
+	padding:0;
+	background:#FFF;
+}
+
+.content
+{
+	padding:0px 0px 10px 10px;
+}
+
+table
+{
+	background-color: #d2d7db;
+	text-align: left;
+	border-spacing: 0px;
+	border: 1px solid #aeb3b6;
+	border-collapse: collapse;
+}
+
+table a, table, tbody, tfoot, tr, th, td
+{
+	font-family: georgia, "times new roman", serif;
+	line-height: 1.5em;
+	font-size: 13px;
+	color: #55595c;
+}
+
+table caption
+{
+	border-top: 1px solid #aeb3b6;
+	padding: .5em 0;
+	font-size: 240%;
+	font-style: italic;
+	color: #d2d7db;
+}
+
+table th
+{
+	width: 200px;
+}
+
+tbody th
+{
+	color: #25c1e2;
+	font-style: italic;
+	background-color: #fff;
+	border-bottom: 1px solid #aeb3b6;
+}
+
+td
+{
+	border: 1px dotted #fff;
+	padding: 0 2px;
+}
+
+.row0
+{
+	border: 1px dotted #fff;
+	background-color: #FFFF88;
+	padding: 0 2px;
+}
+
+.row1
+{
+	border: 1px dotted #fff;
+	background-color: #EEEEEE;
+	padding: 0 2px;
+}
+
+
+
+ul
+{
+	padding:0px 0px 0px 20px;
+	width:600px;
+}
+
+li
+{
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/rule.htm (from rev 15719, labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/result/rule.htm)
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/rule.htm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/report/html/rule.htm	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,15 @@
+
+<div>
+	<h2>Rule</h2>
+	<div>
+		Name: @{rule.ruleName}<br/>
+	</div>
+	<div>
+		Patterns:
+		<ul>
+			@foreach{objectTypes as objectType}
+			<li><a href="@{sourceFolder}/@{objectTypeFolder}/@{objectType.id}.htm">@{objectType.name}</a></li>
+			@end{}
+		</ul>
+	</div>
+</div>

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/reports/RangeCheckReports.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -3,14 +3,14 @@
 
 #list any import classes here.
 import org.drools.analytics.components.Field;
-import org.drools.analytics.result.AnalysisWarning;
-import org.drools.analytics.result.AnalysisResult;
-import org.drools.analytics.result.MissingRange;
+import org.drools.analytics.report.components.AnalyticsRangeCheckMessage;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.MissingRange;
 
 import java.util.ArrayList;
 
 #declare any global variables here
-global AnalysisResult result
+global AnalyticsResult result
 
 rule "Collect gaps"
 	when
@@ -20,5 +20,7 @@
 				MissingRange( field == $f )
 			)
 	then
-		result.add( new AnalysisWarning( $f, $f + " has one or more gaps.", $list ) );
+		result.save( new AnalyticsRangeCheckMessage( 
+								AnalyticsRangeCheckMessage.Severity.WARNING, $f, 
+								$f + " has one or more gaps.", $list ) );
 end
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/AnalyticsTestStandalone.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -35,9 +35,9 @@
 					Analyzer.class.getResourceAsStream("Misc3.drl")));
 
 			Analyzer a = new Analyzer();
-//			a.addPackageDescr(descr);
+			// a.addPackageDescr(descr);
 			// a.addPackageDescr(descr2);
-//			 a.addPackageDescr(descr3);
+			// a.addPackageDescr(descr3);
 			// a.addPackageDescr(descr4);
 			a.addPackageDescr(descr5);
 			a.addPackageDescr(descr6);
@@ -45,7 +45,8 @@
 			a.fireAnalysis();
 			// System.out.print(a.getResultAsPlainText());
 			// System.out.print(a.getResultAsXML());
-			a.writeComponentsHTML("/stash/");
+			// a.writeComponentsHTML("/stash/");
+			a.writeComponentsHTML("C:\\");
 		} catch (Throwable t) {
 			t.printStackTrace();
 		}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckCleanTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckCleanTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckCleanTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -11,9 +11,9 @@
 import org.drools.analytics.components.AnalyticsComponent;
 import org.drools.analytics.components.Field;
 import org.drools.analytics.components.LiteralRestriction;
-import org.drools.analytics.dao.AnalyticsData;
 import org.drools.analytics.dao.AnalyticsDataFactory;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 /**
@@ -82,13 +82,13 @@
 		higher.setValue("100");
 		testData.add(higher);
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -176,14 +176,14 @@
 		higher.setEvaluator("<");
 		higher.setValue("100");
 		testData.add(higher);
+
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 		
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-		
 		StatelessSessionResult sessionResult = session
 		.executeWithResults(testData);
 		
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -271,14 +271,14 @@
 		higher.setEvaluator("<");
 		higher.setValue("100.0");
 		testData.add(higher);
+
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 		
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-		
 		StatelessSessionResult sessionResult = session
 		.executeWithResults(testData);
 		
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -366,14 +366,14 @@
 		higher.setEvaluator("<");
 		higher.setValue("100.0");
 		testData.add(higher);
+
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 		
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-		
 		StatelessSessionResult sessionResult = session
 		.executeWithResults(testData);
 		
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -461,14 +461,14 @@
 		higher.setEvaluator("<");
 		higher.setValue("20-Oct-2007");
 		testData.add(higher);
+
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 		
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-		
 		StatelessSessionResult sessionResult = session
 		.executeWithResults(testData);
 		
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -556,14 +556,14 @@
 		higher.setEvaluator("<");
 		higher.setValue("20-Oct-2007");
 		testData.add(higher);
+
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 		
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-		
 		StatelessSessionResult sessionResult = session
 		.executeWithResults(testData);
 		
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -592,245 +592,4 @@
 			}
 		}
 	}
-/*
-	public void testUselessIntegerGapAboveRestriction1() throws Exception {
-		StatelessSession session = getStatelessSession(this.getClass()
-				.getResourceAsStream("rangeChecks/Clean.drl"));
-
-		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
-				"Remove useless integer gaps"));
-
-		Collection<Object> testData = new ArrayList<Object>();
-
-		Field f = new Field();
-		testData.add(f);
-
-		// > 10 covered
-		LiteralRestriction lower = new LiteralRestriction();
-		lower.setRuleName("> 10 covered");
-		lower.setFieldId(f.getId());
-		lower.setEvaluator(">");
-		lower.setValue("10");
-		testData.add(lower);
-
-		// == 50 covered
-		LiteralRestriction r1 = new LiteralRestriction();
-		r1.setRuleName("== 50 covered");
-		r1.setFieldId(f.getId());
-		r1.setEvaluator("==");
-		r1.setValue("50");
-		testData.add(r1);
-
-		// > 50 gap
-		Gap g1 = new Gap(f, ">", r1);
-		g1.setFiredRuleName("above");
-		testData.add(g1);
-
-		// < 50 gap
-		Gap g2 = new Gap(f, "<", r1);
-		g2.setFiredRuleName("below");
-		testData.add(g2);
-
-		// < 100 covered
-		LiteralRestriction higher = new LiteralRestriction();
-		higher.setRuleName("< 100 covered");
-		higher.setFieldId(f.getId());
-		higher.setEvaluator("<");
-		higher.setValue("100");
-		testData.add(higher);
-
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-
-		StatelessSessionResult sessionResult = session
-				.executeWithResults(testData);
-
-		Iterator iter = sessionResult.iterateObjects();
-
-		Set<String> rulesThatHadErrors = new HashSet<String>();
-		while (iter.hasNext()) {
-			Object o = (Object) iter.next();
-			if (o instanceof Field) {
-				// Do nothing
-			} else if (o instanceof Gap) {
-				rulesThatHadErrors.add(((Gap) o).getFiredRuleName());
-			} else if (o instanceof AnalyticsComponent) {
-				rulesThatHadErrors.add(((AnalyticsComponent) o).getRuleName());
-			}
-			// System.out.println(o);
-		}
-
-		assertTrue(rulesThatHadErrors.remove("> 10 covered"));
-		assertTrue(rulesThatHadErrors.remove("== 50 covered"));
-		assertTrue(rulesThatHadErrors.remove("< 100 covered"));
-		assertFalse(rulesThatHadErrors.contains("below"));
-		assertFalse(rulesThatHadErrors.contains("above"));
-
-		if (!rulesThatHadErrors.isEmpty()) {
-			for (String string : rulesThatHadErrors) {
-				fail("Rule " + string + " caused an error.");
-			}
-		}
-	}
-
-	public void testUselessDoubleGapAboveRestriction() throws Exception {
-		StatelessSession session = getStatelessSession(this.getClass()
-				.getResourceAsStream("rangeChecks/Clean.drl"));
-
-		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
-				"Remove useless double gaps"));
-
-		Collection<Object> testData = new ArrayList<Object>();
-
-		Field f = new Field();
-		testData.add(f);
-
-		// > 10 covered
-		LiteralRestriction lower = new LiteralRestriction();
-		lower.setRuleName("> 10.0 covered");
-		lower.setFieldId(f.getId());
-		lower.setEvaluator(">");
-		lower.setValue("10.0");
-		testData.add(lower);
-
-		// == 50 covered
-		LiteralRestriction r1 = new LiteralRestriction();
-		r1.setRuleName("== 50.0 covered");
-		r1.setFieldId(f.getId());
-		r1.setEvaluator("==");
-		r1.setValue("50.0");
-		testData.add(r1);
-
-		// > 50 gap
-		Gap g1 = new Gap(f, ">", r1);
-		g1.setFiredRuleName("above");
-		testData.add(g1);
-
-		// < 50 gap
-		Gap g2 = new Gap(f, "<", r1);
-		g2.setFiredRuleName("below");
-		testData.add(g2);
-
-		// < 100 covered
-		LiteralRestriction higher = new LiteralRestriction();
-		higher.setRuleName("< 100.0 covered");
-		higher.setFieldId(f.getId());
-		higher.setEvaluator("<");
-		higher.setValue("100.0");
-		testData.add(higher);
-
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-
-		StatelessSessionResult sessionResult = session
-				.executeWithResults(testData);
-
-		Iterator iter = sessionResult.iterateObjects();
-
-		Set<String> rulesThatHadErrors = new HashSet<String>();
-		while (iter.hasNext()) {
-			Object o = (Object) iter.next();
-			if (o instanceof Field) {
-				// Do nothing
-			} else if (o instanceof Gap) {
-				rulesThatHadErrors.add(((Gap) o).getFiredRuleName());
-			} else if (o instanceof AnalyticsComponent) {
-				rulesThatHadErrors.add(((AnalyticsComponent) o).getRuleName());
-			}
-			// System.out.println(o);
-		}
-
-		assertTrue(rulesThatHadErrors.remove("> 10.0 covered"));
-		assertTrue(rulesThatHadErrors.remove("== 50.0 covered"));
-		assertTrue(rulesThatHadErrors.remove("< 100.0 covered"));
-		assertFalse(rulesThatHadErrors.contains("below"));
-		assertFalse(rulesThatHadErrors.contains("above"));
-
-		if (!rulesThatHadErrors.isEmpty()) {
-			for (String string : rulesThatHadErrors) {
-				fail("Rule " + string + " caused an error.");
-			}
-		}
-	}
-
-	public void testUselessDateGapBelowRestriction() throws Exception {
-		StatelessSession session = getStatelessSession(this.getClass()
-				.getResourceAsStream("rangeChecks/Clean.drl"));
-
-		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
-				"Remove useless date gaps"));
-
-		Collection<Object> testData = new ArrayList<Object>();
-
-		Field f = new Field();
-		testData.add(f);
-
-		// > 01-Oct-2007 covered
-		LiteralRestriction lower = new LiteralRestriction();
-		lower.setRuleName("> 01-Oct-2007 covered");
-		lower.setFieldId(f.getId());
-		lower.setEvaluator(">");
-		lower.setValue("01-Oct-2007");
-		testData.add(lower);
-
-		// == 10-Oct-2007 covered
-		LiteralRestriction r1 = new LiteralRestriction();
-		r1.setRuleName("== 10-Oct-2007 covered");
-		r1.setFieldId(f.getId());
-		r1.setEvaluator("==");
-		r1.setValue("10-Oct-2007");
-		testData.add(r1);
-
-		// > 10-Oct-2007 gap
-		Gap g1 = new Gap(f, ">", r1);
-		g1.setFiredRuleName("above");
-		testData.add(g1);
-
-		// < 10-Oct-2007 gap
-		Gap g2 = new Gap(f, "<", r1);
-		g2.setFiredRuleName("below");
-		testData.add(g2);
-
-		// < 20-Oct-2007 covered
-		LiteralRestriction higher = new LiteralRestriction();
-		higher.setRuleName("< 20-Oct-2007 covered");
-		higher.setFieldId(f.getId());
-		higher.setEvaluator("<");
-		higher.setValue("20-Oct-2007");
-		testData.add(higher);
-
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
-
-		StatelessSessionResult sessionResult = session
-				.executeWithResults(testData);
-
-		Iterator iter = sessionResult.iterateObjects();
-
-		Set<String> rulesThatHadErrors = new HashSet<String>();
-		while (iter.hasNext()) {
-			Object o = (Object) iter.next();
-			if (o instanceof Field) {
-				// Do nothing
-			} else if (o instanceof Gap) {
-				rulesThatHadErrors.add(((Gap) o).getFiredRuleName());
-			} else if (o instanceof AnalyticsComponent) {
-				rulesThatHadErrors.add(((AnalyticsComponent) o).getRuleName());
-			} //
-			// System.out.println(o);
-		}
-
-		assertTrue(rulesThatHadErrors.remove("> 01-Oct-2007 covered"));
-		assertTrue(rulesThatHadErrors.remove("== 10-Oct-2007 covered"));
-		assertTrue(rulesThatHadErrors.remove("< 20-Oct-2007 covered"));
-		assertFalse(rulesThatHadErrors.contains("above"));
-		assertFalse(rulesThatHadErrors.contains("below"));
-
-		if (!rulesThatHadErrors.isEmpty()) {
-			for (String string : rulesThatHadErrors) {
-				fail("Rule " + string + " caused an error.");
-			}
-		}
-	}
-	*/
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDatesTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -7,9 +7,9 @@
 
 import org.drools.StatelessSession;
 import org.drools.StatelessSessionResult;
-import org.drools.analytics.dao.AnalyticsData;
 import org.drools.analytics.dao.AnalyticsDataFactory;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 /**
@@ -23,20 +23,19 @@
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("rangeChecks/Dates.drl"));
 
-		session
-				.setAgendaFilter(new RuleNameMatchesAgendaFilter(
-						"Range check for dates, if smaller than or equal is missing"));
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Range check for dates, if smaller than or equal is missing"));
 
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDates.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -61,20 +60,19 @@
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("rangeChecks/Dates.drl"));
 
-		session
-				.setAgendaFilter(new RuleNameMatchesAgendaFilter(
-						"Range check for dates, if greater than or equal is missing"));
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Range check for dates, if greater than or equal is missing"));
 
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDates.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -105,13 +103,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDates.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -143,13 +141,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDates.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckDoublesTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -7,9 +7,9 @@
 
 import org.drools.StatelessSession;
 import org.drools.StatelessSessionResult;
-import org.drools.analytics.dao.AnalyticsData;
 import org.drools.analytics.dao.AnalyticsDataFactory;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 /**
@@ -30,13 +30,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDoubles.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -68,13 +68,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDoubles.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -105,13 +105,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDoubles.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -144,13 +144,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForDoubles.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -172,119 +172,4 @@
 			}
 		}
 	}
-
-	/*
-	 * public void testSmallerAndGreaterThan() throws Exception {
-	 * StatelessSession session = getStatelessSession(this.getClass()
-	 * .getResourceAsStream("rangeChecks/Doubles.drl"));
-	 * 
-	 * session.setAgendaFilter(new RuleNameMatchesAgendaFilter( "Range check for
-	 * doubles, smaller and greater than"));
-	 * 
-	 * Collection<? extends Object> testData = getTestData(this.getClass()
-	 * .getResourceAsStream("MissingRangesForDoubles.drl"));
-	 * 
-	 * AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-	 * session.setGlobal("data", data);
-	 * 
-	 * StatelessSessionResult sessionResult =
-	 * session.executeWithResults(testData);
-	 * 
-	 * Iterator iter = sessionResult.iterateObjects();
-	 * 
-	 * Set<String> rulesThatHadErrors = new HashSet<String>(); while
-	 * (iter.hasNext()) { Object o = (Object) iter.next(); if (o instanceof Gap) {
-	 * rulesThatHadErrors.add(((Gap) o).getRuleName()); } //
-	 * System.out.println(o); }
-	 * 
-	 * assertTrue(rulesThatHadErrors.remove("Double range 1a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 2a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 3a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 4a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 7a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 7b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 8a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 8b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 9a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 9b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 10a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 10b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 11a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 11b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 12a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 13a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 14a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 15a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 18a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 18b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 19a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 19b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 20a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 20b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 21a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 21b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 22a, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 22b, has gap"));
-	 * 
-	 * if (!rulesThatHadErrors.isEmpty()) { for (String string :
-	 * rulesThatHadErrors) { fail("Rule " + string + " caused an error."); } } }
-	 * 
-	 * public void testEqualAndGreaterThan() throws Exception { StatelessSession
-	 * session = getStatelessSession(this.getClass()
-	 * .getResourceAsStream("rangeChecks/Doubles.drl"));
-	 * 
-	 * session.setAgendaFilter(new RuleNameMatchesAgendaFilter( "Range check for
-	 * doubles, equal and greater than"));
-	 * 
-	 * Collection<? extends Object> testData = getTestData(this.getClass()
-	 * .getResourceAsStream("MissingRangesForDoubles.drl"));
-	 * 
-	 * AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-	 * session.setGlobal("data", data);
-	 * 
-	 * StatelessSessionResult sessionResult =
-	 * session.executeWithResults(testData);
-	 * 
-	 * Iterator iter = sessionResult.iterateObjects();
-	 * 
-	 * Set<String> rulesThatHadErrors = new HashSet<String>(); while
-	 * (iter.hasNext()) { Object o = (Object) iter.next(); if (o instanceof Gap) {
-	 * rulesThatHadErrors.add(((Gap) o).getRuleName()); } //
-	 * System.out.println(o); }
-	 * 
-	 * assertTrue(rulesThatHadErrors.remove("Double range 5b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 16b, has gap"));
-	 * 
-	 * if (!rulesThatHadErrors.isEmpty()) { for (String string :
-	 * rulesThatHadErrors) { fail("Rule " + string + " fired."); } } }
-	 * 
-	 * public void testEqualAndSmallerThan() throws Exception { StatelessSession
-	 * session = getStatelessSession(this.getClass()
-	 * .getResourceAsStream("rangeChecks/Doubles.drl"));
-	 * 
-	 * session.setAgendaFilter(new RuleNameMatchesAgendaFilter( "Range check for
-	 * doubles, equal and smaller than"));
-	 * 
-	 * Collection<? extends Object> testData = getTestData(this.getClass()
-	 * .getResourceAsStream("MissingRangesForDoubles.drl"));
-	 * 
-	 * AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-	 * session.setGlobal("data", data);
-	 * 
-	 * StatelessSessionResult sessionResult =
-	 * session.executeWithResults(testData);
-	 * 
-	 * Iterator iter = sessionResult.iterateObjects();
-	 * 
-	 * Set<String> rulesThatHadErrors = new HashSet<String>(); while
-	 * (iter.hasNext()) { Object o = (Object) iter.next(); if (o instanceof Gap) {
-	 * rulesThatHadErrors.add(((Gap) o).getRuleName()); } //
-	 * System.out.println(o); }
-	 * 
-	 * assertTrue(rulesThatHadErrors.remove("Double range 6b, has gap"));
-	 * assertTrue(rulesThatHadErrors.remove("Double range 17b, has gap"));
-	 * 
-	 * if (!rulesThatHadErrors.isEmpty()) { for (String string :
-	 * rulesThatHadErrors) { fail("Rule " + string + " fired."); } } }
-	 */
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RangeCheckIntegersTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -7,9 +7,9 @@
 
 import org.drools.StatelessSession;
 import org.drools.StatelessSessionResult;
-import org.drools.analytics.dao.AnalyticsData;
 import org.drools.analytics.dao.AnalyticsDataFactory;
-import org.drools.analytics.result.Gap;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.Gap;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 /**
@@ -30,13 +30,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForInts.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -68,13 +68,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForInts.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -105,13 +105,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForInts.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {
@@ -143,13 +143,13 @@
 		Collection<? extends Object> testData = getTestData(this.getClass()
 				.getResourceAsStream("MissingRangesForInts.drl"));
 
-		AnalyticsData data = AnalyticsDataFactory.getAnalyticsData();
-		session.setGlobal("data", data);
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session
 				.executeWithResults(testData);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Set<String> rulesThatHadErrors = new HashSet<String>();
 		while (iter.hasNext()) {

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RedundancyTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RedundancyTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/RedundancyTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -10,15 +10,17 @@
 
 import org.drools.StatelessSession;
 import org.drools.StatelessSessionResult;
+import org.drools.analytics.components.AnalyticsComponent;
 import org.drools.analytics.components.AnalyticsRule;
 import org.drools.analytics.components.LiteralRestriction;
 import org.drools.analytics.components.Pattern;
 import org.drools.analytics.components.PatternPossibility;
 import org.drools.analytics.components.RulePossibility;
-import org.drools.analytics.result.AnalysisResultNormal;
-import org.drools.analytics.result.PartialRedundancy;
-import org.drools.analytics.result.Redundancy;
-import org.drools.analytics.result.Subsumption;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.report.components.PartialRedundancy;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.analytics.report.components.Subsumption;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 /**
@@ -27,8 +29,8 @@
  * 
  */
 public class RedundancyTest extends TestBase {
-	
-	public void testFake ( ) {
+
+	public void testFake() {
 		assertTrue(true);
 	}
 
@@ -41,8 +43,9 @@
 
 		Collection<Object> data = new ArrayList<Object>();
 
-		AnalysisResultNormal analysisResult = new AnalysisResultNormal();
-		session.setGlobal("result", analysisResult);
+		AnalyticsResult result = AnalyticsDataFactory
+				.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		String ruleName1 = "Rule 1";
 		String ruleName2 = "Rule 2";
@@ -83,13 +86,15 @@
 
 		Map<String, Set<Redundancy>> map = new HashMap<String, Set<Redundancy>>();
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		while (iter.hasNext()) {
 			Object o = (Object) iter.next();
 			if (o instanceof PartialRedundancy) {
 				PartialRedundancy pr = (PartialRedundancy) o;
-				String key = pr.getLeft().getRuleName() + ":"
-						+ pr.getRight().getRuleName();
+				AnalyticsComponent left = (AnalyticsComponent) pr.getLeft();
+				AnalyticsComponent right = (AnalyticsComponent) pr.getRight();
+
+				String key = left.getRuleName() + ":" + right.getRuleName();
 				if (map.containsKey(key)) {
 					Set<Redundancy> set = map.get(key);
 					set.add(pr.getRedundancy());
@@ -118,8 +123,9 @@
 
 		Collection<Object> data = new ArrayList<Object>();
 
-		AnalysisResultNormal analysisResult = new AnalysisResultNormal();
-		session.setGlobal("result", analysisResult);
+		AnalyticsResult result = AnalyticsDataFactory
+				.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		String ruleName1 = "Rule 1";
 		String ruleName2 = "Rule 2";
@@ -140,7 +146,7 @@
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 
 		Map<String, Set<String>> map = createRedundancyMap(iter);
 
@@ -160,8 +166,9 @@
 
 		Collection<Object> data = new ArrayList<Object>();
 
-		AnalysisResultNormal analysisResult = new AnalysisResultNormal();
-		session.setGlobal("result", analysisResult);
+		AnalyticsResult result = AnalyticsDataFactory
+				.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		String ruleName1 = "Rule 1";
 		String ruleName2 = "Rule 2";
@@ -202,13 +209,15 @@
 
 		Map<String, Set<Redundancy>> map = new HashMap<String, Set<Redundancy>>();
 
-		Iterator iter = sessionResult.iterateObjects();
+		Iterator<Object> iter = sessionResult.iterateObjects();
 		while (iter.hasNext()) {
 			Object o = (Object) iter.next();
 			if (o instanceof PartialRedundancy) {
 				PartialRedundancy pr = (PartialRedundancy) o;
-				String key = pr.getLeft().getRuleName() + ":"
-						+ pr.getRight().getRuleName();
+				AnalyticsComponent left = (AnalyticsComponent) pr.getLeft();
+				AnalyticsComponent right = (AnalyticsComponent) pr.getRight();
+
+				String key = left.getRuleName() + ":" + right.getRuleName();
 				if (map.containsKey(key)) {
 					Set<Redundancy> set = map.get(key);
 					set.add(pr.getRedundancy());
@@ -272,8 +281,9 @@
 		Collection<? extends Object> data = getTestData(this.getClass()
 				.getResourceAsStream("PatternRedundancyTest.drl"));
 
-		AnalysisResultNormal analysisResult = new AnalysisResultNormal();
-		session.setGlobal("result", analysisResult);
+		AnalyticsResult result = AnalyticsDataFactory
+				.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
@@ -302,7 +312,7 @@
 		}
 	}
 
-	public void fixmetestAnalyticsLiteralRestrictionRedundancy() throws Exception {
+	public void testAnalyticsLiteralRestrictionRedundancy() throws Exception {
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("redundancy/Restrictions.drl"));
 
@@ -312,33 +322,35 @@
 		Collection<? extends Object> data = getTestData(this.getClass()
 				.getResourceAsStream("RedundancyLiteralRestrictionTest.drl"));
 
-		AnalysisResultNormal analysisResult = new AnalysisResultNormal();
-		session.setGlobal("result", analysisResult);
+		AnalyticsResult result = AnalyticsDataFactory
+				.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
 		Map<String, Set<String>> map = createRedundancyMap(sessionResult
 				.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, "Redundant 1a", "Redundant 1b"));
-		assertTrue(TestBase.mapContains(map, "Redundant 1b", "Redundant 1a"));
-		assertTrue(TestBase.mapContains(map, "Redundant 2a", "Redundant 2b"));
-		assertTrue(TestBase.mapContains(map, "Redundant 2b", "Redundant 2a"));
-		assertTrue(TestBase.mapContains(map, "Redundant 3a", "Redundant 3b"));
-		assertTrue(TestBase.mapContains(map, "Redundant 3b", "Redundant 3a"));
-		assertTrue(TestBase.mapContains(map, "Redundant 4a", "Redundant 4b"));
-		assertTrue(TestBase.mapContains(map, "Redundant 4b", "Redundant 4a"));
-		assertTrue(TestBase.mapContains(map, "Redundant 5a", "Redundant 5b"));
-		assertTrue(TestBase.mapContains(map, "Redundant 5b", "Redundant 5a"));
-		assertTrue(TestBase.mapContains(map, "Redundant 6a", "Redundant 6b"));
-		assertTrue(TestBase.mapContains(map, "Redundant 6b", "Redundant 6a"));
+		assertTrue((TestBase.mapContains(map, "Redundant 1a", "Redundant 1b") ^ TestBase
+				.mapContains(map, "Redundant 1b", "Redundant 1a")));
+		assertTrue((TestBase.mapContains(map, "Redundant 2a", "Redundant 2b") ^ TestBase
+				.mapContains(map, "Redundant 2b", "Redundant 2a")));
+		assertTrue((TestBase.mapContains(map, "Redundant 3a", "Redundant 3b") ^ TestBase
+				.mapContains(map, "Redundant 3b", "Redundant 3a")));
+		assertTrue((TestBase.mapContains(map, "Redundant 4a", "Redundant 4b") ^ TestBase
+				.mapContains(map, "Redundant 4b", "Redundant 4a")));
+		assertTrue((TestBase.mapContains(map, "Redundant 5a", "Redundant 5b") ^ TestBase
+				.mapContains(map, "Redundant 5b", "Redundant 5a")));
+		assertTrue((TestBase.mapContains(map, "Redundant 6a", "Redundant 6b") ^ TestBase
+				.mapContains(map, "Redundant 6b", "Redundant 6a")));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");
 		}
 	}
 
-	public void fixmetestAnalyticsVariableRestrictionRedundancy() throws Exception {
+	public void fixmetestAnalyticsVariableRestrictionRedundancy()
+			throws Exception {
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("redundancy/Restrictions.drl"));
 
@@ -348,8 +360,9 @@
 		Collection<? extends Object> data = getTestData(this.getClass()
 				.getResourceAsStream("SubsumptionVariableRestrictionTest.drl"));
 
-		AnalysisResultNormal analysisResult = new AnalysisResultNormal();
-		session.setGlobal("result", analysisResult);
+		AnalyticsResult result = AnalyticsDataFactory
+				.getAnalyticsResult();
+		session.setGlobal("result", result);
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
@@ -372,20 +385,23 @@
 	 * @param iter
 	 * @return
 	 */
-	private Map<String, Set<String>> createRedundancyMap(Iterator iter) {
+	private Map<String, Set<String>> createRedundancyMap(Iterator<Object> iter) {
 
 		Map<String, Set<String>> map = new HashMap<String, Set<String>>();
 		while (iter.hasNext()) {
 			Object o = (Object) iter.next();
 			if (o instanceof Redundancy) {
 				Redundancy r = (Redundancy) o;
-				if (map.containsKey(r.getLeft().getRuleName())) {
-					Set<String> set = map.get(r.getLeft().getRuleName());
-					set.add(r.getRight().getRuleName());
+				AnalyticsComponent left = (AnalyticsComponent) r.getLeft();
+				AnalyticsComponent right = (AnalyticsComponent) r.getRight();
+
+				if (map.containsKey(left.getRuleName())) {
+					Set<String> set = map.get(left.getRuleName());
+					set.add(right.getRuleName());
 				} else {
 					Set<String> set = new HashSet<String>();
-					set.add(r.getRight().getRuleName());
-					map.put(r.getLeft().getRuleName(), set);
+					set.add(right.getRuleName());
+					map.put(left.getRuleName(), set);
 				}
 			}
 		}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SolversTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SolversTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SolversTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -11,7 +11,7 @@
 import org.drools.analytics.components.PatternPossibility;
 import org.drools.analytics.components.Restriction;
 import org.drools.analytics.components.RulePossibility;
-import org.drools.analytics.result.Cause;
+import org.drools.analytics.report.components.Cause;
 
 import junit.framework.TestCase;
 

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SubsumptantPossibilitiesRuleTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SubsumptantPossibilitiesRuleTest.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/SubsumptantPossibilitiesRuleTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -10,19 +10,20 @@
 
 import org.drools.StatelessSession;
 import org.drools.StatelessSessionResult;
+import org.drools.analytics.components.AnalyticsComponent;
 import org.drools.analytics.components.LiteralRestriction;
 import org.drools.analytics.components.PatternPossibility;
 import org.drools.analytics.components.RulePossibility;
-import org.drools.analytics.result.PartialRedundancy;
-import org.drools.analytics.result.Redundancy;
-import org.drools.analytics.result.Subsumption;
+import org.drools.analytics.report.components.PartialRedundancy;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.analytics.report.components.Subsumption;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 public class SubsumptantPossibilitiesRuleTest extends TestBase {
 
 	private static final String RULE_NAME = "Find subsumptant Possibilities";
-	
-	public void testFake ( ) {
+
+	public void testFake() {
 		assertTrue(true);
 	}
 
@@ -212,13 +213,16 @@
 			Object o = (Object) iter.next();
 			if (o instanceof Subsumption) {
 				Subsumption s = (Subsumption) o;
-				if (map.containsKey(s.getLeft().getRuleName())) {
-					Set<String> set = map.get(s.getLeft().getRuleName());
-					set.add(s.getRight().getRuleName());
+				AnalyticsComponent left = (AnalyticsComponent) s.getLeft();
+				AnalyticsComponent right = (AnalyticsComponent) s.getRight();
+
+				if (map.containsKey(left.getRuleName())) {
+					Set<String> set = map.get(left.getRuleName());
+					set.add(right.getRuleName());
 				} else {
 					Set<String> set = new HashSet<String>();
-					set.add(s.getRight().getRuleName());
-					map.put(s.getLeft().getRuleName(), set);
+					set.add(right.getRuleName());
+					map.put(left.getRuleName(), set);
 				}
 			}
 		}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/TestBase.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -23,7 +23,7 @@
  * @author Toni Rikkola
  * 
  */
-abstract class TestBase extends TestCase {
+abstract public class TestBase extends TestCase {
 
 	@Override
 	protected void setUp() throws Exception {

Added: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/NotesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/NotesTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/redundancy/NotesTest.java	2007-10-18 09:29:17 UTC (rev 15907)
@@ -0,0 +1,58 @@
+package org.drools.analytics.redundancy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.drools.StatelessSession;
+import org.drools.analytics.TestBase;
+import org.drools.analytics.components.LiteralRestriction;
+import org.drools.analytics.components.PatternPossibility;
+import org.drools.analytics.dao.AnalyticsDataFactory;
+import org.drools.analytics.dao.AnalyticsResult;
+import org.drools.analytics.report.components.AnalyticsMessage;
+import org.drools.analytics.report.components.AnalyticsMessageBase;
+import org.drools.analytics.report.components.Redundancy;
+import org.drools.base.RuleNameMatchesAgendaFilter;
+
+public class NotesTest extends TestBase {
+
+	public void testRedundantRestrictionsInPatternPossibilities()
+			throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("Notes.drl"));
+
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Find redundant restrictions from pattern possibilities"));
+
+		Collection<Object> objects = new ArrayList<Object>();
+		LiteralRestriction left = new LiteralRestriction();
+
+		LiteralRestriction right = new LiteralRestriction();
+
+		Redundancy redundancy = new Redundancy(
+				Redundancy.RedundancyType.STRONG, left, right);
+
+		PatternPossibility possibility = new PatternPossibility();
+		possibility.add(left);
+		possibility.add(right);
+
+		objects.add(left);
+		objects.add(right);
+		objects.add(redundancy);
+		objects.add(possibility);
+
+		AnalyticsResult result = AnalyticsDataFactory.getAnalyticsResult();
+		session.setGlobal("result", result);
+
+		session.executeWithResults(objects);
+
+		Collection<AnalyticsMessageBase> notes = result
+				.getBySeverity(AnalyticsMessage.Severity.NOTE);
+
+		// Has at least one item.
+		assertEquals(1, notes.size());
+
+		AnalyticsMessageBase note = notes.iterator().next();
+		assertTrue(note.getFaulty().equals(redundancy));
+	}
+}

Modified: labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl	2007-10-18 06:36:53 UTC (rev 15906)
+++ labs/jbossrules/trunk/drools-analytics/src/test/resources/org/drools/analytics/Misc3.drl	2007-10-18 09:29:17 UTC (rev 15907)
@@ -3,34 +3,9 @@
 import com.sample.DroolsTest.Message;
 
 
-rule "Some rule 1"
+rule "Redundant restrictions"
 	when
-		    SuperPattern( temp > 1, bar <= 10.0, a == "first string", b == "second string" )
+		RedundancyPattern( a == 1, a == 1 )
 	then
-		System.out.println( "Test" );
-end
-
-rule "Some rule 2"
-	when
-		    SuperPattern( temp == 1, a == "first string", b == "second string" )
-	then
-		System.out.println( "Test" );
-end
-
-rule "Some rule 3"
-	when
-		    sp: SuperPattern( temp < 1, bar == 10.0, a == "first string" )
-		    LesserPattern(  group contains sp )
-	then
-		System.out.println( "Test" );
-end
-
-rule "Some rule 4"
-	when
-		    SuperPattern( temp < 10, bar >= -1.0, a == "first string", b == "second string" )
-		    SuperPattern( temp < 10 a == "first string", b == "second string" )
-		    SuperPattern( temp < 10, a == "first string", b == "second string" )
-		    SuperPattern( temp < 10, a == "first string", b == "second string" )
-	then
-		System.out.println( "Test" );
+		// Something
 end
\ No newline at end of file




More information about the jboss-svn-commits mailing list