[jboss-svn-commits] JBL Code SVN: r32680 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 29 12:48:36 EDT 2010


Author: tirelli
Date: 2010-04-29 12:48:35 -0400 (Thu, 29 Apr 2010)
New Revision: 32680

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
Log:
JBRULES-2494: enabling string escapes on rule meta attributes

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java	2010-04-29 15:54:17 UTC (rev 32679)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java	2010-04-29 16:48:35 UTC (rev 32680)
@@ -20,11 +20,13 @@
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Map.Entry;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.EnabledBoolean;
 import org.drools.base.SalienceInteger;
 import org.drools.core.util.DateUtils;
+import org.drools.core.util.StringUtils;
 import org.drools.lang.DroolsSoftKeywords;
 import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.QueryDescr;
@@ -65,7 +67,7 @@
             context.getRule().setParent( context.getPkg().getRule( ruleDescr.getParentName() ) );
         }
         // add all the rule's meta attributes
-        context.getRule().getMetaAttributes().putAll( ruleDescr.getMetaAttributes() );
+        buildMetaAttributes( context );
 
         final RuleConditionBuilder builder = (RuleConditionBuilder) context.getDialect().getBuilder( ruleDescr.getLhs().getClass() );
         if ( builder != null ) {
@@ -101,6 +103,17 @@
 
     }
 
+    public void buildMetaAttributes(final RuleBuildContext context ) {
+        Rule rule = context.getRule();
+        for( Entry<String, String> meta : context.getRuleDescr().getMetaAttributes().entrySet() ) {
+            String value = meta.getValue().trim();
+            if( value.startsWith( "\"" ) && value.endsWith( "\"" ) && value.length() > 2 ) {
+                value = StringUtils.unescapeJava( value.substring( 1, value.length()-1 ) ); 
+            }
+            rule.addMetaAttribute( meta.getKey(), value );
+        }
+    }
+
     public void buildAttributes(final RuleBuildContext context) {
         final Rule rule = context.getRule();
         final RuleDescr ruleDescr = context.getRuleDescr();

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-29 15:54:17 UTC (rev 32679)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2010-04-29 16:48:35 UTC (rev 32680)
@@ -16,13 +16,14 @@
  * limitations under the License.
  */
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -98,7 +99,6 @@
 import org.drools.builder.KnowledgeBuilderErrors;
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
-import org.drools.builder.conf.ClassLoaderCacheOption;
 import org.drools.common.AbstractWorkingMemory;
 import org.drools.common.DefaultAgenda;
 import org.drools.common.DefaultFactHandle;
@@ -114,6 +114,7 @@
 import org.drools.compiler.PackageBuilder.PackageMergeException;
 import org.drools.compiler.xml.XmlDumper;
 import org.drools.definition.KnowledgePackage;
+import org.drools.definition.rule.Rule;
 import org.drools.definition.type.FactType;
 import org.drools.event.ActivationCancelledEvent;
 import org.drools.event.ActivationCreatedEvent;
@@ -137,7 +138,6 @@
 import org.drools.lang.descr.RuleDescr;
 import org.drools.marshalling.MarshallerFactory;
 import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.ReteooRuleBase;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.InvalidRulePackage;
 import org.drools.rule.Package;
@@ -149,8 +149,6 @@
 import org.drools.spi.GlobalResolver;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
-import static org.hamcrest.CoreMatchers.*;
-import static org.junit.Assert.*;
 
 /** Run all the tests with the ReteOO engine implementation */
 public class MiscTest extends TestCase {
@@ -344,21 +342,24 @@
 
         // read in the source
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "MVEL_soundex.drl", getClass() ), ResourceType.DRL ); 
-        
+        kbuilder.add( ResourceFactory.newClassPathResource( "MVEL_soundex.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
         if ( kbuilder.hasErrors() ) {
             fail( kbuilder.getErrors().toString() );
         }
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         kbase = SerializationHelper.serializeObject( kbase );
-        
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();         
 
-        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true );        
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
 
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+                                                                              true );
+
         Cheese c = new Cheese( "fubar",
                                2 );
 
@@ -372,17 +373,20 @@
 
         // read in the source
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_MVELrewrite.drl", getClass() ), ResourceType.DRL );        
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_MVELrewrite.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();         
 
-        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+                                                                              true );
         List results = new ArrayList();
         ksession.setGlobal( "results",
-                           results );
+                            results );
 
         Cheese brie = new Cheese( "brie",
                                   2 );
@@ -1320,15 +1324,17 @@
 
     public void testExplicitAnd() throws Exception {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_ExplicitAnd.drl", getClass() ), ResourceType.DRL );        
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_ExplicitAnd.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         final List list = new ArrayList();
         ksession.setGlobal( "list",
-                           list );
+                            list );
         ksession.insert( new Message( "hola" ) );
 
         ksession.fireAllRules();
@@ -1336,9 +1342,10 @@
                       list.size() );
 
         ksession.insert( new Cheese( "brie",
-                                    33 ) );
+                                     33 ) );
 
-        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true );
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+                                                                              true );
         ksession.fireAllRules();
         assertEquals( 1,
                       ((List) ksession.getGlobal( "list" )).size() );
@@ -1347,16 +1354,18 @@
     public void testHelloWorld() throws Exception {
         // read in the source
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "HelloWorld.drl", getClass() ), ResourceType.DRL );        
+        kbuilder.add( ResourceFactory.newClassPathResource( "HelloWorld.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
 
         final List list = new ArrayList();
         ksession.setGlobal( "list",
-                                 list );
+                            list );
 
         // go !
         final Message message = new Message( "hola" );
@@ -1460,9 +1469,9 @@
             kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_RuleExtend.drl" ) ),
                           ResourceType.DRL );
 
-            assertFalse( kbuilder.getErrors().toString(), 
+            assertFalse( kbuilder.getErrors().toString(),
                          kbuilder.hasErrors() );
-            
+
             KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
             kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
 
@@ -1485,17 +1494,16 @@
 
             ksession.fireAllRules();
 
-            assertEquals( 2,  
+            assertEquals( 2,
                           results.size() );
-            assertEquals( "stilton", 
+            assertEquals( "stilton",
                           results.get( 0 ) );
-            assertEquals( "brie", 
+            assertEquals( "brie",
                           results.get( 1 ) );
         } catch ( Exception e ) {
             e.printStackTrace();
-            if( kbuilder.hasErrors() )
-                System.out.println( kbuilder.getErrors() );
-            fail("Unexpected exception: "+e.getMessage());
+            if ( kbuilder.hasErrors() ) System.out.println( kbuilder.getErrors() );
+            fail( "Unexpected exception: " + e.getMessage() );
         }
     }
 
@@ -1552,16 +1560,16 @@
     public void testLiteral() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "literal_rule_test.drl" ) ) );
-        
+
         if ( builder.hasErrors() ) {
             fail( builder.getErrors().toString() );
         }
-        
+
         final Package pkg = builder.getPackage();
 
         RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        
+
         ruleBase = SerializationHelper.serializeObject( ruleBase );
         StatefulSession session = ruleBase.newStatefulSession();
 
@@ -2104,7 +2112,6 @@
 
     }
 
-
     public void testEval() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "eval_rule_test.drl" ) ) );
@@ -2634,8 +2641,8 @@
         //        workingMemory    = SerializationHelper.serializeObject(workingMemory);
         workingMemory.fireAllRules();
 
-        List<String> results = (List<String>) workingMemory.getGlobal( "list" ); 
-        System.out.println(results);
+        List<String> results = (List<String>) workingMemory.getGlobal( "list" );
+        System.out.println( results );
         assertEquals( 5,
                       results.size() );
         assertTrue( results.contains( "first" ) );
@@ -3196,16 +3203,17 @@
         }
     }
 
-
     public void testInsurancePricingExample() throws Exception {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "insurance_pricing_example.drl", getClass() ), ResourceType.DRL );        
+        kbuilder.add( ResourceFactory.newClassPathResource( "insurance_pricing_example.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();        
 
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
         // now create some test data
         final Driver driver = new Driver();
         final Policy policy = new Policy();
@@ -3223,15 +3231,18 @@
 
         // read in the source
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_JoinNodeModifyTuple.drl", getClass() ), ResourceType.DRL );        
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_JoinNodeModifyTuple.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();         
 
-        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
 
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+                                                                              true );
+
         // 1st time
         org.drools.Target tgt = new org.drools.Target();
         tgt.setLabel( "Santa-Anna" );
@@ -3317,8 +3328,6 @@
         ksession.fireAllRules();
     }
 
-
-
     public void testFunctionWithPrimitives() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FunctionWithPrimitives.drl" ) ) );
@@ -4807,7 +4816,7 @@
         public String aValue = "";
 
     }
-    
+
     public void testRuleRemovalWithJoinedRootPattern() {
         String str = "";
         str += "package org.drools \n";
@@ -4817,14 +4826,13 @@
         str += "  Person() \n";
         str += "then \n";
         str += "end  \n";
-        
+
         str += "rule rule2 \n";
         str += "when \n";
         str += "  String() \n";
         str += "  Cheese() \n";
         str += "then \n";
         str += "end  \n";
-       
 
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
@@ -4840,18 +4848,19 @@
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
 
-        DefaultFactHandle handle = ( DefaultFactHandle ) ksession.insert( "hello" );
+        DefaultFactHandle handle = (DefaultFactHandle) ksession.insert( "hello" );
         LeftTuple leftTuple = handle.getFirstLeftTuple();
         assertNotNull( leftTuple );
         assertNotNull( leftTuple.getLeftParentNext() );
-        
-        kbase.removeRule( "org.drools", "rule2" );
-        
+
+        kbase.removeRule( "org.drools",
+                          "rule2" );
+
         leftTuple = handle.getFirstLeftTuple();
         assertNotNull( leftTuple );
-        assertNull( leftTuple.getLeftParentNext() );        
+        assertNull( leftTuple.getLeftParentNext() );
 
-    }    
+    }
 
     // JBRULES-1808
     public void testKnowledgeHelperFixerInStrings() {
@@ -6074,7 +6083,7 @@
                       1,
                       list.size() );
     }
-    
+
     public void testOrWithAndUsingNestedBindings() {
         String str = "";
         str += "package org.drools\n";
@@ -6104,57 +6113,70 @@
         str += "   )\n ";
         str += "then\n";
         str += "   jlist.add( $b );\n";
-        str += "end\n";        
-        
+        str += "end\n";
+
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
-        
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
         if ( kbuilder.hasErrors() ) {
             fail( kbuilder.getErrors().toString() );
         }
-        
+
         Person a = new Person( "a" );
         Person b1 = new Person( "b1" );
         Person p2 = new Person( "p2" );
         Person b2 = new Person( "b2" );
         Person p3 = new Person( "p3" );
         Person b3 = new Person( "b3" );
-        
+
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         List mlist = new ArrayList();
         List jlist = new ArrayList();
-        
+
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-        ksession.setGlobal( "mlist", mlist);
-        ksession.setGlobal( "jlist", jlist);
+        ksession.setGlobal( "mlist",
+                            mlist );
+        ksession.setGlobal( "jlist",
+                            jlist );
         ksession.insert( a );
-        ksession.insert( b1 );    
-        ksession.fireAllRules();        
-        assertEquals( b1, mlist.get(0));
-        assertEquals( b1, jlist.get(0));
-        
+        ksession.insert( b1 );
+        ksession.fireAllRules();
+        assertEquals( b1,
+                      mlist.get( 0 ) );
+        assertEquals( b1,
+                      jlist.get( 0 ) );
+
         ksession = kbase.newStatefulKnowledgeSession();
-        ksession.setGlobal( "mlist", mlist);
-        ksession.setGlobal( "jlist", jlist);
+        ksession.setGlobal( "mlist",
+                            mlist );
+        ksession.setGlobal( "jlist",
+                            jlist );
         ksession.insert( a );
         ksession.insert( b2 );
         ksession.insert( p2 );
-        ksession.fireAllRules();        
-        assertEquals( b2, mlist.get(1));
-        assertEquals( b2, jlist.get(1));
-        
+        ksession.fireAllRules();
+        assertEquals( b2,
+                      mlist.get( 1 ) );
+        assertEquals( b2,
+                      jlist.get( 1 ) );
+
         ksession = kbase.newStatefulKnowledgeSession();
-        ksession.setGlobal( "mlist", mlist);
-        ksession.setGlobal( "jlist", jlist);
+        ksession.setGlobal( "mlist",
+                            mlist );
+        ksession.setGlobal( "jlist",
+                            jlist );
         ksession.insert( a );
         ksession.insert( b3 );
         ksession.insert( p3 );
-        ksession.fireAllRules();        
-        assertEquals( b3, mlist.get(2));
-        assertEquals( b3, jlist.get(2));
-        
+        ksession.fireAllRules();
+        assertEquals( b3,
+                      mlist.get( 2 ) );
+        assertEquals( b3,
+                      jlist.get( 2 ) );
+
     }
 
     public void testDeepNestedConstraints() throws Exception {
@@ -6678,49 +6700,52 @@
         rule1 += "end\n";
 
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ), ResourceType.DRL );
-        
+        kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ),
+                      ResourceType.DRL );
+
         if ( kbuilder.hasErrors() ) {
             System.out.println( kbuilder.getErrors() );
             throw new RuntimeException( kbuilder.getErrors().toString() );
         }
-        
+
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        
+
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         final WorkingMemoryEntryPoint ep = ksession.getWorkingMemoryEntryPoint( "testep" );
-        
+
         List list = new ArrayList();
-        ksession.setGlobal( "list", list );
-        
-        ksession.insert( new Cheese("cheddar") );
+        ksession.setGlobal( "list",
+                            list );
+
+        ksession.insert( new Cheese( "cheddar" ) );
         ksession.fireAllRules();
-        
+
         Runnable fireUntilHalt = new Runnable() {
             public void run() {
                 ksession.fireUntilHalt();
             }
         };
-        
+
         Thread t1 = new Thread( fireUntilHalt );
         t1.start();
-        
+
         Thread.currentThread().sleep( 500 );
-        ep.insert( new Person("darth") );
+        ep.insert( new Person( "darth" ) );
         Thread.currentThread().sleep( 500 );
         ksession.halt();
         t1.stop();
-        assertEquals( 1, list.size() ); 
-    }    
-    
+        assertEquals( 1,
+                      list.size() );
+    }
+
     public void testNetworkBuildErrorAcrossEntryPointsAndFroms() throws Exception {
         String rule1 = "package org.drools\n";
         rule1 += "global java.util.List list\n";
         rule1 += "rule rule1\n";
         rule1 += "when\n";
-        rule1 += "         Cheese() from entry-point \"testep\"\n";        
+        rule1 += "         Cheese() from entry-point \"testep\"\n";
         rule1 += "    $p : Person() from list\n";
         rule1 += "then \n";
         rule1 += "  list.add( \"rule1\" ) ;\n";
@@ -6731,33 +6756,35 @@
         rule1 += "  $p : Person() \n";
         rule1 += "then \n";
         rule1 += "  list.add( \"rule2\" ) ;\n";
-        rule1 += "end\n";        
+        rule1 += "end\n";
 
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ), ResourceType.DRL );
-        
+        kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ),
+                      ResourceType.DRL );
+
         if ( kbuilder.hasErrors() ) {
             System.out.println( kbuilder.getErrors() );
             throw new RuntimeException( kbuilder.getErrors().toString() );
         }
-        
+
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        
+
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
+
         final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         final WorkingMemoryEntryPoint ep = ksession.getWorkingMemoryEntryPoint( "testep" );
-        
+
         List list = new ArrayList();
-        ksession.setGlobal( "list", list );
-        
-        list.add( new Person( "darth") );
-        ep.insert( new Cheese("cheddar") );        
+        ksession.setGlobal( "list",
+                            list );
 
-        
+        list.add( new Person( "darth" ) );
+        ep.insert( new Cheese( "cheddar" ) );
+
         ksession.fireAllRules();
-        assertEquals( 3, list.size() ); 
-    }        
+        assertEquals( 3,
+                      list.size() );
+    }
 
     public void testJBRules2140() {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
@@ -6866,9 +6893,10 @@
         // since it is no longer listening.
         ksession.insert( new Cheese( "brie" ) );
 
-        verify( wmeListener, times(2) ).objectInserted( any( org.drools.event.rule.ObjectInsertedEvent.class ) );
+        verify( wmeListener,
+                times( 2 ) ).objectInserted( any( org.drools.event.rule.ObjectInsertedEvent.class ) );
     }
-    
+
     public void testInsert() throws Exception {
         String drl = "";
         drl += "package test\n";
@@ -6903,11 +6931,11 @@
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
 
-        ksession.insert( new Person("Toni") );
+        ksession.insert( new Person( "Toni" ) );
         // XXX: Fails here, this worked in revision 30833
-        ksession.insert( new Pet("Toni") );
+        ksession.insert( new Pet( "Toni" ) );
     }
-   
+
     public void testClassLoaderHits() throws Exception {
         final KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
         //conf.setOption( ClassLoaderCacheOption.DISABLED );
@@ -6922,9 +6950,9 @@
                      kbuilder.hasErrors() );
 
         //((CompositeClassLoader)((PackageBuilderConfiguration)conf).getClassLoader()).dumpStats();
-        
+
     }
-    
+
     public void testMVELConsequenceWithoutSemiColon1() throws Exception {
         String drl = "";
         drl += "package test\n";
@@ -6957,24 +6985,66 @@
 
         // create working memory mock listener
         org.drools.event.rule.WorkingMemoryEventListener wml = Mockito.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
-        
+
         ksession.addEventListener( wml );
 
-        org.drools.runtime.rule.FactHandle personFH = ksession.insert( new Person("Toni") );
-        org.drools.runtime.rule.FactHandle petFH = ksession.insert( new Pet("Toni") );
-        
+        org.drools.runtime.rule.FactHandle personFH = ksession.insert( new Person( "Toni" ) );
+        org.drools.runtime.rule.FactHandle petFH = ksession.insert( new Pet( "Toni" ) );
+
         int fired = ksession.fireAllRules();
-        assertEquals( 1, fired );
+        assertEquals( 1,
+                      fired );
 
         // capture the arguments and check that the retracts happened
-        ArgumentCaptor<org.drools.event.rule.ObjectRetractedEvent> retracts = ArgumentCaptor.forClass(org.drools.event.rule.ObjectRetractedEvent.class);
-        verify( wml, times(2) ).objectRetracted( retracts.capture() );
+        ArgumentCaptor<org.drools.event.rule.ObjectRetractedEvent> retracts = ArgumentCaptor.forClass( org.drools.event.rule.ObjectRetractedEvent.class );
+        verify( wml,
+                times( 2 ) ).objectRetracted( retracts.capture() );
         List<org.drools.event.rule.ObjectRetractedEvent> values = retracts.getAllValues();
-        assertThat( values.get( 0 ).getFactHandle(), is( personFH ) );
-        assertThat( values.get( 1 ).getFactHandle(), is( petFH ) );
-        
+        assertThat( values.get( 0 ).getFactHandle(),
+                    is( personFH ) );
+        assertThat( values.get( 1 ).getFactHandle(),
+                    is( petFH ) );
+
     }
-   
+
+    public void testRuleMetaAttributes() throws Exception {
+        String drl = "";
+        drl += "package test\n";
+        drl += "rule \"test meta attributes\"\n";
+        drl += "    @id(1234 ) @author(  john doe  ) @text(\"It's an escaped\\\" string\"  )\n";
+        drl += "when\n";
+        drl += "then\n";
+        drl += "    // some comment\n";
+        drl += "end\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newReaderResource( new StringReader( drl ) ),
+                      ResourceType.DRL );
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if ( errors.size() > 0 ) {
+            for ( KnowledgeBuilderError error : errors ) {
+                System.err.println( error );
+            }
+            throw new IllegalArgumentException( "Could not parse knowledge." );
+        }
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        Rule rule = kbase.getRule( "test",
+                                   "test meta attributes" );
+
+        assertNotNull( rule );
+        assertThat( rule.getMetaAttribute( "id" ),
+                    is( "1234" ));
+        assertThat( rule.getMetaAttribute( "author" ),
+                    is( "john doe" ));
+        assertThat( rule.getMetaAttribute( "text" ),
+                    is( "It's an escaped\" string" ));
+
+    }
+
     // following test depends on MVEL: http://jira.codehaus.org/browse/MVEL-212
     public void FIXME_testMVELConsequenceUsingFactConstructors() throws Exception {
         String drl = "";
@@ -7001,12 +7071,14 @@
         }
         assertTrue( kbuilder.hasErrors() );
     }
-    
+
     public void testModifyWithRuleflowAndSubNetwork() throws Exception {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_ModifyWithRuleflowAndSubNetwork.drl", getClass() ),
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_ModifyWithRuleflowAndSubNetwork.drl",
+                                                            getClass() ),
                       ResourceType.DRL );
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_modifyWithRuleflowAndSubnetwork.rf", getClass() ),
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_modifyWithRuleflowAndSubnetwork.rf",
+                                                            getClass() ),
                       ResourceType.DRF );
         KnowledgeBuilderErrors errors = kbuilder.getErrors();
         if ( errors.size() > 0 ) {
@@ -7024,36 +7096,40 @@
         // create working memory mock listener
         org.drools.event.rule.WorkingMemoryEventListener wml = Mockito.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
         org.drools.event.rule.AgendaEventListener ael = Mockito.mock( org.drools.event.rule.AgendaEventListener.class );
-        
+
         ksession.addEventListener( wml );
         ksession.addEventListener( ael );
 
-        Order order = new Order( 1, "bob" );
-        OrderItem item = new OrderItem( order, 1 );
+        Order order = new Order( 1,
+                                 "bob" );
+        OrderItem item = new OrderItem( order,
+                                        1 );
         order.addItem( item );
         order.setStatus( new OrderStatus() );
         order.getStatus().setActive( true );
         org.drools.runtime.rule.FactHandle orderFH = ksession.insert( order );
-        
-        Order order2 = new Order( 2, "bob" );
-        OrderItem item2 = new OrderItem( order, 2 );
+
+        Order order2 = new Order( 2,
+                                  "bob" );
+        OrderItem item2 = new OrderItem( order,
+                                         2 );
         order2.addItem( item2 );
         order2.setStatus( new OrderStatus() );
         order2.getStatus().setActive( true );
         org.drools.runtime.rule.FactHandle order2FH = ksession.insert( order2 );
 
         ksession.startProcess( "ruleflow" );
-        
+
         int fired = ksession.fireAllRules();
-        assertEquals( 4, fired );
+        assertEquals( 4,
+                      fired );
 
         // capture the arguments and check that the retracts happened
-//        ArgumentCaptor<org.drools.event.rule.ObjectRetractedEvent> retracts = ArgumentCaptor.forClass(org.drools.event.rule.ObjectRetractedEvent.class);
-//        verify( wml, times(2) ).objectRetracted( retracts.capture() );
-//        List<org.drools.event.rule.ObjectRetractedEvent> values = retracts.getAllValues();
-//        assertThat( values.get( 0 ).getFactHandle(), is( personFH ) );
-//        assertThat( values.get( 1 ).getFactHandle(), is( petFH ) );
+        //        ArgumentCaptor<org.drools.event.rule.ObjectRetractedEvent> retracts = ArgumentCaptor.forClass(org.drools.event.rule.ObjectRetractedEvent.class);
+        //        verify( wml, times(2) ).objectRetracted( retracts.capture() );
+        //        List<org.drools.event.rule.ObjectRetractedEvent> values = retracts.getAllValues();
+        //        assertThat( values.get( 0 ).getFactHandle(), is( personFH ) );
+        //        assertThat( values.get( 1 ).getFactHandle(), is( petFH ) );
     }
-   
-    
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java	2010-04-29 15:54:17 UTC (rev 32679)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java	2010-04-29 16:48:35 UTC (rev 32680)
@@ -171,7 +171,7 @@
         ruleDescr.addAttribute( new AttributeDescr( "duration",
                                                     "60" ) );
         ruleDescr.addAttribute( new AttributeDescr( "calendars",
-                                                    "\"cal1\"" ) );        
+                                                    "\"cal1\"" ) );
         ruleDescr.addAttribute( new AttributeDescr( "date-effective",
                                                     "10-Jul-1974" ) );
         ruleDescr.addAttribute( new AttributeDescr( "date-expires",
@@ -186,28 +186,65 @@
                                               new DateFormatsImpl() ) );
 
         // defining expectations on the mock object
-        when( context.getRule() ).thenReturn(rule);
-        when( context.getRuleDescr() ).thenReturn(ruleDescr);
-        when( context.getPackageBuilder() ).thenReturn(new PackageBuilder());
-        
+        when( context.getRule() ).thenReturn( rule );
+        when( context.getRuleDescr() ).thenReturn( ruleDescr );
+        when( context.getPackageBuilder() ).thenReturn( new PackageBuilder() );
+
         // calling the build method
         RuleBuilder builder = new RuleBuilder();
         builder.buildAttributes( context );
 
         // check expectations
-        verify( rule ).setNoLoop(true);
-        verify( rule ).setAutoFocus(false);
-        verify( rule ).setAgendaGroup("my agenda");
+        verify( rule ).setNoLoop( true );
+        verify( rule ).setAutoFocus( false );
+        verify( rule ).setAgendaGroup( "my agenda" );
         verify( rule ).setActivationGroup( "my activation" );
         verify( rule ).setRuleFlowGroup( "mygroup" );
         verify( rule ).setLockOnActive( true );
         verify( rule ).setEnabled( EnabledBoolean.ENABLED_FALSE );
-        verify( rule ).setTimer( new IntervalTimer( null , null, -1, TimeUtils.parseTimeString( "60" ), 0 ) );
-        verify( rule ).setCalendars( new String[] { "cal1" } );
+        verify( rule ).setTimer( new IntervalTimer( null,
+                                                    null,
+                                                    -1,
+                                                    TimeUtils.parseTimeString( "60" ),
+                                                    0 ) );
+        verify( rule ).setCalendars( new String[]{"cal1"} );
         verify( rule ).setDateEffective( effective );
         verify( rule ).setDateExpires( expires );
     }
 
+    public void testBuildMetaAttributes() throws Exception {
+        // creates mock objects
+        final RuleBuildContext context = mock( RuleBuildContext.class );
+        final Rule rule = mock( Rule.class );
+
+        // creates input object
+        final RuleDescr ruleDescr = new RuleDescr( "my rule" );
+        ruleDescr.addMetaAttribute( "ruleId",
+                                    "123" );
+        ruleDescr.addMetaAttribute( "author",
+                                    "Bob Doe" );
+        ruleDescr.addMetaAttribute( "text",
+                                    "\"It's a quoted\\\" string\"" );
+
+        // creates expected results
+        // defining expectations on the mock object
+        when( context.getRule() ).thenReturn( rule );
+        when( context.getRuleDescr() ).thenReturn( ruleDescr );
+        when( context.getPackageBuilder() ).thenReturn( new PackageBuilder() );
+
+        // calling the build method
+        RuleBuilder builder = new RuleBuilder();
+        builder.buildMetaAttributes( context );
+
+        // check expectations
+        verify( rule ).addMetaAttribute( "ruleId",
+                                         "123" );
+        verify( rule ).addMetaAttribute( "author",
+                                         "Bob Doe" );
+        verify( rule ).addMetaAttribute( "text",
+                                         "It's a quoted\" string" );
+    }
+
     public void testBuildDurationExpression() throws Exception {
         // creates mock objects
         final RuleBuildContext context = mock( RuleBuildContext.class );
@@ -218,74 +255,83 @@
         ruleDescr.addAttribute( new AttributeDescr( "duration",
                                                     "( 1h30m )" ) );
         ruleDescr.addAttribute( new AttributeDescr( "calendars",
-                                                    "[\"cal1\", \"cal2\"]" ) ); 
-        
+                                                    "[\"cal1\", \"cal2\"]" ) );
+
         // defining expectations on the mock object
-        when( context.getRule() ).thenReturn(rule);
-        when( context.getRuleDescr() ).thenReturn(ruleDescr);
+        when( context.getRule() ).thenReturn( rule );
+        when( context.getRuleDescr() ).thenReturn( ruleDescr );
 
         // calling the build method
         RuleBuilder builder = new RuleBuilder();
         builder.buildAttributes( context );
 
         // check expectations
-        verify( rule ).setTimer( new IntervalTimer( null , null, -1, TimeUtils.parseTimeString( "1h30m" ), 0 ) );
-        verify( rule ).setCalendars( new String[] { "cal1", "cal2" } );
+        verify( rule ).setTimer( new IntervalTimer( null,
+                                                    null,
+                                                    -1,
+                                                    TimeUtils.parseTimeString( "1h30m" ),
+                                                    0 ) );
+        verify( rule ).setCalendars( new String[]{"cal1", "cal2"} );
     }
-    
+
     public void testBuildBigDecimalLiteralConstraint() throws Exception {
-        final PackageDescr pkgDescr = new PackageDescr("org.drools");
-        final RuleDescr ruleDescr = new RuleDescr("Test Rule");
+        final PackageDescr pkgDescr = new PackageDescr( "org.drools" );
+        final RuleDescr ruleDescr = new RuleDescr( "Test Rule" );
         AndDescr andDescr = new AndDescr();
-        PatternDescr patDescr = new PatternDescr("java.math.BigDecimal", "$bd");
-        FieldConstraintDescr fcd = new FieldConstraintDescr("this");
-        LiteralRestrictionDescr restr = new LiteralRestrictionDescr("==", "10");
+        PatternDescr patDescr = new PatternDescr( "java.math.BigDecimal",
+                                                  "$bd" );
+        FieldConstraintDescr fcd = new FieldConstraintDescr( "this" );
+        LiteralRestrictionDescr restr = new LiteralRestrictionDescr( "==",
+                                                                     "10" );
         fcd.addRestriction( restr );
         patDescr.addConstraint( fcd );
         andDescr.addDescr( patDescr );
         ruleDescr.setLhs( andDescr );
         ruleDescr.setConsequence( "" );
         pkgDescr.addRule( ruleDescr );
-        
+
         final PackageBuilder pkgBuilder = new PackageBuilder();
         pkgBuilder.addPackage( pkgDescr );
 
         Assert.assertTrue( pkgBuilder.getErrors().toString(),
                            pkgBuilder.getErrors().isEmpty() );
 
-        final Rule rule = pkgBuilder.getPackages()[0].getRule("Test Rule");
+        final Rule rule = pkgBuilder.getPackages()[0].getRule( "Test Rule" );
         final GroupElement and = rule.getLhs();
         final Pattern pat = (Pattern) and.getChildren().get( 0 );
         final LiteralConstraint fc = (LiteralConstraint) pat.getConstraints().get( 0 );
-        assertTrue("Wrong class. Expected java.math.BigDecimal. Found: " + fc.getField().getValue().getClass(), fc.getField().getValue() instanceof BigDecimal );
+        assertTrue( "Wrong class. Expected java.math.BigDecimal. Found: " + fc.getField().getValue().getClass(),
+                    fc.getField().getValue() instanceof BigDecimal );
     }
 
     public void testBuildBigIntegerLiteralConstraint() throws Exception {
-        final PackageDescr pkgDescr = new PackageDescr("org.drools");
-        final RuleDescr ruleDescr = new RuleDescr("Test Rule");
+        final PackageDescr pkgDescr = new PackageDescr( "org.drools" );
+        final RuleDescr ruleDescr = new RuleDescr( "Test Rule" );
         AndDescr andDescr = new AndDescr();
-        PatternDescr patDescr = new PatternDescr("java.math.BigInteger", "$bd");
-        FieldConstraintDescr fcd = new FieldConstraintDescr("this");
-        LiteralRestrictionDescr restr = new LiteralRestrictionDescr("==", "10");
+        PatternDescr patDescr = new PatternDescr( "java.math.BigInteger",
+                                                  "$bd" );
+        FieldConstraintDescr fcd = new FieldConstraintDescr( "this" );
+        LiteralRestrictionDescr restr = new LiteralRestrictionDescr( "==",
+                                                                     "10" );
         fcd.addRestriction( restr );
         patDescr.addConstraint( fcd );
         andDescr.addDescr( patDescr );
         ruleDescr.setLhs( andDescr );
         ruleDescr.setConsequence( "" );
         pkgDescr.addRule( ruleDescr );
-        
+
         final PackageBuilder pkgBuilder = new PackageBuilder();
         pkgBuilder.addPackage( pkgDescr );
 
         Assert.assertTrue( pkgBuilder.getErrors().toString(),
                            pkgBuilder.getErrors().isEmpty() );
 
-        final Rule rule = pkgBuilder.getPackages()[0].getRule("Test Rule");
+        final Rule rule = pkgBuilder.getPackages()[0].getRule( "Test Rule" );
         final GroupElement and = rule.getLhs();
         final Pattern pat = (Pattern) and.getChildren().get( 0 );
         final LiteralConstraint fc = (LiteralConstraint) pat.getConstraints().get( 0 );
-        assertTrue("Wrong class. Expected java.math.BigInteger. Found: " + fc.getField().getValue().getClass(), fc.getField().getValue() instanceof BigInteger );
+        assertTrue( "Wrong class. Expected java.math.BigInteger. Found: " + fc.getField().getValue().getClass(),
+                    fc.getField().getValue() instanceof BigInteger );
     }
 
-    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2010-04-29 15:54:17 UTC (rev 32679)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2010-04-29 16:48:35 UTC (rev 32680)
@@ -33,7 +33,6 @@
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.CompiledInvoker;
 import org.drools.spi.Consequence;
-import org.drools.spi.Duration;
 import org.drools.spi.Enabled;
 import org.drools.spi.Salience;
 import org.drools.spi.Tuple;
@@ -61,128 +60,129 @@
     /**
      *
      */
-    private static final long serialVersionUID = 400L;
+    private static final long        serialVersionUID = 400L;
 
     /**   */
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
     /** The parent pkg */
-    private String            pkg;
+    private String                   pkg;
 
     /** Name of the rule. */
-    private String            name;
-    
+    private String                   name;
+
     /** Parent Rule Name, optional */
-    private Rule 			parent;
+    private Rule                     parent;
 
     /** Salience value. */
-    private Salience          salience;
+    private Salience                 salience;
 
     /** The Rule is dirty after patterns have been added */
-    private boolean           dirty;
-    private Map               declarations;
-    private Declaration[]     declarationArray;
+    private boolean                  dirty;
+    private Map                      declarations;
+    private Declaration[]            declarationArray;
 
-    private GroupElement      lhsRoot;
+    private GroupElement             lhsRoot;
 
-    private String            dialect;
+    private String                   dialect;
 
-    private String            agendaGroup;
-    
-    private Map<String,String> metaAttributes;
+    private String                   agendaGroup;
 
+    private Map<String, String>      metaAttributes;
+
     /** Consequence. */
-    private Consequence       consequence;
-    
+    private Consequence              consequence;
+
     private Map<String, Consequence> namedConsequence;
-    
+
     /** Timer semantics that controls the firing of a rule */
-    private Timer             timer;
+    private Timer                    timer;
 
     /** Load order in Package */
-    private long              loadOrder;
+    private long                     loadOrder;
 
     /** Is recursion of this rule allowed */
-    private boolean           noLoop;
+    private boolean                  noLoop;
 
     /** makes the rule's much the current focus */
-    private boolean           autoFocus;
+    private boolean                  autoFocus;
 
-    private String            activationGroup;
+    private String                   activationGroup;
 
-    private String            ruleFlowGroup;
+    private String                   ruleFlowGroup;
 
-    private boolean           lockOnActive;
+    private boolean                  lockOnActive;
 
-    private boolean           hasLogicalDependency;
+    private boolean                  hasLogicalDependency;
 
     /** indicates that the rule is semantically correct. */
-    private boolean           semanticallyValid;
-    
-    private String[]          calendars;
+    private boolean                  semanticallyValid;
 
-    private Calendar          dateEffective;
+    private String[]                 calendars;
 
-    private Calendar          dateExpires;
+    private Calendar                 dateEffective;
 
-    private Enabled           enabled;
-    
-    private Resource          resource;
+    private Calendar                 dateExpires;
 
+    private Enabled                  enabled;
+
+    private Resource                 resource;
+
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(pkg);
-        out.writeObject(name);
-        out.writeObject(parent);
-        out.writeObject(salience);
-        out.writeBoolean(dirty);
-        out.writeObject(declarations);
-        out.writeObject(declarationArray);
-        out.writeObject(lhsRoot);
-        out.writeObject(dialect);
-        out.writeObject(agendaGroup);
-        out.writeObject(metaAttributes);
+        out.writeObject( pkg );
+        out.writeObject( name );
+        out.writeObject( parent );
+        out.writeObject( salience );
+        out.writeBoolean( dirty );
+        out.writeObject( declarations );
+        out.writeObject( declarationArray );
+        out.writeObject( lhsRoot );
+        out.writeObject( dialect );
+        out.writeObject( agendaGroup );
+        out.writeObject( metaAttributes );
 
         if ( this.consequence instanceof CompiledInvoker ) {
             out.writeObject( null );
             out.writeObject( null );
         } else {
-            out.writeObject(this.consequence); 
+            out.writeObject( this.consequence );
             out.writeObject( this.namedConsequence );
-        } 
-        out.writeObject(timer);
-        out.writeLong(loadOrder);
-        out.writeBoolean(noLoop);
-        out.writeBoolean(autoFocus);
-        out.writeObject(activationGroup);
-        out.writeObject(ruleFlowGroup);
-        out.writeBoolean(lockOnActive);
-        out.writeBoolean(hasLogicalDependency);
-        out.writeBoolean(semanticallyValid);
-        out.writeObject(dateEffective);
-        out.writeObject(dateExpires);
-        out.writeObject(enabled);
+        }
+        out.writeObject( timer );
+        out.writeLong( loadOrder );
+        out.writeBoolean( noLoop );
+        out.writeBoolean( autoFocus );
+        out.writeObject( activationGroup );
+        out.writeObject( ruleFlowGroup );
+        out.writeBoolean( lockOnActive );
+        out.writeBoolean( hasLogicalDependency );
+        out.writeBoolean( semanticallyValid );
+        out.writeObject( dateEffective );
+        out.writeObject( dateExpires );
+        out.writeObject( enabled );
         out.writeObject( resource );
     }
-    
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        pkg = (String)in.readObject();
-        name = (String)in.readObject();
-        parent = (Rule)in.readObject();
-        salience = (Salience)in.readObject();
-        
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        pkg = (String) in.readObject();
+        name = (String) in.readObject();
+        parent = (Rule) in.readObject();
+        salience = (Salience) in.readObject();
+
         dirty = in.readBoolean();
-        declarations    = (Map)in.readObject();
-        declarationArray = (Declaration[])in.readObject();
-        lhsRoot = (GroupElement)in.readObject();
-        dialect = (String)in.readObject();
-        agendaGroup = (String)in.readObject();
-        metaAttributes = (Map<String,String>)in.readObject();
-        
-        consequence = (Consequence)in.readObject();
+        declarations = (Map) in.readObject();
+        declarationArray = (Declaration[]) in.readObject();
+        lhsRoot = (GroupElement) in.readObject();
+        dialect = (String) in.readObject();
+        agendaGroup = (String) in.readObject();
+        metaAttributes = (Map<String, String>) in.readObject();
+
+        consequence = (Consequence) in.readObject();
         namedConsequence = (Map<String, Consequence>) in.readObject();
-        timer = (Timer)in.readObject();
-        loadOrder   = in.readLong();
+        timer = (Timer) in.readObject();
+        loadOrder = in.readLong();
         noLoop = in.readBoolean();
         autoFocus = in.readBoolean();
         activationGroup = (String) in.readObject();
@@ -193,7 +193,7 @@
         dateEffective = (Calendar) in.readObject();
         dateExpires = (Calendar) in.readObject();
         enabled = (Enabled) in.readObject();
-        resource = ( Resource ) in.readObject();
+        resource = (Resource) in.readObject();
     }
 
     // ------------------------------------------------------------
@@ -220,8 +220,8 @@
         this.semanticallyValid = true;
         this.enabled = EnabledBoolean.ENABLED_TRUE;
         this.salience = SalienceInteger.DEFAULT_SALIENCE;
-        this.metaAttributes = new HashMap<String,String>();
-     
+        this.metaAttributes = new HashMap<String, String>();
+
     }
 
     /**
@@ -243,8 +243,6 @@
               null,
               AgendaGroup.MAIN );
     }
-    
-    
 
     public Resource getResource() {
         return resource;
@@ -313,7 +311,7 @@
     public void setPackage(String pkg) {
         this.pkg = pkg;
     }
-    
+
     public String getPackageName() {
         return this.pkg;
     }
@@ -366,8 +364,12 @@
      *
      * This uses the dateEffective, dateExpires and enabled flag to decide this.
      */
-    public boolean isEffective(TimeMachine tm, Tuple tuple, WorkingMemory workingMemory) {
-        if ( !this.enabled.getValue( tuple, this, workingMemory ) ) {
+    public boolean isEffective(TimeMachine tm,
+                               Tuple tuple,
+                               WorkingMemory workingMemory) {
+        if ( !this.enabled.getValue( tuple,
+                                     this,
+                                     workingMemory ) ) {
             return false;
         }
         if ( this.dateEffective == null && this.dateExpires == null ) {
@@ -425,7 +427,8 @@
      */
     public Declaration getDeclaration(final String identifier) {
         if ( this.dirty || (this.declarations == null) ) {
-            this.declarations = this.getExtendedLhs(this, null).getOuterDeclarations();
+            this.declarations = this.getExtendedLhs( this,
+                                                     null ).getOuterDeclarations();
             this.declarationArray = (Declaration[]) this.declarations.values().toArray( new Declaration[this.declarations.values().size()] );
             this.dirty = false;
         }
@@ -462,7 +465,8 @@
      */
     public Declaration[] getDeclarations() {
         if ( this.dirty || (this.declarationArray == null) ) {
-            this.declarations = this.getExtendedLhs(this, null).getOuterDeclarations();
+            this.declarations = this.getExtendedLhs( this,
+                                                     null ).getOuterDeclarations();
             this.declarationArray = (Declaration[]) this.declarations.values().toArray( new Declaration[this.declarations.values().size()] );
             this.dirty = false;
         }
@@ -496,23 +500,27 @@
         this.dirty = true;
         this.lhsRoot = lhsRoot;
     }
-    private GroupElement getExtendedLhs(Rule rule, GroupElement fromChild){
-    	//combine rules LHS with Parent "Extends"
-    	final GroupElement lhs = (GroupElement) rule.lhsRoot.clone();
-    	//use the children passed from prior child rules, and combine with current LHS (at the end)
-    	if(null != fromChild){
-			//Have GroupElement from a child rule, so combine it
-			lhs.getChildren().addAll(fromChild.getChildren());
-		}
-    	//move recursively up the tree
-    	if(rule.parent != null){
-    		return getExtendedLhs(rule.parent, lhs);
-    	}
-    	//at the top of the tree, return combined LHS
-    	//TODO Merge LHS for performace
-    	
-    	return lhs;	
+
+    private GroupElement getExtendedLhs(Rule rule,
+                                        GroupElement fromChild) {
+        //combine rules LHS with Parent "Extends"
+        final GroupElement lhs = (GroupElement) rule.lhsRoot.clone();
+        //use the children passed from prior child rules, and combine with current LHS (at the end)
+        if ( null != fromChild ) {
+            //Have GroupElement from a child rule, so combine it
+            lhs.getChildren().addAll( fromChild.getChildren() );
+        }
+        //move recursively up the tree
+        if ( rule.parent != null ) {
+            return getExtendedLhs( rule.parent,
+                                   lhs );
+        }
+        //at the top of the tree, return combined LHS
+        //TODO Merge LHS for performace
+
+        return lhs;
     }
+
     /**
      * Uses the LogicTransformer to process the Rule patters - if no ORs are
      * used this will return an array of a single AND element. If there are Ors
@@ -524,8 +532,9 @@
      * @throws InvalidPatternException
      */
     public GroupElement[] getTransformedLhs() throws InvalidPatternException {
-    	//Moved to getExtendedLhs --final GroupElement cloned = (GroupElement) this.lhsRoot.clone();
-    	return LogicTransformer.getInstance().transform( getExtendedLhs(this, null) );
+        //Moved to getExtendedLhs --final GroupElement cloned = (GroupElement) this.lhsRoot.clone();
+        return LogicTransformer.getInstance().transform( getExtendedLhs( this,
+                                                                         null ) );
     }
 
     public int getSpecifity() {
@@ -559,16 +568,17 @@
     public void wire(Object object) {
         if ( object instanceof Salience ) {
             setSalience( (Salience) object );
-        } else if( object instanceof Enabled ) {
-        	setEnabled(( Enabled) object);
+        } else if ( object instanceof Enabled ) {
+            setEnabled( (Enabled) object );
         } else {
             Consequence c = (Consequence) object;
             if ( "default".equals( c.getName() ) ) {
-                setConsequence( c );    
+                setConsequence( c );
             } else {
-                getNamedConsequences().put( c.getName(), c );
+                getNamedConsequences().put( c.getName(),
+                                            c );
             }
-            
+
         }
     }
 
@@ -593,12 +603,12 @@
     public Consequence getConsequence() {
         return this.consequence;
     }
-    
+
     public Map<String, Consequence> getNamedConsequences() {
         if ( this.namedConsequence == null ) {
             this.namedConsequence = new HashMap<String, Consequence>();
         }
-        
+
         return this.namedConsequence;
     }
 
@@ -688,27 +698,41 @@
         this.enabled = b;
     }
 
-    public boolean isEnabled( Tuple tuple, WorkingMemory workingMemory ) {
-        return this.enabled.getValue( tuple, this, workingMemory );
+    public boolean isEnabled(Tuple tuple,
+                             WorkingMemory workingMemory) {
+        return this.enabled.getValue( tuple,
+                                      this,
+                                      workingMemory );
     }
-	public void setMetaAttributes(Map<String,String> metaAttributes) {
-		this.metaAttributes = metaAttributes;
-	}
-	public Map<String,String> getMetaAttributes() {
-		return metaAttributes;
-	}
+
+    public void setMetaAttributes(Map<String, String> metaAttributes) {
+        this.metaAttributes = metaAttributes;
+    }
+
+    public void addMetaAttribute(String key,
+                                 String value) {
+        this.metaAttributes.put( key,
+                                 value );
+    }
+
+    public Map<String, String> getMetaAttributes() {
+        return metaAttributes;
+    }
+
     public String getMetaAttribute(final String identifier) {
         return (String) this.metaAttributes.get( identifier );
     }
-    
+
     public Collection<String> listMetaAttributes() {
         return this.metaAttributes.keySet();
     }
-    
-	public void setParent(Rule parent) {
-		this.parent = parent;
-	}
-	public Rule getParent() {
-		return parent;
-	}
+
+    public void setParent(Rule parent) {
+        this.parent = parent;
+    }
+
+    public Rule getParent() {
+        return parent;
+    }
+
 }



More information about the jboss-svn-commits mailing list