Author: michiel
Date: 2010-05-03 16:40:42 +0200 (Mon, 03 May 2010)
New Revision: 42091

Added:
   mmbase/trunk/bridge/src/main/config/utils/nodeevents.xml
   mmbase/trunk/bridge/src/test/java/org/mmbase/core/
   mmbase/trunk/bridge/src/test/java/org/mmbase/core/event/
   mmbase/trunk/bridge/src/test/java/org/mmbase/core/event/NodeEventTest.java
Modified:
   mmbase/trunk/bridge/src/main/java/org/mmbase/core/event/NodeEvent.java
Log:
MMB-1850

Added: mmbase/trunk/bridge/src/main/config/utils/nodeevents.xml
===================================================================
--- mmbase/trunk/bridge/src/main/config/utils/nodeevents.xml                    
        (rev 0)
+++ mmbase/trunk/bridge/src/main/config/utils/nodeevents.xml    2010-05-03 
14:40:42 UTC (rev 42091)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!DOCTYPE util PUBLIC "-//MMBase//DTD util config 1.0//EN" 
"http://www.mmbase.org/dtd/util_1_0.dtd";>
+<util>
+  <properties>
+    <property name="unacceptable">[B</property>
+    <!-- strings can become quite big too! -->
+    <property name="unacceptable">[B,java.lang.String</property>
+    -->
+    <property name="required">java.io.Serializable</property>
+  </properties>
+</util>

Modified: mmbase/trunk/bridge/src/main/java/org/mmbase/core/event/NodeEvent.java
===================================================================
--- mmbase/trunk/bridge/src/main/java/org/mmbase/core/event/NodeEvent.java      
2010-05-03 13:52:03 UTC (rev 42090)
+++ mmbase/trunk/bridge/src/main/java/org/mmbase/core/event/NodeEvent.java      
2010-05-03 14:40:42 UTC (rev 42091)
@@ -10,6 +10,7 @@
 import java.util.*;
 
 import org.mmbase.util.HashCodeUtil;
+import org.mmbase.util.xml.UtilReader;
 import org.mmbase.cache.Cache;
 import org.mmbase.cache.CacheManager;
 import org.mmbase.util.logging.Logger;
@@ -29,6 +30,9 @@
 
     private static final long serialVersionUID = 1L;
 
+    private static Class[] unacceptableValueTypes = new Class[] { byte[].class 
};
+    private static Class[] requiredValueTypes = new Class[] { 
Serializable.class };
+
     /**
      * Event type speicfic for MMBase nodes.
      */
@@ -48,15 +52,24 @@
         Set<String> toremove = new HashSet<String>();
         Map<String, Object> newMap = new HashMap<String, Object>();
         synchronized(values) {
+            ENTRIES:
             for (Map.Entry<String, Object> entry : values.entrySet()) {
                 Object value = entry.getValue();
                 if (value != null) {
-                    if (value instanceof byte[]) {
-                        toremove.add(entry.getKey());
-                    } else if (! (value instanceof java.io.Serializable)) {
-                        log.warn("Found non serializable '" + entry.getKey() + 
"' in " + values);
-                        toremove.add(entry.getKey());
+                    for (Class clazz : requiredValueTypes) {
+                        if (! clazz.isInstance(value)) {
+                            log.warn("Found non " + clazz + "'" + 
entry.getKey() + "' in " + values);
+                            toremove.add(entry.getKey());
+                            continue ENTRIES;
+                        }
                     }
+                    for (Class clazz : unacceptableValueTypes) {
+                        if (clazz.isInstance(value)) {
+                            log.debug("Found  " + clazz + "'" + entry.getKey() 
+ "' in " + values);
+                            toremove.add(entry.getKey());
+                            continue ENTRIES;
+                        }
+                    }
                 }
             }
             newMap.putAll(values);
@@ -67,7 +80,61 @@
         return Collections.unmodifiableMap(newMap);
     }
 
+    static void setUnacceptableValueTypes(Class[] types) {
+        unacceptableValueTypes = types;
+    }
 
+    static void setRequiredValueTypes(Class[] types) {
+        requiredValueTypes = types;
+    }
+    public static Class[] getUnacceptableValueTypes() {
+        return unacceptableValueTypes;
+    }
+    public static Class[] getRequiredValueTypes() {
+        return requiredValueTypes;
+    }
+
+
+    static final UtilReader properties = new UtilReader("nodeevents.xml", new 
Runnable() {
+            @Override
+            public void run() {
+                configure();
+            }
+        });
+    static void configure() {
+        log.info("Reading " + properties);
+        {
+            String[] unacceptable = 
properties.getProperties().get("unacceptable").split(",");
+            List<Class> classes = new ArrayList<Class>();
+            for (String clazz : unacceptable) {
+                try {
+                    classes.add(Class.forName(clazz));
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+            log.info("Setting unacceptable values types for NodeEvents to " + 
classes);
+            setUnacceptableValueTypes(classes.toArray(new Class[] {}));
+        }
+        {
+            String[] required = 
properties.getProperties().get("required").split(",");
+            List<Class> classes = new ArrayList<Class>();
+            for (String clazz : required) {
+                try {
+                    classes.add(Class.forName(clazz));
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+            log.info("Setting unacceptable values types for NodeEvents to " + 
classes);
+            setRequiredValueTypes(classes.toArray(new Class[] {}));
+        }
+    }
+    static {
+        configure();
+    }
+
+
     private final int nodeNumber;
     private final String builderName;
 

Added: 
mmbase/trunk/bridge/src/test/java/org/mmbase/core/event/NodeEventTest.java
===================================================================
--- mmbase/trunk/bridge/src/test/java/org/mmbase/core/event/NodeEventTest.java  
                        (rev 0)
+++ mmbase/trunk/bridge/src/test/java/org/mmbase/core/event/NodeEventTest.java  
2010-05-03 14:40:42 UTC (rev 42091)
@@ -0,0 +1,28 @@
+package org.mmbase.core.event;
+
+import java.io.*;
+import java.util.*;
+import org.junit.*;
+import static org.junit.Assert.*;
+
+
+/**
+ *
+ * @author Michiel Meeuwissen
+ * @version $Id: MockTest.java 41950 2010-04-19 11:16:24Z michiel $
+ */
+public class NodeEventTest  {
+
+    @Test
+    public void basic() throws Exception {
+        Map<String, Object> newValues = new HashMap<String, Object>();
+        newValues.put("a", "AA");
+        newValues.put("b", new byte[] { 0, 1, 2} );
+        System.out.println("required: " + 
Arrays.asList(NodeEvent.getRequiredValueTypes()));
+        System.out.println("unacceptable: " + 
Arrays.asList(NodeEvent.getUnacceptableValueTypes()));
+        NodeEvent ev = new NodeEvent("localhost", "object", 123, null, 
newValues, Event.TYPE_CHANGE);
+        newValues.put("a", "BB");
+        assertEquals("AA", ev.getNewValue("a"));
+        assertEquals(null, ev.getNewValue("b"));
+    }
+}

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to