[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