[jboss-svn-commits] JBL Code SVN: r11355 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/base and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Apr 26 09:52:12 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-04-26 09:52:12 -0400 (Thu, 26 Apr 2007)
New Revision: 11355
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/TypeResolver.java
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
labs/jbossrules/trunk/drools-core/src/test/java/org/codehaus/jfdi/interpreter/ClassTypeResolverTest.java
Log:
JBRULES-713 Make Dialects Pluggeable
-Moved the ClassTypeResolver in the JFDI namespace to org.drools.base
-Added a dialect field to Rule.
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java (from rev 11328, labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/ClassTypeResolver.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java 2007-04-26 13:52:12 UTC (rev 11355)
@@ -0,0 +1,298 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ClassTypeResolver
+ implements
+ TypeResolver {
+ private List imports;
+
+ private ClassLoader classLoader;
+
+ private Map cachedImports = new HashMap();
+
+ private static final 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" );
+ }
+
+ public ClassTypeResolver() {
+ this( Collections.EMPTY_LIST );
+ }
+
+ public ClassTypeResolver(final List imports) {
+ this( imports,
+ null );
+ }
+
+ public ClassTypeResolver(final List imports,
+ ClassLoader classLoader) {
+ this.imports = imports;
+
+ if ( classLoader == null ) {
+ classLoader = Thread.currentThread().getContextClassLoader();
+ }
+
+ if ( classLoader == null ) {
+ classLoader = getClass().getClassLoader();
+ }
+
+ this.classLoader = classLoader;
+ }
+
+ public void setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.drools.semantics.base.Importer#getImports( Class clazz )
+ */
+ /* (non-Javadoc)
+ * @see org.drools.semantics.java.TypeResolver#getImports()
+ */
+ public List getImports() {
+ return this.imports;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.drools.semantics.base.Importer#addImports(org.drools.spi.ImportEntry)
+ */
+ /* (non-Javadoc)
+ * @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 );
+ }
+ }
+
+ public Class lookupFromCache(final String className) {
+ return (Class) this.cachedImports.get( className );
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.drools.semantics.base.Importer#importClass(java.lang.ClassLoader,
+ * java.lang.String)
+ */
+ /* (non-Javadoc)
+ * @see org.drools.semantics.java.TypeResolver#resolveType(java.lang.String)
+ */
+ public Class resolveType(String className) throws ClassNotFoundException {
+ Class clazz = null;
+ boolean isArray = false;
+ final StringBuffer arrayClassName = new StringBuffer();
+
+ //is the class a primitive type ?
+ if ( internalNamesMap.containsKey( className ) ) {
+ clazz = Class.forName( "[" + internalNamesMap.get( className ),
+ true,
+ this.classLoader ).getComponentType();
+ // Could also be a primitive array
+ } else if ( className.indexOf( '[' ) > 0 ) {
+ isArray = true;
+ int bracketIndex = className.indexOf( '[' );
+ final String componentName = className.substring( 0,
+ bracketIndex );
+ arrayClassName.append( '[' );
+ while ( (bracketIndex = className.indexOf( '[',
+ bracketIndex + 1 )) > 0 ) {
+ arrayClassName.append( '[' );
+ }
+ className = componentName;
+ }
+
+ if ( clazz == null ) {
+ // Now try the package object type cache
+ clazz = lookupFromCache( className );
+ }
+
+ // try loading className
+ if ( clazz == null ) {
+ try {
+ clazz = this.classLoader.loadClass( className );
+ } catch ( final ClassNotFoundException e ) {
+ clazz = null;
+ }
+ }
+
+ // Now try the className with each of the given imports
+ if ( clazz == null ) {
+ final Set validClazzCandidates = new HashSet();
+
+ final Iterator it = this.imports.iterator();
+ while ( it.hasNext() ) {
+ clazz = importClass( (String) it.next(),
+ className );
+ if ( clazz != null ) {
+ validClazzCandidates.add( clazz );
+ }
+ }
+
+ // If there are more than one possible resolutions, complain about
+ // the ambiguity
+ if ( validClazzCandidates.size() > 1 ) {
+ final StringBuffer sb = new StringBuffer();
+ final Iterator clazzCandIter = validClazzCandidates.iterator();
+ while ( clazzCandIter.hasNext() ) {
+ if ( 0 != sb.length() ) {
+ sb.append( ", " );
+ }
+ sb.append( ((Class) clazzCandIter.next()).getName() );
+ }
+ throw new Error( "Unable to find unambiguously defined class '" + className + "', candidates are: [" + sb.toString() + "]" );
+ } else if ( validClazzCandidates.size() == 1 ) {
+ clazz = (Class) validClazzCandidates.toArray()[0];
+ } else {
+ clazz = null;
+ }
+
+ }
+
+ // Now try the java.lang package
+ if ( clazz == null ) {
+ clazz = defaultClass( className );
+ }
+
+ // If array component class was found, try to resolve the array class of it
+ if ( isArray ) {
+ if ( clazz == null && internalNamesMap.containsKey( className ) ) {
+ arrayClassName.append( internalNamesMap.get( className ) );
+ } else {
+ 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( ";" );
+ }
+ }
+ try {
+ clazz = Class.forName( arrayClassName.toString() );
+ } catch ( final 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 + "'" );
+ }
+
+ return clazz;
+ }
+
+ private Class importClass(final String importText,
+ final String className) {
+ String qualifiedClass = null;
+ Class clazz = null;
+
+ // not python
+ if ( importText.endsWith( "*" ) ) {
+ qualifiedClass = importText.substring( 0,
+ importText.indexOf( '*' ) ) + className;
+ } else if ( importText.endsWith( "." + className ) ) {
+ qualifiedClass = importText;
+ } else if ( importText.equals( className ) ) {
+ qualifiedClass = importText;
+ }
+
+ if ( qualifiedClass != null ) {
+ try {
+ clazz = this.classLoader.loadClass( qualifiedClass );
+ } catch ( final ClassNotFoundException e ) {
+ clazz = null;
+ }
+
+ // maybe its a nested class?
+ if ( clazz == null ) {
+ try {
+ final int lastIndex = qualifiedClass.lastIndexOf( '.' );
+ qualifiedClass = qualifiedClass.substring( 0,
+ lastIndex ) + "$" + qualifiedClass.substring( lastIndex + 1 );
+ clazz = this.classLoader.loadClass( qualifiedClass );
+ } catch ( final ClassNotFoundException e ) {
+ clazz = null;
+ }
+ }
+ }
+
+ if ( clazz != null ) {
+ if ( this.cachedImports == Collections.EMPTY_MAP ) {
+ this.cachedImports = new HashMap();
+ }
+
+ this.cachedImports.put( className,
+ clazz );
+ }
+
+ return clazz;
+ }
+
+ private Class defaultClass(final String className) {
+ final 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();
+ }
+}
\ No newline at end of file
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/TypeResolver.java (from rev 11296, labs/jbossrules/trunk/drools-core/src/main/java/org/codehaus/jfdi/interpreter/TypeResolver.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/TypeResolver.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/TypeResolver.java 2007-04-26 13:52:12 UTC (rev 11355)
@@ -0,0 +1,12 @@
+package org.drools.base;
+
+import java.util.List;
+
+public interface TypeResolver {
+ public List getImports();
+
+ public void addImport(String importEntry);
+
+ public Class resolveType(String className) throws ClassNotFoundException;
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java 2007-04-26 13:47:50 UTC (rev 11354)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java 2007-04-26 13:52:12 UTC (rev 11355)
@@ -65,6 +65,8 @@
private Declaration[] declarationArray;
private GroupElement lhsRoot;
+
+ private String dialect;
private String agendaGroup;
@@ -141,7 +143,17 @@
null,
AgendaGroup.MAIN );
}
+
+
+ public String getDialect() {
+ return dialect;
+ }
+
+ public void setDialect(String dialect) {
+ this.dialect = dialect;
+ }
+
/**
* Set the truthness duration. This causes a delay before the firing of the
* <code>Consequence</code> if the rule is still true at the end of the
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/codehaus/jfdi/interpreter/ClassTypeResolverTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/codehaus/jfdi/interpreter/ClassTypeResolverTest.java 2007-04-26 13:47:50 UTC (rev 11354)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/codehaus/jfdi/interpreter/ClassTypeResolverTest.java 2007-04-26 13:52:12 UTC (rev 11355)
@@ -8,6 +8,7 @@
import junit.framework.TestCase;
import org.drools.Cheese;
+import org.drools.base.ClassTypeResolver;
/**
* @author fburlet
More information about the jboss-svn-commits
mailing list