/* Implementation of the NSPropertyDescription class for the GNUstep Core Data framework. Copyright (C) 2005 Free Software Foundation, Inc. Written by: Saso Kiselkov Date: August 2005 This file is part of the GNUstep Core Data framework. 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "CoreDataHeaders.h" @implementation NSPropertyDescription - (void) dealloc { TEST_RELEASE(_name); TEST_RELEASE(_userInfo); TEST_RELEASE(_validationPredicates); TEST_RELEASE(_validationWarnings); [super dealloc]; } - (NSString *) name { return _name; } - (void) setName: (NSString *) aName { [self _ensureEditableWithReason: @"Tried to set name of a property " @"already in use."]; ASSIGN(_name, aName); } - (NSEntityDescription *) entity { return _entity; } - (BOOL) isOptional { return _optional; } - (void) setOptional: (BOOL) flag { [self _ensureEditableWithReason: @"Tried to optionality of a property " @"already in use."]; _optional = flag; } - (BOOL) isTransient { return _transient; } - (void) setTransient: (BOOL) flag { [self _ensureEditableWithReason: @"Tried to set transient-ness of a" @" property already in use."]; _transient = flag; } - (NSDictionary *) userInfo { return _userInfo; } - (void) setUserInfo: (NSDictionary *) userInfo { [self _ensureEditableWithReason: @"Tried to set user info of a property " @"already in use."]; ASSIGN(_userInfo, userInfo); } - (NSArray *) validationPredicates { return _validationPredicates; } - (NSArray *) validationWarnings { return _validationWarnings; } - (void) setValidationPredicates: (NSArray *) someValidationPredicates withValidationWarnings: (NSArray *) someValidationWarnings { [self _ensureEditableWithReason: @"Tried to set validation predicates and " @"validation warnings of a property " @"already in use."]; ASSIGN(_validationPredicates, someValidationPredicates); ASSIGN(_validationWarnings, someValidationWarnings); } // NSCopying - (id) copyWithZone: (NSZone *) zone { NSPropertyDescription * property; property = [NSPropertyDescription new]; [property setName: _name]; [property setOptional: _optional]; [property setTransient: _transient]; [property setUserInfo: _userInfo]; [property setValidationPredicates: _validationPredicates withValidationWarnings: _validationWarnings]; return property; } // NSCoding - (id) initWithCoder: (NSCoder *) coder { if ((self = [super init])) { if ([coder allowsKeyedCoding]) { ASSIGN(_name, [coder decodeObjectForKey: @"Name"]); ASSIGN(_userInfo, [coder decodeObjectForKey: @"UserInfo"]); ASSIGN(_validationPredicates, [coder decodeObjectForKey: @"ValidationPredicates"]); ASSIGN(_validationWarnings, [coder decodeObjectForKey: @"ValidationPredicates"]); _entity = [coder decodeObjectForKey: @"Entity"]; _optional = [coder decodeBoolForKey: @"Optional"]; _transient = [coder decodeBoolForKey: @"Transient"]; } else { ASSIGN(_name, [coder decodeObject]); ASSIGN(_userInfo, [coder decodeObject]); ASSIGN(_validationPredicates, [coder decodeObject]); ASSIGN(_validationWarnings, [coder decodeObject]); _entity = [coder decodeObject]; [coder decodeValueOfObjCType: @encode(typeof(_optional)) at: &_optional]; [coder decodeValueOfObjCType: @encode(typeof(_transient)) at: &_transient]; } } return self; } - (void) encodeWithCoder: (NSCoder *) coder { if ([coder allowsKeyedCoding]) { [coder encodeObject: _name forKey: @"Name"]; [coder encodeObject: _userInfo forKey: @"UserInfo"]; [coder encodeObject: _validationPredicates forKey: @"ValidationPredicates"]; [coder encodeObject: _validationWarnings forKey: @"ValidationWarnings"]; [coder encodeObject: _entity forKey: @"Entity"]; [coder encodeBool: _optional forKey: @"Optional"]; [coder encodeBool: _transient forKey: @"Transient"]; } else { [coder encodeObject: _name]; [coder encodeObject: _userInfo]; [coder encodeObject: _validationPredicates]; [coder encodeObject: _validationWarnings]; [coder encodeObject: _entity]; [coder encodeValueOfObjCType: @encode(typeof(_optional)) at: &_optional]; [coder encodeValueOfObjCType: @encode(typeof(_transient)) at: &_transient]; } } @end @implementation NSPropertyDescription (GSCoreDataPrivate) /** * Sets the inverse weak relationship from the receiver to it's * owning entity. */ - (void) _setEntity: (NSEntityDescription *) entity { _entity = entity; } /** * Raises an exception if the property's entity is associated with a * managed object model which is already in use by a persistent * store coordinator. In other words, it ensures that the property * can be edited. The `reason' argument is the reason set in the exception. * It can passed unlocalized - this method will localize it. This is * for efficiency. */ - (void) _ensureEditableWithReason: (NSString *) reason { NSManagedObjectModel * model; model = [_entity managedObjectModel]; if (model != nil && [model _isEditable] == NO) { [NSException raise: NSGenericException format: _(reason)]; } } @end