001: /*
002: * Created on Dec 2, 2006
003: */
004: package uk.org.ponder.rsf.state.entity.support;
005:
006: import java.util.HashMap;
007: import java.util.Iterator;
008: import java.util.Map;
009:
010: import org.springframework.beans.factory.NoSuchBeanDefinitionException;
011:
012: import uk.org.ponder.beanutil.BeanUtil;
013: import uk.org.ponder.beanutil.entity.NewEntityEntry;
014: import uk.org.ponder.beanutil.entity.NewEntityReceiver;
015: import uk.org.ponder.rsf.state.entity.EntityHandler;
016: import uk.org.ponder.rsf.state.entity.EntityMapper;
017: import uk.org.ponder.rsf.state.entity.ObstinateEntityBeanLocator;
018: import uk.org.ponder.rsf.state.entity.UpdatableEntityHandler;
019: import uk.org.ponder.util.UniversalRuntimeException;
020:
021: public class BasicObstinateEBL implements ObstinateEntityBeanLocator {
022: private Map delivered = new HashMap();
023: private EntityHandler entityHandler;
024: private EntityMapper entityMapper;
025: private NewEntityReceiver entityreceiver;
026:
027: public void setEntityMapper(EntityMapper entityMapper) {
028: this .entityMapper = entityMapper;
029: }
030:
031: public void setEntityHandler(EntityHandler entityHandler) {
032: this .entityHandler = entityHandler;
033: }
034:
035: public void setNewEntityReceiver(NewEntityReceiver entityreceiver) {
036: this .entityreceiver = entityreceiver;
037: }
038:
039: public boolean remove(String beanname) {
040: Object beanid = entityMapper.parseID(beanname);
041: try {
042: return entityHandler.delete(beanid);
043: } finally {
044: delivered.remove(beanname);
045: }
046: }
047:
048: private void registerNewEntity(String id, Object newent) {
049: if (entityreceiver != null) {
050: entityreceiver.receiveNewEntity(new NewEntityEntry(newent,
051: id, this ));
052: }
053: delivered.put(id, newent);
054: }
055:
056: public void set(String beanname, Object toset) {
057: if (beanname.startsWith(BeanUtil.NEW_ENTITY_PREFIX)) {
058: registerNewEntity(beanname, toset);
059: } else {
060: if (entityHandler instanceof UpdatableEntityHandler) {
061: try {
062: ((UpdatableEntityHandler) entityHandler)
063: .update(toset);
064: } catch (Exception e) {
065: throw UniversalRuntimeException.accumulate(e,
066: "Error updating bean with id " + beanname
067: + " of "
068: + entityMapper.getEntityClass());
069: }
070: }
071: delivered.put(beanname, toset);
072: }
073: }
074:
075: public void endCycle() {
076: // This should really be part of AlterationWrapper
077: }
078:
079: public Object locateBean(String path) {
080: Object togo = null;
081: // Assume this is even FASTER than Hibernate 1st-level cache :P
082: togo = delivered.get(path);
083: if (togo == null) {
084: if (path.startsWith(BeanUtil.NEW_ENTITY_PREFIX)) {
085: togo = entityMapper.instantiate();
086: registerNewEntity(path, togo);
087: } else {
088: try {
089: Object beanid = entityMapper.parseID(path);
090: togo = entityHandler.get(beanid);
091: } catch (Exception e) {
092: throw UniversalRuntimeException.accumulate(e,
093: "Error getting bean with ID " + path
094: + " of "
095: + entityMapper.getEntityClass());
096: }
097: if (togo == null) {
098: throw new NoSuchBeanDefinitionException(path,
099: "No entity of "
100: + entityMapper.getEntityClass()
101: + " with ID " + path
102: + " could be found");
103: }
104: }
105: delivered.put(path, togo);
106:
107: }
108: return togo;
109: }
110:
111: /** Returns an iterator of PREVIOUSLY DELIVERED beans */
112: public Iterator iterator() {
113: return delivered.keySet().iterator();
114: }
115:
116: }
|