[jboss-svn-commits] JBL Code SVN: r10164 - in labs/jbossrules/trunk: drools-jbrms/src/main/java/org/drools/brms/client/modeldriven and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Mar 13 14:22:50 EDT 2007


Author: tirelli
Date: 2007-03-13 14:22:50 -0400 (Tue, 13 Mar 2007)
New Revision: 10164

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java
Log:
JBRULES-733: populating suggestion completion engine with template info. Test case added.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java	2007-03-13 17:54:26 UTC (rev 10163)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java	2007-03-13 18:22:50 UTC (rev 10164)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -27,22 +28,30 @@
 public class ClassTypeResolver
     implements
     TypeResolver {
-    private final List        imports;
+    private List              imports;
 
     private final ClassLoader classLoader;
 
-    private Map               cachedImports = new HashMap();
-    
-    private static Map internalNamesMap = new HashMap();
+    private Map               cachedImports    = new HashMap();
+
+    private static Map        internalNamesMap = new HashMap();
     static {
-        internalNamesMap.put( "int", "I" );
-        internalNamesMap.put( "boolean", "Z" );
-        internalNamesMap.put( "float", "F" );
-        internalNamesMap.put( "long", "J" );
-        internalNamesMap.put( "short", "S" );
-        internalNamesMap.put( "byte", "B" );
-        internalNamesMap.put( "double", "D" );
-        internalNamesMap.put( "char", "C" );
+        internalNamesMap.put( "int",
+                              "I" );
+        internalNamesMap.put( "boolean",
+                              "Z" );
+        internalNamesMap.put( "float",
+                              "F" );
+        internalNamesMap.put( "long",
+                              "J" );
+        internalNamesMap.put( "short",
+                              "S" );
+        internalNamesMap.put( "byte",
+                              "B" );
+        internalNamesMap.put( "double",
+                              "D" );
+        internalNamesMap.put( "char",
+                              "C" );
     }
 
     public ClassTypeResolver() {
@@ -90,6 +99,9 @@
      * @see org.drools.semantics.java.TypeResolver#addImport(java.lang.String)
      */
     public void addImport(final String importEntry) {
+        if ( this.imports == Collections.EMPTY_LIST ) {
+            this.imports = new ArrayList();
+        }
         if ( !this.imports.contains( importEntry ) ) {
             this.imports.add( importEntry );
         }
@@ -114,19 +126,20 @@
         StringBuffer arrayClassName = new StringBuffer();
 
         //is the class a primitive type ?
-        if (internalNamesMap.containsKey(className)) {
-            clazz = Class.forName( "[" + internalNamesMap.get(className),
+        if ( internalNamesMap.containsKey( className ) ) {
+            clazz = Class.forName( "[" + internalNamesMap.get( className ),
                                    true,
-                                   classLoader).getComponentType();
+                                   classLoader ).getComponentType();
             // Could also be a primitive array
-        } else if ( className.indexOf('[') > 0 ) {
+        } else if ( className.indexOf( '[' ) > 0 ) {
             isArray = true;
-            int bracketIndex = className.indexOf('[');
+            int bracketIndex = className.indexOf( '[' );
             String componentName = className.substring( 0,
                                                         bracketIndex );
-            arrayClassName.append('[');
-            while( (bracketIndex = className.indexOf( '[', bracketIndex+1 )) > 0 ) {
-                arrayClassName.append('[');
+            arrayClassName.append( '[' );
+            while ( (bracketIndex = className.indexOf( '[',
+                                                       bracketIndex + 1 )) > 0 ) {
+                arrayClassName.append( '[' );
             }
             className = componentName;
         }
@@ -184,15 +197,15 @@
         }
 
         // If array component class was found, try to resolve the array class of it 
-        if( isArray ) {
-            if (clazz == null && internalNamesMap.containsKey( className ) ) {
+        if ( isArray ) {
+            if ( clazz == null && internalNamesMap.containsKey( className ) ) {
                 arrayClassName.append( internalNamesMap.get( className ) );
             } else {
-                if( clazz != null ) {
-                    arrayClassName.append( "L" ).append( clazz.getName() ).append( ";" );                
+                if ( clazz != null ) {
+                    arrayClassName.append( "L" ).append( clazz.getName() ).append( ";" );
                 } else {
                     // we know we will probably not be able to resolve this name, but nothing else we can do. 
-                    arrayClassName.append( "L" ).append( className ).append( ";" );                
+                    arrayClassName.append( "L" ).append( className ).append( ";" );
                 }
             }
             try {
@@ -201,7 +214,7 @@
                 clazz = null;
             }
         }
-        
+
         // We still can't find the class so throw an exception 
         if ( clazz == null ) {
             throw new ClassNotFoundException( "Unable to find class '" + className + "'" );

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2007-03-13 17:54:26 UTC (rev 10163)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2007-03-13 18:22:50 UTC (rev 10164)
@@ -194,6 +194,11 @@
                 
     }
     
+    public String getFieldType( String factType,
+                                String fieldName ) {
+        return (String) this.fieldTypes.get( factType + "." + fieldName );
+    }
+    
     public boolean isGlobalVariable(String variable) {
         return this.globalTypes.containsKey( variable );
     }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-03-13 17:54:26 UTC (rev 10163)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-03-13 18:22:50 UTC (rev 10164)
@@ -10,12 +10,15 @@
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
 import org.drools.RuntimeDroolsException;
 import org.drools.brms.client.common.AssetFormats;
 import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.brms.server.util.SuggestionCompletionEngineBuilder;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldTemplateDescr;
 import org.drools.lang.descr.GlobalDescr;
 import org.drools.lang.descr.ImportDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -42,7 +45,12 @@
 
     private SuggestionCompletionEngineBuilder builder = new SuggestionCompletionEngineBuilder();
     private DrlParser                         parser  = new DrlParser();
+    private final ByteArrayClassLoader        loader;
 
+    public SuggestionCompletionLoader() {
+        loader = new ByteArrayClassLoader( this.getClass().getClassLoader() );
+    }
+
     public SuggestionCompletionEngine getSuggestionEngine(PackageItem pkg) {
         StringBuffer errors = new StringBuffer();
         builder.newCompletionEngine();
@@ -66,7 +74,7 @@
         // populating globals
         this.populateGlobalInfo( errors,
                                  pkgDescr,
-                                 pkg);
+                                 pkg );
 
         // populating DSL sentences
         this.populateDSLSentences( pkg,
@@ -112,26 +120,28 @@
      * Populate the global stuff.
      */
     private void populateGlobalInfo(StringBuffer errors,
-                                    PackageDescr pkgDescr, PackageItem pkg) {
-        
+                                    PackageDescr pkgDescr,
+                                    PackageItem pkg) {
+
         // populating information for the globals
         for ( Iterator it = pkgDescr.getGlobals().iterator(); it.hasNext(); ) {
             GlobalDescr global = (GlobalDescr) it.next();
             try {
-                    String shortTypeName = global.getType();
-                    if (!this.builder.hasFieldsForType( shortTypeName )) {
-                        Class clazz = loadClass( pkg,
-                                                 global.getType(), 
-                                                 errors );
-                        loadClassFields( clazz,
-                                         shortTypeName );  
-                        
-                        this.builder.addGlobalType( global.getIdentifier(), shortTypeName );
-                    }
-    
-    
-                    builder.addGlobalType( global.getIdentifier(), shortTypeName );
-            } catch (IOException e) {
+                String shortTypeName = global.getType();
+                if ( !this.builder.hasFieldsForType( shortTypeName ) ) {
+                    Class clazz = loadClass( pkg,
+                                             global.getType(),
+                                             errors );
+                    loadClassFields( clazz,
+                                     shortTypeName );
+
+                    this.builder.addGlobalType( global.getIdentifier(),
+                                                shortTypeName );
+                }
+
+                builder.addGlobalType( global.getIdentifier(),
+                                       shortTypeName );
+            } catch ( IOException e ) {
                 errors.append( "\tError while inspecting class: " );
                 errors.append( global.getType() );
                 errors.append( " : " );
@@ -147,24 +157,24 @@
      */
     private void populateModelInfo(StringBuffer errors,
                                    PackageDescr pkgDescr,
-                                   PackageItem pkg ) {
+                                   PackageItem pkg) {
 
-        
-
         // iterating over the import list
+        ClassTypeResolver resolver = new ClassTypeResolver();
         for ( Iterator it = pkgDescr.getImports().iterator(); it.hasNext(); ) {
             ImportDescr imp = (ImportDescr) it.next();
             String classname = imp.getTarget();
+            resolver.addImport( classname );
 
             Class clazz = loadClass( pkg,
-                                     classname,                                      
+                                     classname,
                                      errors );
             if ( clazz != null ) {
                 try {
                     String shortTypeName = getShortNameOfClass( clazz.getName() );
                     loadClassFields( clazz,
                                      shortTypeName );
-                    builder.addFactType( shortTypeName );                    
+                    builder.addFactType( shortTypeName );
                 } catch ( IOException e ) {
                     errors.append( "\tError while inspecting class: " );
                     errors.append( classname );
@@ -174,15 +184,58 @@
                 }
             }
         }
+
+        // iterating over templates
+        populateFactTemplateTypes( pkgDescr,
+                                   pkg,
+                                   resolver,
+                                   errors );
     }
 
+    /**
+     * Iterates over fact templates and add them to the model definition
+     * 
+     * @param pkgDescr
+     */
+    private void populateFactTemplateTypes(PackageDescr pkgDescr,
+                                           PackageItem pkg,
+                                           ClassTypeResolver resolver,
+                                           StringBuffer errors) {
+        for ( Iterator it = pkgDescr.getFactTemplates().iterator(); it.hasNext(); ) {
+            FactTemplateDescr templ = (FactTemplateDescr) it.next();
+            String factType = templ.getName();
+            builder.addFactType( factType );
+
+            String[] fields = new String[templ.getFields().size()];
+            builder.addFieldsForType( factType,
+                                      fields );
+
+            int index = 0;
+            for ( Iterator fieldsIt = templ.getFields().iterator(); fieldsIt.hasNext(); ) {
+                FieldTemplateDescr fieldDescr = (FieldTemplateDescr) fieldsIt.next();
+                fields[index++] = fieldDescr.getName();
+                String fieldType = fieldDescr.getClassType();
+
+                Class fieldTypeClass = null;
+                try {
+                    fieldTypeClass = resolver.resolveType( fieldType );
+                } catch ( ClassNotFoundException e ) {
+                    errors.append( "\tClass not found: " );
+                    errors.append( fieldType );
+                    errors.append( "\n" );
+                }
+                builder.addFieldType( factType + "." + fieldDescr.getName(),
+                                      getFieldType( fieldTypeClass ) );
+            }
+        }
+    }
+
     private void loadClassFields(Class clazz,
                                  String shortTypeName) throws IOException {
         ClassFieldInspector inspector = new ClassFieldInspector( clazz );
         String[] fields = (String[]) inspector.getFieldNames().keySet().toArray( new String[inspector.getFieldNames().size()] );
 
-        fields = removeIrrelevantFields(fields);
-        
+        fields = removeIrrelevantFields( fields );
 
         builder.addFieldsForType( shortTypeName,
                                   fields );
@@ -195,7 +248,7 @@
     }
 
     String getShortNameOfClass(String clazz) {
-        return clazz.substring( clazz.lastIndexOf('.')+1 );
+        return clazz.substring( clazz.lastIndexOf( '.' ) + 1 );
     }
 
     /**
@@ -206,7 +259,7 @@
         List result = new ArrayList();
         for ( int i = 0; i < fields.length; i++ ) {
             String field = fields[i];
-            if (field.equals( "class" ) || field.equals( "hashCode" ) || field.equals( "toString" )) {
+            if ( field.equals( "class" ) || field.equals( "hashCode" ) || field.equals( "toString" ) ) {
                 //ignore
             } else {
                 result.add( field );
@@ -223,44 +276,45 @@
      */
     private Class loadClass(PackageItem pkg,
                             String classname,
-                            StringBuffer errors ) {
-        ByteArrayClassLoader loader = new ByteArrayClassLoader( this.getClass().getClassLoader() );
+                            StringBuffer errors) {
         Class clazz = null;
         try {
             // check if it is already in the classpath
             clazz = loader.loadClass( classname );
-            
+
         } catch ( ClassNotFoundException e1 ) {
-            
+
             // not found in the classpath, so check if it
             // is in a package model
             try {
 
-                    AssetItemIterator ait = pkg.listAssetsByFormat( new String[]{AssetFormats.MODEL} );
-                    while ( ait.hasNext() ) {
-                        AssetItem item = (AssetItem) ait.next();
-                        JarInputStream jis = new JarInputStream( item.getBinaryContentAttachment(),
-                                                                 false );
-                        JarEntry entry = null;
-                        byte[] buf = new byte[1024];
-                        int len = 0;
-                        while ( (entry = jis.getNextJarEntry()) != null ) {
-                            if ( !entry.isDirectory() ) {
-                                ByteArrayOutputStream out = new ByteArrayOutputStream();
-                                while( (len = jis.read( buf ) ) >=0 ) {
-                                    out.write( buf, 0, len );
-                                }
-                                loader.addResource( entry.getName(),
-                                                    out.toByteArray() );
+                AssetItemIterator ait = pkg.listAssetsByFormat( new String[]{AssetFormats.MODEL} );
+                while ( ait.hasNext() ) {
+                    AssetItem item = (AssetItem) ait.next();
+                    JarInputStream jis = new JarInputStream( item.getBinaryContentAttachment(),
+                                                             false );
+                    JarEntry entry = null;
+                    byte[] buf = new byte[1024];
+                    int len = 0;
+                    while ( (entry = jis.getNextJarEntry()) != null ) {
+                        if ( !entry.isDirectory() ) {
+                            ByteArrayOutputStream out = new ByteArrayOutputStream();
+                            while ( (len = jis.read( buf )) >= 0 ) {
+                                out.write( buf,
+                                           0,
+                                           len );
                             }
+                            loader.addResource( entry.getName(),
+                                                out.toByteArray() );
                         }
+                    }
 
                 }
                 clazz = loader.loadClass( classname );
             } catch ( IOException e ) {
-                throw new RulesRepositoryException ( e );
+                throw new RulesRepositoryException( e );
             } catch ( ClassNotFoundException e ) {
-                errors.append( "\tImported class not found: " );
+                errors.append( "\tClass not found: " );
                 errors.append( classname );
                 errors.append( "\n" );
             }
@@ -276,16 +330,18 @@
      */
     private String getFieldType(Class type) {
         String fieldType = null; // if null, will use standard operators
-        if ( type.isPrimitive() && (type != boolean.class) ) {
-            fieldType = SuggestionCompletionEngine.TYPE_NUMERIC;
-        } else if ( Number.class.isAssignableFrom( type ) ) {
-            fieldType = SuggestionCompletionEngine.TYPE_NUMERIC;
-        } else if ( String.class.isAssignableFrom( type ) ) {
-            fieldType = SuggestionCompletionEngine.TYPE_STRING;
-        } else if ( Collection.class.isAssignableFrom( type ) ) {
-            fieldType = SuggestionCompletionEngine.TYPE_COLLECTION;
-        } else if ( Comparable.class.isAssignableFrom( type ) ) {
-            fieldType = SuggestionCompletionEngine.TYPE_COMPARABLE;
+        if ( type != null ) {
+            if ( type.isPrimitive() && (type != boolean.class) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_NUMERIC;
+            } else if ( Number.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_NUMERIC;
+            } else if ( String.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_STRING;
+            } else if ( Collection.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_COLLECTION;
+            } else if ( Comparable.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_COMPARABLE;
+            } 
         }
         return fieldType;
     }

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java	2007-03-13 17:54:26 UTC (rev 10163)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java	2007-03-13 18:22:50 UTC (rev 10164)
@@ -14,6 +14,7 @@
         RulesRepository repo = new RulesRepository(SessionHelper.getSession());
         PackageItem item = repo.createPackage( "testLoader", "to test the loader" );
         item.updateHeader( "import java.util.Date" );
+        repo.save();
         
         SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
         SuggestionCompletionEngine engine = loader.getSuggestionEngine( item );
@@ -34,9 +35,33 @@
         assertEquals("Object", loader.getShortNameOfClass( Object.class.getName() ));
         
         assertEquals("Foo", loader.getShortNameOfClass( "Foo" ));
+    }
+    
+    public void testFactTemplates() throws Exception {
         
+        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        PackageItem item = repo.createPackage( "testLoader2", "to test the loader for fact templates" );
+        item.updateHeader( "import java.util.Date\ntemplate Person\njava.lang.String name\nDate birthDate\nend" );
+        repo.save();
         
+        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
+        SuggestionCompletionEngine engine = loader.getSuggestionEngine( item );
+        assertNotNull(engine);
+        String[] factTypes = engine.getFactTypes();
         
+        assertEquals( 2, factTypes.length );
+        assertEquals("Date", factTypes[0]);
+        assertEquals("Person", factTypes[1]);
+        
+        String[] fieldsForType = engine.getFieldCompletions( "Person" );
+        assertEquals( 2, fieldsForType.length );
+        assertEquals("name", fieldsForType[0]);
+        assertEquals("birthDate", fieldsForType[1]);
+        
+        String fieldType = engine.getFieldType( "Person", "name" );
+        assertEquals( SuggestionCompletionEngine.TYPE_STRING, fieldType );
+        fieldType = engine.getFieldType( "Person", "birthDate" );
+        assertEquals( SuggestionCompletionEngine.TYPE_COMPARABLE, fieldType );
     }
     
 }




More information about the jboss-svn-commits mailing list