2 * Copyright (C) 2001-2006 The Mir-coders group
4 * This file is part of Mir.
6 * Mir is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Mir is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Mir; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * In addition, as a special exception, The Mir-coders gives permission to link
21 * the code of this program with any library licensed under the Apache Software License,
22 * and distribute linked combinations including the two. You must obey the
23 * GNU General Public License in all respects for all of the code used other than
24 * the above mentioned libraries. If you modify this file, you may extend this
25 * exception to your version of the file, but you are not obligated to do so.
26 * If you do not wish to do so, delete this exception statement from your version.
28 package mir.storage.store;
31 * Title: ObjectStore for StorableObjects
32 * Description: ObjectStore holds a Map of @see StoreContainer for all possible
33 * @see StoreIdentifier.
35 * @see StorageIdentifier - identitfies one object in the ObjectStore
36 * i.e. in its apropriate bucket. It holds a unique identifier
37 * of a StorableObject and a reference on the StorableObject.
39 * @see StoreContainer - "Buckets" to store different types of Objects
40 * in one Container. These buckets are cofigurable via
43 * @see StoreContainerType - is a signature for all StoreContainer
44 * and StoreIdentifier.
46 * @see StorableObjects - Interface Object have to implement to
47 * be handled by the ObjectStore
49 * @see ServletStoreInfo - Maintenance Servlet for ObjectStore.
50 * Displays information about current content of the
54 * Copyright: Copyright (c) 2002
60 import java.util.HashMap;
61 import java.util.Iterator;
63 import java.util.MissingResourceException;
65 import javax.servlet.http.HttpServletRequest;
67 import mir.config.MirPropertiesConfiguration;
68 import mir.log.LoggerWrapper;
70 public class ObjectStore {
72 private final static ObjectStore INSTANCE = new ObjectStore();
73 private final static Map containerMap = new HashMap(); // StoreContainerType/StoreContainer
74 private static long storeHit = 0, storeMiss = 0;
75 private MirPropertiesConfiguration configuration;
76 private LoggerWrapper logger;
78 private ObjectStore() {
79 logger = new LoggerWrapper("Database.ObjectStore");
80 configuration = MirPropertiesConfiguration.instance();
83 public static ObjectStore getInstance() {
89 * Description: The ObjectStore tries to find the @see StoreIdentifier sid
90 * and returns the stored Object.
92 * @return StorableObject is null when no StorableObject for the
93 * StoreIdentifier sid is found.
95 public StorableObject use(StoreIdentifier sid) {
97 StorableObject storeObject = null;
98 StoreContainer stoc = getStoreContainerForSid(sid);
100 storeObject = stoc.use(sid);
102 logger.warn("container not found for: " + sid.toString());
103 if (storeObject != null) {
115 * Description: A StoreIdentifier is added to the ObjectStore, if it
116 * contains a reference to a @see StorableObject.
118 public void add(StoreIdentifier sid) {
119 if (sid != null && sid.hasReference()) {
120 // find the right StoreContainer for sid
121 StoreContainer stoc = getStoreContainerForSid(sid);
123 // we have to make new StoreContainer
124 StoreContainerType stocType = sid.getStoreContainerType();
125 stoc = new StoreContainer(stocType);
126 containerMap.put(stocType, stoc);
133 * Method: invalidate(StorableObject sto)
134 * Description: ObjectStore is notified of change of a @see StorableObject
135 * sto and invalidates all relevant cache entries.
138 public void invalidate(StoreIdentifier sid) {
139 // propagate invalidation to StoreContainer
141 StoreContainer stoc = getStoreContainerForSid(sid);
142 stoc.invalidate(sid);
147 * serves to invalidate a whole StoreContainer
149 public void invalidate(StoreContainerType stoc_type) {
150 if (stoc_type != null) {
151 StoreContainer stoc = getStoreContainerForStocType(stoc_type);
158 // internal methods for StoreContainer managment
161 * Method: getStoreContainerForSid
162 * Description: private method to find the right @see StoreContainer for
163 * the @see StoreIdentifier sid.
165 * @return StoreContainer is null when no Container is found.
167 private StoreContainer getStoreContainerForSid(StoreIdentifier sid) {
168 // find apropriate container for a specific sid
170 StoreContainerType stoc_type = sid.getStoreContainerType();
171 return getStoreContainerForStocType(stoc_type);
176 private StoreContainer getStoreContainerForStocType(StoreContainerType
178 if (stoc_type != null && containerMap.containsKey(stoc_type))
179 return (StoreContainer) containerMap.get(stoc_type);
183 private boolean has(StoreIdentifier sid) {
184 StoreContainer stoc = getStoreContainerForSid(sid);
185 return (stoc != null && stoc.has(sid)) ? true : false;
188 public String getConfProperty(String name) {
191 return configuration.getString(name);
193 catch (MissingResourceException e) {
194 logger.error("getConfProperty: " + e.toString());
202 * Description: Displays statistical information about the ObjectStore.
203 * Further information is gathered from all @see StoreContainer
207 public String toString() {
211 public String toHtml(HttpServletRequest req) {
213 long divisor = storeHit + storeMiss;
215 hitRatio = (float) storeHit / (float) divisor;
218 StringBuffer sb = new StringBuffer("Mir-ObjectStore ");
219 sb.append( ( (req != null) ? html_version() : version())).append("\n");
220 sb.append("ObjectStore overall hits/misses/ratio: ").append(storeHit);
221 sb.append("/").append(storeMiss).append("/").append(hitRatio);
222 sb.append("%\nCurrently ").append(containerMap.size());
223 sb.append(" StoreContainer in use - listing information:\n");
225 // ask container for information
226 StoreContainer currentStoc;
227 for (Iterator it = containerMap.keySet().iterator(); it.hasNext(); ) {
228 currentStoc = (StoreContainer) containerMap.get(it.next());
229 sb.append(currentStoc.toHtml(req));
232 return sb.toString();
236 * Method: html_version()
237 * Description: returns ObjectStore version as String for HTML representation
241 private String html_version() {
242 return "<i>" + version() + "</i>";
247 * Description: returns ObjectStore version as String
251 private String version() {
252 return "v_sstart3__1.0";