[Buix-commits] r1007 - in lutinjaxx/trunk/jaxx-core: . src/main/java/jaxx/compiler src/main/java/jaxx/runtime src/test/java/jaxx/runtime
Author: tchemit Date: 2008-10-30 12:36:43 +0000 (Thu, 30 Oct 2008) New Revision: 1007 Added: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JAXXAction.java lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/DefaultJAXXContextTest.java Modified: lutinjaxx/trunk/jaxx-core/changelog lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXObjectGenerator.java lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java Log: improve JAXXContext : - fix setContextValue bug when setting twice a same type for a same key - implements a DefaultJAXXContext - use this default implementation with delegate pattern in JAXXObject Modified: lutinjaxx/trunk/jaxx-core/changelog =================================================================== --- lutinjaxx/trunk/jaxx-core/changelog 2008-10-27 20:33:29 UTC (rev 1006) +++ lutinjaxx/trunk/jaxx-core/changelog 2008-10-30 12:36:43 UTC (rev 1007) @@ -1,4 +1,9 @@ ver-0-6 chemit 200811?? + * 20081030 [chemit] improve JAXXContext : + - fix setContextValue bug when setting twice a same type for a same key + - implements a DefaultJAXXContext + - use this default implementation with delegate pattern in JAXXObject + * 20081030 [chemit] add JAXXAction contract to simplify init of ui with JAXXInitialContext * 20081027 [chemit] fix bug 1722 * 20081027 [chemit] add conversion support in validator * 20081025 [chemit] improve BeanValidator tag : Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXObjectGenerator.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXObjectGenerator.java 2008-10-27 20:33:29 UTC (rev 1006) +++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXObjectGenerator.java 2008-10-30 12:36:43 UTC (rev 1007) @@ -142,7 +142,7 @@ javaFile.addImport("jaxx.runtime.validator.BeanValidator"); javaFile.addImport("jaxx.runtime.JAXXInitialContext"); - + if (compiler.getStylesheet() != null) { javaFile.addField(new JavaField(0, "java.util.Map", "$previousValues", "new java.util.HashMap()")); } @@ -182,24 +182,25 @@ javaFile.addMethod(createProcessDataBindingMethod()); + javaFile.addField(createJAXXObjectDescriptorField()); + javaFile.addMethod(createGetJAXXObjectDescriptorMethod()); + if (!superclassIsJAXXObject) { javaFile.addField(createObjectMap()); javaFile.addMethod(createGetObjectByIdMethod()); + + /* + * Gestion du context + */ + javaFile.addField(createContextField()); + javaFile.addMethod(createSetContextValueMethod()); + javaFile.addMethod(createSetContextValueNameMethod()); + javaFile.addMethod(createGetContextValueMethod()); + javaFile.addMethod(createGetContextValueNameMethod()); + javaFile.addMethod(createGetParentContainer()); + javaFile.addMethod(createGetParentContainerMore()); } - javaFile.addField(createJAXXObjectDescriptorField()); - javaFile.addMethod(createGetJAXXObjectDescriptorMethod()); - - /* - * Gestion du context - */ - javaFile.addField(createContextField()); - javaFile.addMethod(createSetContextValueMethod()); - javaFile.addMethod(createSetContextValueNameMethod()); - javaFile.addMethod(createGetContextValueMethod()); - javaFile.addMethod(createGetContextValueNameMethod()); - javaFile.addMethod(createGetParentContainer()); - javaFile.addMethod(createGetParentContainerMore()); ClassDescriptor currentClass = root.getObjectClass(); MethodDescriptor firePropertyChange = null; while (firePropertyChange == null && currentClass != null) { @@ -249,7 +250,7 @@ } private JavaField createContextField() { - return new JavaField(Modifier.PROTECTED, "Map<Object,String>", "$contextMap", "new HashMap<Object,String>()"); + return new JavaField(Modifier.PROTECTED, "jaxx.runtime.JAXXContext", "delegateContext", "new jaxx.runtime.DefaultJAXXContext(this);"); } private JavaField createLoggerField(String className) { @@ -413,7 +414,7 @@ code.append(JAXXCompiler.getLineSeparator()); code.append("$initialize();"); code.append(JAXXCompiler.getLineSeparator()); - JavaArgument arg = new JavaArgument("jaxx.runtime.JAXXInitialContext","initialContext"); + JavaArgument arg = new JavaArgument("jaxx.runtime.JAXXInitialContext", "initialContext"); return new JavaMethod(Modifier.PUBLIC, null, className, new JavaArgument[]{arg}, null, code.toString()); } @@ -542,44 +543,27 @@ /*-- Create methods code ----------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/ private String getSetContextValueMethodCode() { - return "this.setContextValue(clazz, null);"; + return "delegateContext.setContextValue(clazz, null);"; } private String getSetContextValueNameMethodCode() { - StringBuffer result = new StringBuffer(); - result.append("$contextMap.put(clazz, name);"); - return result.toString(); + return "delegateContext.setContextValue(clazz, name);"; } private String getGetContextValueMethodCode() { - return "return this.getContextValue(clazz, null);"; + return "return delegateContext.getContextValue(clazz, null);"; } private String getGetContextValueNameMethodCode() { - StringBuffer result = new StringBuffer(); - result.append("for (Map.Entry<Object,String> entry : $contextMap.entrySet()) {"); - result.append("if (clazz.isAssignableFrom(entry.getKey().getClass()) && (name == null || name == entry.getValue())) {"); - result.append("return (T) entry.getKey();}}"); - result.append("return null;"); - return result.toString(); + return "return delegateContext.getContextValue(clazz, name);"; } private String getGetParentContenerMethodCode() { - StringBuffer result = new StringBuffer(); - result.append("return this.getParentContainer(this, clazz);"); - return result.toString(); + return "return delegateContext.getParentContainer(clazz);"; } private String getGetParentContenerMethodMoreCode() { - StringBuffer result = new StringBuffer(); - result.append("if (!Container.class.isAssignableFrom(source.getClass())) {return null;}"); - result.append(JAXXCompiler.getLineSeparator()); - result.append("Container parent = ((Container)source).getParent();"); - result.append(JAXXCompiler.getLineSeparator()); - result.append("if (parent != null && !clazz.isAssignableFrom(parent.getClass())){parent = getParentContainer(parent, clazz);}"); - result.append(JAXXCompiler.getLineSeparator()); - result.append("return (O)parent;"); - return result.toString(); + return "return delegateContext.getParentContainer(source, clazz);"; } protected String getCreationCode(CompiledObject object) throws CompilerException { Added: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java (rev 0) +++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java 2008-10-30 12:36:43 UTC (rev 1007) @@ -0,0 +1,95 @@ +package jaxx.runtime; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.awt.Container; +import java.util.HashMap; +import java.util.Map; + +/** + * The default {@link JAXXContext} to beused in a {@link JAXXObject} by delegation. + * + * @author chemit + */ +public class DefaultJAXXContext implements JAXXContext { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private final Log log = LogFactory.getLog(DefaultJAXXContext.class); + + /** l'ui auquel est rattache le context */ + protected JAXXObject ui; + + /** les données contenues dans le context */ + protected final Map<Object, String> data; + + public DefaultJAXXContext() { + data = new HashMap<Object, String>(); + } + + public DefaultJAXXContext(JAXXObject ui) { + this(); + this.ui = ui; + } + + public void setContextValue(Object o) { + setContextValue(o, null); + } + + public void setContextValue(Object o, String name) { + // first remove + Object toRemove = getContextValue(o.getClass(), name); + if (toRemove != null) { + log.info("remove previously value " + toRemove); + data.remove(toRemove); + } + // then can put safely + data.put(o, name); + } + + public <T> T getContextValue(Class<T> clazz) { + return getContextValue(clazz, null); + } + + @SuppressWarnings({"unchecked"}) + public <T> T getContextValue(Class<T> clazz, String name) { + for (Map.Entry<Object, String> entry : data.entrySet()) { + if (clazz.isAssignableFrom(entry.getKey().getClass()) && (name == null || name.equals(entry.getValue()))) { + return (T) entry.getKey(); + } + } + //todo pas trouve dans ce context, on devrait rechercher dans les parents de l'ui ? + return null; + } + + + public <O extends Container> O getParentContainer(Class<O> clazz) { + return this.getParentContainer(ui, clazz); + } + + @SuppressWarnings({"unchecked"}) + public <O extends Container> O getParentContainer(Object top, Class<O> clazz) { + if (ui == null) { + throw new IllegalStateException("no ui attached to this context"); + } + if (top==null) { + throw new IllegalArgumentException("top parameter can not be null"); + } + if (!Container.class.isAssignableFrom(top.getClass())) { + throw new IllegalArgumentException("top parameter "+top + " is not a " + Container.class); + } + Container parent = ((Container) top).getParent(); + if (parent != null && !clazz.isAssignableFrom(parent.getClass())) { + parent = getParentContainer(parent, clazz); + } + return (O) parent; + } + + protected JAXXObject getUi() { + return ui; + } + + protected void setUi(JAXXObject ui) { + this.ui = ui; + } +} Added: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JAXXAction.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JAXXAction.java (rev 0) +++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JAXXAction.java 2008-10-30 12:36:43 UTC (rev 1007) @@ -0,0 +1,18 @@ +package jaxx.runtime; + +/** + * This is the contract to be realized by any class to be used as Action class for an ui. + * + * @author chemit + */ +public interface JAXXAction { + + /** + * Prepare the initial context of the ui. + * + * @param parentContent the context of the parent of the ui (can be null if no parent is required) + * @return the {@link jaxx.runtime.JAXXInitialContext} to be injected in the ui via the constructor of the {@link jaxx.runtime.JAXXObject} + */ + JAXXInitialContext init(JAXXContext parentContent); + +} Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java 2008-10-27 20:33:29 UTC (rev 1006) +++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java 2008-10-30 12:36:43 UTC (rev 1007) @@ -38,7 +38,7 @@ public class Util { /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(Util.class); + static private final Log log = LogFactory.getLog(Util.class); // Maps root objects to lists of event listeners Added: lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/DefaultJAXXContextTest.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/DefaultJAXXContextTest.java (rev 0) +++ lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/DefaultJAXXContextTest.java 2008-10-30 12:36:43 UTC (rev 1007) @@ -0,0 +1,138 @@ +package jaxx.runtime; + +import jaxx.runtime.validator.BeanValidator; +import junit.framework.TestCase; + +import java.awt.Container; +import java.util.List; +import java.util.Map; + +/** @author chemit */ +public class DefaultJAXXContextTest extends TestCase { + + JAXXContext ctxt; + + @Override + protected void setUp() throws Exception { + super.setUp(); + // instanciate a new empty context + ctxt = new DefaultJAXXContext(); + } + + public void testParentContainer() throws Exception { + try { + ctxt.getParentContainer(Container.class); + fail(); + } catch (IllegalStateException e) { + assertTrue(true); + } + try { + ctxt.getParentContainer("null", Container.class); + fail(); + } catch (IllegalStateException e) { + assertTrue(true); + } + + // attach a fake ui (which is NOT a Container) + ((DefaultJAXXContext) ctxt).setUi(new MyJAXXObject()); + try { + ctxt.getParentContainer(Container.class); + fail(); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + + try { + ctxt.getParentContainer(null, Container.class); + fail(); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + + try { + ctxt.getParentContainer("null", Container.class); + fail(); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + + //todo finish test with a real JAXXObject + + } + + public void testSetGetContextValue() throws Exception { + String expected; + String result; + + result = ctxt.getContextValue(String.class); + assertNull(result); + + expected = "yo"; + ctxt.setContextValue(expected); + result = ctxt.getContextValue(String.class); + assertEquals(expected, result); + + expected = "ya"; + ctxt.setContextValue(expected, "second"); + result = ctxt.getContextValue(String.class, "second"); + assertEquals(expected, result); + + expected = "yi"; + ctxt.setContextValue(expected, "second"); + result = ctxt.getContextValue(String.class, "second"); + assertEquals(expected, result); + } + + private static class MyJAXXObject implements JAXXObject { + + public Object getObjectById(String id) { + return null; + } + + public Map<String, Object> get$objectMap() { + return null; + } + + public void applyDataBinding(String id) { + } + + public void removeDataBinding(String id) { + } + + public void processDataBinding(String dest) { + } + + public void firePropertyChange(String name, Object oldValue, Object newValue) { + } + + public void setContextValue(Object o) { + } + + public void setContextValue(Object o, String name) { + } + + public <T> T getContextValue(Class<T> clazz) { + return null; + } + + public <T> T getContextValue(Class<T> clazz, String name) { + return null; + } + + public <O extends Container> O getParentContainer(Class<O> clazz) { + return null; + } + + public <O extends Container> O getParentContainer(Object top, Class<O> clazz) { + return null; + } + + public BeanValidator<?> getValidator(String validatorId) { + return null; + } + + public List<String> getValidatorIds() { + return null; + } + } +}
participants (1)
-
tchemit@users.labs.libre-entreprise.org