KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > richtext > processors > GetIndex


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

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 /**
21  *
22  * @author Michiel Meeuwissen
23  * @version $Id: GetIndex.java,v 1.4 2005/10/25 22:29:17 michiel Exp $
24  * @since MMBase-1.8
25  */

26
27 public class GetIndex implements Processor {
28     private static final Logger log = Logging.getLoggerInstance(GetIndex.class);
29
30     public static final String JavaDoc 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 JavaDoc indexField = "index";
38     private String JavaDoc role = "index";
39     private int depth = 5;
40
41     private MMBaseObserver observer = new MMBaseObserver() {
42
43             public boolean nodeRemoteChanged(String JavaDoc machine, String JavaDoc number, String JavaDoc builder, String JavaDoc ctype) {
44                 return nodeChanged(number, builder, ctype);
45             }
46             
47             public boolean nodeLocalChanged(String JavaDoc machine, String JavaDoc number, String JavaDoc builder, String JavaDoc ctype) {
48                 return nodeChanged(number, builder, ctype);
49             }
50             
51             protected boolean nodeChanged(String JavaDoc number, String JavaDoc builder, String JavaDoc ctype) {
52                 cacheValid = false;
53                 GetIndex.this.cache.clear();
54                 return true;
55             }
56         };
57     
58     private Object JavaDoc getKey(final Node root, final Node node, final Field field) {
59         return "" + root.getNumber() + "/" + node.getNumber() + "/" + field.getName();
60     }
61
62     private String JavaDoc successor(String JavaDoc i) {
63         if (i == null) return "1";
64         return "" + (Integer.parseInt(i) + 1);
65     }
66
67     private Node findRoot(final Node relation) {
68         Object JavaDoc 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             // not specified, search any.
77
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         // make sure the cache is watched.
89
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             // 'n' now contains the 'topmost' object.
98
// now iterate down again, while determining all indices.
99
String JavaDoc[] index = new String JavaDoc[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 JavaDoc i = (String JavaDoc) 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 JavaDoc process(Node node, Field field, Object JavaDoc value) {
115         Node root = findRoot(node);
116         log.info("Found root-node " + root.getNumber());
117         Object JavaDoc key = getKey(root, node, field);
118         Object JavaDoc 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