001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.core.persist;
028:
029: import java.lang.ref.ReferenceQueue;
030: import java.lang.ref.WeakReference;
031:
032: /**
033: * This class establishes an association between an object that has
034: * been persisted and a reference number. It also captures the state
035: * of the object.
036: */
037: public class PersistenceAssociation extends WeakReference {
038:
039: /**
040: * The id assigned to the object. This id is used to replace the
041: * object when its actual value is not significant.
042: */
043: private PersistenceReference referenceId;
044:
045: private PersistenceIdentity clientId;
046:
047: /**
048: * Records if the object has not yet been removed from the plan.
049: * Used to manage the lifecycle of IdentityTable entries.
050: */
051: private static final int NEW = 0;
052: private static final int ACTIVE = 1;
053: private static final int INACTIVE = 2;
054: private int active = NEW;
055:
056: /**
057: * Temporarily used to mark objects needing to be persisted or that
058: * have been rehydrated
059: */
060: private boolean marked = false;
061:
062: /**
063: * The hashcode of the object. For efficiency (see IdentityTable).
064: */
065: int hash;
066:
067: /**
068: * Chain of associations in IdentityTable. Links together all the
069: * entries in a hashtable bucket.
070: */
071: PersistenceAssociation next;
072:
073: PersistenceAssociation(Object object, int id, ReferenceQueue refQ) {
074: this (object, new PersistenceReference(id), refQ);
075: }
076:
077: PersistenceAssociation(Object object, PersistenceReference id,
078: ReferenceQueue refQ) {
079: super (object, refQ);
080: if (id == null)
081: throw new IllegalArgumentException(
082: "Null PersistenceReference");
083: if (object == null)
084: throw new IllegalArgumentException("Null Object");
085: referenceId = id;
086: hash = System.identityHashCode(object); // Get this now before the object disappears
087: }
088:
089: public Object getObject() {
090: return get();
091: }
092:
093: public PersistenceReference getReferenceId() {
094: return referenceId;
095: }
096:
097: public PersistenceIdentity getClientId() {
098: return clientId;
099: }
100:
101: public void setClientId(PersistenceIdentity newClientId) {
102: clientId = newClientId;
103: }
104:
105: /**
106: * A mark used for various purposes. During a persist operation, the
107: * mark serves to identify associations that are being written to
108: * this persistence delta. During rehydration, the mark is used to
109: * identify associations that were restored from a particular delta.
110: */
111: public void setMarked(boolean newMarked) {
112: marked = newMarked;
113: }
114:
115: public boolean isMarked() {
116: return marked;
117: }
118:
119: public void setActive() {
120: if (active == NEW)
121: active = ACTIVE;
122: }
123:
124: public void setActive(int newActive) {
125: if (newActive > active)
126: active = newActive;
127: }
128:
129: public void setInactive() {
130: active = INACTIVE;
131: }
132:
133: public boolean isActive() {
134: return active == ACTIVE;
135: }
136:
137: public int getActive() {
138: return active;
139: }
140:
141: public boolean isNew() {
142: return active == NEW;
143: }
144:
145: public boolean isInactive() {
146: return active == INACTIVE;
147: }
148:
149: public String toString() {
150: String activity;
151: switch (active) {
152: default:
153: activity = " 0";
154: break;
155: case ACTIVE:
156: activity = " +";
157: break;
158: case INACTIVE:
159: activity = " -";
160: break;
161: }
162: return PersistenceServiceComponent.hc(getObject()) + activity
163: + " @ " + referenceId;
164: }
165: }
|