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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Feb 9 14:05:17 EST 2007


Author: tirelli
Date: 2007-02-09 14:05:17 -0500 (Fri, 09 Feb 2007)
New Revision: 9411

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_primitiveArray.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java
Log:
JBRULES-657: fixing type resolver to resolve array classes

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-02-09 11:59:41 UTC (rev 9410)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-02-09 19:05:17 UTC (rev 9411)
@@ -3862,14 +3862,19 @@
 
         final Primitives p1 = new Primitives();
         p1.setPrimitiveArrayAttribute( new int[] { 1, 2, 3 } );
+        p1.setArrayAttribute( new String[] { "a","b" } );
 
         workingMemory.assertObject( p1 );
 
         workingMemory.fireAllRules();
-        assertEquals( 1,
+        assertEquals( 3,
                       result.size() );
         assertEquals( 3,
                       ((Integer)result.get( 0 )).intValue());
+        assertEquals( 2,
+                      ((Integer)result.get( 1 )).intValue());
+        assertEquals( 3,
+                      ((Integer)result.get( 2 )).intValue());
 
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_primitiveArray.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_primitiveArray.drl	2007-02-09 11:59:41 UTC (rev 9410)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_primitiveArray.drl	2007-02-09 19:05:17 UTC (rev 9411)
@@ -2,8 +2,32 @@
 
 global java.util.List result;
 
-rule "Test Array"
+function boolean testNonEmptyArray(int[] array) {
+   return array != null && array.length > 0;
+}
+
+function boolean isNonEmptyObjectArray(Object[] array) {
+   return array != null && array.length > 0;
+}
+
+rule "Primitive array in function" salience 20
   when
+    Primitives( $array : primitiveArrayAttribute )
+    eval( testNonEmptyArray($array) )
+  then
+     result.add( new Integer( $array.length ) );
+end
+
+rule "Primitive Array with Object in function" salience 10
+ when
+   Primitives( $sArray : arrayAttribute )
+   eval( isNonEmptyObjectArray($sArray) )
+ then
+     result.add( new Integer( $sArray.length ) );
+end
+
+rule "Test Array" salience 0
+  when
     Primitives( $array : primitiveArrayAttribute -> (($array != null) && ($array.length > 0)))
   then
     result.add( new Integer( $array.length ) );

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-02-09 11:59:41 UTC (rev 9410)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java	2007-02-09 19:05:17 UTC (rev 9411)
@@ -32,8 +32,9 @@
     private final ClassLoader classLoader;
 
     private Map               cachedImports = new HashMap();
+
     public ClassTypeResolver() {
-    		this( Collections.EMPTY_LIST );
+        this( Collections.EMPTY_LIST );
     }
 
     public ClassTypeResolver(final List imports) {
@@ -95,29 +96,53 @@
     /* (non-Javadoc)
      * @see org.drools.semantics.java.TypeResolver#resolveType(java.lang.String)
      */
-    public Class resolveType(final String className) throws ClassNotFoundException {
+    public Class resolveType(String className) throws ClassNotFoundException {
         Class clazz = null;
+        boolean isArray = false;
 
         //is the class a primitive?
-        if ( "boolean".equals( className )) {
+        if ( "boolean".equals( className ) ) {
             clazz = boolean.class;
         } else if ( "byte".equals( className ) ) {
-            clazz =  byte.class;
+            clazz = byte.class;
         } else if ( "short".equals( className ) ) {
-            clazz =  short.class;
+            clazz = short.class;
         } else if ( "char".equals( className ) ) {
-            clazz =  char.class;
+            clazz = char.class;
         } else if ( "int".equals( className ) ) {
-            clazz =  int.class;
+            clazz = int.class;
         } else if ( "long".equals( className ) ) {
-            clazz =  long.class;
+            clazz = long.class;
         } else if ( "float".equals( className ) ) {
-            clazz =  float.class;
+            clazz = float.class;
         } else if ( "double".equals( className ) ) {
-            clazz =  double.class;
+            clazz = double.class;
+            // Could also be a primitive array
+        } else if ( "boolean[]".equals( className ) ) {
+            clazz = boolean[].class;
+        } else if ( "byte[]".equals( className ) ) {
+            clazz = byte[].class;
+        } else if ( "short[]".equals( className ) ) {
+            clazz = short[].class;
+        } else if ( "char[]".equals( className ) ) {
+            clazz = char[].class;
+        } else if ( "int[]".equals( className ) ) {
+            clazz = int[].class;
+        } else if ( "long[]".equals( className ) ) {
+            clazz = long[].class;
+        } else if ( "float[]".equals( className ) ) {
+            clazz = float[].class;
+        } else if ( "double[]".equals( className ) ) {
+            clazz = double[].class;
+            // Could be primitive array of objects
+        } else if ( className.endsWith( "[]" ) ) {
+            String componentName = className.substring( 0,
+                                                        className.length() - 2 );
+            className = componentName;
+            isArray = true;
         }
-        
-        if( clazz == null ) {
+
+        if ( clazz == null ) {
             // Now try the package object type cache         
             clazz = lookupFromCache( className );
         }
@@ -144,15 +169,6 @@
                 }
             }
 
-            // make a last try using java.lang.* package
-            if( validClazzCandidates.isEmpty() ) {
-                clazz = importClass( "java.lang.*",
-                                     className );
-                if ( clazz != null ) {
-                    validClazzCandidates.add( clazz );
-                }
-            }
-
             // If there are more than one possible resolutions, complain about
             // the ambiguity
             if ( validClazzCandidates.size() > 1 ) {
@@ -174,10 +190,20 @@
         }
 
         // Now try the java.lang package
-        if (clazz == null) {
-        	clazz = defaultClass( className );
+        if ( clazz == null ) {
+            clazz = defaultClass( className );
         }
 
+        // If array component class was found, try to resolve the array class of it 
+        if( isArray && clazz != null ) {
+            String arrayClassName = new StringBuffer().append( "[L" ).append( clazz.getName() ).append( ";" ).toString();
+            try {
+                clazz = Class.forName( arrayClassName );
+            } catch ( ClassNotFoundException e ) {
+                clazz = null;
+            }
+        }
+        
         // We still can't find the class so throw an exception 
         if ( clazz == null ) {
             throw new ClassNotFoundException( "Unable to find class '" + className + "'" );
@@ -234,22 +260,23 @@
     }
 
     private Class defaultClass(String className) {
-		String qualifiedClass = "java.lang." + className;
-		Class clazz = null;
-		try {
-			clazz = this.classLoader.loadClass(qualifiedClass);
-		} catch (final ClassNotFoundException e) {
-			// do nothing
-		}
-		if (clazz != null) {
-			if (this.cachedImports == Collections.EMPTY_MAP) {
-				this.cachedImports = new HashMap();
-			}
-			this.cachedImports.put(className, clazz);
-		}
-		return clazz;
-	}
-    
+        String qualifiedClass = "java.lang." + className;
+        Class clazz = null;
+        try {
+            clazz = this.classLoader.loadClass( qualifiedClass );
+        } catch ( final ClassNotFoundException e ) {
+            // do nothing
+        }
+        if ( clazz != null ) {
+            if ( this.cachedImports == Collections.EMPTY_MAP ) {
+                this.cachedImports = new HashMap();
+            }
+            this.cachedImports.put( className,
+                                    clazz );
+        }
+        return clazz;
+    }
+
     public boolean isEmpty() {
         return this.imports.isEmpty();
     }




More information about the jboss-svn-commits mailing list