summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EODatabaseChannel.java
blob: 10424e97f8a93eb5bb86866e2de9912384d6f874 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 Wotonomy: OpenStep design patterns for pure Java applications.
 Copyright (C) 2001 Michael Powers

 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, see http://www.gnu.org
 */
package net.wotonomy.access;

import net.wotonomy.control.EOClassDescription;
import net.wotonomy.control.EOEditingContext;
import net.wotonomy.control.EOFetchSpecification;
import net.wotonomy.control.EOGlobalID;
import net.wotonomy.control.EOKeyValueCodingAdditions;
import net.wotonomy.foundation.NSArray;
import net.wotonomy.foundation.NSDictionary;
import net.wotonomy.foundation.NSMutableArray;

/**
*
* @author ezamudio@nasoft.com
* @author $Author: cgruber $
* @version $Revision: 894 $
*/
public class EODatabaseChannel {

	protected EODatabaseContext _context;
	protected EOAdaptorChannel _channel;
	protected EOEntity _currEntity;
	protected EOEditingContext _currEC;
	protected NSArray _attributes;
	protected boolean _locking;
	protected boolean _refreshing;

	public EODatabaseChannel(EODatabaseContext context) {
		super();
		_context = context;
		_channel = _context.adaptorContext().createAdaptorChannel();
	}

	public EOAdaptorChannel adaptorChannel() {
		return _channel;
	}

	public EODatabaseContext databaseContext() {
		return _context;
	}

	public void cancelFetch() {
		_channel.cancelFetch();
	}

	public Object fetchObject() {
		NSDictionary r = _channel.fetchRow();
		EOGlobalID gid = _currEntity.globalIDForRow(r);
		Object eo = _currEC.objectForGlobalID(gid);
		if (eo == null) {
			eo = EOClassDescription.classDescriptionForEntityName(_currEntity.name()).createInstanceWithEditingContext(_currEC, gid);
			if (eo instanceof EOKeyValueCodingAdditions)
				((EOKeyValueCodingAdditions)eo).takeValuesFromDictionary(r);
			else
				EOKeyValueCodingAdditions.DefaultImplementation.takeValuesFromDictionary(eo, r);
		} else {
			if (isRefreshingObjects()) {
				//TODO: refresh object (how?)
			}
		}
		return eo;
	}

	public boolean isFetchInProgress() {
		return _channel.isFetchInProgress();
	}

	public void setIsLocking(boolean flag) {
		_locking = flag;
	}

	public boolean isLocking() {
		return _locking;
	}

	public void setIsRefreshingObjects(boolean flag) {
		_refreshing = flag;
	}

	public boolean isRefreshingObjects() {
		return _refreshing;
	}

	public void selectObjectsWithFetchSpecification(EOFetchSpecification fspec, EOEditingContext ec) {
		setIsLocking(fspec.locksObjects());
		setIsRefreshingObjects(fspec.refreshesRefetchedObjects());
		setCurrentEditingContext(ec);
		setCurrentEntity(databaseContext().database().entityNamed(fspec.entityName()));
		NSMutableArray atts = new NSMutableArray();
		atts.addObjectsFromArray(_currEntity.attributes());
		adaptorChannel().selectAttributes(atts, fspec, isLocking(), _currEntity);
		adaptorChannel().setAttributesToFetch(atts);
		_attributes = atts;
	}

	public void setCurrentEditingContext(EOEditingContext ec) {
		_currEC = ec;
	}

	public void setCurrentEntity(EOEntity entity) {
		_currEntity = entity;
	}

}
/*
 * $Log$
 * Revision 1.2  2006/02/16 16:47:14  cgruber
 * Move some classes in to "internal" packages and re-work imports, etc.
 *
 * Also use UnsupportedOperationExceptions where appropriate, instead of WotonomyExceptions.
 *
 * Revision 1.1  2006/02/16 13:19:57  cgruber
 * Check in all sources in eclipse-friendly maven-enabled packages.
 *
 * Revision 1.2  2003/08/29 21:15:46  chochos
 * use EOEntity's globalIDForRow method.
 *
 * Revision 1.1  2003/08/19 01:54:43  chochos
 * The EODatabase layer still needs a lot of work, but it's on its way...
 *
 */