KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > module > builders > Cookies


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.module.builders;
11
12 import java.util.*;
13 import org.mmbase.module.core.*;
14 import org.mmbase.util.*;
15 import org.mmbase.util.logging.*;
16
17 /**
18  * @author Daniel Ockeloen
19  * @version $Id: Cookies.java,v 1.12 2005/01/25 12:45:18 pierre Exp $
20  */

21 public class Cookies extends MMObjectBuilder {
22
23     private static Logger log = Logging.getLoggerInstance(Cookies.class.getName());
24
25     // remember the 250 most used cookies
26
LRUHashtable cache = new LRUHashtable(250);
27
28     // also remember them the other way around (should be changed)
29
LRUHashtable cache2 = new LRUHashtable(250);
30
31         /**
32         * replace call, when called in format MMBASE-BUILDER-users-xxxxx
33         */

34     public String JavaDoc replace(scanpage sp, StringTokenizer tok) {
35         if (tok.hasMoreTokens()) {
36             String JavaDoc cmd=tok.nextToken();
37             if (cmd.equals("number")) {
38                 int i=getNumber(sp.getSessionName());
39                 if (i!=-1) {
40                     return(""+i);
41                 } else {
42                     return("");
43                 }
44             }
45         }
46             return("");
47         }
48
49         /**
50         * get the object number of this browser based on the
51         * current cookie as defined by the key
52         */

53     public int getNumber(String JavaDoc key) {
54
55                 // check if we have this key allready in cache
56
Integer JavaDoc i=(Integer JavaDoc)cache.get(key);
57         if (i!=null) {
58                         // we have it in the cache so return that
59
if (i.intValue()!=-1) {
60                 log.debug("cookie positive cache "+key);
61                 return(i.intValue());
62             } else {
63                 // this branch is only needed for the debug
64
log.debug("cookie negative cache "+key);
65                 return(-1);
66             }
67         }
68
69         // its not in cache so lets check the database
70
Enumeration e=search("WHERE "+mmb.getStorageManagerFactory().getStorageIdentifier("cookiekey")+"='"+key+"'");
71         if (e.hasMoreElements()) {
72             // found this cookie in the cloud so
73
// put it in cache and return it
74
MMObjectNode node=(MMObjectNode)e.nextElement();
75             int number=node.getIntValue("number");
76
77             // put in cache for positive caching
78
cache.put(key,new Integer JavaDoc(number));
79             cache2.put(new Integer JavaDoc(number),key);
80
81             log.debug("cookie positive "+key);
82             return(number);
83         } else {
84             // not in the cloud but put it cache
85
// to make sure it doesn't keep asking
86
// the database and return -1
87
log.debug("cookie negative "+key);
88             cache.put(key,new Integer JavaDoc(-1));
89             cache2.put(new Integer JavaDoc(-1),key);
90             return(-1);
91         }
92     }
93
94
95     /**
96     * cookie nodes has changed, update the different caches
97     * in cookies,users,people and even sessions
98     */

99     public boolean nodeChanged(String JavaDoc machine,String JavaDoc number,String JavaDoc builder,String JavaDoc ctype) {
100         // System.out.println("MACHINE="+machine+" NUMBER="+number+" BUILDER="+builder+" TYPE="+ctype);
101

102         // its a new cookie lets put it in the cache
103
if (ctype.equals("n")) {
104             MMObjectNode node=getNode(number);
105             if (node!=null) {
106                 String JavaDoc key=node.getStringValue("cookiekey");
107
108                 // allways put in cache probably overwriting -1
109
cache.put(key,new Integer JavaDoc(node.getIntValue("number")));
110                 cache2.put(new Integer JavaDoc(node.getIntValue("number")),key);
111             }
112         } else if (ctype.equals("r")) {
113             // it has a changed relation (probably linked to a
114
// new/different user so clear needed caches
115
MMObjectNode node=getNode(number);
116             if (node!=null) {
117                 // node found so lets clear its caches
118
flushCache(node.getIntegerValue("number"));
119             }
120         } else if (ctype.equals("d")) {
121                     // The node is deleted so remove it from the cache.
122
flushCache(new Integer JavaDoc(number));
123                 }
124
125         return(true);
126     }
127
128     /**
129     * local change on a cookie object detected
130     */

131     public boolean nodeLocalChanged(String JavaDoc machine,String JavaDoc number,String JavaDoc builder,String JavaDoc ctype) {
132         super.nodeLocalChanged(machine,number,builder,ctype);
133         return(nodeChanged(machine,number,builder,ctype));
134     }
135
136     /**
137     * remote change on a cookie object detected
138     */

139     public boolean nodeRemoteChanged(String JavaDoc machine,String JavaDoc number,String JavaDoc builder,String JavaDoc ctype) {
140         super.nodeRemoteChanged(machine,number,builder,ctype);
141         return(nodeChanged(machine,number,builder,ctype));
142     }
143
144
145     /**
146     * flush the cache for this cookie, also signal
147     * related builder of the change
148     */

149     public void flushCache(Integer JavaDoc number) {
150
151         // well first signal the users builder
152
Users users=(Users)mmb.getMMObject("users");
153         if (users!=null) {
154             String JavaDoc key=(String JavaDoc)cache2.get(number);
155             users.flushCache(key);
156         }
157
158         // now signal the people builder
159
People people=(People)mmb.getMMObject("people");
160         if (people!=null) {
161             String JavaDoc key=(String JavaDoc)cache2.get(number);
162             people.flushCache(key);
163         }
164     }
165
166 }
167
Popular Tags