/* 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... * */