[jboss-svn-commits] JBL Code SVN: r12646 - in labs/jbossrules/trunk/drools-compiler/src: main/resources/META-INF and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jun 17 18:36:12 EDT 2007


Author: fmeyer
Date: 2007-06-17 18:36:12 -0400 (Sun, 17 Jun 2007)
New Revision: 12646

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseCollect.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseExists.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseForall.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFrom.xml
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AndHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/FieldConstraintHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/Handler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/LiteralRestrictionHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/OrHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/RestrictionConnectiveHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ReturnValueRestrictionHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/VariableRestrictionsHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-3.0.xsd
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/XmlPackageReaderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFunction.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseGlobal.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseImport.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseLhs.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParsePackageName.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseQuery.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRhs.xml
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml
Log:
JBRULES-880 - Tests and resources for xml parser 
JBRULES-883 - <and> <or> nesting inside CEs
JBRULES-888 - Special connective "or" constraint
JBRULES-891 - Create a specialized "exists" node



Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AndHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AndHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/AndHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,102 +1,97 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.ConditionalElementDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.QueryDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-class AndHandler extends BaseAbstractHandler
-    implements
-    Handler {
-    AndHandler(final XmlPackageReader xmlPackageReader) {
-        this.xmlPackageReader = xmlPackageReader;
-
-        if ( (this.validParents == null) && (this.validPeers == null) ) {
-            this.validParents = new HashSet();
-            this.validParents.add( QueryDescr.class );
-            this.validParents.add( RuleDescr.class );
-            this.validParents.add( OrDescr.class );
-            this.validParents.add( AndDescr.class );
-
-            this.validPeers = new HashSet();
-            this.validPeers.add( null );
-            this.validPeers.add( AndDescr.class );
-            this.validPeers.add( OrDescr.class );
-            this.validPeers.add( NotDescr.class );
-            this.validPeers.add( ExistsDescr.class );
-            this.validPeers.add( EvalDescr.class );
-            this.validPeers.add( PatternDescr.class );
-
-            this.allowNesting = true;
-        }
-    }
-
-    public Object start(final String uri,
-                        final String localName,
-                        final Attributes attrs) throws SAXException {
-        this.xmlPackageReader.startConfiguration( localName,
-                                                  attrs );
-        final AndDescr andDescr = new AndDescr();
-
-        return andDescr;
-    }
-
-    public Object end(final String uri,
-                      final String localName) throws SAXException {
-        final Configuration config = this.xmlPackageReader.endConfiguration();
-
-        final AndDescr andDescr = (AndDescr) this.xmlPackageReader.getCurrent();
-
-        final LinkedList parents = this.xmlPackageReader.getParents();
-        final ListIterator it = parents.listIterator( parents.size() );
-        it.previous();
-        final Object parent = it.previous();
-
-        if ( parent.getClass() == RuleDescr.class || parent.getClass() == QueryDescr.class ) {
-            final RuleDescr ruleDescr = (RuleDescr) parent;
-            ruleDescr.setLhs( andDescr );
-        } else {
-            final ConditionalElementDescr ceDescr = (ConditionalElementDescr) parent;
-            ceDescr.addDescr( andDescr );
-        }
-
-        return null;
-    }
-
-    public Class generateNodeFor() {
-        return AndDescr.class;
-    }
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.lang.descr.*;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+/**
+ * @author mproctor
+ * 
+ * TODO To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Style - Code Templates
+ */
+class AndHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    AndHandler(final XmlPackageReader xmlPackageReader) {
+        this.xmlPackageReader = xmlPackageReader;
+
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( QueryDescr.class );
+            this.validParents.add( RuleDescr.class );
+            this.validParents.add( OrDescr.class );
+            this.validParents.add( AndDescr.class );
+            this.validParents.add( LiteralRestrictionHandler.class );
+
+
+            this.validPeers = new HashSet();
+            this.validPeers.add( null );
+            this.validPeers.add( AndDescr.class );
+            this.validPeers.add( OrDescr.class );
+            this.validPeers.add( NotDescr.class );
+            this.validPeers.add( ExistsDescr.class );
+            this.validPeers.add( EvalDescr.class );
+            this.validPeers.add( PatternDescr.class );
+
+            this.allowNesting = true;
+        }
+    }
+
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs) throws SAXException {
+        this.xmlPackageReader.startConfiguration( localName,
+                                                  attrs );
+        final AndDescr andDescr = new AndDescr();
+
+        return andDescr;
+    }
+
+    public Object end(final String uri,
+                      final String localName) throws SAXException {
+        final Configuration config = this.xmlPackageReader.endConfiguration();
+
+        final AndDescr andDescr = (AndDescr) this.xmlPackageReader.getCurrent();
+
+        final LinkedList parents = this.xmlPackageReader.getParents();
+        final ListIterator it = parents.listIterator( parents.size() );
+        it.previous();
+        final Object parent = it.previous();
+        
+        
+        if (parent instanceof RuleDescr || parent instanceof QueryDescr) {            
+            final RuleDescr ruleDescr = (RuleDescr) parent;
+            ruleDescr.setLhs( andDescr );
+        } else if ( parent instanceof ConditionalElementDescr ) {
+            final ConditionalElementDescr ceDescr = (ConditionalElementDescr) parent;
+            ceDescr.addDescr( andDescr );
+        }
+        
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return AndDescr.class;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/FieldConstraintHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/FieldConstraintHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/FieldConstraintHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,94 +1,104 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.FieldBindingDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-class FieldConstraintHandler extends BaseAbstractHandler
-    implements
-    Handler {
-    FieldConstraintHandler(final XmlPackageReader xmlPackageReader) {
-        this.xmlPackageReader = xmlPackageReader;
-
-        if ( (this.validParents == null) && (this.validPeers == null) ) {
-            this.validParents = new HashSet();
-            this.validParents.add( PatternDescr.class );
-
-            this.validPeers = new HashSet();
-            this.validPeers.add( null );
-            this.validPeers.add( FieldConstraintDescr.class );
-            this.validPeers.add( PredicateDescr.class );
-            this.validPeers.add( FieldBindingDescr.class );
-            this.allowNesting = false;
-        }
-    }
-
-    public Object start(final String uri,
-                        final String localName,
-                        final Attributes attrs) throws SAXException {
-        this.xmlPackageReader.startConfiguration( localName,
-                                                  attrs );
-
-        final String fieldName = attrs.getValue( "field-name" );
-
-        if ( fieldName == null || fieldName.trim().equals( "" ) ) {
-            throw new SAXParseException( "<field-constraint> requires a 'field-name' attribute",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        final FieldConstraintDescr fieldConstraint = new FieldConstraintDescr( fieldName );
-
-        return fieldConstraint;
-    }
-
-    public Object end(final String uri,
-                      final String localName) throws SAXException {
-        final Configuration config = this.xmlPackageReader.endConfiguration();
-
-        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) this.xmlPackageReader.getCurrent();
-
-        final LinkedList parents = this.xmlPackageReader.getParents();
-        final ListIterator it = parents.listIterator( parents.size() );
-        it.previous();
-        final Object parent = it.previous();
-
-        final PatternDescr patternDescr = (PatternDescr) parent;
-        patternDescr.addConstraint( fieldConstraintDescr );
-
-        return null;
-    }
-
-    public Class generateNodeFor() {
-        return FieldConstraintDescr.class;
-    }
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.lang.descr.*;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+/**
+ * @author mproctor
+ * 
+ * TODO To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Style - Code Templates
+ */
+class FieldConstraintHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    FieldConstraintHandler(final XmlPackageReader xmlPackageReader) {
+        this.xmlPackageReader = xmlPackageReader;
+
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( PatternDescr.class );
+            this.validParents.add( AndDescr.class );
+            this.validParents.add( OrDescr.class );
+
+            this.validPeers = new HashSet();
+            this.validPeers.add( null );
+            this.validPeers.add( FieldConstraintDescr.class );
+            this.validPeers.add( PredicateDescr.class );
+            this.validPeers.add( FieldBindingDescr.class );
+            
+            this.validPeers.add( AndDescr.class );
+            this.validPeers.add( OrDescr.class );
+            
+            this.allowNesting = false;
+        }
+    }
+
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs) throws SAXException {
+        this.xmlPackageReader.startConfiguration( localName,
+                                                  attrs );
+
+        final String fieldName = attrs.getValue( "field-name" );
+
+        if ( fieldName == null || fieldName.trim().equals( "" ) ) {
+            throw new SAXParseException( "<field-constraint> requires a 'field-name' attribute",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        final FieldConstraintDescr fieldConstraint = new FieldConstraintDescr( fieldName );
+
+        return fieldConstraint;
+    }
+
+    public Object end(final String uri,
+                      final String localName) throws SAXException {
+        
+        final Configuration config = this.xmlPackageReader.endConfiguration();
+
+        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) this.xmlPackageReader.getCurrent();
+
+        final LinkedList parents = this.xmlPackageReader.getParents();
+        final ListIterator it = parents.listIterator( parents.size() );
+        it.previous();
+        final Object parent = it.previous();
+        
+        if ( parent instanceof PatternDescr )  { 
+            final PatternDescr patternDescr = (PatternDescr) parent;
+            patternDescr.addConstraint( fieldConstraintDescr );
+        } else if ( parent instanceof ConditionalElementDescr ) {
+            final ConditionalElementDescr ceDescr = (ConditionalElementDescr) parent;
+            FieldConstraintDescr field = (FieldConstraintDescr) this.xmlPackageReader.getCurrent();
+            ceDescr.addOrMerge( field );
+        }
+
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return FieldConstraintDescr.class;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/Handler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/Handler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/Handler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,46 +1,44 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.Set;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-interface Handler {
-
-    Object start(String uri,
-                 String localName,
-                 Attributes attrs) throws SAXException;
-
-    Object end(String uri,
-               String localName) throws SAXException;
-
-    Set getValidParents();
-
-    Set getValidPeers();
-
-    boolean allowNesting();
-
-    Class generateNodeFor();
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+import java.util.Set;
+
+/**
+ * @author mproctor
+ * 
+ */
+interface Handler {
+
+    Object start(String uri,
+                 String localName,
+                 Attributes attrs) throws SAXException;
+
+    Object end(String uri,
+               String localName) throws SAXException;
+
+    Set getValidParents();
+
+    Set getValidPeers();
+
+    boolean allowNesting();
+
+    Class generateNodeFor();
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/LiteralRestrictionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/LiteralRestrictionHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/LiteralRestrictionHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,101 +1,109 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-class LiteralRestrictionHandler extends BaseAbstractHandler
-    implements
-    Handler {
-    LiteralRestrictionHandler(final XmlPackageReader xmlPackageReader) {
-        this.xmlPackageReader = xmlPackageReader;
-
-        if ( (this.validParents == null) && (this.validPeers == null) ) {
-            this.validParents = new HashSet();
-            this.validParents.add( FieldConstraintDescr.class );
-
-            this.validPeers = new HashSet();
-            this.validPeers.add( null );
-            this.validPeers.add( LiteralRestrictionDescr.class );
-            this.validPeers.add( ReturnValueRestrictionDescr.class );
-            this.validPeers.add( VariableRestrictionDescr.class );
-            this.validPeers.add( RestrictionConnectiveDescr.class );
-            this.allowNesting = false;
-        }
-    }
-
-    public Object start(final String uri,
-                        final String localName,
-                        final Attributes attrs) throws SAXException {
-        this.xmlPackageReader.startConfiguration( localName,
-                                                  attrs );
-
-        final String evaluator = attrs.getValue( "evaluator" );
-        if ( evaluator == null || evaluator.trim().equals( "" ) ) {
-            throw new SAXParseException( "<literal-restriction> requires an 'evaluator' attribute",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        final String text = attrs.getValue( "value" );
-        if ( text == null || text.trim().equals( "" ) ) {
-            throw new SAXParseException( "<literal-restriction>  requires an 'value' attribute",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        final LiteralRestrictionDescr literalDescr = new LiteralRestrictionDescr( evaluator,
-                                                                                  text );
-
-        return literalDescr;
-    }
-
-    public Object end(final String uri,
-                      final String localName) throws SAXException {
-        final Configuration config = this.xmlPackageReader.endConfiguration();
-
-        final LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) this.xmlPackageReader.getCurrent();
-
-        final LinkedList parents = this.xmlPackageReader.getParents();
-        final ListIterator it = parents.listIterator( parents.size() );
-        it.previous();
-        final FieldConstraintDescr fieldConstriantDescr = (FieldConstraintDescr) it.previous();
-
-        fieldConstriantDescr.addRestriction( literalDescr );
-
-        return null;
-    }
-
-    public Class generateNodeFor() {
-        return LiteralRestrictionDescr.class;
-    }
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.lang.descr.*;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+/**
+ * @author mproctor
+ * @author fmeyer
+ * 
+ */
+class LiteralRestrictionHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    LiteralRestrictionHandler(final XmlPackageReader xmlPackageReader) {
+        this.xmlPackageReader = xmlPackageReader;
+
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( FieldConstraintDescr.class );
+            this.validParents.add( AndDescr.class );
+            this.validParents.add( OrDescr.class );
+
+            this.validPeers = new HashSet();
+            this.validPeers.add( null );
+            this.validPeers.add( LiteralRestrictionDescr.class );
+            this.validPeers.add( ReturnValueRestrictionDescr.class );
+            this.validPeers.add( VariableRestrictionDescr.class );
+            this.validPeers.add( RestrictionConnectiveDescr.class );
+            this.allowNesting = false;
+        }
+    }
+
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs) throws SAXException {
+        this.xmlPackageReader.startConfiguration( localName,
+                                                  attrs );
+
+        final String evaluator = attrs.getValue( "evaluator" );
+        if ( evaluator == null || evaluator.trim().equals( "" ) ) {
+            throw new SAXParseException( "<literal-restriction> requires an 'evaluator' attribute",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        final String text = attrs.getValue( "value" );
+        if ( text == null || text.trim().equals( "" ) ) {
+            throw new SAXParseException( "<literal-restriction>  requires an 'value' attribute",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        final LiteralRestrictionDescr literalDescr = new LiteralRestrictionDescr( evaluator,
+                                                                                  text );
+
+        return literalDescr;
+    }
+
+    public Object end(final String uri,
+                      final String localName) throws SAXException {
+        final Configuration config = this.xmlPackageReader.endConfiguration();
+
+        final LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) this.xmlPackageReader.getCurrent();
+
+        final LinkedList parents = this.xmlPackageReader.getParents();
+        final ListIterator it = parents.listIterator( parents.size() );
+        it.previous();
+
+        //TODO: correct classcastexception in AndDescr.
+        
+        Object parent = it.previous();
+        
+        if (parent instanceof FieldConstraintDescr) {
+            final FieldConstraintDescr fieldConstriantDescr = (FieldConstraintDescr) parent;
+            fieldConstriantDescr.addRestriction( literalDescr );
+        } else if ( parent instanceof ConditionalElementDescr )  { 
+            final ConditionalElementDescr conditionDescr = (ConditionalElementDescr) parent;
+            
+            
+            
+//            System.out.println("LiteralRestriction");
+        }
+        return null;
+    }
+    
+    public Class generateNodeFor() {
+        return LiteralRestrictionDescr.class;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/OrHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/OrHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/OrHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,93 +1,89 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.ConditionalElementDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-class OrHandler extends BaseAbstractHandler
-    implements
-    Handler {
-    OrHandler(final XmlPackageReader xmlPackageReader) {
-        this.xmlPackageReader = xmlPackageReader;
-
-        if ( (this.validParents == null) && (this.validPeers == null) ) {
-            this.validParents = new HashSet();
-            this.validParents.add( AndDescr.class );
-            this.validParents.add( OrDescr.class );
-
-            this.validPeers = new HashSet();
-            this.validPeers.add( null );
-            this.validPeers.add( AndDescr.class );
-            this.validPeers.add( OrDescr.class );
-            this.validPeers.add( NotDescr.class );
-            this.validPeers.add( ExistsDescr.class );
-            this.validPeers.add( EvalDescr.class );
-            this.validPeers.add( PatternDescr.class );
-
-            this.allowNesting = true;
-        }
-    }
-
-    public Object start(final String uri,
-                        final String localName,
-                        final Attributes attrs) throws SAXException {
-        this.xmlPackageReader.startConfiguration( localName,
-                                                  attrs );
-        final OrDescr orDescr = new OrDescr();
-
-        return orDescr;
-    }
-
-    public Object end(final String uri,
-                      final String localName) throws SAXException {
-        final Configuration config = this.xmlPackageReader.endConfiguration();
-
-        final OrDescr orDescr = (OrDescr) this.xmlPackageReader.getCurrent();
-
-        final LinkedList parents = this.xmlPackageReader.getParents();
-        final ListIterator it = parents.listIterator( parents.size() );
-        it.previous();
-        final Object parent = it.previous();
-
-        final ConditionalElementDescr parentDescr = (ConditionalElementDescr) parent;
-        parentDescr.addDescr( orDescr );
-
-        return null;
-    }
-
-    public Class generateNodeFor() {
-        return OrDescr.class;
-    }
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.lang.descr.*;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+/**
+ * @author mproctor
+ */
+class OrHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    OrHandler(final XmlPackageReader xmlPackageReader) {
+        this.xmlPackageReader = xmlPackageReader;
+
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( AndDescr.class );
+            this.validParents.add( PatternDescr.class );
+            
+            this.validPeers = new HashSet();
+            this.validPeers.add( null );
+            this.validPeers.add( AndDescr.class );
+            this.validPeers.add( OrDescr.class );
+            this.validPeers.add( NotDescr.class );
+            this.validPeers.add( ExistsDescr.class );
+            this.validPeers.add( EvalDescr.class );
+            this.validPeers.add( PatternDescr.class );
+
+            this.allowNesting = true;
+        }
+    }
+
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs) throws SAXException {
+        this.xmlPackageReader.startConfiguration( localName,
+                                                  attrs );
+        final OrDescr orDescr = new OrDescr();
+
+        return orDescr;
+    }
+
+    public Object end(final String uri,
+                      final String localName) throws SAXException {
+        final Configuration config = this.xmlPackageReader.endConfiguration();
+
+        final OrDescr orDescr = (OrDescr) this.xmlPackageReader.getCurrent();
+
+        final LinkedList parents = this.xmlPackageReader.getParents();
+        final ListIterator it = parents.listIterator( parents.size() );
+        it.previous();
+        final Object parent = it.previous();
+        
+        if ( parent instanceof ConditionalElementDescr )  { 
+	        final ConditionalElementDescr parentDescr = (ConditionalElementDescr) parent;
+	        parentDescr.addDescr( orDescr );
+        } else if ( parent instanceof PatternDescr ) {
+            final PatternDescr parentDescr = (PatternDescr) parent;
+            parentDescr.addConstraint( orDescr );
+        }
+        
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return OrDescr.class;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/RestrictionConnectiveHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/RestrictionConnectiveHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/RestrictionConnectiveHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -68,10 +68,13 @@
         }
 
         RestrictionConnectiveDescr connectiveDescr = null;
-        if ( connective.equals( "|" ) ) {
+        if ( connective.equals( "or" ) ) {
             connectiveDescr = new RestrictionConnectiveDescr( RestrictionConnectiveDescr.OR );
+        } else if (connective.equals( "and" )) {
+            connectiveDescr = new RestrictionConnectiveDescr( RestrictionConnectiveDescr.AND );
         } else {
-            connectiveDescr = new RestrictionConnectiveDescr( RestrictionConnectiveDescr.AND );
+            throw new SAXParseException( "<connective-restriction> requires a valid 'connective' value (and,or): " + connective,
+                                         this.xmlPackageReader.getLocator() );
         }
 
         return connectiveDescr;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ReturnValueRestrictionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ReturnValueRestrictionHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ReturnValueRestrictionHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,102 +1,114 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-class ReturnValueRestrictionHandler extends BaseAbstractHandler
-    implements
-    Handler {
-    ReturnValueRestrictionHandler(final XmlPackageReader xmlPackageReader) {
-        this.xmlPackageReader = xmlPackageReader;
-
-        if ( (this.validParents == null) && (this.validPeers == null) ) {
-            this.validParents = new HashSet();
-            this.validParents.add( FieldConstraintDescr.class );
-
-            this.validPeers = new HashSet();
-            this.validPeers.add( null );
-            this.validPeers.add( LiteralRestrictionDescr.class );
-            this.validPeers.add( ReturnValueRestrictionDescr.class );
-            this.validPeers.add( VariableRestrictionDescr.class );
-            this.validPeers.add( RestrictionConnectiveDescr.class );
-            this.allowNesting = false;
-        }
-    }
-
-    public Object start(final String uri,
-                        final String localName,
-                        final Attributes attrs) throws SAXException {
-        this.xmlPackageReader.startConfiguration( localName,
-                                                  attrs );
-        final String evaluator = attrs.getValue( "evaluator" );
-        if ( evaluator == null || evaluator.trim().equals( "" ) ) {
-            throw new SAXParseException( "<return-value-restriction> requires an 'evaluator' attribute",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        final ReturnValueRestrictionDescr returnValueDescr = new ReturnValueRestrictionDescr( evaluator );
-
-        return returnValueDescr;
-    }
-
-    public Object end(final String uri,
-                      final String localName) throws SAXException {
-        final Configuration config = this.xmlPackageReader.endConfiguration();
-
-        final ReturnValueRestrictionDescr returnValueDescr = (ReturnValueRestrictionDescr) this.xmlPackageReader.getCurrent();
-
-        final String expression = config.getText();
-
-        if ( expression == null || expression.trim().equals( "" ) ) {
-            throw new SAXParseException( "<return-value-restriction> must have some content",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        returnValueDescr.setContent( expression );
-
-        final LinkedList parents = this.xmlPackageReader.getParents();
-        final ListIterator it = parents.listIterator( parents.size() );
-        it.previous();
-        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) it.previous();
-
-        fieldConstraintDescr.addRestriction( returnValueDescr );
-
-        return null;
-    }
-
-    public Class generateNodeFor() {
-        return ReturnValueRestrictionDescr.class;
-    }
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * @author mproctor
+ * 
+ * TODO To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Style - Code Templates
+ */
+class ReturnValueRestrictionHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    ReturnValueRestrictionHandler(final XmlPackageReader xmlPackageReader) {
+        this.xmlPackageReader = xmlPackageReader;
+
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( FieldConstraintDescr.class );
+            this.validParents.add( AndDescr.class );
+            this.validParents.add( OrDescr.class );
+
+            this.validPeers = new HashSet();
+            this.validPeers.add( null );
+            this.validPeers.add( LiteralRestrictionDescr.class );
+            this.validPeers.add( ReturnValueRestrictionDescr.class );
+            this.validPeers.add( VariableRestrictionDescr.class );
+            this.validPeers.add( RestrictionConnectiveDescr.class );
+            this.allowNesting = false;
+        }
+    }
+
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs) throws SAXException {
+        this.xmlPackageReader.startConfiguration( localName,
+                                                  attrs );
+        final String evaluator = attrs.getValue( "evaluator" );
+        if ( evaluator == null || evaluator.trim().equals( "" ) ) {
+            throw new SAXParseException( "<return-value-restriction> requires an 'evaluator' attribute",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        final ReturnValueRestrictionDescr returnValueDescr = new ReturnValueRestrictionDescr( evaluator );
+
+        return returnValueDescr;
+    }
+
+    public Object end(final String uri,
+                      final String localName) throws SAXException {
+        final Configuration config = this.xmlPackageReader.endConfiguration();
+
+        final ReturnValueRestrictionDescr returnValueDescr = (ReturnValueRestrictionDescr) this.xmlPackageReader.getCurrent();
+
+        final String expression = config.getText();
+
+        if ( expression == null || expression.trim().equals( "" ) ) {
+            throw new SAXParseException( "<return-value-restriction> must have some content",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        returnValueDescr.setContent( expression );
+
+        final LinkedList parents = this.xmlPackageReader.getParents();
+        final ListIterator it = parents.listIterator( parents.size() );
+        it.previous();
+        
+        Object parent = it.previous();
+        
+        //TODO: Again same problem with these parent shit
+        
+        if (parent instanceof FieldConstraintDescr) {
+	        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) parent;
+	        fieldConstraintDescr.addRestriction( returnValueDescr );
+        } else {
+            System.out.println("ReturnValueRestriction");
+        }
+
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return ReturnValueRestrictionDescr.class;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/VariableRestrictionsHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/VariableRestrictionsHandler.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/VariableRestrictionsHandler.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,101 +1,110 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * @author mproctor
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-class VariableRestrictionsHandler extends BaseAbstractHandler
-    implements
-    Handler {
-    VariableRestrictionsHandler(final XmlPackageReader xmlPackageReader) {
-        this.xmlPackageReader = xmlPackageReader;
-
-        if ( (this.validParents == null) && (this.validPeers == null) ) {
-            this.validParents = new HashSet();
-            this.validParents.add( FieldConstraintDescr.class );
-
-            this.validPeers = new HashSet();
-            this.validPeers.add( null );
-            this.validPeers.add( LiteralRestrictionDescr.class );
-            this.validPeers.add( ReturnValueRestrictionDescr.class );
-            this.validPeers.add( VariableRestrictionDescr.class );
-            this.validPeers.add( RestrictionConnectiveDescr.class );
-            this.allowNesting = false;
-        }
-    }
-
-    public Object start(final String uri,
-                        final String localName,
-                        final Attributes attrs) throws SAXException {
-        this.xmlPackageReader.startConfiguration( localName,
-                                                  attrs );
-
-        final String evaluator = attrs.getValue( "evaluator" );
-        if ( evaluator == null || evaluator.trim().equals( "" ) ) {
-            throw new SAXParseException( "<bound-variable> requires an 'evaluator' attribute",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        final String identifier = attrs.getValue( "identifier" );
-        if ( identifier == null || identifier.trim().equals( "" ) ) {
-            throw new SAXParseException( "<bound-variable>  requires an 'identifier' attribute",
-                                         this.xmlPackageReader.getLocator() );
-        }
-
-        final VariableRestrictionDescr variableDescr = new VariableRestrictionDescr( evaluator,
-                                                                                     identifier );
-
-        return variableDescr;
-    }
-
-    public Object end(final String uri,
-                      final String localName) throws SAXException {
-        final Configuration config = this.xmlPackageReader.endConfiguration();
-
-        final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) this.xmlPackageReader.getCurrent();
-
-        final LinkedList parents = this.xmlPackageReader.getParents();
-        final ListIterator it = parents.listIterator( parents.size() );
-        it.previous();
-        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) it.previous();
-
-        fieldConstraintDescr.addRestriction( variableDescr );
-
-        return null;
-    }
-
-    public Class generateNodeFor() {
-        return VariableRestrictionDescr.class;
-    }
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * @author mproctor
+ * TODO To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Style - Code Templates
+ */
+class VariableRestrictionsHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    VariableRestrictionsHandler(final XmlPackageReader xmlPackageReader) {
+        this.xmlPackageReader = xmlPackageReader;
+
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( FieldConstraintDescr.class );
+            this.validParents.add( AndDescr.class);
+            this.validParents.add( OrDescr.class);
+
+            this.validPeers = new HashSet();
+            this.validPeers.add( null );
+            this.validPeers.add( LiteralRestrictionDescr.class );
+            this.validPeers.add( ReturnValueRestrictionDescr.class );
+            this.validPeers.add( VariableRestrictionDescr.class );
+            this.validPeers.add( RestrictionConnectiveDescr.class );
+            this.allowNesting = false;
+        }
+    }
+
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs) throws SAXException {
+        this.xmlPackageReader.startConfiguration( localName,
+                                                  attrs );
+
+        final String evaluator = attrs.getValue( "evaluator" );
+        if ( evaluator == null || evaluator.trim().equals( "" ) ) {
+            throw new SAXParseException( "<bound-variable> requires an 'evaluator' attribute",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        final String identifier = attrs.getValue( "identifier" );
+        if ( identifier == null || identifier.trim().equals( "" ) ) {
+            throw new SAXParseException( "<bound-variable>  requires an 'identifier' attribute",
+                                         this.xmlPackageReader.getLocator() );
+        }
+
+        final VariableRestrictionDescr variableDescr = new VariableRestrictionDescr( evaluator,
+                                                                                     identifier );
+
+        return variableDescr;
+    }
+
+    public Object end(final String uri,
+                      final String localName) throws SAXException {
+        final Configuration config = this.xmlPackageReader.endConfiguration();
+
+        final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) this.xmlPackageReader.getCurrent();
+
+        final LinkedList parents = this.xmlPackageReader.getParents();
+        final ListIterator it = parents.listIterator( parents.size() );
+        it.previous();
+        
+        Object parent = it.previous();
+        
+        if ( parent instanceof FieldConstraintDescr ) {
+        	final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) parent;
+        	fieldConstraintDescr.addRestriction( variableDescr );
+        } else {
+            System.out.println("variableRestriction class");
+        }
+
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return VariableRestrictionDescr.class;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -158,8 +158,8 @@
 
     public void visitPackageDescr(final PackageDescr packageDescr) {
         final String packageName = packageDescr.getName();
-        final String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " + XmlDumper.eol + " <package name=\"" + packageName + "\"  " + XmlDumper.eol + "\txmlns=\"http://drools.org/drools-3.0\" " + XmlDumper.eol
-                                 + "\txmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\" " + XmlDumper.eol + "\txs:schemaLocation=\"http://drools.org/drools-3.0 drools-3.0.xsd\"> " + XmlDumper.eol;
+        final String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " + XmlDumper.eol + " <package name=\"" + packageName + "\"  " + XmlDumper.eol + "\txmlns=\"http://drools.org/drools-4.0\" " + XmlDumper.eol
+                                 + "\txmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\" " + XmlDumper.eol + "\txs:schemaLocation=\"http://drools.org/drools-4.0 drools-4.0.xsd\"> " + XmlDumper.eol;
         appendXmlDump( xmlString );
         appendXmlDump( processImportsList( packageDescr.getImports() ) );
         appendXmlDump( processGlobalsList( packageDescr.getGlobals() ) );
@@ -221,11 +221,9 @@
     }
 
     public void visitRestrictionConnectiveDescr(final RestrictionConnectiveDescr descr) {
-        if ( descr.getConnective() == RestrictionConnectiveDescr.OR ) {
-            this.template = "<restriction-connective connective=\"|\"/>" + XmlDumper.eol;
-        } else {
-            this.template = "<restriction-connective connective=\"&amp;\"/>" + XmlDumper.eol;
-        }
+        this.template = "<restriction-connective connective=";
+        this.template += descr.getConnective() == RestrictionConnectiveDescr.OR ? "\"or\"" : "\"and\"" ;
+        this.template += "/>" + XmlDumper.eol;
     }
 
     private String processDescrList(final List descr) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlPackageReader.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,747 +1,727 @@
-package org.drools.xml;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.xml.sax.Attributes;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * <code>RuleSet</code> loader.
- *
- * Note you can override the default entity resolver by setting the System property of:
- *  <code>org.drools.io.EntityResolve</code> to your own custom entity resolver.
- *  This can be done using -Dorg.drools.io.EntityResolver=YourClassHere on the command line, for instance.
- *
- * @author <a href="mailto:bob at werken.com">bob mcwhirter </a>
- */
-public class XmlPackageReader extends DefaultHandler {
-    // ----------------------------------------------------------------------
-    // Constants
-    // ----------------------------------------------------------------------
-    public static final String  ENTITY_RESOLVER_PROPERTY_NAME = "org.drools.io.EntityResolver";
-
-    /** Namespace URI for the general tags. */
-    public static final String  RULES_NAMESPACE_URI           = "http://drools.org/rules";
-
-    private static final String JAXP_SCHEMA_LANGUAGE          = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
-
-    private static final String W3C_XML_SCHEMA                = "http://www.w3.org/2001/XMLSchema";
-
-    // ----------------------------------------------------------------------
-    // Instance members
-    // ----------------------------------------------------------------------
-    /** SAX parser. */
-    private SAXParser           parser;
-
-    /** isValidating */
-    private boolean             isValidating                  = true;
-
-    /** Locator for errors. */
-    private Locator             locator;
-
-    // private Map repo;
-
-    /** Stack of configurations. */
-    private LinkedList          configurationStack;
-
-    /** Current configuration text. */
-    private StringBuffer        characters;
-
-    private Map                 handlers;
-
-    private boolean             lastWasEndElement;
-
-    private LinkedList          parents;
-
-    private Object              peer;
-
-    private Object              current;
-
-    private PackageDescr        packageDescr;
-
-    private boolean             inHandledRuleSubElement;
-
-    private final MessageFormat message                       = new MessageFormat( "({0}: {1}, {2}): {3}" );
-
-    private final Map           namespaces                    = new HashMap();
-
-    EntityResolver              entityResolver;
-
-    // ----------------------------------------------------------------------
-    // Constructors
-    // ----------------------------------------------------------------------
-
-    /**
-     * Construct.
-     *
-     * <p>
-     * Uses the default JAXP SAX parser and the default classpath-based
-     * <code>DefaultSemanticModule</code>.
-     * </p>
-     */
-    public XmlPackageReader() {
-        // init
-        this.configurationStack = new LinkedList();
-        this.parents = new LinkedList();
-
-        this.handlers = new HashMap();
-
-        this.handlers.put( "package",
-                           new PackageHandler( this ) );
-        this.handlers.put( "rule",
-                           new RuleHandler( this ) );
-        this.handlers.put( "query",
-                           new QueryHandler( this ) );
-        this.handlers.put( "attribute",
-                           null );
-        this.handlers.put( "function",
-                           new FunctionHandler( this ) );
-
-        // Conditional Elements
-        this.handlers.put( "lhs",
-                           new AndHandler( this ) );
-        this.handlers.put( "and",
-                           new AndHandler( this ) );
-        this.handlers.put( "or",
-                           new OrHandler( this ) );
-        this.handlers.put( "not",
-                           new NotHandler( this ) );
-        this.handlers.put( "exists",
-                           new ExistsHandler( this ) );
-        this.handlers.put( "eval",
-                           new EvalHandler( this ) );
-        this.handlers.put( "pattern",
-                           new PatternHandler( this ) );
-
-        // Field Constraints
-        this.handlers.put( "field-constraint",
-                           new FieldConstraintHandler( this ) );
-        this.handlers.put( "literal-restriction",
-                           new LiteralRestrictionHandler( this ) );
-        this.handlers.put( "variable-restriction",
-                           new VariableRestrictionsHandler( this ) );
-        this.handlers.put( "predicate",
-                           new PredicateHandler( this ) );
-        this.handlers.put( "return-value-restriction",
-                           new ReturnValueRestrictionHandler( this ) );
-        this.handlers.put( "field-binding",
-                           new FieldBindingHandler( this ) );
-        this.handlers.put( "restriction-connective",
-                           new RestrictionConnectiveHandler( this ) );
-
-        initEntityResolver();
-
-    }
-
-    /**
-     * Construct.
-     *
-     * <p>
-     * Uses the default classpath-based <code>DefaultSemanticModule</code>.
-     * </p>
-     *
-     * @param parser
-     *            The SAX parser.
-     */
-    public XmlPackageReader(final SAXParser parser) {
-        this.parser = parser;
-    }
-
-    // ----------------------------------------------------------------------
-    // Instance methods
-    // ----------------------------------------------------------------------
-
-    /**
-     * Read a <code>RuleSet</code> from a <code>Reader</code>.
-     *
-     * @param reader
-     *            The reader containing the rule-set.
-     *
-     * @return The rule-set.
-     */
-    public PackageDescr read(final Reader reader) throws SAXException,
-                                                 IOException {
-        return read( new InputSource( reader ) );
-    }
-
-    /**
-     * Read a <code>RuleSet</code> from an <code>InputStream</code>.
-     *
-     * @param inputStream
-     *            The input-stream containing the rule-set.
-     *
-     * @return The rule-set.
-     */
-    public PackageDescr read(final InputStream inputStream) throws SAXException,
-                                                           IOException {
-        return read( new InputSource( inputStream ) );
-    }
-
-    /**
-     * Read a <code>RuleSet</code> from an <code>InputSource</code>.
-     *
-     * @param in
-     *            The rule-set input-source.
-     *
-     * @return The rule-set.
-     */
-    public PackageDescr read(final InputSource in) throws SAXException,
-                                                  IOException {
-        SAXParser localParser = null;
-        if ( this.parser == null ) {
-            final SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setNamespaceAware( true );
-
-            final String isValidatingString = System.getProperty( "drools.schema.validating" );
-            if ( System.getProperty( "drools.schema.validating" ) != null ) {
-                this.isValidating = Boolean.getBoolean( "drools.schema.validating" );
-            }
-
-            if ( this.isValidating == true ) {
-                factory.setValidating( true );
-                try {
-                    localParser = factory.newSAXParser();
-                } catch ( final ParserConfigurationException e ) {
-                    throw new RuntimeException( e.getMessage() );
-                }
-
-                try {
-                    localParser.setProperty( XmlPackageReader.JAXP_SCHEMA_LANGUAGE,
-                                             XmlPackageReader.W3C_XML_SCHEMA );
-                } catch ( final SAXNotRecognizedException e ) {
-                    boolean hideWarnings = Boolean.getBoolean( "drools.schema.hidewarnings" );
-                    if ( !hideWarnings ) {
-                        System.err.println( "Your SAX parser is not JAXP 1.2 compliant - turning off validation." );
-                    }
-                    localParser = null;
-                }
-            }
-
-            if ( localParser == null ) {
-                // not jaxp1.2 compliant so turn off validation
-                try {
-                    this.isValidating = false;
-                    factory.setValidating( this.isValidating );
-                    localParser = factory.newSAXParser();
-                } catch ( final ParserConfigurationException e ) {
-                    throw new RuntimeException( e.getMessage() );
-                }
-            }
-        } else {
-            localParser = this.parser;
-        }
-
-        if ( !localParser.isNamespaceAware() ) {
-            throw new RuntimeException( "parser must be namespace-aware" );
-        }
-
-        localParser.parse( in,
-                           this );
-
-        return this.packageDescr;
-    }
-
-    void setPackageDescr(final PackageDescr packageDescr) {
-        this.packageDescr = packageDescr;
-    }
-
-    public PackageDescr getPackageDescr() {
-        return this.packageDescr;
-    }
-
-    /**
-     * @see org.xml.sax.ContentHandler
-     */
-    public void setDocumentLocator(final Locator locator) {
-        this.locator = locator;
-    }
-
-    /**
-     * Get the <code>Locator</code>.
-     *
-     * @return The locator.
-     */
-    public Locator getLocator() {
-        return this.locator;
-    }
-
-    public void startDocument() {
-        this.isValidating = true;
-        this.packageDescr = null;
-        this.current = null;
-        this.peer = null;
-        this.lastWasEndElement = false;
-        this.parents.clear();
-        this.characters = null;
-        this.configurationStack.clear();
-        this.namespaces.clear();
-    }
-
-    /**
-     * @param uri
-     * @param localName
-     * @param qname
-     * @param attrs
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler
-     *
-     * @todo: better way to manage unhandled elements
-     */
-    public void startElement(final String uri,
-                             final String localName,
-                             final String qname,
-                             final Attributes attrs) throws SAXException {
-        // going down so no peer
-        if ( !this.lastWasEndElement ) {
-            this.peer = null;
-        }
-
-        final Handler handler = getHandler( localName );
-
-        if ( (handler != null) && (!this.parents.isEmpty() && this.parents.getLast() instanceof RuleDescr) ) {
-            this.inHandledRuleSubElement = true;
-        }
-
-        if ( handler == null ) {
-            //            if ( ((this.inHandledRuleSubElement == false) && (this.parents.getLast() instanceof RuleDescr)) || (this.parents.getLast() instanceof PackageDescr) ) {
-            //                throw new SAXParseException( "unknown tag '" + localName + "' in namespace '" + uri + "'",
-            //                                             getLocator() );
-            //            }
-            // no handler so build up the configuration
-            startConfiguration( localName,
-                                attrs );
-            return;
-        }
-
-        validate( uri,
-                  localName,
-                  handler );
-
-        final Object node = handler.start( uri,
-                                           localName,
-                                           attrs );
-
-        if ( node != null ) {
-            this.parents.add( node );
-            this.current = node;
-        }
-        this.lastWasEndElement = false;
-    }
-
-    /**
-     * @param uri
-     * @param localName
-     * @param qname
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler
-     */
-    public void endElement(final String uri,
-                           final String localName,
-                           final String qname) throws SAXException {
-        final Handler handler = getHandler( localName );
-
-        if ( (handler != null) && (!this.parents.isEmpty() && this.parents.getLast() instanceof RuleDescr) ) {
-            this.inHandledRuleSubElement = false;
-        }
-
-        if ( handler == null ) {
-            if ( this.configurationStack.size() >= 1 ) {
-                endConfiguration();
-            }
-            return;
-        }
-
-        this.current = getParent( handler.generateNodeFor() );
-
-        final Object node = handler.end( uri,
-                                         localName );
-
-        // next
-        if ( node != null && !this.lastWasEndElement ) {
-            this.peer = node;
-        }
-        // up or no children
-        else if ( this.lastWasEndElement || (this.parents.getLast()).getClass().isInstance( this.current ) ) {
-            this.peer = this.parents.removeLast();
-        }
-
-        this.lastWasEndElement = true;
-    }
-
-    private void validate(final String uri,
-                          final String localName,
-                          final Handler handler) throws SAXParseException {
-        boolean validParent = false;
-        boolean validPeer = false;
-        boolean invalidNesting = false;
-
-        final Set validParents = handler.getValidParents();
-        final Set validPeers = handler.getValidPeers();
-        boolean allowNesting = handler.allowNesting();
-
-        // get parent
-        Object parent;
-        if ( this.parents.size() != 0 ) {
-            parent = this.parents.getLast();
-        } else {
-            parent = null;
-        }
-
-        // check valid parents
-        // null parent means localname is rule-set
-        // dont process if elements are the same
-        // instead check for allowed nesting
-        final Class nodeClass = getHandler( localName ).generateNodeFor();
-        if ( !nodeClass.isInstance( parent ) ) {
-            Object allowedParent;
-            final Iterator it = validParents.iterator();
-            while ( !validParent && it.hasNext() ) {
-                allowedParent = it.next();
-                if ( parent == null && allowedParent == null ) {
-                    validParent = true;
-                } else if ( allowedParent != null && ((Class) allowedParent).isInstance( parent ) ) {
-                    validParent = true;
-                }
-            }
-            if ( !validParent ) {
-                throw new SAXParseException( "<" + localName + "> has an invalid parent element [" + parent + "]",
-                                             getLocator() );
-            }
-        }
-
-        // check valid peers
-        // null peer means localname is rule-set
-        final Object peer = this.peer;
-
-        Object allowedPeer;
-        Iterator it = validPeers.iterator();
-        while ( !validPeer && it.hasNext() ) {
-            allowedPeer = it.next();
-            if ( peer == null && allowedPeer == null ) {
-                validPeer = true;
-            } else if ( allowedPeer != null && ((Class) allowedPeer).isInstance( peer ) ) {
-                validPeer = true;
-            }
-        }
-        if ( !validPeer ) {
-            throw new SAXParseException( "<" + localName + "> is after an invalid element",
-                                         getLocator() );
-        }
-
-        if ( !allowNesting ) {
-            it = this.parents.iterator();
-            while ( !invalidNesting && it.hasNext() ) {
-                if ( nodeClass.isInstance( it.next() ) ) {
-                    invalidNesting = true;
-                }
-            }
-        }
-        if ( invalidNesting ) {
-            throw new SAXParseException( "<" + localName + ">  may not be nested",
-                                         getLocator() );
-        }
-
-    }
-
-    /**
-     * Start a configuration node.
-     *
-     * @param name
-     *            Tag name.
-     * @param attrs
-     *            Tag attributes.
-     */
-    protected void startConfiguration(final String name,
-                                      final Attributes attrs) {
-        this.characters = new StringBuffer();
-
-        final DefaultConfiguration config = new DefaultConfiguration( name );
-
-        final int numAttrs = attrs.getLength();
-
-        for ( int i = 0; i < numAttrs; ++i ) {
-            config.setAttribute( attrs.getLocalName( i ),
-                                 attrs.getValue( i ) );
-        }
-
-        // lets add the namespaces as attributes
-        for ( final Iterator iter = this.namespaces.entrySet().iterator(); iter.hasNext(); ) {
-            final Map.Entry entry = (Map.Entry) iter.next();
-            String ns = (String) entry.getKey();
-            final String value = (String) entry.getValue();
-            if ( ns == null || ns.length() == 0 ) {
-                ns = "xmlns";
-            } else {
-                ns = "xmlns:" + ns;
-            }
-            config.setAttribute( ns,
-                                 value );
-        }
-
-        if ( this.configurationStack.isEmpty() ) {
-            this.configurationStack.addLast( config );
-        } else {
-            ((DefaultConfiguration) this.configurationStack.getLast()).addChild( config );
-            this.configurationStack.addLast( config );
-        }
-    }
-
-    Handler getHandler(final String localName) {
-        return (Handler) this.handlers.get( localName );
-    }
-
-    /**
-     * @param chars
-     * @param start
-     * @param len
-     * @see org.xml.sax.ContentHandler
-     */
-    public void characters(final char[] chars,
-                           final int start,
-                           final int len) {
-        if ( this.characters != null ) {
-            this.characters.append( chars,
-                                    start,
-                                    len );
-        }
-    }
-
-    /**
-     * End a configuration node.
-     *
-     * @return The configuration.
-     */
-    protected Configuration endConfiguration() {
-        final DefaultConfiguration config = (DefaultConfiguration) this.configurationStack.removeLast();
-        if ( this.characters != null ) {
-            config.setText( this.characters.toString() );
-        }
-
-        this.characters = null;
-
-        return config;
-    }
-
-    LinkedList getParents() {
-        return this.parents;
-    }
-
-    Object getParent(final Class parent) {
-        final ListIterator it = this.parents.listIterator( this.parents.size() );
-        Object node = null;
-        while ( it.hasPrevious() ) {
-            node = it.previous();
-            if ( parent.isInstance( node ) ) {
-                break;
-            }
-        }
-        return node;
-    }
-
-    Object getPeer() {
-        return this.peer;
-    }
-
-    Object getCurrent() {
-        return this.current;
-    }
-
-    public InputSource resolveEntity(final String publicId,
-                                     final String systemId) throws SAXException {
-        try {
-            final InputSource inputSource = resolveSchema( publicId,
-                                                           systemId );
-            if ( inputSource != null ) {
-                return inputSource;
-            }
-            if ( this.entityResolver != null ) {
-                return this.entityResolver.resolveEntity( publicId,
-                                                          systemId );
-            }
-        } catch ( final IOException ioe ) {
-        }
-        return null;
-    }
-
-    public void startPrefixMapping(final String prefix,
-                                   final String uri) throws SAXException {
-        super.startPrefixMapping( prefix,
-                                  uri );
-        this.namespaces.put( prefix,
-                             uri );
-    }
-
-    public void endPrefixMapping(final String prefix) throws SAXException {
-        super.endPrefixMapping( prefix );
-        this.namespaces.remove( prefix );
-    }
-
-    private void print(final SAXParseException x) {
-        final String msg = this.message.format( new Object[]{x.getSystemId(), new Integer( x.getLineNumber() ), new Integer( x.getColumnNumber() ), x.getMessage()} );
-        System.out.println( msg );
-    }
-
-    public void warning(final SAXParseException x) {
-        print( x );
-    }
-
-    public void error(final SAXParseException x) {
-        print( x );
-    }
-
-    public void fatalError(final SAXParseException x) throws SAXParseException {
-        print( x );
-        throw x;
-    }
-
-    private InputSource resolveSchema(final String publicId,
-                                      final String systemId) throws SAXException,
-                                                            IOException {
-        // Schema files must end with xsd
-        if ( !systemId.toLowerCase().endsWith( "xsd" ) ) {
-            return null;
-        }
-
-        // try the actual location given by systemId
-        try {
-            final URL url = new URL( systemId );
-            return new InputSource( url.openStream() );
-        } catch ( final Exception e ) {
-        }
-
-        // Try and get the index for the filename, else return null
-        String xsd;
-        int index = systemId.lastIndexOf( "/" );
-        if ( index == -1 ) {
-            index = systemId.lastIndexOf( "\\" );
-        }
-        if ( index != -1 ) {
-            xsd = systemId.substring( index + 1 );
-        } else {
-            xsd = systemId;
-        }
-
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-
-        if ( cl == null ) {
-            cl = XmlPackageReader.class.getClassLoader();
-        }
-
-        // Try looking in META-INF
-
-        {
-            final InputStream is = cl.getResourceAsStream( "META-INF/" + xsd );
-            if ( is != null ) {
-                return new InputSource( is );
-            }
-        }
-
-        // Try looking in /META-INF
-        {
-            final InputStream is = cl.getResourceAsStream( "/META-INF/" + xsd );
-            if ( is != null ) {
-                return new InputSource( is );
-            }
-        }
-
-        // Try looking at root of classpath
-        {
-            final InputStream is = cl.getResourceAsStream( "/" + xsd );
-            if ( is != null ) {
-                return new InputSource( is );
-            }
-        }
-
-        // Try current working directory
-        {
-            final File file = new File( xsd );
-            if ( file.exists() ) {
-                return new InputSource( new BufferedInputStream( new FileInputStream( file ) ) );
-            }
-        }
-
-        cl = ClassLoader.getSystemClassLoader();
-
-        // Try looking in META-INF
-        {
-            final InputStream is = cl.getResourceAsStream( "META-INF/" + xsd );
-            if ( is != null ) {
-                return new InputSource( is );
-            }
-        }
-
-        // Try looking in /META-INF
-        {
-            final InputStream is = cl.getResourceAsStream( "/META-INF/" + xsd );
-            if ( is != null ) {
-                return new InputSource( is );
-            }
-        }
-
-        // Try looking at root of classpath
-        {
-            final InputStream is = cl.getResourceAsStream( "/" + xsd );
-            if ( is != null ) {
-                return new InputSource( is );
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Intializes EntityResolver that is configured via system property ENTITY_RESOLVER_PROPERTY_NAME.
-     */
-    private void initEntityResolver() {
-        final String entityResolveClazzName = System.getProperty( XmlPackageReader.ENTITY_RESOLVER_PROPERTY_NAME );
-        if ( entityResolveClazzName != null && entityResolveClazzName.length() > 0 ) {
-            try {
-                final Class entityResolverClazz = Thread.currentThread().getContextClassLoader().loadClass( entityResolveClazzName );
-                this.entityResolver = (EntityResolver) entityResolverClazz.newInstance();
-            } catch ( final Exception ignoreIt ) {
-            }
-        }
-    }
-
+package org.drools.xml;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.xml.sax.*;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.*;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * <code>RuleSet</code> loader.
+ *
+ * Note you can override the default entity resolver by setting the System property of:
+ *  <code>org.drools.io.EntityResolve</code> to your own custom entity resolver.
+ *  This can be done using -Dorg.drools.io.EntityResolver=YourClassHere on the command line, for instance.
+ *
+ * @author <a href="mailto:bob at werken.com">bob mcwhirter </a>
+ */
+public class XmlPackageReader extends DefaultHandler {
+    // ----------------------------------------------------------------------
+    // Constants
+    // ----------------------------------------------------------------------
+    public static final String  ENTITY_RESOLVER_PROPERTY_NAME = "org.drools.io.EntityResolver";
+
+    /** Namespace URI for the general tags. */
+    public static final String  RULES_NAMESPACE_URI           = "http://drools.org/rules";
+
+    private static final String JAXP_SCHEMA_LANGUAGE          = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+
+    private static final String W3C_XML_SCHEMA                = "http://www.w3.org/2001/XMLSchema";
+
+    // ----------------------------------------------------------------------
+    // Instance members
+    // ----------------------------------------------------------------------
+    /** SAX parser. */
+    private SAXParser           parser;
+
+    /** isValidating */
+    private boolean             isValidating                  = true;
+
+    /** Locator for errors. */
+    private Locator             locator;
+
+    // private Map repo;
+
+    /** Stack of configurations. */
+    private LinkedList          configurationStack;
+
+    /** Current configuration text. */
+    private StringBuffer        characters;
+
+    private Map                 handlers;
+
+    private boolean             lastWasEndElement;
+
+    private LinkedList          parents;
+
+    private Object              peer;
+
+    private Object              current;
+
+    private PackageDescr        packageDescr;
+
+    private boolean             inHandledRuleSubElement;
+
+    private final MessageFormat message                       = new MessageFormat( "({0}: {1}, {2}): {3}" );
+
+    private final Map           namespaces                    = new HashMap();
+
+    EntityResolver              entityResolver;
+
+    // ----------------------------------------------------------------------
+    // Constructors
+    // ----------------------------------------------------------------------
+
+    /**
+     * Construct.
+     *
+     * <p>
+     * Uses the default JAXP SAX parser and the default classpath-based
+     * <code>DefaultSemanticModule</code>.
+     * </p>
+     */
+    public XmlPackageReader() {
+        // init
+        this.configurationStack = new LinkedList();
+        this.parents = new LinkedList();
+
+        this.handlers = new HashMap();
+
+        this.handlers.put( "package",
+                           new PackageHandler( this ) );
+        this.handlers.put( "rule",
+                           new RuleHandler( this ) );
+        this.handlers.put( "query",
+                           new QueryHandler( this ) );
+        this.handlers.put( "attribute",
+                           null );
+        this.handlers.put( "function",
+                           new FunctionHandler( this ) );
+
+        // Conditional Elements
+        this.handlers.put( "lhs",
+                           new AndHandler( this ) );
+        this.handlers.put( "and",
+                           new AndHandler( this ) );
+        this.handlers.put( "or",
+                           new OrHandler( this ) );
+        this.handlers.put( "not",
+                           new NotHandler( this ) );
+        this.handlers.put( "exists",
+                           new ExistsHandler( this ) );
+        this.handlers.put( "eval",
+                           new EvalHandler( this ) );
+        this.handlers.put( "pattern",
+                           new PatternHandler( this ) );
+
+        // Field Constraints
+        this.handlers.put( "field-constraint",
+                           new FieldConstraintHandler( this ) );
+        this.handlers.put( "literal-restriction",
+                           new LiteralRestrictionHandler( this ) );
+        this.handlers.put( "variable-restriction",
+                           new VariableRestrictionsHandler( this ) );
+        this.handlers.put( "predicate",
+                           new PredicateHandler( this ) );
+        this.handlers.put( "return-value-restriction",
+                           new ReturnValueRestrictionHandler( this ) );
+        this.handlers.put( "field-binding",
+                           new FieldBindingHandler( this ) );
+        this.handlers.put( "restriction-connective",
+                           new RestrictionConnectiveHandler( this ) );
+        
+        initEntityResolver();
+
+    }
+
+    /**
+     * Construct.
+     *
+     * <p>
+     * Uses the default classpath-based <code>DefaultSemanticModule</code>.
+     * </p>
+     *
+     * @param parser
+     *            The SAX parser.
+     */
+    public XmlPackageReader(final SAXParser parser) {
+        this.parser = parser;
+    }
+
+    // ----------------------------------------------------------------------
+    // Instance methods
+    // ----------------------------------------------------------------------
+
+    /**
+     * Read a <code>RuleSet</code> from a <code>Reader</code>.
+     *
+     * @param reader
+     *            The reader containing the rule-set.
+     *
+     * @return The rule-set.
+     */
+    public PackageDescr read(final Reader reader) throws SAXException,
+                                                 IOException {
+        return read( new InputSource( reader ) );
+    }
+
+    /**
+     * Read a <code>RuleSet</code> from an <code>InputStream</code>.
+     *
+     * @param inputStream
+     *            The input-stream containing the rule-set.
+     *
+     * @return The rule-set.
+     */
+    public PackageDescr read(final InputStream inputStream) throws SAXException,
+                                                           IOException {
+        return read( new InputSource( inputStream ) );
+    }
+
+    /**
+     * Read a <code>RuleSet</code> from an <code>InputSource</code>.
+     *
+     * @param in
+     *            The rule-set input-source.
+     *
+     * @return The rule-set.
+     */
+    public PackageDescr read(final InputSource in) throws SAXException,
+                                                  IOException {
+        SAXParser localParser = null;
+        if ( this.parser == null ) {
+            final SAXParserFactory factory = SAXParserFactory.newInstance();
+            factory.setNamespaceAware( true );
+
+            final String isValidatingString = System.getProperty( "drools.schema.validating" );
+            if ( System.getProperty( "drools.schema.validating" ) != null ) {
+                this.isValidating = Boolean.getBoolean( "drools.schema.validating" );
+            }
+
+            if ( this.isValidating == true ) {
+                factory.setValidating( true );
+                try {
+                    localParser = factory.newSAXParser();
+                } catch ( final ParserConfigurationException e ) {
+                    throw new RuntimeException( e.getMessage() );
+                }
+
+                try {
+                    localParser.setProperty( XmlPackageReader.JAXP_SCHEMA_LANGUAGE,
+                                             XmlPackageReader.W3C_XML_SCHEMA );
+                } catch ( final SAXNotRecognizedException e ) {
+                    boolean hideWarnings = Boolean.getBoolean( "drools.schema.hidewarnings" );
+                    if ( !hideWarnings ) {
+                        System.err.println( "Your SAX parser is not JAXP 1.2 compliant - turning off validation." );
+                    }
+                    localParser = null;
+                }
+            }
+
+            if ( localParser == null ) {
+                // not jaxp1.2 compliant so turn off validation
+                try {
+                    this.isValidating = false;
+                    factory.setValidating( this.isValidating );
+                    localParser = factory.newSAXParser();
+                } catch ( final ParserConfigurationException e ) {
+                    throw new RuntimeException( e.getMessage() );
+                }
+            }
+        } else {
+            localParser = this.parser;
+        }
+
+        if ( !localParser.isNamespaceAware() ) {
+            throw new RuntimeException( "parser must be namespace-aware" );
+        }
+
+        localParser.parse( in,
+                           this );
+
+        return this.packageDescr;
+    }
+
+    void setPackageDescr(final PackageDescr packageDescr) {
+        this.packageDescr = packageDescr;
+    }
+
+    public PackageDescr getPackageDescr() {
+        return this.packageDescr;
+    }
+
+    /**
+     * @see org.xml.sax.ContentHandler
+     */
+    public void setDocumentLocator(final Locator locator) {
+        this.locator = locator;
+    }
+
+    /**
+     * Get the <code>Locator</code>.
+     *
+     * @return The locator.
+     */
+    public Locator getLocator() {
+        return this.locator;
+    }
+
+    public void startDocument() {
+        this.isValidating = true;
+        this.packageDescr = null;
+        this.current = null;
+        this.peer = null;
+        this.lastWasEndElement = false;
+        this.parents.clear();
+        this.characters = null;
+        this.configurationStack.clear();
+        this.namespaces.clear();
+    }
+
+    /**
+     * @param uri
+     * @param localName
+     * @param qname
+     * @param attrs
+     * @throws SAXException
+     * @see org.xml.sax.ContentHandler
+     *
+     * @todo: better way to manage unhandled elements
+     */
+    public void startElement(final String uri,
+                             final String localName,
+                             final String qname,
+                             final Attributes attrs) throws SAXException {
+        // going down so no peer
+        if ( !this.lastWasEndElement ) {
+            this.peer = null;
+        }
+
+        final Handler handler = getHandler( localName );
+
+        if ( (handler != null) && (!this.parents.isEmpty() && this.parents.getLast() instanceof RuleDescr) ) {
+            this.inHandledRuleSubElement = true;
+        }
+
+        if ( handler == null ) {
+            //            if ( ((this.inHandledRuleSubElement == false) && (this.parents.getLast() instanceof RuleDescr)) || (this.parents.getLast() instanceof PackageDescr) ) {
+            //                throw new SAXParseException( "unknown tag '" + localName + "' in namespace '" + uri + "'",
+            //                                             getLocator() );
+            //            }
+            // no handler so build up the configuration
+            startConfiguration( localName,
+                                attrs );
+            return;
+        }
+
+        validate( uri,  localName, handler );
+
+        final Object node = handler.start( uri, localName, attrs );
+
+        if ( node != null ) {
+            this.parents.add( node );
+            this.current = node;
+        }
+        this.lastWasEndElement = false;
+    }
+
+    /**
+     * @param uri
+     * @param localName
+     * @param qname
+     * @throws SAXException
+     * @see org.xml.sax.ContentHandler
+     */
+
+    public void endElement(final String uri,
+                           final String localName,
+                           final String qname) throws SAXException {
+        final Handler handler = getHandler( localName );
+
+        if ( (handler != null) && (!this.parents.isEmpty() && this.parents.getLast() instanceof RuleDescr) ) {
+            this.inHandledRuleSubElement = false;
+        }
+
+        if ( handler == null ) {
+            if ( this.configurationStack.size() >= 1 ) {
+                endConfiguration();
+            }
+            return;
+        }
+
+        this.current = getParent( handler.generateNodeFor() );
+
+        final Object node = handler.end( uri,
+                                         localName );
+
+        // next
+        if ( node != null && !this.lastWasEndElement ) {
+            this.peer = node;
+        }
+        // up or no children
+        else if ( this.lastWasEndElement || (this.parents.getLast()).getClass().isInstance( this.current ) ) {
+            this.peer = this.parents.removeLast();
+        }
+
+        this.lastWasEndElement = true;
+    }
+
+    private void validate(final String uri,
+                          final String localName,
+                          final Handler handler) throws SAXParseException {
+        boolean validParent = false;
+        boolean validPeer = false;
+        boolean invalidNesting = false;
+
+        final Set validParents = handler.getValidParents();
+        final Set validPeers = handler.getValidPeers();
+        boolean allowNesting = handler.allowNesting();
+
+        // get parent
+        Object parent;
+        if ( this.parents.size() != 0 ) {
+            parent = this.parents.getLast();
+        } else {
+            parent = null;
+        }
+
+        // check valid parents
+        // null parent means localname is rule-set
+        // dont process if elements are the same
+        // instead check for allowed nesting
+        final Class nodeClass = getHandler( localName ).generateNodeFor();
+        if ( !nodeClass.isInstance( parent ) ) {
+            Object allowedParent;
+            final Iterator it = validParents.iterator();
+            while ( !validParent && it.hasNext() ) {
+                allowedParent = it.next();
+                if ( parent == null && allowedParent == null ) {
+                    validParent = true;
+                } else if ( allowedParent != null && ((Class) allowedParent).isInstance( parent ) ) {
+                    validParent = true;
+                }
+            }
+            if ( !validParent ) {
+                 throw new SAXParseException( "<" + localName + "> has an invalid parent element [" + parent + "]",
+                                             getLocator() );
+            }
+        }
+
+        // check valid peers
+        // null peer means localname is rule-set
+        final Object peer = this.peer;
+
+        Object allowedPeer;
+        Iterator it = validPeers.iterator();
+        while ( !validPeer && it.hasNext() ) {
+            allowedPeer = it.next();
+            if ( peer == null && allowedPeer == null ) {
+                validPeer = true;
+            } else if ( allowedPeer != null && ((Class) allowedPeer).isInstance( peer ) ) {
+                validPeer = true;
+            }
+        }
+        if ( !validPeer ) {
+            throw new SAXParseException( "<" + localName + "> is after an invalid element",
+                                         getLocator() );
+        }
+
+        if ( !allowNesting ) {
+            it = this.parents.iterator();
+            while ( !invalidNesting && it.hasNext() ) {
+                if ( nodeClass.isInstance( it.next() ) ) {
+                    invalidNesting = true;
+                }
+            }
+        }
+        if ( invalidNesting ) {
+            throw new SAXParseException( "<" + localName + ">  may not be nested",
+                                         getLocator() );
+        }
+
+    }
+
+    /**
+     * Start a configuration node.
+     *
+     * @param name
+     *            Tag name.
+     * @param attrs
+     *            Tag attributes.
+     */
+    protected void startConfiguration(final String name,
+                                      final Attributes attrs) {
+        this.characters = new StringBuffer();
+
+        final DefaultConfiguration config = new DefaultConfiguration( name );
+
+        final int numAttrs = attrs.getLength();
+
+        for ( int i = 0; i < numAttrs; ++i ) {
+            config.setAttribute( attrs.getLocalName( i ),
+                                 attrs.getValue( i ) );
+        }
+
+        // lets add the namespaces as attributes
+        for ( final Iterator iter = this.namespaces.entrySet().iterator(); iter.hasNext(); ) {
+            final Map.Entry entry = (Map.Entry) iter.next();
+            String ns = (String) entry.getKey();
+            final String value = (String) entry.getValue();
+            if ( ns == null || ns.length() == 0 ) {
+                ns = "xmlns";
+            } else {
+                ns = "xmlns:" + ns;
+            }
+            config.setAttribute( ns,
+                                 value );
+        }
+
+        if ( this.configurationStack.isEmpty() ) {
+            this.configurationStack.addLast( config );
+        } else {
+            ((DefaultConfiguration) this.configurationStack.getLast()).addChild( config );
+            this.configurationStack.addLast( config );
+        }
+    }
+
+    Handler getHandler(final String localName) {
+        return (Handler) this.handlers.get( localName );
+    }
+
+    /**
+     * @param chars
+     * @param start
+     * @param len
+     * @see org.xml.sax.ContentHandler
+     */
+    public void characters(final char[] chars,
+                           final int start,
+                           final int len) {
+        if ( this.characters != null ) {
+            this.characters.append( chars,
+                                    start,
+                                    len );
+        }
+    }
+
+    /**
+     * End a configuration node.
+     *
+     * @return The configuration.
+     */
+    protected Configuration endConfiguration() {
+        final DefaultConfiguration config = (DefaultConfiguration) this.configurationStack.removeLast();
+        if ( this.characters != null ) {
+            config.setText( this.characters.toString() );
+        }
+
+        this.characters = null;
+
+        return config;
+    }
+
+    LinkedList getParents() {
+        return this.parents;
+    }
+
+    Object getParent(final Class parent) {
+        final ListIterator it = this.parents.listIterator( this.parents.size() );
+        Object node = null;
+        while ( it.hasPrevious() ) {
+            node = it.previous();
+            if ( parent.isInstance( node ) ) {
+                break;
+            }
+        }
+        return node;
+    }
+
+    Object getPeer() {
+        return this.peer;
+    }
+
+    Object getCurrent() {
+        return this.current;
+    }
+
+    public InputSource resolveEntity(final String publicId,
+                                     final String systemId) throws SAXException {
+        try {
+            final InputSource inputSource = resolveSchema( publicId,
+                                                           systemId );
+            if ( inputSource != null ) {
+                return inputSource;
+            }
+            if ( this.entityResolver != null ) {
+                return this.entityResolver.resolveEntity( publicId,
+                                                          systemId );
+            }
+        } catch ( final IOException ioe ) {
+        }
+        return null;
+    }
+
+    public void startPrefixMapping(final String prefix,
+                                   final String uri) throws SAXException {
+        super.startPrefixMapping( prefix,
+                                  uri );
+        this.namespaces.put( prefix,
+                             uri );
+    }
+
+    public void endPrefixMapping(final String prefix) throws SAXException {
+        super.endPrefixMapping( prefix );
+        this.namespaces.remove( prefix );
+    }
+
+    private void print(final SAXParseException x) {
+        final String msg = this.message.format( new Object[]{x.getSystemId(), new Integer( x.getLineNumber() ), new Integer( x.getColumnNumber() ), x.getMessage()} );
+        System.out.println( msg );
+    }
+
+    public void warning(final SAXParseException x) {
+        print( x );
+    }
+
+    public void error(final SAXParseException x) {
+        print( x );
+    }
+
+    public void fatalError(final SAXParseException x) throws SAXParseException {
+        print( x );
+        throw x;
+    }
+
+    private InputSource resolveSchema(final String publicId,
+                                      final String systemId) throws SAXException,
+                                                            IOException {
+        // Schema files must end with xsd
+        if ( !systemId.toLowerCase().endsWith( "xsd" ) ) {
+            return null;
+        }
+
+        // try the actual location given by systemId
+        try {
+            final URL url = new URL( systemId );
+            return new InputSource( url.openStream() );
+        } catch ( final Exception e ) {
+        }
+
+        // Try and get the index for the filename, else return null
+        String xsd;
+        int index = systemId.lastIndexOf( "/" );
+        if ( index == -1 ) {
+            index = systemId.lastIndexOf( "\\" );
+        }
+        if ( index != -1 ) {
+            xsd = systemId.substring( index + 1 );
+        } else {
+            xsd = systemId;
+        }
+
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+
+        if ( cl == null ) {
+            cl = XmlPackageReader.class.getClassLoader();
+        }
+
+        // Try looking in META-INF
+
+        {
+            final InputStream is = cl.getResourceAsStream( "META-INF/" + xsd );
+            if ( is != null ) {
+                return new InputSource( is );
+            }
+        }
+
+        // Try looking in /META-INF
+        {
+            final InputStream is = cl.getResourceAsStream( "/META-INF/" + xsd );
+            if ( is != null ) {
+                return new InputSource( is );
+            }
+        }
+
+        // Try looking at root of classpath
+        {
+            final InputStream is = cl.getResourceAsStream( "/" + xsd );
+            if ( is != null ) {
+                return new InputSource( is );
+            }
+        }
+
+        // Try current working directory
+        {
+            final File file = new File( xsd );
+            if ( file.exists() ) {
+                return new InputSource( new BufferedInputStream( new FileInputStream( file ) ) );
+            }
+        }
+
+        cl = ClassLoader.getSystemClassLoader();
+
+        // Try looking in META-INF
+        {
+            final InputStream is = cl.getResourceAsStream( "META-INF/" + xsd );
+            if ( is != null ) {
+                return new InputSource( is );
+            }
+        }
+
+        // Try looking in /META-INF
+        {
+            final InputStream is = cl.getResourceAsStream( "/META-INF/" + xsd );
+            if ( is != null ) {
+                return new InputSource( is );
+            }
+        }
+
+        // Try looking at root of classpath
+        {
+            final InputStream is = cl.getResourceAsStream( "/" + xsd );
+            if ( is != null ) {
+                return new InputSource( is );
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Intializes EntityResolver that is configured via system property ENTITY_RESOLVER_PROPERTY_NAME.
+     */
+    private void initEntityResolver() {
+        final String entityResolveClazzName = System.getProperty( XmlPackageReader.ENTITY_RESOLVER_PROPERTY_NAME );
+        if ( entityResolveClazzName != null && entityResolveClazzName.length() > 0 ) {
+            try {
+                final Class entityResolverClazz = Thread.currentThread().getContextClassLoader().loadClass( entityResolveClazzName );
+                this.entityResolver = (EntityResolver) entityResolverClazz.newInstance();
+            } catch ( final Exception ignoreIt ) {
+            }
+        }
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-3.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-3.0.xsd	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-3.0.xsd	2007-06-17 22:36:12 UTC (rev 12646)
@@ -8,13 +8,9 @@
     <xs:complexType>
       <xs:choice maxOccurs="unbounded" minOccurs="0">
         <xs:element ref="drools:import"/>
-        
         <xs:element ref="drools:global"/>
-
         <xs:element ref="drools:function"/>        
-
         <xs:element ref="drools:rule"/>
-        
         <xs:element ref="drools:query"/>        
       </xs:choice>
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,17 +1,16 @@
 package org.drools.xml;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-
 import junit.framework.TestCase;
-
 import org.drools.compiler.DrlParser;
 import org.drools.lang.DrlDumper;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.RuleDescr;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+
 /**
  * Test the dump/convert format utilities.
  * @author Michael Neale
@@ -26,6 +25,31 @@
 
         final XmlDumper dumper = new XmlDumper();
         final String result = dumper.dump( pkgOriginal );
+        
+        final BufferedReader reader = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "test_ParseRule.xml" ) ) );
+        final StringBuffer buffer = new StringBuffer();
+        String s = null;
+        while ( (s = reader.readLine()) != null ) {
+            buffer.append( s );
+        }
+        
+        System.out.println("-------------------------");
+        
+        System.out.println(result);
+        
+        System.out.println("-------------------------");
+        
+        System.out.println(buffer);
+        
+        System.out.println("-------------------------");
+        
+        assertEqualsIgnoreWhitespace( buffer.toString(),
+                                      result );
+
+        
+        
+        // TODO: FM need test dumped result
+        
         assertNotNull( result );
 
         //now lest slurp it back up
@@ -59,7 +83,16 @@
         DrlParser parser = new DrlParser();
         final PackageDescr pkgOriginal = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "test_Dump.drl" ) ) );
         final DrlDumper dumper = new DrlDumper();
+        
+        final XmlDumper XMLdumper = new XmlDumper();
+        final String XMLresult = XMLdumper.dump( pkgOriginal );
+        
+        System.out.println(XMLresult);
+        
         final String result = dumper.dump( pkgOriginal );
+        
+        System.out.println(result);
+        
         assertNotNull( result );
 
         parser = new DrlParser();
@@ -84,6 +117,7 @@
                       ruleDumped.getLhs().getDescrs().size() );
         assertEquals( ruleOriginal.getConsequence(),
                       ruleDumped.getConsequence() );
+        
 
         // Now double check the contents are the same
         final BufferedReader reader = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "test_Dump.drl" ) ) );
@@ -92,6 +126,10 @@
         while ( (s = reader.readLine()) != null ) {
             buffer.append( s );
         }
+        
+        System.out.println(result);
+        System.out.println(buffer);
+        
 
         assertEqualsIgnoreWhitespace( buffer.toString(),
                                       result );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/XmlPackageReaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/XmlPackageReaderTest.java	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/XmlPackageReaderTest.java	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,455 +1,525 @@
-package org.drools.xml;
-
-import java.io.InputStreamReader;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.AttributeDescr;
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.FieldBindingDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.FunctionDescr;
-import org.drools.lang.descr.GlobalDescr;
-import org.drools.lang.descr.ImportDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.QueryDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-
-public class XmlPackageReaderTest extends TestCase {
-    public void testParsePackageName() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParsePackageName.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-    }
-
-    public void testParseImport() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseImport.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-    }
-
-    public void testParseGlobal() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseGlobal.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-
-        final List globals = packageDescr.getGlobals();
-        assertEquals( 2,
-                      globals.size() );
-        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
-        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
-        assertEquals( "com.sample.X",
-                      x.getType() );
-        assertEquals( "x",
-                      x.getIdentifier() );
-        assertEquals( "com.sample.Yada",
-                      yada.getType() );
-        assertEquals( "yada",
-                      yada.getIdentifier() );
-    }
-
-    public void testParseFunction() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseFunction.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-
-        final List globals = packageDescr.getGlobals();
-        assertEquals( 2,
-                      globals.size() );
-        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
-        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
-        assertEquals( "com.sample.X",
-                      x.getType() );
-        assertEquals( "x",
-                      x.getIdentifier() );
-        assertEquals( "com.sample.Yada",
-                      yada.getType() );
-        assertEquals( "yada",
-                      yada.getIdentifier() );
-
-        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
-        final List names = functionDescr.getParameterNames();
-        assertEquals( "foo",
-                      names.get( 0 ) );
-        assertEquals( "bada",
-                      names.get( 1 ) );
-
-        final List types = functionDescr.getParameterTypes();
-        assertEquals( "Bar",
-                      types.get( 0 ) );
-        assertEquals( "Bing",
-                      types.get( 1 ) );
-
-        assertEquals( "System.out.println(\"hello world\");",
-                      functionDescr.getText().trim() );
-    }
-
-    public void testParseRule() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseRule.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-
-        final List globals = packageDescr.getGlobals();
-        assertEquals( 2,
-                      globals.size() );
-        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
-        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
-        assertEquals( "com.sample.X",
-                      x.getType() );
-        assertEquals( "x",
-                      x.getIdentifier() );
-        assertEquals( "com.sample.Yada",
-                      yada.getType() );
-        assertEquals( "yada",
-                      yada.getIdentifier() );
-
-        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
-        final List names = functionDescr.getParameterNames();
-        assertEquals( "foo",
-                      names.get( 0 ) );
-        assertEquals( "bada",
-                      names.get( 1 ) );
-
-        final List types = functionDescr.getParameterTypes();
-        assertEquals( "Bar",
-                      types.get( 0 ) );
-        assertEquals( "Bing",
-                      types.get( 1 ) );
-
-        assertEquals( "System.out.println(\"hello world\");",
-                      functionDescr.getText().trim() );
-
-        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
-        assertEquals( "simple_rule",
-                      ruleDescr.getName() );
-
-        assertEquals( 4,
-                      ruleDescr.getAttributes().size() );
-        final AttributeDescr attributeDescr = (AttributeDescr) ruleDescr.getAttributes().get( 0 );
-        assertEquals( "salience",
-                      attributeDescr.getName() );
-        assertEquals( "10",
-                      attributeDescr.getValue() );
-
-        final AndDescr lhs = ruleDescr.getLhs();
-        assertEquals( 6,
-                      lhs.getDescrs().size() );
-        final PatternDescr patternDescr = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "Bar",
-                      patternDescr.getObjectType() );
-
-        final String consequence = (String) ruleDescr.getConsequence();
-        assertNotNull( consequence );
-
-    }
-
-    public void testParseLhs() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseLhs.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-
-        final List globals = packageDescr.getGlobals();
-        assertEquals( 2,
-                      globals.size() );
-        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
-        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
-        assertEquals( "com.sample.X",
-                      x.getType() );
-        assertEquals( "x",
-                      x.getIdentifier() );
-        assertEquals( "com.sample.Yada",
-                      yada.getType() );
-        assertEquals( "yada",
-                      yada.getIdentifier() );
-
-        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
-        final List names = functionDescr.getParameterNames();
-        assertEquals( "foo",
-                      names.get( 0 ) );
-        assertEquals( "bada",
-                      names.get( 1 ) );
-
-        final List types = functionDescr.getParameterTypes();
-        assertEquals( "Bar",
-                      types.get( 0 ) );
-        assertEquals( "Bing",
-                      types.get( 1 ) );
-
-        assertEquals( "System.out.println(\"hello world\");",
-                      functionDescr.getText().trim() );
-
-        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
-        assertEquals( "my rule",
-                      ruleDescr.getName() );
-
-        final AndDescr lhsDescr = ruleDescr.getLhs();
-        AndDescr andDescr = (AndDescr) lhsDescr.getDescrs().get( 0 );
-        OrDescr orDescr = (OrDescr) lhsDescr.getDescrs().get( 1 );
-        final PatternDescr pattern1 = (PatternDescr) lhsDescr.getDescrs().get( 2 );
-        assertNull( pattern1.getIdentifier() );
-        assertEquals( "Foo",
-                      pattern1.getObjectType() );
-
-        final PatternDescr pattern2 = (PatternDescr) lhsDescr.getDescrs().get( 3 );
-        assertEquals( "Bar",
-                      pattern2.getObjectType() );
-        assertEquals( "bar",
-                      pattern2.getIdentifier() );
-
-        final PatternDescr pattern3 = (PatternDescr) lhsDescr.getDescrs().get( 4 );
-        //final LiteralDescr literalDescr = (LiteralDescr) pattern3.getDescrs().get( 0 );
-        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) pattern3.getDescrs().get( 0 );
-        final LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "field1",
-                      fieldConstraintDescr.getFieldName() );
-        assertEquals( "==",
-                      literalDescr.getEvaluator() );
-        assertEquals( "value1",
-                      literalDescr.getText() );
-
-        final ReturnValueRestrictionDescr returnValueDescr = (ReturnValueRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 1 );
-        assertEquals( "==",
-                      returnValueDescr.getEvaluator() );
-        assertEquals( "1==1",
-                      returnValueDescr.getContent() );
-
-        final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 2 );
-        assertEquals( "==",
-                      variableDescr.getEvaluator() );
-        assertEquals( "var1",
-                      variableDescr.getIdentifier() );
-
-        final PredicateDescr predicateDescr = (PredicateDescr) pattern3.getDescrs().get( 1 );
-        assertEquals( "1==1",
-                      predicateDescr.getContent() );
-
-        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) pattern3.getDescrs().get( 2 );
-        assertEquals( "field1",
-                      fieldBindingDescr.getFieldName() );
-        assertEquals( "var1",
-                      fieldBindingDescr.getIdentifier() );
-
-        final NotDescr notDescr = (NotDescr) lhsDescr.getDescrs().get( 5 );
-        assertEquals( 1,
-                      notDescr.getDescrs().size() );
-        PatternDescr patternDescr = (PatternDescr) notDescr.getDescrs().get( 0 );
-        assertEquals( "Bar",
-                      patternDescr.getObjectType() );
-
-        final ExistsDescr existsDescr = (ExistsDescr) lhsDescr.getDescrs().get( 6 );
-        assertEquals( 1,
-                      existsDescr.getDescrs().size() );
-        patternDescr = (PatternDescr) existsDescr.getDescrs().get( 0 );
-        assertEquals( "Bar",
-                      patternDescr.getObjectType() );
-
-        andDescr = (AndDescr) lhsDescr.getDescrs().get( 7 );
-        assertEquals( 2,
-                      andDescr.getDescrs().size() );
-        orDescr = (OrDescr) andDescr.getDescrs().get( 0 );
-        patternDescr = (PatternDescr) orDescr.getDescrs().get( 0 );
-        assertEquals( "Bar",
-                      patternDescr.getObjectType() );
-        patternDescr = (PatternDescr) andDescr.getDescrs().get( 1 );
-        assertEquals( "Yada",
-                      patternDescr.getObjectType() );
-
-        orDescr = (OrDescr) lhsDescr.getDescrs().get( 8 );
-        assertEquals( 2,
-                      orDescr.getDescrs().size() );
-        andDescr = (AndDescr) orDescr.getDescrs().get( 0 );
-        patternDescr = (PatternDescr) andDescr.getDescrs().get( 0 );
-        assertEquals( "Foo",
-                      patternDescr.getObjectType() );
-        patternDescr = (PatternDescr) orDescr.getDescrs().get( 1 );
-        assertEquals( "Zaa",
-                      patternDescr.getObjectType() );
-
-        final EvalDescr evalDescr = (EvalDescr) lhsDescr.getDescrs().get( 9 );
-        assertEquals( "1==1",
-                      evalDescr.getContent() );
-    }
-
-    public void testParseRhs() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseRhs.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-
-        final List globals = packageDescr.getGlobals();
-        assertEquals( 2,
-                      globals.size() );
-        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
-        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
-        assertEquals( "com.sample.X",
-                      x.getType() );
-        assertEquals( "x",
-                      x.getIdentifier() );
-        assertEquals( "com.sample.Yada",
-                      yada.getType() );
-        assertEquals( "yada",
-                      yada.getIdentifier() );
-
-        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
-        final List names = functionDescr.getParameterNames();
-        assertEquals( "foo",
-                      names.get( 0 ) );
-        assertEquals( "bada",
-                      names.get( 1 ) );
-
-        final List types = functionDescr.getParameterTypes();
-        assertEquals( "Bar",
-                      types.get( 0 ) );
-        assertEquals( "Bing",
-                      types.get( 1 ) );
-
-        assertEquals( "System.out.println(\"hello world\");",
-                      functionDescr.getText().trim() );
-
-        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
-        assertEquals( "my rule",
-                      ruleDescr.getName() );
-
-        final String consequence = (String) ruleDescr.getConsequence();
-        assertNotNull( consequence );
-        assertEquals( "System.out.println( \"hello\" );",
-                      consequence.trim() );
-    }
-
-    public void testParseQuery() throws Exception {
-        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
-        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseQuery.xml" ) ) );
-        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
-        assertNotNull( packageDescr );
-        assertEquals( "com.sample",
-                      packageDescr.getName() );
-
-        final List imports = packageDescr.getImports();
-        assertEquals( 2,
-                      imports.size() );
-        assertEquals( "java.util.HashMap",
-                      ((ImportDescr) imports.get( 0 )).getTarget() );
-        assertEquals( "org.drools.*",
-                      ((ImportDescr) imports.get( 1 )).getTarget() );
-
-        final List globals = packageDescr.getGlobals();
-        assertEquals( 2,
-                      globals.size() );
-        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
-        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
-        assertEquals( "com.sample.X",
-                      x.getType() );
-        assertEquals( "x",
-                      x.getIdentifier() );
-        assertEquals( "com.sample.Yada",
-                      yada.getType() );
-        assertEquals( "yada",
-                      yada.getIdentifier() );
-
-        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
-        final List names = functionDescr.getParameterNames();
-        assertEquals( "foo",
-                      names.get( 0 ) );
-        assertEquals( "bada",
-                      names.get( 1 ) );
-
-        final List types = functionDescr.getParameterTypes();
-        assertEquals( "Bar",
-                      types.get( 0 ) );
-        assertEquals( "Bing",
-                      types.get( 1 ) );
-
-        assertEquals( "System.out.println(\"hello world\");",
-                      functionDescr.getText().trim() );
-
-        final QueryDescr queryDescr = (QueryDescr) packageDescr.getRules().get( 0 );
-        assertEquals( "my query",
-                      queryDescr.getName() );
-
-        final AndDescr lhs = queryDescr.getLhs();
-        assertEquals( 1,
-                      lhs.getDescrs().size() );
-        final PatternDescr patternDescr = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "Foo",
-                      patternDescr.getObjectType() );
-
-    }
-}
+package org.drools.xml;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.Cheese;
+import org.drools.Person;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.PatternDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.QueryDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+import org.drools.rule.Package;
+
+public class XmlPackageReaderTest extends TestCase {
+    
+    
+    protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+
+    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+
+    
+    public void testParsePackageName() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParsePackageName.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+    }
+        
+    public void testParseExists() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseExists.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        
+        RuleDescr obj = (RuleDescr) packageDescr.getRules().get( 0 );
+        Object existdescr = obj.getLhs().getDescrs().get( 1 );
+        assertTrue( existdescr instanceof ExistsDescr );
+        
+        Object patternDescriptor = ((ExistsDescr) existdescr).getDescrs().get( 0 );
+        assertTrue( patternDescriptor instanceof PatternDescr );
+    }
+    
+    public void testParseForall() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseForall.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        
+        RuleDescr obj = (RuleDescr) packageDescr.getRules().get( 0 );
+        assertEquals( obj.getLhs().getDescrs().size(), 3); 
+    }
+
+    /*
+    public void testParseFrom() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseFrom.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample", packageDescr.getName() );
+        fail();
+    }
+    
+    
+    public void testParseCollect() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseCollect.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample", packageDescr.getName() );
+        fail();
+    }
+    */
+    
+
+    public void testParseImport() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseImport.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+    }
+
+    public void testParseGlobal() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseGlobal.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+
+        final List globals = packageDescr.getGlobals();
+        assertEquals( 2,
+                      globals.size() );
+        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
+        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
+        assertEquals( "com.sample.X",
+                      x.getType() );
+        assertEquals( "x",
+                      x.getIdentifier() );
+        assertEquals( "com.sample.Yada",
+                      yada.getType() );
+        assertEquals( "yada",
+                      yada.getIdentifier() );
+    }
+
+    public void testParseFunction() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseFunction.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+
+        final List globals = packageDescr.getGlobals();
+        assertEquals( 2,
+                      globals.size() );
+        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
+        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
+        assertEquals( "com.sample.X",
+                      x.getType() );
+        assertEquals( "x",
+                      x.getIdentifier() );
+        assertEquals( "com.sample.Yada",
+                      yada.getType() );
+        assertEquals( "yada",
+                      yada.getIdentifier() );
+
+        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
+        final List names = functionDescr.getParameterNames();
+        assertEquals( "foo",
+                      names.get( 0 ) );
+        assertEquals( "bada",
+                      names.get( 1 ) );
+
+        final List types = functionDescr.getParameterTypes();
+        assertEquals( "Bar",
+                      types.get( 0 ) );
+        assertEquals( "Bing",
+                      types.get( 1 ) );
+
+        assertEquals( "System.out.println(\"hello world\");",
+                      functionDescr.getText().trim() );
+    }
+
+    public void testParseRule() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseRule.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+
+        final List globals = packageDescr.getGlobals();
+        assertEquals( 2,
+                      globals.size() );
+        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
+        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
+        assertEquals( "com.sample.X",
+                      x.getType() );
+        assertEquals( "x",
+                      x.getIdentifier() );
+        assertEquals( "com.sample.Yada",
+                      yada.getType() );
+        assertEquals( "yada",
+                      yada.getIdentifier() );
+
+        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
+        final List names = functionDescr.getParameterNames();
+        assertEquals( "foo",
+                      names.get( 0 ) );
+        assertEquals( "bada",
+                      names.get( 1 ) );
+
+        final List types = functionDescr.getParameterTypes();
+        assertEquals( "Bar",
+                      types.get( 0 ) );
+        assertEquals( "Bing",
+                      types.get( 1 ) );
+
+        assertEquals( "System.out.println(\"hello world\");",
+                      functionDescr.getText().trim() );
+
+        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
+        assertEquals( "simple_rule",
+                      ruleDescr.getName() );
+
+        assertEquals( 4,
+                      ruleDescr.getAttributes().size() );
+        final AttributeDescr attributeDescr = (AttributeDescr) ruleDescr.getAttributes().get( 0 );
+        assertEquals( "salience",
+                      attributeDescr.getName() );
+        assertEquals( "10",
+                      attributeDescr.getValue() );
+
+        final AndDescr lhs = ruleDescr.getLhs();
+        assertEquals( 7,
+                      lhs.getDescrs().size() );
+        final PatternDescr patternDescr = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "Bar",
+                      patternDescr.getObjectType() );
+
+        final String consequence = (String) ruleDescr.getConsequence();
+        assertNotNull( consequence );
+
+    }
+
+    public void testParseLhs() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseLhs.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+
+        final List globals = packageDescr.getGlobals();
+        assertEquals( 2,
+                      globals.size() );
+        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
+        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
+        assertEquals( "com.sample.X",
+                      x.getType() );
+        assertEquals( "x",
+                      x.getIdentifier() );
+        assertEquals( "com.sample.Yada",
+                      yada.getType() );
+        assertEquals( "yada",
+                      yada.getIdentifier() );
+
+        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
+        final List names = functionDescr.getParameterNames();
+        assertEquals( "foo",
+                      names.get( 0 ) );
+        assertEquals( "bada",
+                      names.get( 1 ) );
+
+        final List types = functionDescr.getParameterTypes();
+        assertEquals( "Bar",
+                      types.get( 0 ) );
+        assertEquals( "Bing",
+                      types.get( 1 ) );
+
+        assertEquals( "System.out.println(\"hello world\");",
+                      functionDescr.getText().trim() );
+
+        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
+        assertEquals( "my rule",
+                      ruleDescr.getName() );
+
+        final AndDescr lhsDescr = ruleDescr.getLhs();
+        AndDescr andDescr = (AndDescr) lhsDescr.getDescrs().get( 0 );
+        OrDescr orDescr = (OrDescr) lhsDescr.getDescrs().get( 1 );
+        final PatternDescr pattern1 = (PatternDescr) lhsDescr.getDescrs().get( 2 );
+        assertNull( pattern1.getIdentifier() );
+        assertEquals( "Foo",
+                      pattern1.getObjectType() );
+
+        final PatternDescr pattern2 = (PatternDescr) lhsDescr.getDescrs().get( 3 );
+        assertEquals( "Bar",
+                      pattern2.getObjectType() );
+        assertEquals( "bar",
+                      pattern2.getIdentifier() );
+
+        final PatternDescr pattern3 = (PatternDescr) lhsDescr.getDescrs().get( 4 );
+        //final LiteralDescr literalDescr = (LiteralDescr) pattern3.getDescrs().get( 0 );
+        final FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) pattern3.getDescrs().get( 0 );
+        final LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "field1",
+                      fieldConstraintDescr.getFieldName() );
+        assertEquals( "==",
+                      literalDescr.getEvaluator() );
+        assertEquals( "value1",
+                      literalDescr.getText() );
+
+        final ReturnValueRestrictionDescr returnValueDescr = (ReturnValueRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 1 );
+        assertEquals( "==",
+                      returnValueDescr.getEvaluator() );
+        assertEquals( "1==1",
+                      returnValueDescr.getContent() );
+
+        final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 2 );
+        assertEquals( "==",
+                      variableDescr.getEvaluator() );
+        assertEquals( "var1",
+                      variableDescr.getIdentifier() );
+
+        final PredicateDescr predicateDescr = (PredicateDescr) pattern3.getDescrs().get( 1 );
+        assertEquals( "1==1",
+                      predicateDescr.getContent() );
+
+        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) pattern3.getDescrs().get( 2 );
+        assertEquals( "field1",
+                      fieldBindingDescr.getFieldName() );
+        assertEquals( "var1",
+                      fieldBindingDescr.getIdentifier() );
+
+        final NotDescr notDescr = (NotDescr) lhsDescr.getDescrs().get( 5 );
+        assertEquals( 1,
+                      notDescr.getDescrs().size() );
+        PatternDescr patternDescr = (PatternDescr) notDescr.getDescrs().get( 0 );
+        assertEquals( "Bar",
+                      patternDescr.getObjectType() );
+
+        final ExistsDescr existsDescr = (ExistsDescr) lhsDescr.getDescrs().get( 6 );
+        assertEquals( 1,
+                      existsDescr.getDescrs().size() );
+        patternDescr = (PatternDescr) existsDescr.getDescrs().get( 0 );
+        assertEquals( "Bar",
+                      patternDescr.getObjectType() );
+
+        andDescr = (AndDescr) lhsDescr.getDescrs().get( 7 );
+        assertEquals( 2,
+                      andDescr.getDescrs().size() );
+        orDescr = (OrDescr) andDescr.getDescrs().get( 0 );
+        patternDescr = (PatternDescr) orDescr.getDescrs().get( 0 );
+        assertEquals( "Bar",
+                      patternDescr.getObjectType() );
+        patternDescr = (PatternDescr) andDescr.getDescrs().get( 1 );
+        assertEquals( "Yada",
+                      patternDescr.getObjectType() );
+
+        orDescr = (OrDescr) lhsDescr.getDescrs().get( 8 );
+        assertEquals( 2,
+                      orDescr.getDescrs().size() );
+        andDescr = (AndDescr) orDescr.getDescrs().get( 0 );
+        patternDescr = (PatternDescr) andDescr.getDescrs().get( 0 );
+        assertEquals( "Foo",
+                      patternDescr.getObjectType() );
+        patternDescr = (PatternDescr) orDescr.getDescrs().get( 1 );
+        assertEquals( "Zaa",
+                      patternDescr.getObjectType() );
+
+        final EvalDescr evalDescr = (EvalDescr) lhsDescr.getDescrs().get( 9 );
+        assertEquals( "1==1",
+                      evalDescr.getContent() );
+    }
+
+    public void testParseRhs() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseRhs.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+
+        final List globals = packageDescr.getGlobals();
+        assertEquals( 2,
+                      globals.size() );
+        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
+        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
+        assertEquals( "com.sample.X",
+                      x.getType() );
+        assertEquals( "x",
+                      x.getIdentifier() );
+        assertEquals( "com.sample.Yada",
+                      yada.getType() );
+        assertEquals( "yada",
+                      yada.getIdentifier() );
+
+        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
+        final List names = functionDescr.getParameterNames();
+        assertEquals( "foo",
+                      names.get( 0 ) );
+        assertEquals( "bada",
+                      names.get( 1 ) );
+
+        final List types = functionDescr.getParameterTypes();
+        assertEquals( "Bar",
+                      types.get( 0 ) );
+        assertEquals( "Bing",
+                      types.get( 1 ) );
+
+        assertEquals( "System.out.println(\"hello world\");",
+                      functionDescr.getText().trim() );
+
+        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
+        assertEquals( "my rule",
+                      ruleDescr.getName() );
+
+        final String consequence = (String) ruleDescr.getConsequence();
+        assertNotNull( consequence );
+        assertEquals( "System.out.println( \"hello\" );",
+                      consequence.trim() );
+    }
+
+    public void testParseQuery() throws Exception {
+        final XmlPackageReader xmlPackageReader = new XmlPackageReader();
+        xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseQuery.xml" ) ) );
+        final PackageDescr packageDescr = xmlPackageReader.getPackageDescr();
+        assertNotNull( packageDescr );
+        assertEquals( "com.sample",
+                      packageDescr.getName() );
+
+        final List imports = packageDescr.getImports();
+        assertEquals( 2,
+                      imports.size() );
+        assertEquals( "java.util.HashMap",
+                      ((ImportDescr) imports.get( 0 )).getTarget() );
+        assertEquals( "org.drools.*",
+                      ((ImportDescr) imports.get( 1 )).getTarget() );
+
+        final List globals = packageDescr.getGlobals();
+        assertEquals( 2,
+                      globals.size() );
+        final GlobalDescr x = (GlobalDescr) globals.get( 0 );
+        final GlobalDescr yada = (GlobalDescr) globals.get( 1 );
+        assertEquals( "com.sample.X",
+                      x.getType() );
+        assertEquals( "x",
+                      x.getIdentifier() );
+        assertEquals( "com.sample.Yada",
+                      yada.getType() );
+        assertEquals( "yada",
+                      yada.getIdentifier() );
+
+        final FunctionDescr functionDescr = (FunctionDescr) packageDescr.getFunctions().get( 0 );
+        final List names = functionDescr.getParameterNames();
+        assertEquals( "foo",
+                      names.get( 0 ) );
+        assertEquals( "bada",
+                      names.get( 1 ) );
+
+        final List types = functionDescr.getParameterTypes();
+        assertEquals( "Bar",
+                      types.get( 0 ) );
+        assertEquals( "Bing",
+                      types.get( 1 ) );
+
+        assertEquals( "System.out.println(\"hello world\");",
+                      functionDescr.getText().trim() );
+
+        final QueryDescr queryDescr = (QueryDescr) packageDescr.getRules().get( 0 );
+        assertEquals( "my query",
+                      queryDescr.getName() );
+
+        final AndDescr lhs = queryDescr.getLhs();
+        assertEquals( 1,
+                      lhs.getDescrs().size() );
+        final PatternDescr patternDescr = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "Foo",
+                      patternDescr.getObjectType() );
+
+    }
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl	2007-06-17 22:36:12 UTC (rev 12646)
@@ -6,6 +6,7 @@
   agenda-group "agenda-group"
   activation-group "activation-group"
   when
+	foo2 : Bar( ( a ( > 60 && < 70 ) || ( > 50 && < 55 ) && a3 == "black" ) || ( a == 40 && a3 == "pink" ) || ( a == 12 && ( a3 == "yellow" || a3 == "blue" ) ) )
     foo3 : Bar( a == 3 || == 4, a3 == "hello", a4 == null )    
     foo4 : Bar( a4 : a != 4 && != 5)
     foo5 : Bar( b == (a4 + 1) || > a4)    

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseCollect.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseCollect.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseCollect.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample" xmlns="http://drools.org/drools-4.0"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+	xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+	
+	<import name="import java.util.List"/>
+	<import name="org.drools.Cheese"/>
+	<import name="org.drools.Cheesery"/>
+	
+	<global identifier="cheesery" type="Cheesery"/>
+	<global identifier="list" type="List"/>
+	
+	<rule name="simple_rule">
+		<rule-attribute name="salience" value="10"/>
+		<rule-attribute name="no-loop" value="true"/>
+		<rule-attribute name="agenda-group" value="agenda-group"/>
+		<rule-attribute name="activation-group" value="activation-group"/>
+		
+		<lhs>
+			<pattern identifier="cheeseList" object-type="ArrayList">
+				<from source="unordered-fact">person</from>
+			</pattern>
+		</lhs>
+		<rhs> list.add( $cheese ); </rhs>
+	</rule>
+	
+</package>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseExists.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseExists.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseExists.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample" xmlns="http://drools.org/drools-4.0"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+	xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+	
+	<import name="import java.util.List"/>
+	<import name="org.drools.Cheese"/>
+	<import name="org.drools.Cheesery"/>
+	
+	<global identifier="cheesery" type="Cheesery"/>
+	<global identifier="list" type="List"/>
+	
+	<rule name="simple_rule">
+		<rule-attribute name="salience" value="10"/>
+		<rule-attribute name="no-loop" value="true"/>
+		<rule-attribute name="agenda-group" value="agenda-group"/>
+		<rule-attribute name="activation-group" value="activation-group"/>
+		
+		<lhs>
+			<pattern identifier="cheese" object-type="Cheese">
+				<field-binding field-name="type" identifier="type"/>
+			</pattern>
+			
+			<exists>
+				<pattern object-type="Person">
+					<field-constraint field-name="likes">
+						<variable-restriction evaluator="==" identifier="type"/>
+					</field-constraint>
+				</pattern>
+			</exists>
+		</lhs>
+		<rhs> list.add( $cheese ); </rhs>
+	</rule>
+	
+</package>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseForall.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseForall.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseForall.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+
+	<global identifier="results" type="java.util.List" />
+
+<rule name="simple_rule">
+	<rule-attribute name="salience" value="10" />
+	<rule-attribute name="no-loop" value="true" />
+	<rule-attribute name="agenda-group" value="agenda-group" />
+	<rule-attribute name="activation-group" value="activation-group" />
+
+	<lhs>
+        <forall>
+            <pattern object-type="State">
+                <field-binding field-name="state" identifier="state" />
+            </pattern>
+
+            <pattern object-type="Person">
+                <field-constraint field-name="status">
+                    <variable-restriction evaluator="==" identifier="state" />
+                </field-constraint>
+                <field-binding field-name="likes" identifier="likes" />
+            </pattern>
+
+            <pattern object-type="Cheese">
+                <field-binding field-name="type" identifier="likes" />
+            </pattern>
+        </forall>
+
+    </lhs>
+    <rhs>
+		results.add("OK");
+	</rhs>
+</rule>
+</package>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFrom.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFrom.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFrom.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+
+	<import name="import java.util.List"/>
+	<import name="org.drools.Cheese" />
+	<import name="org.drools.Cheesery" />
+
+	<global identifier="cheesery" type="Cheesery" />		
+	<global identifier="list1" type="List" />
+
+<rule name="simple_rule">
+	<rule-attribute name="salience" value="10" />
+	<rule-attribute name="no-loop" value="true" />
+	<rule-attribute name="agenda-group" value="agenda-group" />
+	<rule-attribute name="activation-group" value="activation-group" />
+
+	<lhs>
+        <pattern object-type="Cheese">
+            <from source="unordered-fact">
+                person
+            </from>
+
+        </pattern>
+        <pattern identifier="cheese" object-type="Cheese" >
+            <from>
+                <statement>
+                 </statement>
+            </from>
+        </pattern>
+	</lhs>
+	<rhs>
+		list1.add( $cheese );
+	</rhs>
+</rule>
+
+</package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFunction.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFunction.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseFunction.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />	
-	
-	<global identifier="x" type="com.sample.X" />		
-	<global identifier="yada" type="com.sample.Yada" />
-	
-	<function return-type="void" name="myFunc">
-	    <parameter identifier="foo" type="Bar" />
-	    <parameter identifier="bada" type="Bing" />
-	    	    
-	    <body>
-	    	System.out.println("hello world");
-		</body>		
-	</function>
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+         
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />	
+	
+	<global identifier="x" type="com.sample.X" />		
+	<global identifier="yada" type="com.sample.Yada" />
+	
+	<function return-type="void" name="myFunc">
+	    <parameter identifier="foo" type="Bar" />
+	    <parameter identifier="bada" type="Bing" />
+	    	    
+	    <body>
+	    	System.out.println("hello world");
+		</body>		
+	</function>
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseGlobal.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseGlobal.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseGlobal.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />	
-	
-	
-	<global identifier="x" type="com.sample.X" />		
-	<global identifier="yada" type="com.sample.Yada" />		
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+         
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />	
+	
+	
+	<global identifier="x" type="com.sample.X" />		
+	<global identifier="yada" type="com.sample.Yada" />		
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseImport.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseImport.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseImport.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />		
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+         
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />		
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseLhs.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseLhs.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseLhs.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,76 +1,76 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />	
-	
-	<global identifier="x" type="com.sample.X" />		
-	<global identifier="yada" type="com.sample.Yada" />
-	
-	<function return-type="void" name="myFunc">
-	    <parameter identifier="foo" type="Bar" />
-	    <parameter identifier="bada" type="Bing" />
-	    	    
-	    <body>
-	    	System.out.println("hello world");
-		</body>		
-	</function>
-	
-	<rule name="my rule">
-		<lhs>
-			<and>
-			</and>	
-				
-			<or>
-			</or>
-			
-			<pattern object-type="Foo" >			
-			</pattern>							
-				
-			<pattern identifier="bar" object-type="Bar" >			
-			</pattern>		
-									
-			<pattern object-type="Foo">
-			    <field-constraint field-name="field1">
-				    <literal-restriction       evaluator="==" value="value1" />
-    				<return-value-restriction  evaluator="==">1==1</return-value-restriction>				    
-	    			<variable-restriction      evaluator="==" identifier="var1" />								
-				</field-constraint>
-											
-				<predicate field-name="field1" identifier="var1">1==1</predicate>
-														
-				<field-binding field-name="field1" identifier="var1" />				
-			</pattern>		
-			
-			<not>
-				<pattern object-type="Bar" />			
-			</not>
-			
-			<exists>
-				<pattern object-type="Bar" />							
-			</exists>		
-			
-			<and>
-				<or>
-					<pattern object-type="Bar" />			
-				</or>
-				<pattern object-type="Yada" />							
-			</and>							
-				
-			<or>
-				<and>
-					<pattern object-type="Foo" />							
-				</and>	
-				<pattern object-type="Zaa" />			
-			</or>	
-			
-			<eval>1==1</eval>					
-		</lhs>
-		
-	    <rhs>
-		</rhs>
-	</rule>
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+         
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />	
+	
+	<global identifier="x" type="com.sample.X" />		
+	<global identifier="yada" type="com.sample.Yada" />
+	
+	<function return-type="void" name="myFunc">
+	    <parameter identifier="foo" type="Bar" />
+	    <parameter identifier="bada" type="Bing" />
+	    	    
+	    <body>
+	    	System.out.println("hello world");
+		</body>		
+	</function>
+	
+	<rule name="my rule">
+		<lhs>
+			<and>
+			</and>	
+				
+			<or>
+			</or>
+			
+			<pattern object-type="Foo" >			
+			</pattern>							
+				
+			<pattern identifier="bar" object-type="Bar" >			
+			</pattern>		
+									
+			<pattern object-type="Foo">
+			    <field-constraint field-name="field1">
+				    <literal-restriction       evaluator="==" value="value1" />
+    				<return-value-restriction  evaluator="==">1==1</return-value-restriction>				    
+	    			<variable-restriction      evaluator="==" identifier="var1" />								
+				</field-constraint>
+											
+				<predicate field-name="field1" identifier="var1">1==1</predicate>
+														
+				<field-binding field-name="field1" identifier="var1" />				
+			</pattern>		
+			
+			<not>
+				<pattern object-type="Bar" />			
+			</not>
+			
+			<exists>
+				<pattern object-type="Bar" />							
+			</exists>		
+			
+			<and>
+				<or>
+					<pattern object-type="Bar" />			
+				</or>
+				<pattern object-type="Yada" />							
+			</and>							
+				
+			<or>
+				<and>
+					<pattern object-type="Foo" />							
+				</and>	
+				<pattern object-type="Zaa" />			
+			</or>	
+			
+			<eval>1==1</eval>					
+		</lhs>
+		
+	    <rhs>
+		</rhs>
+	</rule>
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParsePackageName.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParsePackageName.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParsePackageName.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseQuery.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseQuery.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseQuery.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,27 +1,26 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />	
-	
-	<global identifier="x" type="com.sample.X" />		
-	<global identifier="yada" type="com.sample.Yada" />
-	
-	<function return-type="void" name="myFunc">
-	    <parameter identifier="foo" type="Bar" />
-	    <parameter identifier="bada" type="Bing" />
-	    	    
-	    <body>
-	    	System.out.println("hello world");
-		</body>		
-	</function>
-	
-	<query name="my query">
-		<lhs>
-	       <pattern object-type="Foo" />							
-		</lhs>		
-	</query>
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />
+	
+	<global identifier="x" type="com.sample.X" />		
+	<global identifier="yada" type="com.sample.Yada" />
+	
+	<function return-type="void" name="myFunc">
+	    <parameter identifier="foo" type="Bar" />
+	    <parameter identifier="bada" type="Bing" />
+	    	    
+	    <body>
+	    	System.out.println("hello world");
+		</body>		
+	</function>
+	
+	<query name="my query">
+		<lhs>
+	       <pattern object-type="Foo" />							
+		</lhs>		
+	</query>
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRhs.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRhs.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRhs.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />	
-	
-	<global identifier="x" type="com.sample.X" />		
-	<global identifier="yada" type="com.sample.Yada" />
-	
-	<function return-type="void" name="myFunc">
-	    <parameter identifier="foo" type="Bar" />
-	    <parameter identifier="bada" type="Bing" />
-	    	    
-	    <body>
-	    	System.out.println("hello world");
-		</body>		
-	</function>
-	
-	<rule name="my rule">
-		<lhs>							
-		</lhs>
-		
-	    <rhs>
-	    	System.out.println( "hello" );	    
-		</rhs>
-	</rule>
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+         
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />	
+	
+	<global identifier="x" type="com.sample.X" />		
+	<global identifier="yada" type="com.sample.Yada" />
+	
+	<function return-type="void" name="myFunc">
+	    <parameter identifier="foo" type="Bar" />
+	    <parameter identifier="bada" type="Bing" />
+	    	    
+	    <body>
+	    	System.out.println("hello world");
+		</body>		
+	</function>
+	
+	<rule name="my rule">
+		<lhs>							
+		</lhs>
+		
+	    <rhs>
+	    	System.out.println( "hello" );	    
+		</rhs>
+	</rule>
 </package>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml	2007-06-17 22:32:04 UTC (rev 12645)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml	2007-06-17 22:36:12 UTC (rev 12646)
@@ -1,84 +1,127 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package name="com.sample"
-         xmlns="http://drools.org/drools-3.0"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-         xs:schemaLocation="http://drools.org/drools-3.0 drools-3.0.xsd">
-         
-	<import name="java.util.HashMap" />
-	<import name="org.drools.*" />		
-	
-	<global identifier="x" type="com.sample.X" />		
-	<global identifier="yada" type="com.sample.Yada" />
-	
-	<function return-type="void" name="myFunc">
-	    <parameter identifier="foo" type="Bar" />
-	    <parameter identifier="bada" type="Bing" />
-	    	    
-	    <body>
-	    	System.out.println("hello world");
-		</body>		
-	</function>
-	
-<rule name="simple_rule">
-	<rule-attribute name="salience" value="10" />
-	<rule-attribute name="no-loop" value="true" />
-	<rule-attribute name="agenda-group" value="agenda-group" />
-	<rule-attribute name="activation-group" value="activation-group" />
-
-	<lhs>
-		<pattern identifier="foo3" object-type="Bar" >
-			<field-constraint field-name="a"> 
-				<literal-restriction evaluator="==" value="3" />
-				<restriction-connective connective="|"/>
-				<literal-restriction evaluator="==" value="4" />
-			</field-constraint>
-			<field-constraint field-name="a3"> 
-				<literal-restriction evaluator="==" value="hello" />
-			</field-constraint>
-			<field-constraint field-name="a4"> 
-				<literal-restriction evaluator="==" value="null" />
-			</field-constraint>
-		</pattern>
-
-		<pattern identifier="foo4" object-type="Bar" >
-			<field-binding field-name="a" identifier="a4" />
-			<field-constraint field-name="a"> 
-				<literal-restriction evaluator="!=" value="4" />
-				<restriction-connective connective="&amp;"/>
-				<literal-restriction evaluator="!=" value="5" />
-			</field-constraint>
-		</pattern>
-
-		<pattern identifier="foo5" object-type="Bar" >
-			<field-constraint field-name="b"> 
-				<return-value-restriction evaluator="==" >a4 + 1</return-value-restriction>
-				<restriction-connective connective="|"/>
-				<variable-restriction evaluator="&gt;" identifier="a4" />
-			</field-constraint>
-		</pattern>
-
-		<pattern identifier="foo6" object-type="Bar" >
-			<field-binding field-name="a" identifier="a4" />
-			<field-constraint field-name="b"> 
-				<literal-restriction evaluator="==" value="6" />
-			</field-constraint>
-		</pattern>
-
-		<pattern identifier="foo7" object-type="Bar" >
-			<field-binding field-name="a" identifier="a4" />
-			<field-binding field-name="b" identifier="b4" />
-		</pattern>
-
-		<pattern object-type="Baz" > </pattern>
-	</lhs>
-	<rhs>  
-		  if ( a == b ) {
-		    assert( foo3 );
-		  } else {
-		    retract( foo4 );
-		  } 
-		  System.out.println( a4 );
-	</rhs>
-</rule>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.sample"
+         xmlns="http://drools.org/drools-4.0"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+         
+	<import name="java.util.HashMap" />
+	<import name="org.drools.*" />		
+	
+	<global identifier="x" type="com.sample.X" />		
+	<global identifier="yada" type="com.sample.Yada" />
+	
+	<function return-type="void" name="myFunc">
+	    <parameter identifier="foo" type="Bar" />
+	    <parameter identifier="bada" type="Bing" />
+	    	    
+	    <body>
+	    	System.out.println("hello world");
+		</body>		
+	</function>
+	
+<rule name="simple_rule">
+	<rule-attribute name="salience" value="10" />
+	<rule-attribute name="no-loop" value="true" />
+	<rule-attribute name="agenda-group" value="agenda-group" />
+	<rule-attribute name="activation-group" value="activation-group" />
+
+	<lhs>
+
+		<pattern identifier="foo2" object-type="Bar" >
+            <or>
+                <and>
+					<field-constraint field-name="a">
+						<literal-restriction evaluator="&gt;" value="60" />
+						<restriction-connective connective="and" />
+						<literal-restriction evaluator="&lt;" value="70" />
+						<restriction-connective connective="or"/>	
+						<literal-restriction evaluator="&lt;" value="50" />
+						<restriction-connective connective="and"/>
+						<literal-restriction evaluator="&gt;" value="55" />
+					</field-constraint>
+
+					<field-constraint field-name="a3">
+                        <literal-restriction evaluator="==" value="black" />
+                    </field-constraint>
+                </and>
+
+                <and>
+                    <field-constraint field-name="a">
+                        <literal-restriction evaluator="==" value="40" />
+                    </field-constraint>
+
+                    <field-constraint field-name="a3">
+                        <literal-restriction evaluator="==" value="pink" />
+                    </field-constraint>
+                </and>
+
+                <and>
+                    <field-constraint field-name="a">
+                        <literal-restriction evaluator="==" value="12"/>
+                    </field-constraint>
+					
+                    <field-constraint field-name="a3">
+                        <literal-restriction evaluator="==" value="yellow"/>
+                        <restriction-connective connective="and"/>
+                        <literal-restriction evaluator="==" value="blue" />
+                    </field-constraint>
+                </and>
+            </or>
+        </pattern>
+		
+		
+        <pattern identifier="foo3" object-type="Bar" >
+			<field-constraint field-name="a">
+                <literal-restriction evaluator="==" value="3" />
+                <restriction-connective connective="or"/>
+                <literal-restriction evaluator="==" value="4" />
+			</field-constraint>
+			<field-constraint field-name="a3"> 
+				<literal-restriction evaluator="==" value="hello" />
+			</field-constraint>
+			<field-constraint field-name="a4">
+                <literal-restriction evaluator="==" value="null" />
+			</field-constraint>
+		</pattern>
+
+		<pattern identifier="foo4" object-type="Bar" >
+			<field-binding field-name="a" identifier="a4" />
+			<field-constraint field-name="a"> 
+				<literal-restriction evaluator="!=" value="4" />
+				<literal-restriction evaluator="!=" value="5" />
+			</field-constraint>
+		</pattern>
+
+		<pattern identifier="foo5" object-type="Bar" >
+			<field-constraint field-name="b">
+                <return-value-restriction evaluator="==" >a4 + 1</return-value-restriction>
+                <restriction-connective connective="or"/>
+                <variable-restriction evaluator="&gt;" identifier="a4" />
+			</field-constraint>
+		</pattern>
+
+		<pattern identifier="foo6" object-type="Bar" >
+			<field-binding field-name="a" identifier="a4" />
+			<field-constraint field-name="b"> 
+				<literal-restriction evaluator="==" value="6" />
+			</field-constraint>
+		</pattern>
+
+		<pattern identifier="foo7" object-type="Bar" >
+			<field-binding field-name="a" identifier="a4" />
+			<field-binding field-name="b" identifier="b4" />
+		</pattern>
+
+		<pattern object-type="Baz" > </pattern>
+	</lhs>
+	<rhs>  
+		  if ( a == b ) {
+		    assert( foo3 );
+		  } else {
+		    retract( foo4 );
+		  } 
+		  System.out.println( a4 );
+	</rhs>
+</rule>
+
 </package>
\ No newline at end of file




More information about the jboss-svn-commits mailing list