Author: michiel
Date: 2010-05-03 16:48:56 +0200 (Mon, 03 May 2010)
New Revision: 42092
Added:
mmbase/branches/MMBase-1_9/core/src/main/config/utils/nodeevents.xml
Modified:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEvent.java
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEventHelper.java
Log:
MMB-1850
Added: mmbase/branches/MMBase-1_9/core/src/main/config/utils/nodeevents.xml
===================================================================
--- mmbase/branches/MMBase-1_9/core/src/main/config/utils/nodeevents.xml
(rev 0)
+++ mmbase/branches/MMBase-1_9/core/src/main/config/utils/nodeevents.xml
2010-05-03 14:48:56 UTC (rev 42092)
@@ -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/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEvent.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEvent.java
2010-05-03 14:40:42 UTC (rev 42091)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEvent.java
2010-05-03 14:48:56 UTC (rev 42092)
@@ -10,9 +10,9 @@
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.module.core.MMBase;
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;
@@ -30,26 +30,125 @@
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.
*/
public static final int TYPE_RELATION_CHANGE = 3;
+ private static final Map<String, Object> EMPTY =
Collections.unmodifiableMap(new HashMap<String, Object>());
+ private static final Object EMPTIED = null;
+
+ /**
+ * Removes all non-serializable values, and all values we don't want to
serialize (binaries,
+ * because they are too big). This is put in a new (to not reflect further
changes) unmodifiable map and returned.
+ */
+ private static Map<String, Object> values(final Map<String, Object>
values) {
+ if (values.size() == 0) {
+ return Collections.unmodifiableMap(values);
+ }
+ 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) {
+ 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);
+ }
+ for (String k : toremove) {
+ newMap.put(k, EMPTIED);
+ }
+ 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 String builderName;
+ private final String builderName;
private final Map<String, Object> oldValues;
private final Map<String, Object> newValues;
- private static final Map<String, Object> EMPTY =
Collections.unmodifiableMap(new HashMap<String, Object>());
/**
- *...@param machineName (MMBase) name of the server
- *...@param builderName name of builder of node event is about
- *...@param oldValues map with fields and their values that have been
changed by the event. This may be <code>null</code>
- *...@param newValues map with new values of changed fields
- *...@param eventType the type of event
- **/
+ * @param machineName (MMBase) name of the server
+ * @param builderName name of builder of node event is about
+ * @param oldValues map with fields and their values that have been
changed by the event. This may be <code>null</code>
+ * @param newValues map with new values of changed fields
+ * @param eventType the type of event
+ */
public NodeEvent(String machineName, String builderName, int nodeNumber,
final Map<String, Object> oldValues, final Map<String, Object> newValues, int
eventType ){
super(machineName, eventType);
this.builderName = builderName;
@@ -57,16 +156,12 @@
if (oldValues == null) {
this.oldValues = EMPTY;
} else {
- synchronized(oldValues) {
- this.oldValues = Collections.unmodifiableMap(new
HashMap<String, Object>(oldValues));
- }
+ this.oldValues = values(oldValues);
}
if (newValues == null) {
this.newValues = EMPTY;
} else {
- synchronized(newValues) {
- this.newValues = Collections.unmodifiableMap(new
HashMap<String, Object>(newValues));
- }
+ this.newValues = values(newValues);
}
}
@@ -123,6 +218,7 @@
}
+ @Override
public String toString() {
StringBuilder buf = new StringBuilder("Node event: '");
buf.append(getEventTypeGuiName(eventType)).append( "', node:
").append(nodeNumber).append(", nodetype: ").append(builderName);
@@ -153,18 +249,6 @@
/**
- * I think this method is not needed.
- * @deprecated
- */
- /*
- public NodeEvent clone(String builderName) {
- NodeEvent clone = (NodeEvent) super.clone();
- clone.builderName = builderName;
- return clone;
- }
- */
-
- /**
* For conveneance: conversion of the new event type indication to the old
* style
*
@@ -216,6 +300,7 @@
}
+ @Override
public int hashCode() {
int result = 0;
result = HashCodeUtil.hashCode(result, eventType);
@@ -224,6 +309,7 @@
return result;
}
+ @Override
public boolean equals(Object o) {
if (o instanceof NodeEvent) {
NodeEvent ne = (NodeEvent) o;
@@ -263,7 +349,7 @@
in.defaultReadObject();
log.debug("deserialized node event for " + nodeNumber);
try {
- int otype =
MMBase.getMMBase().getTypeDef().getIntValue(builderName);
+ int otype =
org.mmbase.bridge.ContextProvider.getDefaultCloudContext().getCloud("mmbase").getNodeManager(builderName).getNumber();
if (otype != -1) {
Cache<Integer, Integer> typeCache =
CacheManager.getCache("TypeCache");
if (typeCache != null) {
Modified:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEventHelper.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEventHelper.java
2010-05-03 14:40:42 UTC (rev 42091)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/NodeEventHelper.java
2010-05-03 14:48:56 UTC (rev 42092)
@@ -50,21 +50,24 @@
//fill the old and new values maps for the event
switch(eventType) {
case Event.TYPE_NEW:
- newEventValues = removeNonSerializingValues(node.getValues());
+ newEventValues = node.getValues();
oldEventValues = Collections.emptyMap();
break;
case Event.TYPE_CHANGE:
- oldEventValues = removeNonSerializingValues(node.getOldValues());
- newEventValues = new HashMap<String, Object>();
- Map<String, Object> values = node.getValues();
- for (String key : oldEventValues.keySet()) {
- newEventValues.put(key, values.get(key));
+ oldEventValues = node.getOldValues();
+ {
+ // this makes sure the old an new map contain the same keys.
+ Map<String, Object> help = new HashMap<String, Object>();
+ Map<String, Object> values = node.getValues();
+ for (String key : oldEventValues.keySet()) {
+ help.put(key, values.get(key));
+ }
+ newEventValues = help;
}
- newEventValues = removeNonSerializingValues(newEventValues);
break;
case Event.TYPE_DELETE:
newEventValues = Collections.emptyMap();
- oldEventValues = removeNonSerializingValues(node.getValues());
+ oldEventValues = node.getValues();
break;
default: {
oldEventValues = Collections.emptyMap();
@@ -76,40 +79,7 @@
return new NodeEvent(machineName, node.getBuilder().getTableName(),
node.getNumber(), oldEventValues, newEventValues, eventType);
}
- /**
- * Removes all non-serializable values, and all values we don't want to
serialize (binaries,
- * because they are too big).
- */
- private static Map<String, Object> removeNonSerializingValues(Map<String,
Object> oldEventValues) {
- Set<String> toremove = null;
- synchronized(oldEventValues) {
- for (Map.Entry<String, Object> entry : oldEventValues.entrySet()) {
- Object value = entry.getValue();
- if (value != null) {
- if (value instanceof byte[]) {
- if (toremove == null) toremove = new HashSet<String>();
- toremove.add(entry.getKey());
- } else if (! (value instanceof java.io.Serializable)) {
- log.warn("Found non serializable '" + entry.getKey() +
"' in " + oldEventValues);
- if (toremove == null) toremove = new HashSet<String>();
- toremove.add(entry.getKey());
- }
- }
- }
- }
- if (toremove != null) {
- Map<String, Object> newMap = new HashMap<String, Object>();
- newMap.putAll(oldEventValues);
- for (String k : toremove) {
- newMap.remove(k);
- }
- return Collections.unmodifiableMap(newMap);
- } else {
- return oldEventValues;
- }
- }
-
public static RelationEvent createRelationEventInstance(Relation node, int
eventType, String machineName){
MMObjectNode coreNode =
MMBase.getMMBase().getBuilder(node.getNodeManager().getName()).getNode(node.getNumber());
return createRelationEventInstance(coreNode, eventType, machineName);
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs