01: /*
02:
03: This software is OSI Certified Open Source Software.
04: OSI Certified is a certification mark of the Open Source Initiative.
05:
06: The license (Mozilla version 1.0) can be read at the MMBase site.
07: See http://www.MMBase.org/license
08:
09: */
10:
11: package org.mmbase.bridge.util;
12:
13: import org.mmbase.core.CoreField;
14: import org.mmbase.core.util.Fields;
15: import org.mmbase.bridge.implementation.BasicField;
16: import java.util.*;
17: import org.mmbase.bridge.*;
18:
19: /**
20: * A bridge NodeManager based on a Map of node values. The type of the values in the mapped is used to infer the 'fieldTypes'.
21: *
22: * This happens lazily.
23: *
24: * @author Michiel Meeuwissen
25: * @version $Id: MapNodeManager.java,v 1.3 2007/02/10 15:47:42 nklasens Exp $
26: * @since MMBase-1.9
27: */
28:
29: public class MapNodeManager extends AbstractNodeManager {
30:
31: protected final Map<String, Object> map;
32: private final Map<String, Field> fieldTypes = new HashMap<String, Field>();
33: private boolean checked = false;
34:
35: public MapNodeManager(Cloud cloud, Map m) {
36: super (cloud);
37: map = m;
38: }
39:
40: protected void check() {
41: if (!checked) {
42: for (Map.Entry<String, Object> entry : map.entrySet()) {
43: String fieldName = entry.getKey();
44: Object value = entry.getValue();
45: mapField(fieldName, value);
46: }
47: checked = true;
48: }
49: }
50:
51: private Field mapField(String fieldName, Object value) {
52: Field field = fieldTypes.get(fieldName);
53: if (field == null) {
54: CoreField fd = Fields.createField(fieldName, Fields
55: .classToType(value == null ? Object.class : value
56: .getClass()), Field.TYPE_UNKNOWN,
57: Field.STATE_VIRTUAL, null);
58: field = new BasicField(fd, this );
59: fieldTypes.put(fieldName, field);
60: }
61: return field;
62: }
63:
64: @Override
65: protected Map<String, Field> getFieldTypes() {
66: check();
67: return fieldTypes;
68: }
69:
70: // override for performance
71: @Override
72: public boolean hasField(String fieldName) {
73: return map.containsKey(fieldName);
74: }
75:
76: // override for performance
77: @Override
78: public Field getField(String fieldName) throws NotFoundException {
79: Field f = fieldTypes.get(fieldName);
80: if (f == null) {
81: if (map.containsKey(fieldName)) {
82: f = mapField(fieldName, map.get(fieldName));
83: }
84: }
85: if (f == null)
86: throw new NotFoundException("Field '" + fieldName
87: + "' does not exist in NodeManager '" + getName()
88: + "'.(" + getFieldTypes() + ")");
89: return f;
90: }
91:
92: }
|