View Javadoc
1   package org.apache.fulcrum.cache;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.Serializable;
23  import java.util.concurrent.atomic.AtomicBoolean;
24  
25  /**
26   * Wrapper for an object you want to store in a cache for a period of time.
27   *
28   * @author <a href="mailto:mbryson@mont.mindspring.com">Dave Bryson</a>
29   * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
30   * @author <a href="mailto:epugh@upstate.com">Eric Pugh</a>
31   * @version $Id$
32   */
33  
34  public class CachedObject<T> implements Serializable
35  {
36      /*
37       * TODO: The old Turbine version you could set the default age from Turbine.
38       * What we need is a CachedObjectFactory that would generate CachedObject's
39       * that could then have their default age set.
40       */
41  
42      /**
43       * Serialization key
44       */
45      private static final long serialVersionUID = -9107764093769042092L;
46  
47      /** Cache the object with the Default TTL */
48      public static final int DEFAULT = 0;
49  
50      /** Do not expire the object */
51      public static final int FOREVER = -1;
52  
53      /** The object to be cached. */
54      private T contents = null;
55  
56      /** Default age (30 minutes). */
57      private static final long DEFAULT_AGE = 1_800_000;
58  
59      /** When the object is created. */
60      protected long created;
61  
62      /** When the object should expire. */
63      private long expires;
64  
65      /** Is this object stale/expired? */
66      private final AtomicBoolean stale = new AtomicBoolean();
67  
68      /**
69       * Constructor; sets the object to expire in the default time (30 minutes).
70       *
71       * @param object
72       *            The object you want to cache.
73       */
74      public CachedObject(final T object)
75      {
76          this(object, DEFAULT);
77      }
78  
79      /**
80       * Constructor.
81       *
82       * @param object
83       *            The object to cache.
84       * @param expires
85       *            How long before the object expires, in ms, e.g. 1000 = 1
86       *            second.
87       */
88      public CachedObject(final T object, final long expires)
89      {
90          if (expires == DEFAULT)
91          {
92              this.expires = this.DEFAULT_AGE;
93          } else {
94              this.expires = expires;
95          }
96  
97          this.contents = object;
98  
99          this.created = System.currentTimeMillis();
100     }
101 
102     /**
103      * Returns the cached object.
104      *
105      * @return The cached object.
106      */
107     public T getContents()
108     {
109         return this.contents;
110     }
111 
112     /**
113      * Returns the creation time for the object.
114      *
115      * @return When the object was created.
116      */
117     public long getCreated()
118     {
119         return this.created;
120     }
121 
122     /**
123      * Returns the expiration time for the object.
124      *
125      * @return When the object expires.
126      */
127     public long getExpires()
128     {
129         return this.expires;
130     }
131 
132     /**
133      * Set the expiration interval for the object.
134      *
135      * @param expires
136      *            Expiration interval in millis ( 1 second = 1000 millis)
137      */
138     public void setExpires(final long expires)
139     {
140         if (expires == DEFAULT)
141         {
142             this.expires = this.DEFAULT_AGE;
143         }
144         else
145         {
146             this.expires = expires;
147         }
148         if (expires == FOREVER)
149         {
150             setStale(false);
151         }
152         else
153         {
154             setStale((System.currentTimeMillis() - this.created) > expires);
155         }
156     }
157 
158     /**
159      * Set the stale status for the object.
160      *
161      * @param stale
162      *            Whether the object is stale or not.
163      */
164     public void setStale(final boolean stale)
165     {
166         this.stale.set( stale );
167     }
168     
169 
170     /**
171      * Is the object stale?
172      *
173      * @return True if the object is stale.
174      */
175     public boolean isStale()
176     {
177     	boolean currentState = false;
178         if (this.expires != FOREVER)
179         {
180         	setStale((System.currentTimeMillis() - this.created) > this.expires);
181         	currentState = this.stale.get();
182         }
183         return currentState;
184     }
185 }