001: /*
002: *
003: * JMoney - A Personal Finance Manager
004: * Copyright (c) 2004 Nigel Westbury <westbury@users.sourceforge.net>
005: *
006: *
007: * This program is free software; you can redistribute it and/or modify
008: * it under the terms of the GNU General Public License as published by
009: * the Free Software Foundation; either version 2 of the License, or
010: * (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
020: *
021: */
022:
023: package net.sf.jmoney.serializeddatastore;
024:
025: import net.sf.jmoney.JMoneyPlugin;
026: import net.sf.jmoney.model2.Account;
027: import net.sf.jmoney.model2.DataManager;
028: import net.sf.jmoney.model2.Entry;
029: import net.sf.jmoney.model2.EntryInfo;
030: import net.sf.jmoney.model2.ExtendableObject;
031: import net.sf.jmoney.model2.ExtendablePropertySet;
032: import net.sf.jmoney.model2.IListManager;
033: import net.sf.jmoney.model2.IObjectKey;
034: import net.sf.jmoney.model2.ListKey;
035: import net.sf.jmoney.model2.ListPropertyAccessor;
036: import net.sf.jmoney.model2.ScalarPropertyAccessor;
037: import net.sf.jmoney.model2.Session;
038:
039: /**
040: * This class provides the IObjectKey implementation.
041: *
042: * In this datastore implementation, the entire datastore is
043: * read into memory when a session is opened. The object key
044: * implementation is therefore very simple - the object key is
045: * simply a reference to the object.
046: */
047: public class SimpleObjectKey implements IObjectKey {
048: private SessionManager sessionManager;
049: private ExtendableObject extendableObject;
050:
051: // TODO: make this default protection
052: public SimpleObjectKey(SessionManager sessionManager) {
053: this .sessionManager = sessionManager;
054: }
055:
056: public ExtendableObject getObject() {
057: return extendableObject;
058: }
059:
060: // TODO: make this default protection
061: public void setObject(ExtendableObject extendableObject) {
062: this .extendableObject = extendableObject;
063: }
064:
065: public void updateProperties(
066: ExtendablePropertySet<?> actualPropertySet,
067: Object[] oldValues, Object[] newValues) {
068: // If the account property of an entry is changed then we
069: // must update the lists of entries in each account.
070: if (extendableObject instanceof Entry) {
071: int i = 0;
072: for (ScalarPropertyAccessor propertyAccessor2 : actualPropertySet
073: .getScalarProperties3()) {
074: if (propertyAccessor2 == EntryInfo.getAccountAccessor()) {
075: if (!JMoneyPlugin.areEqual(oldValues[i],
076: newValues[i])) {
077: if (oldValues[i] != null) {
078: sessionManager.removeEntryFromList(
079: (Account) oldValues[i],
080: (Entry) extendableObject);
081: }
082: if (newValues[i] != null) {
083: sessionManager.addEntryToList(
084: (Account) newValues[i],
085: (Entry) extendableObject);
086: }
087: }
088: break;
089: }
090: i++;
091: }
092: }
093:
094: /*
095: * There is no back-end datastore that needs updating, so we have
096: * nothing more to do except to mark the session as modified.
097: */
098:
099: sessionManager.setModified();
100: }
101:
102: public Session getSession() {
103: return sessionManager.getSession();
104: }
105:
106: public DataManager getDataManager() {
107: return sessionManager;
108: }
109:
110: public <E extends ExtendableObject> IListManager<E> constructListManager(
111: ListPropertyAccessor<E> listAccessor) {
112: return new SimpleListManager<E>(sessionManager, new ListKey<E>(
113: this, listAccessor));
114: }
115: }
|