[jboss-svn-commits] JBL Code SVN: r14380 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/brms/server/rules and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Aug 20 00:20:27 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-08-20 00:20:27 -0400 (Mon, 20 Aug 2007)
New Revision: 14380

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/DataEnumLoader.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DataEnumLoaderTest.java
Log:
JBRULES-1090

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2007-08-20 02:08:32 UTC (rev 14379)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2007-08-20 04:20:27 UTC (rev 14380)
@@ -11,7 +11,7 @@
 /**
  * An suggestion completion processor. This should be usable in both GWT/Web and the IDE.
  * The data for this can be loaded into this from simple string lists.
- *  
+ *
  * @author Michael Neale
  */
 public class SuggestionCompletionEngine
@@ -40,14 +40,14 @@
     /** The top level conditional elements (first order logic) */
     private static final String[] CONDITIONAL_ELEMENTS   = new String[]{"not", "exists", "or"};
 
-    /** 
+    /**
      * A list of fact types (never fully qualified).
      */
     public String[]               factTypes;
 
     /**
      * A map of types to the fields. key is type, value is (String[] of fields)
-     * 
+     *
      * @gwt.typeArgs <java.lang.String, java.lang.String[]>
      */
     public Map                    fieldsForType;
@@ -57,7 +57,7 @@
      * as well as other things like rendering strings, dates etc.
      * This is in the format of: { 'Type.field' => 'typename' }.
      * Should not be the exact type, perhaps just a high level interface, eg "Comparable".
-     * 
+     *
      * @gwt.typeArgs <java.lang.String, java.lang.String>
      */
     public Map                    fieldTypes;
@@ -68,6 +68,13 @@
      */
     public Map                    globalTypes            = new HashMap();
 
+    /**
+     * Contains a map of { TypeName.field : String[] } - where a list is
+     * valid values to display in a drop down for a given Type.field combination.
+     * @gwt.typeArgs <java.lang.String, java.lang.String[]>
+     */
+    public Map 					  dataEnumLists			 = new HashMap();
+
     /** Operators (from the grammar):
      *      op=(    '=='
      |   '>'
@@ -90,23 +97,23 @@
 
     //    /**
     //     * For bulk loading up the data (from a previous rule save)
-    //     * 
-    //     * @param factToFields A map of "FactType" (key - String) to String[] (value) 
+    //     *
+    //     * @param factToFields A map of "FactType" (key - String) to String[] (value)
     //     * @param factFieldToOperator A map of "FactType.field" (key - String) to String[] operators
-    //     * @param factFieldToConnectiveOperator A map of "FactType.field" (key -String) to String[] operators 
+    //     * @param factFieldToConnectiveOperator A map of "FactType.field" (key -String) to String[] operators
     //     *                                  that are valid CONNECTIVE operators.
-    //     *                                  
+    //     *
     //     * @param globals A map of global variable name to its fields (String[]).
     //     * @param boundFacts A map of bound facts to types.
     //     * @param conditionDSLs a list of DSLSentence suggestions for the LHS
-    //     * @param actionDSLs a list of DSLSentence suggestions for the RHS                          
-    //     *                                       
+    //     * @param actionDSLs a list of DSLSentence suggestions for the RHS
+    //     *
     //     */
-    //    public void load( 
-    //                      Map factToFields, 
-    //                      Map factFieldToOperator, 
+    //    public void load(
+    //                      Map factToFields,
+    //                      Map factFieldToOperator,
     //                      Map factFieldToConnectiveOperator,
-    //                      Map globals,                      
+    //                      Map globals,
     //                      List conditionDSLs,
     //                      List actionDSLs
     //                    ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-08-20 02:08:32 UTC (rev 14379)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-08-20 04:20:27 UTC (rev 14380)
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -12,6 +13,7 @@
 
 import org.drools.base.ClassTypeResolver;
 import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.server.util.DataEnumLoader;
 import org.drools.brms.server.util.SuggestionCompletionEngineBuilder;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
@@ -28,40 +30,45 @@
 import org.drools.util.asm.ClassFieldInspector;
 
 /**
- * This utility class loads suggestion completion stuff for the package configuration, 
- * introspecting from models, templates etc. 
- * 
- * This also includes DSL stuff, basically, everything you need to get started with a package.
- * It also validates the package configuration, and can provide errors.
- * 
- * This does NOT validate assets in the package, other then to load up DSLs, models etc
- * as needed.
- * 
+ * This utility class loads suggestion completion stuff for the package
+ * configuration, introspecting from models, templates etc.
+ *
+ * This also includes DSL stuff, basically, everything you need to get started
+ * with a package. It also validates the package configuration, and can provide
+ * errors.
+ *
+ * This does NOT validate assets in the package, other then to load up DSLs,
+ * models etc as needed.
+ *
  * FYI: the tests for this are in the BRMS module, in context of a full BRMS.
- * 
+ *
  * @author Michael Neale
  *
  */
 public class SuggestionCompletionLoader {
 
     private final SuggestionCompletionEngineBuilder builder = new SuggestionCompletionEngineBuilder();
+
     private final DrlParser                         parser  = new DrlParser();
+
     private final MapBackedClassLoader              loader;
+
     protected List                                  errors  = new ArrayList();
+
     // iterating over the import list
-    final ClassTypeResolver resolver;
+    final ClassTypeResolver                         resolver;
 
     /**
-     * This uses the current classes classloader as a base,
-     * and jars can be added.
+     * This uses the current classes classloader as a base, and jars can be
+     * added.
      */
     public SuggestionCompletionLoader() {
-        this(null);
+        this( null );
     }
 
     /**
-     * This allows a pre existing classloader to be used (and preferred)
-     * for resolving types.
+     * This allows a pre existing classloader to be used (and preferred) for
+     * resolving types.
      */
     public SuggestionCompletionLoader(ClassLoader classLoader) {
         if ( classLoader == null ) {
@@ -71,21 +78,50 @@
             }
         }
         this.loader = new MapBackedClassLoader( classLoader );
-        this.resolver = new ClassTypeResolver(new HashSet(), this.loader);
+        this.resolver = new ClassTypeResolver( new HashSet(),
+                                               this.loader );
     }
 
     /**
-     * This will validate, and generate a new engine, ready to go.
-     * If there are errors, you can get them by doing getErrors();
-     * @param header The package configuration file content.
-     * @param jars a list of jars to look inside (pass in empty array if not needed)
-     * this is a list of {@link JarInputStream}
-     * @param dsls any dsl files. This is a list of {@link DSLMappingFile}.
+     * This will validate, and generate a new engine, ready to go. If there are
+     * errors, you can get them by doing getErrors();
+     *
+     * @param header
+     *            The package configuration file content.
+     * @param jars
+     *            a list of jars to look inside (pass in empty array if not
+     *            needed) this is a list of {@link JarInputStream}
+     * @param dsls
+     *            any dsl files. This is a list of {@link DSLMappingFile}.
      * @return A SuggestionCompletionEngine ready to be used in anger.
      */
     public SuggestionCompletionEngine getSuggestionEngine(final String header,
                                                           final List jars,
                                                           final List dsls) {
+        return this.getSuggestionEngine( header, jars, dsls, Collections.EMPTY_LIST );
+    }
+
+
+    /**
+     * This will validate, and generate a new engine, ready to go. If there are
+     * errors, you can get them by doing getErrors();
+     *
+     * @param header
+     *            The package configuration file content.
+     * @param jars
+     *            a list of jars to look inside (pass in empty array if not
+     *            needed) this is a list of {@link JarInputStream}
+     * @param dsls
+     *            any dsl files. This is a list of {@link DSLMappingFile}.
+     * @param dataEnums
+     *            this is a list of String's which hold data enum definitions.
+     *             (normally will be just one, but for completeness can load multiple).
+     * @return A SuggestionCompletionEngine ready to be used in anger.
+     */
+    public SuggestionCompletionEngine getSuggestionEngine(final String header,
+                                                          final List jars,
+                                                          final List dsls,
+                                                          final List dataEnums) {
         this.builder.newCompletionEngine();
 
         if ( !header.trim().equals( "" ) ) {
@@ -96,9 +132,29 @@
         // populating DSL sentences
         this.populateDSLSentences( dsls );
 
-        return this.builder.getInstance();
+
+
+        SuggestionCompletionEngine sce = this.builder.getInstance();
+
+        populateDateEnums( dataEnums, sce );
+
+
+        return sce;
     }
 
+    private void populateDateEnums(List dataEnums, SuggestionCompletionEngine sce) {
+        for ( Iterator iter = dataEnums.iterator(); iter.hasNext(); ) {
+            String enumFile = (String) iter.next();
+            DataEnumLoader enumLoader = new DataEnumLoader(enumFile);
+            if (enumLoader.hasErrors()) {
+                this.errors.addAll( enumLoader.getErrors() );
+            } else {
+                sce.dataEnumLists.putAll( enumLoader.getData() );
+            }
+        }
+
+    }
+
     private void processPackageHeader(final String header,
                                       final List jars) {
         // get fact types from imports
@@ -130,30 +186,34 @@
      * @param errors
      */
     private void populateDSLSentences(final List dsls) {
-        //        AssetItemIterator it = pkg.listAssetsByFormat( new String[]{AssetFormats.DSL} );
-        //        while ( it.hasNext() ) {
-        //            AssetItem item = (AssetItem) it.next();
-        //            String dslData = item.getContent();
-        //            DSLMappingFile file = new DSLMappingFile();
-        //            try {
-        //                if ( file.parseAndLoad( new StringReader( dslData ) ) ) {
-        //                    DSLMapping mapping = file.getMapping();
-        //                    for ( Iterator entries = mapping.getEntries().iterator(); entries.hasNext(); ) {
-        //                        DSLMappingEntry entry = (DSLMappingEntry) entries.next();
-        //                        if (entry.getSection() == DSLMappingEntry.CONDITION) {
-        //                            builder.addDSLConditionSentence( entry.getMappingKey() );
-        //                        } else if (entry.getSection() == DSLMappingEntry.CONSEQUENCE) {
-        //                            builder.addDSLActionSentence( entry.getMappingKey() );
-        //                        }
-        //                        
-        //                    }
-        //                } else {
-        //                    errors.add( file.getErrors().toString() );
-        //                }
-        //            } catch ( IOException e ) {
-        //                errors.add( "Error while loading DSL language configuration : " + item.getBinaryContentAttachmentFileName() + " error message: " + e.getMessage() );
-        //            }
-        //        }
+        // AssetItemIterator it = pkg.listAssetsByFormat( new
+        // String[]{AssetFormats.DSL} );
+        // while ( it.hasNext() ) {
+        // AssetItem item = (AssetItem) it.next();
+        // String dslData = item.getContent();
+        // DSLMappingFile file = new DSLMappingFile();
+        // try {
+        // if ( file.parseAndLoad( new StringReader( dslData ) ) ) {
+        // DSLMapping mapping = file.getMapping();
+        // for ( Iterator entries = mapping.getEntries().iterator();
+        // entries.hasNext(); ) {
+        // DSLMappingEntry entry = (DSLMappingEntry) entries.next();
+        // if (entry.getSection() == DSLMappingEntry.CONDITION) {
+        // builder.addDSLConditionSentence( entry.getMappingKey() );
+        // } else if (entry.getSection() == DSLMappingEntry.CONSEQUENCE) {
+        // builder.addDSLActionSentence( entry.getMappingKey() );
+        // }
+        //
+        // }
+        // } else {
+        // errors.add( file.getErrors().toString() );
+        // }
+        // } catch ( IOException e ) {
+        // errors.add( "Error while loading DSL language configuration : " +
+        // item.getBinaryContentAttachmentFileName() + " error message: " +
+        // e.getMessage() );
+        // }
+        // }
 
         for ( final Iterator it = dsls.iterator(); it.hasNext(); ) {
             final DSLMappingFile file = (DSLMappingFile) it.next();
@@ -210,8 +270,9 @@
             final String className = imp.getTarget();
             resolver.addImport( className );
 
-            final Class clazz = loadClass(className, jars);
-            
+            final Class clazz = loadClass( className,
+                                           jars );
+
             if ( clazz != null ) {
                 try {
                     final String shortTypeName = getShortNameOfClass( clazz.getName() );
@@ -231,7 +292,7 @@
 
     /**
      * Iterates over fact templates and add them to the model definition
-     * 
+     *
      * @param pkgDescr
      */
     private void populateFactTemplateTypes(final PackageDescr pkgDescr,
@@ -262,7 +323,7 @@
             }
         }
     }
-    
+
     private Class loadClass(String className,
                             List jars) {
         Class clazz = null;
@@ -272,12 +333,12 @@
             try {
                 addJars( jars );
                 clazz = resolver.resolveType( className );
-            } catch ( Exception e) {
+            } catch ( Exception e ) {
                 this.errors.add( "Class not found: " + className );
             }
         }
         return clazz;
-    }    
+    }
 
     private void loadClassFields(final Class clazz,
                                  final String shortTypeName) throws IOException {
@@ -312,7 +373,7 @@
         for ( int i = 0; i < fields.length; i++ ) {
             final String field = fields[i];
             if ( field.equals( "class" ) || field.equals( "hashCode" ) || field.equals( "toString" ) ) {
-                //ignore
+                // ignore
             } else {
                 result.add( field );
             }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/DataEnumLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/DataEnumLoader.java	2007-08-20 02:08:32 UTC (rev 14379)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/DataEnumLoader.java	2007-08-20 04:20:27 UTC (rev 14380)
@@ -28,7 +28,6 @@
 	private Map loadEnum(String mvelSource) {
 		final Object mvelData;
 		try {
-			MVEL mvel = new MVEL();
 
 			mvelData = MVEL.eval("[ " + mvelSource + " ]", new HashMap());
 		} catch (RuntimeException e) {
@@ -42,6 +41,7 @@
 			return Collections.EMPTY_MAP;
 		}
 		Map map = (Map) mvelData;
+        Map newMap = new HashMap();
 		for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
 			String key = (String) iter.next();
 			Object list = map.get(key);
@@ -54,18 +54,18 @@
 				return Collections.EMPTY_MAP;
 			}
 			List items = (List) list;
-			List newItems = new ArrayList();
+			String[] newItems = new String[items.size()];
 			for (int i = 0; i < items.size(); i++) {
 				Object listItem = items.get(i);
 				if (!(listItem instanceof String)) {
-					newItems.add(listItem.toString());
+					newItems[i] = listItem.toString();
 				} else {
-					newItems.add(listItem);
+					newItems[i] = (String) listItem;
 				}
 			}
-			map.put(key, newItems);
+			newMap.put(key, newItems);
 		}
-		return map;
+		return newMap;
 	}
 
 	private void addError(String string) {
@@ -79,6 +79,10 @@
 		return this.errors;
 	}
 
+    public boolean hasErrors() {
+        return this.errors.size() > 0;
+    }
+
 	/**
 	 * Return the map of Fact.field to List (of Strings).
 	 */

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java	2007-08-20 02:08:32 UTC (rev 14379)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java	2007-08-20 04:20:27 UTC (rev 14380)
@@ -1,12 +1,12 @@
 /*
  * Copyright 2006 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.
@@ -26,7 +26,7 @@
 
 /**
  * A builder to incrementally populate a SuggestionCompletionEngine
- * 
+ *
  * @author etirelli
  */
 public class SuggestionCompletionEngineBuilder {
@@ -57,7 +57,7 @@
 
     /**
      * Adds a fact type to the engine
-     * 
+     *
      * @param factType
      */
     public void addFactType(final String factType) {
@@ -66,7 +66,7 @@
 
     /**
      * Adds the list of fields for a given type
-     * 
+     *
      * @param type
      * @param fields
      */
@@ -85,7 +85,7 @@
 
     /**
      * Adds a type declaration for a field
-     * 
+     *
      * @param field
      * @param type
      */
@@ -97,7 +97,7 @@
 
     /**
      * Adds a global and its corresponding type to the engine
-     * 
+     *
      * @param global
      * @param type
      */
@@ -126,9 +126,9 @@
     }
 
     /**
-     * Returns a SuggestionCompletionEngine instance populated with 
+     * Returns a SuggestionCompletionEngine instance populated with
      * all the data since last call to newCompletionEngine() method
-     * 
+     *
      * @return
      */
     public SuggestionCompletionEngine getInstance() {
@@ -141,4 +141,5 @@
         return this.instance;
     }
 
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java	2007-08-20 02:08:32 UTC (rev 14379)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java	2007-08-20 04:20:27 UTC (rev 14380)
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -28,6 +29,27 @@
 
     }
 
+    public void testDataEnums() {
+        String pkg = "package org.test\n import org.drools.brms.client.modeldriven.SuggestionCompletionTest.NestedClass";
+
+        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
+
+        List enums = new ArrayList();
+
+        enums.add( "'Person.age' : [42, 43] \n 'Person.sex' : ['M', 'F']");
+        enums.add( "'Driver.sex' : ['M', 'F']" );
+
+
+        SuggestionCompletionEngine engine = loader.getSuggestionEngine( pkg, new ArrayList(), new ArrayList() , enums);
+        assertEquals( "String", engine.getFieldType( "SuggestionCompletionTest$NestedClass", "name" ) );
+
+        assertEquals(3, engine.dataEnumLists.size());
+        String[] items = (String[]) engine.dataEnumLists.get( "Person.age" );
+        assertEquals(2, items.length);
+        assertEquals("42", items[0]);
+        assertEquals("43", items[1]);
+    }
+
     public void testCompletions() {
 
         final SuggestionCompletionEngine com = new SuggestionCompletionEngine();

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DataEnumLoaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DataEnumLoaderTest.java	2007-08-20 02:08:32 UTC (rev 14379)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DataEnumLoaderTest.java	2007-08-20 04:20:27 UTC (rev 14380)
@@ -25,30 +25,33 @@
 
 		DataEnumLoader loader = new DataEnumLoader(readLines().toString());
 
+        assertFalse(loader.hasErrors());
 
 		Map enumeration = (Map) loader.getData();
 		assertEquals(loader.getErrors().toString(), 0, loader.getErrors().size());
 		assertEquals(3, enumeration.size());
 
-		List list = (List) enumeration.get("Person.age");
-		assertEquals(4, list.size());
-		assertEquals("1", list.get(0));
-		assertEquals("2", list.get(1));
+		String[] list = (String[]) enumeration.get("Person.age");
+		assertEquals(4, list.length);
+		assertEquals("1", list[0]);
+		assertEquals("2", list[1]);
 
-		list = (List) enumeration.get("Person.rating");
-		assertEquals(2, list.size());
-		assertEquals("High", list.get(0));
-		assertEquals("Low", list.get(1));
+		list = (String[]) enumeration.get("Person.rating");
+		assertEquals(2, list.length);
+		assertEquals("High", list[0]);
+		assertEquals("Low", list[1]);
 
 
+
 		loader = new DataEnumLoader("");
 		assertEquals(1, loader.getErrors().size());
+		assertTrue(loader.hasErrors());
 
 		loader = new DataEnumLoader("goober poo error");
 		assertEquals(0, loader.getData().size());
 		assertFalse(loader.getErrors().size() == 0);
+		assertTrue(loader.hasErrors());
 
-
 	}
 
 




More information about the jboss-svn-commits mailing list