View Javadoc

1   /*   Open Source Java Caching Service
2   *    Copyright (C) 2002 Frank Karlstrøm
3   *    This library is free software; you can redistribute it and/or
4   *    modify it under the terms of the GNU Lesser General Public
5   *    License as published by the Free Software Foundation; either
6   *    version 2.1 of the License, or (at your option) any later version.
7   *
8   *    This library is distributed in the hope that it will be useful,
9   *    but WITHOUT ANY WARRANTY; without even the implied warranty of
10  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  *    Lesser General Public License for more details.
12  *
13  *    You should have received a copy of the GNU Lesser General Public
14  *    License along with this library; if not, write to the Free Software
15  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  *
17  *    The author can be contacted by email: fjankk@users.sourceforge.net
18  */
19  package org.fjank.jcache;
20  
21  import java.lang.ref.ReferenceQueue;
22  import java.lang.ref.WeakReference;
23  import javax.util.jcache.Attributes;
24  import javax.util.jcache.CacheEvent;
25  import javax.util.jcache.CacheEventListener;
26  
27  
28  /**
29   * Overrides some of the methods for referenceobjects.
30   *
31   * @author Frank Karlstrøm
32   */
33  public class CacheObject extends WeakReference {
34      /** accesses and refCount is ignored.
35       * @see java.lang.Object#equals(java.lang.Object)
36       */
37      public boolean equals(Object arg0) {
38          if(arg0 instanceof CacheObject) {
39              CacheObject obj = (CacheObject) arg0;
40              if(!attributes.equals(obj.attributes)) return false;
41              if(!group.equals(obj.group))return false;
42              if(!key.equals(obj.key))return false;
43              if(!region.equals(obj.region))return false;
44              if(valid!=obj.valid)return false;
45              
46              return true;
47          }
48          return super.equals(arg0);
49          
50      }
51  	/**
52       * the number of references to this object. (only an indication, this value
53       * could be false)
54       */
55      private int refCount;
56  
57      /** indicates wether this object is valid or not. */
58      private boolean valid;
59  
60      /** the name of this object */
61      private final Object key;
62  
63      /** number of total accesses to this object. */
64      private int accesses;
65  
66      /** the group this object belongs to. */
67      private final CacheGroup group;
68  	/** the region this object belongs to. */
69  	private final CacheRegion region;
70  
71      /** the attributes for this object */
72      private AttributesImpl attributes;
73  
74      /**
75       * Creates a new CacheObject object.
76       *
77       * @param key the name of this object
78       * @param referent the actuall object
79       * @param group the group this object belongs to
80       * @param q the ReferenceQueue this object goes to wneh the GC determines
81       *        that this object is garbage.
82       */
83      public CacheObject(final Object key, final Object referent,
84          final CacheGroup group, final CacheRegion region, final ReferenceQueue q) {
85          super(((referent instanceof String) ? new String(((String) referent))
86                                              : referent), q);
87          this.key = key;
88          this.group = group;
89          this.region = region;
90          if(group!=null) {
91          	setAttributes(group.getAttributes());
92          }
93      }
94  
95      /**
96       * returns a boolean indication wether the object needs loading or not.
97       *
98       * @return a boolean indication wether the object needs loading or not.
99       */
100     public boolean needsLoading() {
101         return needsLoading(NullObject.getInstance());
102     }
103     boolean needsLoading(final Object arguments) {
104         if(arguments!=null && arguments !=NullObject.getInstance()) {
105             return true;
106         }
107         if ((super.get() == NullObject.getInstance()) 
108                 && (attributes.getLoader() != null)) {
109             return true;
110         }
111         return false;
112     }
113     /**
114      * destroys this object
115      */
116     public void destroy() {
117         this.attributes = null;
118         this.valid = false;
119     }
120 
121     /**
122      * invalidates this object
123      */
124     public void invalidate() {
125         this.valid = false;
126         if ((attributes.getLoader() == null) && (group != null)) {
127             group.removeMe(this);
128         }
129         
130         // Notify subscribers
131         CacheEventListener listener = attributes.getListener();
132         if (listener != null) {
133 			listener.handleEvent(new CacheEventImpl(CacheEvent.OBJECT_INVALIDATED, getKey()));
134         }
135     }
136 
137     /**
138      * gets the wrapped real object.
139      *
140      * @return the wrapped real object.
141      */
142     public Object get() {
143         accesses++;
144         refCount++;
145         return super.get();
146     }
147 
148     /**
149      * returns a string representation of this object
150      *
151      * @return a string representation of this object
152      */
153     public String toString() {
154         return "CacheObject {accesses:"+
155         	accesses
156         +", attributes:"+
157         	attributes
158         +", group:"+
159         	group.getName()
160         +", key:"+
161         	key
162         +", refCount:"+
163         	refCount
164         +", region:"+
165         	region.getName()
166         +", valid:"+
167         	valid
168         +"}";
169     }
170 
171     /**
172      * gets the name of this object
173      *
174      * @return the name of this object
175      */
176     public Object getKey() {
177         return key;
178     }
179 
180     /**
181      * sets the attributes for this object
182      *
183      * @param attributes the attributes to set.
184      */
185     public void setAttributes(final AttributesImpl attributes) {
186         if (attributes != null) {
187             this.attributes = attributes;
188         }
189     }
190 
191     public void setAttributes(Attributes attributes) {
192         if(attributes!=null) {
193             this.attributes=new AttributesImpl(attributes);
194         }
195     }
196 
197     /**
198      * gets the attributes for this object
199      *
200      * @return the attributes for this object
201      */
202     public AttributesImpl getAttributes() {
203         return attributes;
204     }
205 
206     /**
207      * gets the group this object belongs to
208      *
209      * @return the group this object belongs to
210      */
211     public CacheGroup getGroup() {
212         return group;
213     }
214 
215     /**
216      * returns the number of total accesses to this cacheobject
217      *
218      * @return the number of total accesses to this cacheobject
219      */
220     public int getAccesses() {
221         return accesses;
222     }
223 
224     /**
225      * returns an indication on how many object keep an reference to this
226      * object. if this number is positive, its only an indication, not a real
227      * numer. if its 0, the refcount is 0.
228      *
229      * @return an indication on how many object keep an reference to this
230      *         object.
231      */
232     public int getRefCount() {
233         return refCount;
234     }
235 
236     /**
237      * Resets the refcount.
238      */
239     public void resetRefCount() {
240         refCount = 0;
241     }
242 
243     
244 
245     /**
246      * @return
247      */
248     public CacheRegion getRegion() {
249         return region;
250     }
251 
252     /* (non-Javadoc)
253      * @see java.lang.ref.Reference#clear()
254      */
255     public void clear() {
256        //s super.clear();
257         System.out.println("cleared:"+key);
258     }
259 
260 
261 }