00001 /** 00002 * C-JDBC: Clustered JDBC. 00003 * Copyright (C) 2002-2004 French National Institute For Research In Computer 00004 * Science And Control (INRIA). 00005 * Contact: c-jdbc@objectweb.org 00006 * 00007 * This library is free software; you can redistribute it and/or modify it 00008 * under the terms of the GNU Lesser General Public License as published by the 00009 * Free Software Foundation; either version 2.1 of the License, or any later 00010 * version. 00011 * 00012 * This library is distributed in the hope that it will be useful, but WITHOUT 00013 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00014 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 00015 * for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public License 00018 * along with this library; if not, write to the Free Software Foundation, 00019 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 00020 * 00021 * Initial developer(s): Nicolas Modrzyk 00022 * Contributor(s): Emmanuel Cecchet. 00023 */ 00024 00025 package org.objectweb.cjdbc.controller.cache.result.rules; 00026 00027 import org.objectweb.cjdbc.common.sql.SelectRequest; 00028 import org.objectweb.cjdbc.common.xml.DatabasesXmlTags; 00029 import org.objectweb.cjdbc.controller.cache.result.AbstractResultCache; 00030 import org.objectweb.cjdbc.controller.cache.result.CacheBehavior; 00031 import org.objectweb.cjdbc.controller.cache.result.entries.CacheEntry; 00032 import org.objectweb.cjdbc.controller.cache.result.entries.ResultCacheEntryRelaxed; 00033 import org.objectweb.cjdbc.controller.virtualdatabase.ControllerResultSet; 00034 00035 /** 00036 * RelaxedCaching means we set a timeout value for this entry, and when expired 00037 * we keep in the cache if no write has modified the corresponding result, we 00038 * wait for the same amount of time again. RelaxedCaching may provide stale 00039 * data. The timeout defines the maximum staleness of a cache entry. It means 00040 * that the cache may return an entry that is out of date. timeout: is a value 00041 * in seconds and 0 means no timeout (always in the cache) keepIfNotDirty: if 00042 * true the entry is kept in the cache and the timeout is reset, if false, the 00043 * entry is removed from the cache after the timeout has expired even if the 00044 * entry was not affected by a write. 00045 * 00046 * @author <a href="mailto:Nicolas.Modrzyk@inrialpes.fr">Nicolas Modrzyk </a> 00047 * @author <a href="mailto:Emmanuel.Cecchet@inria.fr">Emmanuel Cecchet </a> 00048 * @version 1.0 00049 */ 00050 public class RelaxedCaching extends CacheBehavior 00051 { 00052 private long timeout; 00053 private boolean keepIfNotDirty; 00054 00055 /** 00056 * Create new RelaxedCaching action 00057 * 00058 * @param timeout before we check the validity of an entry 00059 * @param keepIfNotDirty true if non-dirty entries must be kept in the cache 00060 */ 00061 public RelaxedCaching(boolean keepIfNotDirty, long timeout) 00062 { 00063 this.keepIfNotDirty = keepIfNotDirty; 00064 this.timeout = timeout; 00065 } 00066 00067 /** 00068 * @see org.objectweb.cjdbc.controller.cache.result.CacheBehavior#getCacheEntry(SelectRequest, 00069 * ControllerResultSet, AbstractResultCache) 00070 */ 00071 public CacheEntry getCacheEntry(SelectRequest sqlQuery, 00072 ControllerResultSet result, AbstractResultCache cache) 00073 { 00074 return new ResultCacheEntryRelaxed(sqlQuery, result, timeout, 00075 keepIfNotDirty); 00076 } 00077 00078 /** 00079 * @see org.objectweb.cjdbc.common.xml.XmlComponent#getXml() 00080 */ 00081 public String getXml() 00082 { 00083 return "<" + DatabasesXmlTags.ELT_RelaxedCaching + " " 00084 + DatabasesXmlTags.ATT_timeout + "=\"" + timeout / 1000 + "\" " 00085 + DatabasesXmlTags.ATT_keepIfNotDirty + "=\"" + keepIfNotDirty + "\"/>"; 00086 } 00087 00088 }