001: /*
002: * Copyright (c) 1998 - 2005 Versant Corporation
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Versant Corporation - initial API and implementation
010: */
011: package com.versant.core.ejb;
012:
013: import com.versant.core.common.OID;
014: import com.versant.core.common.State;
015: import com.versant.core.common.BindingSupportImpl;
016: import com.versant.core.ejb.common.EntrySet;
017:
018: import java.util.Iterator;
019:
020: /**
021: * This is a cache that keeps references to instances that are managed by an EntityManager.
022: * The type of reference can be weak/soft/hard.
023: */
024: public class LocalCache {
025: /**
026: * This is the set of managed instances.
027: */
028: private EntrySet set = new EntrySet();
029:
030: /**
031: * Add a sm to the cache. This method does not expect to find a existing
032: * mapping by this id in the cache.
033: * @param oid
034: * @param sm
035: * @return
036: */
037: public StateManagerImp add(OID oid, StateManagerImp sm) {
038: CacheEntry e = (CacheEntry) set.get(oid);
039: if (e == null) {
040: set.addEntry(createEntry(oid, sm));
041: } else {
042: if (e.val == null) {
043: throw BindingSupportImpl.getInstance().internal(
044: "Cache entry with no value");
045: } else if (!(e.val instanceof State)) {
046: /**
047: * This exception migh occor if the user assigned a already existing
048: * id to a new instance and persisted it.
049: */
050: throw new RuntimeException(
051: "There is already an instance in the cache with same id");
052: } else {
053: e.val = sm;
054: }
055: }
056: return sm;
057: }
058:
059: public void add(OID oid, State state) {
060: CacheEntry e = (CacheEntry) set.get(oid);
061: if (e == null) {
062: set.addEntry(createEntry(oid, state));
063: } else {
064: Object value = e.val;
065: if (value instanceof StateManagerImp) {
066: StateManagerImp sm = (StateManagerImp) value;
067: sm.updateState(state);
068: } else {
069: ((State) value).updateNonFilled(state);
070: }
071: }
072: }
073:
074: public Object get(OID oid) {
075: CacheEntry e = (CacheEntry) set.get(oid);
076: if (e != null) {
077: return e.getValue();
078: }
079: return null;
080: }
081:
082: /**
083: * Create a entry instance to be used. Must determine if this should be a weak/soft/hard entry.
084: * @param oid
085: * @param value
086: * @return
087: */
088: private CacheEntry createEntry(OID oid, Object value) {
089: return new CacheEntry(oid, value);
090: }
091:
092: public void clear() {
093: set.clear();
094: }
095:
096: public class CacheEntry extends EntrySet.Entry {
097: private Object val;
098:
099: public CacheEntry(OID key, Object val) {
100: super (key);
101: this .val = val;
102: }
103:
104: public Object getValue() {
105: return val;
106: }
107: }
108:
109: public void processReferenceQueue() {
110: }
111:
112: public Iterator getCacheIterator() {
113: processReferenceQueue();
114: return set.newEntryIterator();
115: }
116: }
|