001: /*
002: * $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/db/ForumCache.java,v 1.16 2007/10/16 05:41:01 lexuanttkhtn Exp $
003: * $Author: lexuanttkhtn $
004: * $Revision: 1.16 $
005: * $Date: 2007/10/16 05:41:01 $
006: *
007: * ====================================================================
008: *
009: * Copyright (C) 2002-2007 by MyVietnam.net
010: *
011: * All copyright notices regarding mvnForum MUST remain
012: * intact in the scripts and in the outputted HTML.
013: * The "powered by" text/logo with a link back to
014: * http://www.mvnForum.com and http://www.MyVietnam.net in
015: * the footer of the pages MUST remain visible when the pages
016: * are viewed on the internet or intranet.
017: *
018: * This program is free software; you can redistribute it and/or modify
019: * it under the terms of the GNU General Public License as published by
020: * the Free Software Foundation; either version 2 of the License, or
021: * any later version.
022: *
023: * This program is distributed in the hope that it will be useful,
024: * but WITHOUT ANY WARRANTY; without even the implied warranty of
025: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
026: * GNU General Public License for more details.
027: *
028: * You should have received a copy of the GNU General Public License
029: * along with this program; if not, write to the Free Software
030: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
031: *
032: * Support can be obtained from support forums at:
033: * http://www.mvnForum.com/mvnforum/index
034: *
035: * Correspondence and Marketing Questions can be sent to:
036: * info at MyVietnam net
037: *
038: * @author: Minh Nguyen
039: * @author: Mai Nguyen
040: */
041: package com.mvnforum.db;
042:
043: import java.util.*;
044:
045: import net.myvietnam.mvncore.exception.DatabaseException;
046: import net.myvietnam.mvncore.exception.ObjectNotFoundException;
047: import net.myvietnam.mvncore.util.DateUtil;
048:
049: import org.apache.commons.logging.Log;
050: import org.apache.commons.logging.LogFactory;
051:
052: import com.mvnforum.MVNForumConfig;
053: import com.whirlycott.cache.*;
054:
055: public class ForumCache {
056:
057: private static Log log = LogFactory.getLog(ForumCache.class);
058:
059: public static final long TIME_OUT = DateUtil.HOUR;
060:
061: // static singleton variable
062: static private ForumCache instance = new ForumCache();
063:
064: // instance variable
065: private Cache cache;
066:
067: public ForumCache() {
068: //Use the cache manager to create the default cache
069: try {
070: if (MVNForumConfig.getEnableCacheForum()) {
071: cache = CacheManager.getInstance().getCache("forum");
072: }
073: } catch (CacheException ex) {
074: log
075: .error(
076: "Cannot get the WhirlyCache. Forum caching is disabled.",
077: ex);
078: } catch (LinkageError e) {
079: // @todo: Should be never throw
080: log
081: .error(
082: "Cannot get the WhirlyCache caused by Package Conflict. Forum caching is disabled.",
083: e);
084: }
085: }
086:
087: /**
088: * Returns the single instance
089: * @return ForumCache : the singleton instance.
090: *
091: * NOTE: if use normal singleton pattern, this method should be synchronized
092: */
093: static public ForumCache getInstance() {
094: return instance;
095: }
096:
097: public String getEfficiencyReport() {
098: String result = "No report";
099: if (cache == null) {
100: if (MVNForumConfig.getEnableCacheForum() == false) {
101: result = "Cache is disabled.";
102: } else {
103: result = "Cache cannot be inited";
104: }
105: } else if (cache instanceof CacheDecorator) {
106: result = ((CacheDecorator) cache).getEfficiencyReport();
107: }
108: return result;
109: }
110:
111: public void clear() {
112: if (cache != null) {
113: cache.clear();
114: }
115: }
116:
117: /**
118: * IMPORTANT NOTE: The caller must not alter the returned collection.
119: * Any attempt to modify it will throw an <code>UnsupportedOperationException</code>.
120: */
121: public List getBeans() throws DatabaseException {
122: // ensureNewData();
123: List result = null;
124: if (cache != null) {
125: StringBuffer buffer = new StringBuffer(128);
126: buffer.append("getBeans");
127: String key = buffer.toString();
128: result = (List) cache.retrieve(key);
129: if (result == null) {
130: result = (List) DAOFactory.getForumDAO().getForums();
131: cache.store(key, result, TIME_OUT);
132: }
133: } else {
134: result = (List) DAOFactory.getForumDAO().getForums();
135: }
136:
137: return Collections.unmodifiableList(result);
138: }
139:
140: /**
141: * IMPORTANT NOTE: The caller must not alter the returned collection.
142: * Any attempt to modify it will throw an <code>UnsupportedOperationException</code>.
143: */
144: public List getForums_withSortSupport_limit(int offset,
145: int rowsToReturn, String sort, String order)
146: throws DatabaseException {
147: List result = null;
148: if (cache != null) {
149: StringBuffer buffer = new StringBuffer(128);
150: buffer.append("getForums_withSortSupport_limit-").append(
151: "offset").append(offset);
152: buffer.append("-rowsToReturn").append(rowsToReturn);
153: buffer.append("-sort").append(sort);
154: buffer.append("-order").append(order);
155:
156: String key = buffer.toString();
157: result = (List) cache.retrieve(key);
158: if (result == null) {
159: result = (List) DAOFactory.getForumDAO()
160: .getForums_withSortSupport_limit(offset,
161: rowsToReturn, sort, order);
162: cache.store(key, result, TIME_OUT);
163: }
164: } else {
165: result = (List) DAOFactory.getForumDAO()
166: .getForums_withSortSupport_limit(offset,
167: rowsToReturn, sort, order);
168: }
169:
170: return Collections.unmodifiableList(result);
171: }
172:
173: /**
174: * IMPORTANT NOTE: The caller must not alter the returned collection.
175: * Any attempt to modify it will throw an <code>UnsupportedOperationException</code>.
176: */
177: public List getForums_withSortSupport_limit_ViewCount(int offset,
178: int rowsToReturn, String sort, String order)
179: throws DatabaseException {
180: List result = null;
181: if (cache != null) {
182: StringBuffer buffer = new StringBuffer(128);
183: buffer.append("getForums_withSortSupport_limit_ViewCount-")
184: .append("offset").append(offset);
185: buffer.append("-rowsToReturn").append(rowsToReturn);
186: buffer.append("-sort").append(sort);
187: buffer.append("-order").append(order);
188:
189: String key = buffer.toString();
190: result = (List) cache.retrieve(key);
191: if (result == null) {
192: result = (List) DAOFactory.getForumDAO()
193: .getForums_withSortSupport_limit_ViewCount(
194: offset, rowsToReturn, sort, order);
195: cache.store(key, result, TIME_OUT);
196: }
197: } else {
198: result = (List) DAOFactory.getForumDAO()
199: .getForums_withSortSupport_limit_ViewCount(offset,
200: rowsToReturn, sort, order);
201: }
202:
203: return Collections.unmodifiableList(result);
204: }
205:
206: public ForumBean getBean(int forumID) throws DatabaseException,
207: ObjectNotFoundException {
208:
209: List beans = getBeans(); // We do not want the list to change in the process.
210:
211: int size = beans.size();
212: for (int i = 0; i < size; i++) {
213: ForumBean bean = (ForumBean) beans.get(i);
214: if (bean.getForumID() == forumID) {
215: return bean;
216: }
217: }
218: // @todo : localize me
219: throw new ObjectNotFoundException(
220: "Cannot find the row in table Forum where primary key = ("
221: + forumID + ").");
222: }
223:
224: public ForumBean getBean(String forumName)
225: throws DatabaseException, ObjectNotFoundException {
226:
227: List beans = getBeans(); // We do not want the list to change in the process.
228:
229: for (Iterator it = beans.iterator(); it.hasNext();) {
230: ForumBean bean = (ForumBean) it.next();
231: if (bean.getForumName().equals(forumName)) {
232: return bean;
233: }
234: }
235: // @todo : localize me
236: throw new ObjectNotFoundException(
237: "Cannot find a forum with the given name: " + forumName);
238: }
239:
240: public int getNumberOfBeans(int categoryID)
241: throws DatabaseException {
242:
243: List beans = getBeans(); // We do not want the list to change in the process.
244:
245: int forumsInCategory = 0;
246: for (Iterator it = beans.iterator(); it.hasNext();) {
247: ForumBean bean = (ForumBean) it.next();
248: if (bean.getCategoryID() == categoryID) {
249: forumsInCategory++;
250: }
251: }
252: return forumsInCategory;
253: }
254:
255: }
|