From: <jbo...@li...> - 2006-02-06 07:49:50
|
Author: mic...@jb... Date: 2006-02-06 02:49:39 -0500 (Mon, 06 Feb 2006) New Revision: 2276 Added: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowUpdater.java Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ProxyGenerator.java trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowedFactInterceptor.java trunk/labs/jbossrules/drools-core/src/test/java/org/drools/util/proxy/ProxyGeneratorTest.java Log: shadow can now refresh data Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ProxyGenerator.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ProxyGenerator.java 2006-02-06 07:32:52 UTC (rev 2275) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ProxyGenerator.java 2006-02-06 07:49:39 UTC (rev 2276) @@ -29,6 +29,7 @@ //cache the generated classes, and lists of indexable "fields" on each pojo class static Map cache = new HashMap(); + /** In this version, change listening features will be added to the pojo, based on bean properties */ public static Object generateChangeListenerProxy(Object pojo) throws IOException { Class cls = pojo.getClass(); GeneratedEntry holder = getEntryFor(cls); @@ -59,7 +60,7 @@ GeneratedEntry entry = (GeneratedEntry) cache.get(pojoClass); if (entry == null) { entry = new GeneratedEntry(); - entry.instanceFactory = createInstanceFactory(pojoClass, new Class[] {ChangeListener.class}); + entry.instanceFactory = createInstanceFactory(pojoClass, new Class[] {ChangeListener.class, ShadowUpdater.class}); entry.fieldMethods = extractFieldMethodsInOrder(pojoClass); cache.put(pojoClass, entry); } Added: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowUpdater.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowUpdater.java 2006-02-06 07:32:52 UTC (rev 2275) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowUpdater.java 2006-02-06 07:49:39 UTC (rev 2276) @@ -0,0 +1,14 @@ +package org.drools.util.proxy; + +/** + * Shadow proxies provide this + * so that a field can be updated if a change is detected. + * + * @author Michael Neale + * + */ +public interface ShadowUpdater { + + public void refreshShadowCopies(); + +} Property changes on: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowUpdater.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowedFactInterceptor.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowedFactInterceptor.java 2006-02-06 07:32:52 UTC (rev 2275) +++ trunk/labs/jbossrules/drools-core/src/main/java/org/drools/util/proxy/ShadowedFactInterceptor.java 2006-02-06 07:49:39 UTC (rev 2276) @@ -27,40 +27,44 @@ */ public class ShadowedFactInterceptor extends FactInterceptor { - private final Object[] values; - private final Map fieldToValue; + private Map fieldToValue; private final Object target; + private final Method[] fieldMethods; public ShadowedFactInterceptor(Object target, Method[] fieldMethods) { + this.target = target; + this.fieldMethods = fieldMethods; + refreshShadowCopies(); + } - this.target = target; - + + private void refreshShadowCopies() { fieldToValue = new HashMap(); int numOfFields = fieldMethods.length; - values = new Object[numOfFields]; try { for ( int i = 0; i < numOfFields; i++ ) { //read all the objects into a value array Method method = fieldMethods[i]; Object val = method.invoke( target, null); - values[i] = fieldMethods[i].invoke( target, - null ); fieldToValue.put(method, val); } } catch ( Exception e ) { throw new IllegalStateException( e ); } - } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { - + + if (method.getDeclaringClass() == ShadowUpdater.class) { + refreshShadowCopies(); + return null; + } //check if method is in targetFields Object val = fieldToValue.get(method); if (val != null) { Modified: trunk/labs/jbossrules/drools-core/src/test/java/org/drools/util/proxy/ProxyGeneratorTest.java =================================================================== --- trunk/labs/jbossrules/drools-core/src/test/java/org/drools/util/proxy/ProxyGeneratorTest.java 2006-02-06 07:32:52 UTC (rev 2275) +++ trunk/labs/jbossrules/drools-core/src/test/java/org/drools/util/proxy/ProxyGeneratorTest.java 2006-02-06 07:49:39 UTC (rev 2276) @@ -25,6 +25,9 @@ assertEquals("michael", p.getName()); //ooh clever... assertEquals("jo", original.getName()); + ((ShadowUpdater) p).refreshShadowCopies(); + assertEquals("jo", p.getName()); + } public void testChangeListener() throws IOException { |