001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Scott Ferguson
028: */
029:
030: package com.caucho.amber.entity;
031:
032: import com.caucho.amber.manager.AmberConnection;
033: import com.caucho.util.Alarm;
034:
035: import java.sql.SQLException;
036: import java.util.Map;
037:
038: /**
039: * An entity item handles the living entities.
040: */
041: public class CacheableEntityItem extends EntityItem {
042: private AmberEntityHome _home;
043: private Entity _cacheEntity;
044: private long _expireTime;
045:
046: public CacheableEntityItem(AmberEntityHome home, Entity cacheEntity) {
047: _home = home;
048: _cacheEntity = cacheEntity;
049:
050: // jpa/0w00
051: cacheEntity.__caucho_setConnection(null);
052:
053: if (cacheEntity.__caucho_getLoadMask(0) != 0)
054: _expireTime = Alarm.getCurrentTime()
055: + _home.getCacheTimeout();
056: }
057:
058: /**
059: * Returns the entity home.
060: */
061: public AmberEntityHome getEntityHome() {
062: return _home;
063: }
064:
065: /**
066: * Returns the cached entity.
067: *
068: * @return true if the cached value is valid.
069: */
070: public Entity getEntity() {
071: long now = Alarm.getCurrentTime();
072:
073: if (_expireTime < now) {
074: long timeout = _home.getCacheTimeout();
075:
076: boolean isExpired = _expireTime > 0 && timeout > 0;
077:
078: _expireTime = now + timeout;
079:
080: if (isExpired)
081: _cacheEntity.__caucho_expire();
082: }
083:
084: return _cacheEntity;
085: }
086:
087: /**
088: * Returns the cached entity.
089: *
090: * @return true if the cached value is valid.
091: */
092: public Entity loadEntity(int loadGroup) {
093: long now = Alarm.getCurrentTime();
094:
095: if (_expireTime < now) {
096: _expireTime = now + _home.getCacheTimeout();
097: _cacheEntity.__caucho_expire();
098: }
099:
100: AmberConnection aConn = _home.getManager().getCacheConnection();
101:
102: try {
103: // _cacheEntity.__caucho_setConnection(aConn);
104: _cacheEntity.__caucho_retrieve_self(aConn);
105: } finally {
106: aConn.freeConnection();
107: }
108:
109: return _cacheEntity;
110: }
111:
112: /**
113: * Returns the cached entity.
114: *
115: * @return true if the cached value is valid.
116: */
117: public Entity loadEntity(AmberConnection aConn, int loadGroup) {
118: long now = Alarm.getCurrentTime();
119:
120: if (_expireTime < now) {
121: _expireTime = now + _home.getCacheTimeout();
122: _cacheEntity.__caucho_expire();
123: }
124:
125: try {
126: // jpa/0v33
127: // Prepared statements are cached per context so
128: // at this point, the cache item needs to use the
129: // context connection.
130:
131: // _cacheEntity.__caucho_setConnection(aConn);
132: _cacheEntity.__caucho_retrieve_self(aConn);
133: } finally {
134: // After loading the entity, all prepared statements
135: // were properly cached into the context connection.
136: // Now make the cached entity item independent
137: // from any particular context.
138: _cacheEntity.__caucho_setConnection(null);
139: }
140:
141: return _cacheEntity;
142: }
143:
144: /**
145: * Creates a bean instance
146: */
147: public Entity copy(AmberConnection aConn) {
148: return _cacheEntity.__caucho_copy(aConn, this );
149: }
150:
151: /**
152: * Creates a bean instance
153: */
154: public Entity copyTo(Entity targetEntity, AmberConnection aConn) {
155: return _cacheEntity.__caucho_copyTo(targetEntity, aConn, this );
156: }
157:
158: /**
159: * Creates a new entity instance.
160: */
161: @Override
162: public Entity createEntity(AmberConnection aConn, Object key)
163: throws SQLException {
164: Entity cacheEntity = getEntity();
165: AmberEntityHome home = getEntityHome();
166:
167: return cacheEntity.__caucho_home_new(home, key, aConn, this );
168: }
169:
170: /**
171: * Saves the item values into the cache.
172: */
173: public void save(Entity item) {
174: /*
175: long now = Alarm.getCurrentTime();
176:
177: synchronized (_cacheEntity) {
178: _expireTime = now + _home.getCacheTimeout();
179:
180: _cacheEntity.__caucho_loadFromObject(item);
181: }
182: */
183: }
184:
185: /**
186: * Saves the item values into the cache.
187: */
188: public void savePart(Entity item) {
189: /*
190: synchronized (_cacheEntity) {
191: _cacheEntity.__caucho_loadFromObject(item);
192: }
193: */
194: }
195:
196: /**
197: * Expire the value from the cache.
198: */
199: @Override
200: public void expire() {
201: _cacheEntity.__caucho_expire();
202: }
203:
204: Class getInstanceClass() {
205: return _cacheEntity.getClass();
206: }
207:
208: public String toString() {
209: return "CacheableEntityItem[" + _cacheEntity + "]";
210: }
211: }
|