001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: JEntitySwitchCRU.java 8034 2006-02-20 10:10:50Z durieuxp $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_ejb.container;
025:
026: import javax.ejb.EJBException;
027: import javax.ejb.NoSuchObjectLocalException;
028: import javax.transaction.SystemException;
029: import javax.transaction.Transaction;
030:
031: import org.objectweb.jonas_ejb.deployment.api.EntityDesc;
032:
033: import org.objectweb.util.monolog.api.BasicLevel;
034:
035: /**
036: * Container Read Uncommitted lock-policy.
037: * Only 1 thread can write. All other threads can read, without
038: * waiting for a committed state. There is no wait.
039: * This policy is deprecated : CRW should be used instead.
040: * @author Philippe Durieux
041: */
042: public class JEntitySwitchCRU extends JEntitySwitchCST {
043:
044: /**
045: * empty constructor. Object is initialized via init() because it is
046: * implemented differently according to jorm mappers.
047: */
048: public JEntitySwitchCRU() {
049: lockpolicy = EntityDesc.LOCK_CONTAINER_READ_UNCOMMITTED;
050: }
051:
052: protected void initpolicy(JEntityFactory bf) {
053: lazyregister = true;
054: }
055:
056: public void waitmyturn(Transaction tx) {
057: // No synchro for this policy.
058: }
059:
060: /**
061: * Map a context and its instance.
062: * Could use the inherited method here. This is just a simplified
063: * version for performances.
064: * @param tx - the Transaction object
065: * @param bctx - the JEntityContext to bind if not null
066: * @param forced - force to take this context. (case of create)
067: * @param holdit - increment count to hold it, a release will be called
068: * later.
069: * @return JEntityContext actually mapped
070: */
071: public synchronized JEntityContext mapICtx(Transaction tx,
072: JEntityContext bctx, boolean forced, boolean holdit,
073: boolean notused) {
074:
075: waitmyturn(tx);
076:
077: // Choose the context to use.
078: boolean newtrans = false;
079: JEntityContext jec = itContext;
080: if (forced) {
081: // If the new context is enforced, we must first release the older
082: if (jec != null) {
083: if (TraceEjb.isDebugContext()) {
084: TraceEjb.context.log(BasicLevel.DEBUG, ident
085: + "new context is enforced!");
086: }
087: discardContext(tx, false, true);
088: }
089: jec = bctx;
090: itContext = jec;
091: jec.initEntityContext(this );
092: newtrans = true;
093: } else {
094: // First check if bean still exists
095: if (isremoved) {
096: TraceEjb.logger.log(BasicLevel.WARN, ident
097: + " has been removed.");
098: throw new NoSuchObjectLocalException(
099: "Try to access a bean previously removed");
100: }
101: if (jec != null) {
102: if (todiscard) {
103: TraceEjb.logger.log(BasicLevel.WARN, ident
104: + " has been discarded.");
105: throw new NoSuchObjectLocalException(
106: "Try to access a bean previously discarded");
107: }
108: // Reuse the Context for this transaction.
109: // If a context was supplied, release it first.
110: if (bctx != null) {
111: bf.releaseJContext(bctx, 2);
112: }
113: if (runningtx == null) { // TODO change this checking
114: newtrans = true;
115: }
116: jec.reuseEntityContext(newtrans);
117: } else {
118: if (bctx != null) {
119: jec = bctx;
120: } else {
121: // no Context available : get one from the pool.
122: jec = (JEntityContext) bf.getJContext(this );
123: }
124: jec.initEntityContext(this );
125: jec.activate(true);
126: itContext = jec; // after activate
127: newtrans = true;
128: }
129: }
130:
131: if (tx != null) {
132: if (holdit) {
133: // not really used for CRU.
134: countIT++;
135: }
136: } else {
137: if (holdit) {
138: countIH++;
139: if (TraceEjb.isDebugSynchro()) {
140: TraceEjb.synchro.log(BasicLevel.DEBUG, ident
141: + "mapICtx IH count=" + countIH);
142: }
143: if (shared && countIH == 1) {
144: // reload state that could have been modified by
145: // transactions.
146: jec.activate(false);
147: }
148: }
149: }
150:
151: return jec;
152: }
153:
154: }
|