libs-gscoredata/NSRelationshipDescription.m
H. Nikolaus Schaller 30c88829fc New Import
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep@25765 72102866-910b-0410-8b05-ffd578937521
2007-12-20 08:39:55 +00:00

206 lines
6 KiB
Objective-C

/* Implementation of the NSRelationshipDescription class for the GNUstep
Core Data framework.
Copyright (C) 2005 Free Software Foundation, Inc.
Written by: Saso Kiselkov <diablos@manga.sk>
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 NSRelationshipDescription
- (void) dealloc
{
TEST_RELEASE(_destinationEntity);
[super dealloc];
}
- (NSEntityDescription *) destinationEntity
{
return _destinationEntity;
}
- (void) setDestinationEntity: (NSEntityDescription *) entity
{
[self _ensureEditableWithReason: _(@"Tried to set the destination "
@"entity of a relationship "
@"already in use")];
ASSIGN(_destinationEntity, entity);
// destroy the inverse relationship - we'll have to set it up anew
if (_inverseRelationship != nil)
[_inverseRelationship setInverseRelationship: nil];
[self setInverseRelationship: nil];
}
- (NSRelationshipDescription *) inverseRelationship
{
return _inverseRelationship;
}
- (void) setInverseRelationship: (NSRelationshipDescription *) relationship
{
[self _ensureEditableWithReason: _(@"Tried to set the inverse "
@"relationship of a relationship "
@"already in use")];
// make sure the destination entity contains the relationship
if (relationship != nil &&
![[_destinationEntity properties] containsObject: relationship])
{
[NSException raise: NSInvalidArgumentException
format: _(@"Tried to set inverse relationship which is not in the destination entity.")];
}
_inverseRelationship = relationship;
}
- (NSDeleteRule) deleteRule
{
return _deleteRule;
}
- (void) setDeleteRule: (NSDeleteRule) rule
{
[self _ensureEditableWithReason: _(@"Tried to set the delete rule "
@"of a relationship already in use")];
_deleteRule = rule;
}
- (int) minCount
{
return _minCount;
}
- (void) setMinCount: (int) aCount
{
[self _ensureEditableWithReason: _(@"Tried to set minimum count "
@"of a relationship already in use")];
if (aCount > _maxCount)
{
[NSException raise: NSInvalidArgumentException
format: _(@"Tried to set minimum count of a relationship "
@"higher than it's maximum count")];
}
_minCount = aCount;
}
- (int) maxCount
{
return _maxCount;
}
- (void) setMaxCount: (int) aCount
{
[self _ensureEditableWithReason: @"Tried to set maximum count "
@"of a relationship already in use."];
if (aCount < _minCount)
{
[NSException raise: NSInvalidArgumentException
format: @"Tried to set maximum count of a relationship "
@"lower than it's minimum count."];
}
_maxCount = aCount;
}
- (BOOL) isToMany
{
return (_maxCount > 1);
}
// NSCopying
- (id) copyWithZone: (NSZone *) zone
{
NSRelationshipDescription * relationship = [super copyWithZone: zone];
[relationship setDestinationEntity: _destinationEntity];
[relationship setInverseRelationship: _inverseRelationship];
[relationship setDeleteRule: _deleteRule];
[relationship setMaxCount: _maxCount];
[relationship setMinCount: _minCount];
return relationship;
}
// NSCoding
- (id) initWithCoder: (NSCoder *) coder
{
if ((self = [super initWithCoder: coder]))
{
if ([coder allowsKeyedCoding])
{
ASSIGN(_destinationEntity, [coder decodeObjectForKey:
@"DestinationEntity"]);
ASSIGN(_inverseRelationship, [coder decodeObjectForKey:
@"InverseRelationship"]);
_deleteRule = [coder decodeIntForKey: @"DeleteRule"];
_minCount = [coder decodeIntForKey: @"MinCount"];
_maxCount = [coder decodeIntForKey: @"MaxCount"];
}
else
{
ASSIGN(_destinationEntity, [coder decodeObject]);
ASSIGN(_inverseRelationship, [coder decodeObject]);
[coder decodeValueOfObjCType: @encode(typeof(_deleteRule))
at: &_deleteRule];
[coder decodeValueOfObjCType: @encode(typeof(_minCount))
at: &_minCount];
[coder decodeValueOfObjCType: @encode(typeof(_maxCount))
at: &_maxCount];
}
}
return self;
}
- (void) encodeWithCoder: (NSCoder *) coder
{
[super encodeWithCoder: coder];
if ([coder allowsKeyedCoding])
{
[coder encodeObject: _destinationEntity forKey: @"DestinationEntity"];
[coder encodeObject: _inverseRelationship
forKey: @"InverseRelationship"];
[coder encodeInt: _deleteRule forKey: @"DeleteRule"];
[coder encodeInt: _minCount forKey: @"MinCount"];
[coder encodeInt: _maxCount forKey: @"MaxCount"];
}
else
{
[coder encodeObject: _destinationEntity];
[coder encodeObject: _inverseRelationship];
[coder encodeValueOfObjCType: @encode(typeof(_deleteRule))
at: &_deleteRule];
[coder encodeValueOfObjCType: @encode(typeof(_minCount))
at: &_minCount];
[coder encodeValueOfObjCType: @encode(typeof(_maxCount))
at: &_maxCount];
}
}
@end