1 10 package org.mmbase.richtext.processors; 11 import org.mmbase.datatypes.processors.Processor; 12 13 import org.mmbase.bridge.*; 14 import org.mmbase.bridge.util.*; 15 import org.mmbase.module.core.*; 16 import org.mmbase.util.logging.*; 17 import java.util.*; 18 19 20 26 27 public class GetIndex implements Processor { 28 private static final Logger log = Logging.getLoggerInstance(GetIndex.class); 29 30 public static final String CLOUDPROP_INDEXROOT = "org.mmbase.index-root"; 31 32 private static final int serialVersionUID = 1; 33 34 private Map cache = Collections.synchronizedMap(new HashMap()); 35 private boolean cacheValid = true; 36 37 private String indexField = "index"; 38 private String role = "index"; 39 private int depth = 5; 40 41 private MMBaseObserver observer = new MMBaseObserver() { 42 43 public boolean nodeRemoteChanged(String machine, String number, String builder, String ctype) { 44 return nodeChanged(number, builder, ctype); 45 } 46 47 public boolean nodeLocalChanged(String machine, String number, String builder, String ctype) { 48 return nodeChanged(number, builder, ctype); 49 } 50 51 protected boolean nodeChanged(String number, String builder, String ctype) { 52 cacheValid = false; 53 GetIndex.this.cache.clear(); 54 return true; 55 } 56 }; 57 58 private Object getKey(final Node root, final Node node, final Field field) { 59 return "" + root.getNumber() + "/" + node.getNumber() + "/" + field.getName(); 60 } 61 62 private String successor(String i) { 63 if (i == null) return "1"; 64 return "" + (Integer.parseInt(i) + 1); 65 } 66 67 private Node findRoot(final Node relation) { 68 Object root = relation.getCloud().getProperty(CLOUDPROP_INDEXROOT); 69 if (root != null) { 70 if (root instanceof Node) { 71 return (Node) root; 72 } else { 73 return relation.getCloud().getNode("" + root); 74 } 75 } else { 76 Node n = relation.getNodeValue("snumber"); 78 NodeList l = n.getRelatedNodes("object", role, "source"); 79 while (l.size() > 0) { 80 n = l.getNode(0); 81 l = n.getRelatedNodes("object", role, "source"); 82 } 83 return n; 84 } 85 } 86 87 private void fillCache(final Node root, final Node node, final Field field) { 88 MMBase mmb = MMBase.getMMBase(); 90 mmb.getBuilder(node.getNodeManager().getName()).addRemoteObserver(observer); 91 mmb.getBuilder(node.getNodeManager().getName()).addLocalObserver(observer); 92 93 log.info("Filling cache, initiated by node " + node.getNumber()); 94 Node n = root; 95 96 synchronized(cache) { 97 String [] index = new String [depth * 2 + 1]; 100 GrowingTreeList tree = new GrowingTreeList(Queries.createNodeQuery(n), depth, null, role, "destination"); 101 TreeIterator iterator = tree.treeIterator(); 102 while (iterator.hasNext()) { 103 n = iterator.nextNode(); 104 String i = (String ) n.getObjectValue(indexField); 105 if (i == null || i.equals("")) i = successor(index[iterator.currentDepth() - 1]); 106 index[iterator.currentDepth()] = i; 107 cache.put(getKey(root, n, field), i); 108 } 109 log.info("Filled cached " + cache); 110 cacheValid = true; 111 } 112 } 113 114 public Object process(Node node, Field field, Object value) { 115 Node root = findRoot(node); 116 log.info("Found root-node " + root.getNumber()); 117 Object key = getKey(root, node, field); 118 Object result = cache.get(key); 119 if (result == null) { 120 fillCache(root, node, field); 121 result = cache.get(key); 122 } 123 log.info("Found index for " + key + " " + result); 124 if (result == null) return ""; 125 return result; 126 } 127 128 } 129 | Popular Tags |