[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