X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmir%2Fstorage%2Fstore%2FObjectStore.java;h=0c65b1c9cc4f8356a672176d8c51f13ed779b2c9;hb=63e0ee1fb8038eb6d8f0190cf38c3b3ab2727216;hp=311c3a9c96ce01f925ca7ffd4dc5f4f23fcf4cc0;hpb=cf845a4d2c15935c02fc6c19db571be2502e28af;p=mir.git diff --git a/source/mir/storage/store/ObjectStore.java b/source/mir/storage/store/ObjectStore.java index 311c3a9c..0c65b1c9 100755 --- a/source/mir/storage/store/ObjectStore.java +++ b/source/mir/storage/store/ObjectStore.java @@ -1,3 +1,32 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. + */ package mir.storage.store; /** @@ -30,189 +59,202 @@ package mir.storage.store; * @version 1.0 */ -import java.util.*; -import javax.servlet.http.*; -import javax.servlet.*; -import mir.misc.Logfile; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.MissingResourceException; +import javax.servlet.http.HttpServletRequest; + +import mir.config.MirPropertiesConfiguration; +import mir.log.LoggerWrapper; public class ObjectStore { - private final static ObjectStore INSTANCE=new ObjectStore(); - private final static HashMap containerMap=new HashMap(); // StoreContainerType/StoreContainer - private static Logfile storeLog; - private static long storeHit=0,storeMiss=0; - private ResourceBundle ostoreConf; - - private ObjectStore() { - ostoreConf = ResourceBundle.getBundle("objectstore"); - if ( ostoreConf == null ) - System.err.println("FATAL: could not find objectstore.properties"); - } - public static ObjectStore getInstance() { return INSTANCE; } - - - /** - * Method: use - * Description: The ObjectStore tries to find the @see StoreIdentifier sid - * and returns the stored Object. - * - * @return StorableObject is null when no StorableObject for the - * StoreIdentifier sid is found. - */ - public StorableObject use(StoreIdentifier sid) { - if (sid!=null ) { - StorableObject storeObject=null; - StoreContainer stoc = getStoreContainerForSid( sid ); - if (stoc!=null) storeObject=stoc.use(sid); - else System.out.println("Warning: container not found for: " + sid.toString()); - if (storeObject!=null) { + private final static ObjectStore INSTANCE = new ObjectStore(); + private final static Map containerMap = new HashMap(); // StoreContainerType/StoreContainer + private static long storeHit = 0, storeMiss = 0; + private MirPropertiesConfiguration configuration; + private LoggerWrapper logger; + + private ObjectStore() { + logger = new LoggerWrapper("Database.ObjectStore"); + configuration = MirPropertiesConfiguration.instance(); + } + + public static ObjectStore getInstance() { + return INSTANCE; + } + + /** + * Method: use + * Description: The ObjectStore tries to find the @see StoreIdentifier sid + * and returns the stored Object. + * + * @return StorableObject is null when no StorableObject for the + * StoreIdentifier sid is found. + */ + public StorableObject use(StoreIdentifier sid) { + if (sid != null) { + StorableObject storeObject = null; + StoreContainer stoc = getStoreContainerForSid(sid); + if (stoc != null) + storeObject = stoc.use(sid); + else + logger.warn("container not found for: " + sid.toString()); + if (storeObject != null) { storeHit++; - return storeObject; + return storeObject; } } - storeMiss++; return null; - - } - - /** - * Method: add - * Description: A StoreIdentifier is added to the ObjectStore, if it - * contains a reference to a @see StorableObject. - */ - public void add(StoreIdentifier sid) { - if ( sid!=null && sid.hasReference() ) { - // find the right StoreContainer for sid - StoreContainer stoc = getStoreContainerForSid(sid); - if (stoc==null) { - // we have to make new StoreContainer - StoreContainerType stocType = sid.getStoreContainerType(); - stoc = new StoreContainer(stocType); - containerMap.put(stocType, stoc); - } - stoc.add(sid); - } - } - - /** - * Method: invalidate(StorableObject sto) - * Description: ObjectStore is notified of change of a @see StorableObject - * sto and invalidates all relevant cache entries. - */ - - public void invalidate(StoreIdentifier sid) { - // propagate invalidation to StoreContainer - if (sid!=null) { + storeMiss++; + return null; + + } + + /** + * Method: add + * Description: A StoreIdentifier is added to the ObjectStore, if it + * contains a reference to a @see StorableObject. + */ + public void add(StoreIdentifier sid) { + if (sid != null && sid.hasReference()) { + // find the right StoreContainer for sid + StoreContainer stoc = getStoreContainerForSid(sid); + if (stoc == null) { + // we have to make new StoreContainer + StoreContainerType stocType = sid.getStoreContainerType(); + stoc = new StoreContainer(stocType); + containerMap.put(stocType, stoc); + } + stoc.add(sid); + } + } + + /** + * Method: invalidate(StorableObject sto) + * Description: ObjectStore is notified of change of a @see StorableObject + * sto and invalidates all relevant cache entries. + */ + + public void invalidate(StoreIdentifier sid) { + // propagate invalidation to StoreContainer + if (sid != null) { StoreContainer stoc = getStoreContainerForSid(sid); stoc.invalidate(sid); - } - } + } + } /** - * Method: invalidate(StoreContainerType) - * Description: serves to invalidate a whole StoreContainer - * - * @return + * serves to invalidate a whole StoreContainer */ public void invalidate(StoreContainerType stoc_type) { - if ( stoc_type != null ) { + if (stoc_type != null) { + /* @todo invalidates too much: + * improvement: if instanceof StoreContainerEntity && EntityList + * then invalidate only StoreIdentifier matching the right table + */ StoreContainer stoc = getStoreContainerForStocType(stoc_type); - if ( stoc!=null ) + if (stoc != null) stoc.invalidate(); } } - // internal methods for StoreContainer managment - - /** - * Method: getStoreContainerForSid - * Description: private method to find the right @see StoreContainer for - * the @see StoreIdentifier sid. - * - * @return StoreContainer is null when no Container is found. - */ - private StoreContainer getStoreContainerForSid(StoreIdentifier sid){ - // find apropriate container for a specific sid - if (sid!=null) { - StoreContainerType stoc_type = sid.getStoreContainerType(); - return getStoreContainerForStocType(stoc_type); - } - return null; - } - - private StoreContainer getStoreContainerForStocType(StoreContainerType stoc_type) { - if ( stoc_type!=null && containerMap.containsKey(stoc_type) ) - return (StoreContainer)containerMap.get(stoc_type); + // internal methods for StoreContainer managment + + /** + * Method: getStoreContainerForSid + * Description: private method to find the right @see StoreContainer for + * the @see StoreIdentifier sid. + * + * @return StoreContainer is null when no Container is found. + */ + private StoreContainer getStoreContainerForSid(StoreIdentifier sid) { + // find apropriate container for a specific sid + if (sid != null) { + StoreContainerType stoc_type = sid.getStoreContainerType(); + return getStoreContainerForStocType(stoc_type); + } return null; } - private boolean has(StoreIdentifier sid) { - StoreContainer stoc = getStoreContainerForSid( sid ); - return ( stoc != null && stoc.has(sid) ) ? true:false; - } + private StoreContainer getStoreContainerForStocType(StoreContainerType + stoc_type) { + if (stoc_type != null && containerMap.containsKey(stoc_type)) + return (StoreContainer) containerMap.get(stoc_type); + return null; + } + + private boolean has(StoreIdentifier sid) { + StoreContainer stoc = getStoreContainerForSid(sid); + return (stoc != null && stoc.has(sid)) ? true : false; + } public String getConfProperty(String name) { - if (name!=null ) { - String returnValue=""; + if (name != null) { try { - return ostoreConf.getString(name); + return configuration.getString(name); } catch (MissingResourceException e) { - System.err.println("ObjectStore: " + e.toString()); + logger.error("getConfProperty: " + e.toString()); } } return null; } - /** - * Method: toString() - * Description: Displays statistical information about the ObjectStore. - * Further information is gathered from all @see StoreContainer - * - * @return String - */ - public String toString() { - return toHtml(null); + /** + * Method: toString() + * Description: Displays statistical information about the ObjectStore. + * Further information is gathered from all @see StoreContainer + * + * @return String + */ + public String toString() { + return toHtml(null); } public String toHtml(HttpServletRequest req) { - float hitRatio=0; - long divisor=storeHit+storeMiss; - if (divisor>0) hitRatio=(float)storeHit/(float)divisor; - hitRatio*=100; + float hitRatio = 0; + long divisor = storeHit + storeMiss; + if (divisor > 0) + hitRatio = (float) storeHit / (float) divisor; + hitRatio *= 100; StringBuffer sb = new StringBuffer("Mir-ObjectStore "); - sb.append( ((req!=null) ? html_version():version()) ).append("\n"); - sb.append("ObjectStore overall hits/misses/ratio: ").append(storeHit); - sb.append("/").append(storeMiss).append("/").append(hitRatio); - sb.append("%\nCurrently ").append(containerMap.size()); - sb.append(" StoreContainer in use - listing information:\n"); + sb.append( ( (req != null) ? html_version() : version())).append("\n"); + sb.append("ObjectStore overall hits/misses/ratio: ").append(storeHit); + sb.append("/").append(storeMiss).append("/").append(hitRatio); + sb.append("%\nCurrently ").append(containerMap.size()); + sb.append(" StoreContainer in use - listing information:\n"); - // ask container for information - StoreContainer currentStoc; - for(Iterator it=containerMap.keySet().iterator();it.hasNext();) { - currentStoc=(StoreContainer)containerMap.get(it.next()); - sb.append(currentStoc.toHtml(req)); - } + // ask container for information + StoreContainer currentStoc; + for (Iterator it = containerMap.keySet().iterator(); it.hasNext(); ) { + currentStoc = (StoreContainer) containerMap.get(it.next()); + sb.append(currentStoc.toHtml(req)); + } - return sb.toString(); - } + return sb.toString(); + } + /** + * Method: html_version() + * Description: returns ObjectStore version as String for HTML representation + * + * @return String + */ + private String html_version() { + return "" + version() + ""; + } /** - * Method: html_version() - * Description: returns ObjectStore version as String for HTML representation - * - * @return String - */ - private String html_version() { return ""+version()+""; } - - /** - * Method: version() - * Description: returns ObjectStore version as String - * - * @return String - */ - private String version() { return "v_sstart3__1.0"; } + * Method: version() + * Description: returns ObjectStore version as String + * + * @return String + */ + private String version() { + return "v_sstart3__1.0"; + } } \ No newline at end of file