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