001: /*
002: * %W% %E%
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.jump.module.contentstore;
028:
029: import com.sun.jump.module.JUMPModule;
030:
031: /**
032: * <code>JUMPContentStore</code> provides a base class for all content stores
033: * in the JUMP system. Concrete content stores extend this class and provides
034: * an instance of the <code>JUMPStore</code> to be used for this
035: * content store.
036: * <p>
037: * This also implements the <Code>JUMPModule</code> to indicate that all
038: * the subclasses of this class is a JUMP module.
039: */
040: public abstract class JUMPContentStore implements JUMPModule {
041:
042: private static int exclusiveAccess = 0;
043: private static int readAccess = 0;
044: private static Object lock = new Object();
045:
046: /**
047: * Creates a new instance of JUMPContentStore
048: */
049: protected JUMPContentStore() {
050: }
051:
052: /**
053: * Returns a <code>JUMPStore</code> instance to be used by the
054: * content store. Typically this method is called from the <code>
055: * JUMPContentStore.openStore(boolean) </code> when creating the StoreHandle.
056: * The subclass of JUMPContentStore can choose to either work with a single
057: * instance of JUMPStore, which this <code>getStore()</code> returns,
058: * or use multiple instances.
059: */
060: protected abstract JUMPStore getStore();
061:
062: /**
063: * Open the store for read-only or exclusive access. In exclsuive
064: * access mutable operations can be performed on the store, whereas
065: * in read-only mode, only immutable operations can be performed. This
066: * method ensures that there can only be a single component that can
067: * be in exclusuive mode. The caller blocks till the store is accessible
068: * with the requested access.
069: */
070: protected JUMPStoreHandle openStore(boolean accessExclusive) {
071: if (accessExclusive) {
072: synchronized (lock) {
073: while (exclusiveAccess > 0 || readAccess > 0) {
074: try {
075: // Wait until closeStore is called...
076: lock.wait();
077: } catch (InterruptedException e) {
078: }
079: }
080: exclusiveAccess++;
081: return new JUMPStoreHandle(getStore(), accessExclusive);
082: }
083: } else { // read-only
084: synchronized (lock) {
085: while (exclusiveAccess > 0) {
086: try {
087: // Wait until closeStore is called...
088: lock.wait();
089: } catch (InterruptedException e) {
090: }
091: }
092: readAccess++;
093: return new JUMPStoreHandle(getStore(), accessExclusive);
094: }
095: }
096: }
097:
098: /**
099: * Called to indicate that the content store does not access the store
100: * anymore.
101: */
102: protected void closeStore(JUMPStoreHandle storeHandle) {
103: synchronized (lock) {
104: if (storeHandle.isExclusive()) {
105: exclusiveAccess--;
106: } else {
107: readAccess--;
108: }
109: lock.notifyAll(); // Notify all threads waiting at openStore()
110: }
111: }
112: }
|