001: /*
002: * $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/db/RankCache.java,v 1.12 2007/12/17 09:09:40 minhnn Exp $
003: * $Author: minhnn $
004: * $Revision: 1.12 $
005: * $Date: 2007/12/17 09:09:40 $
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.ArrayList;
044:
045: import com.mvnforum.db.jdbc.RankDAOImplJDBC;
046: import net.myvietnam.mvncore.exception.DatabaseException;
047: import net.myvietnam.mvncore.exception.ObjectNotFoundException;
048:
049: public final class RankCache {
050:
051: // static singleton variable
052: static private RankCache instance = new RankCache();
053:
054: // instance variable
055: private ArrayList beanArray = null;
056:
057: /**
058: * A private constructor since this is a Singleton
059: */
060: private RankCache() {
061: }
062:
063: /**
064: * Returns the single instance
065: * @return RankCache : the singleton instance.
066: *
067: * NOTE: if use normal singleton pattern, this method should be synchronized
068: */
069: static public RankCache getInstance() {
070: return instance;
071: }
072:
073: /**
074: * This is a private method, and a util method
075: * If a method call ensureNewData(), then it MUST be synchronized
076: */
077: private void ensureNewData() throws DatabaseException {
078: if (RankDAOImplJDBC.isDirty() || (beanArray == null)) {
079: RankDAOImplJDBC.setDirty(false);
080: beanArray = (ArrayList) DAOFactory.getRankDAO().getRanks();
081: }
082: }
083:
084: /**
085: * IMPORTANT NOTE: The caller must not alter the returned collection
086: * Note: since the return value can be accessed in many threads,
087: * we must be sure that this collection is intact. Now we can only
088: * be sure that each object in the collection is intact (default set methods),
089: * but we can not prevent the collection from being changed
090: * #@todo Find a way to make the collection immutable
091: */
092: public synchronized ArrayList getBeans() throws DatabaseException {
093: ensureNewData();
094: return beanArray;
095: }
096:
097: public synchronized RankBean getBean(int rankID)
098: throws DatabaseException, ObjectNotFoundException {
099:
100: ensureNewData();
101: int size = beanArray.size();
102: for (int i = 0; i < size; i++) {
103: RankBean bean = (RankBean) beanArray.get(i);
104: if (bean.getRankID() == rankID) {
105: return bean;
106: }
107: }
108: //@todo : localize me
109: throw new ObjectNotFoundException(
110: "Cannot find the row in table Rank where primary key = ("
111: + rankID + ").");
112: }
113:
114: /**
115: * Reload to get the latest info
116: * Normally, this class will detect all the modifications in the table.
117: * However, call this method to force a reload
118: * Auto call reload after some time (say 1 hour) is also a good idea
119: */
120: public synchronized void reload() throws DatabaseException {
121: RankDAOImplJDBC.setDirty(false);
122: beanArray = (ArrayList) DAOFactory.getRankDAO().getRanks();
123: }
124: }
|