25 #import "CoreDataHeaders.h"
30 static inline void EnsureEntityEditable(NSManagedObjectModel * model,
33 if (model != nil && [model _isEditable] == NO)
35 [NSException raise: NSGenericException format: reason];
40 @implementation NSEntityDescription
43 - (NSDictionary *) _filteredPropertiesOfClass: (Class) aClass
45 NSMutableDictionary * dict;
47 NSPropertyDescription * property;
49 dict = [NSMutableDictionary dictionaryWithCapacity: [_properties count]];
50 e = [_properties objectEnumerator];
51 while ((property = [e nextObject]) != nil)
53 if (aClass == Nil || [property isKindOfClass: aClass])
55 [dict setObject: property forKey: [property name]];
59 return [[dict copy] autorelease];
62 - (NSDictionary *) _fetchedPropertiesByName
64 return [
self _filteredPropertiesOfClass: [NSFetchedPropertyDescription
68 + (NSEntityDescription *) entityForName: (NSString *) entityName
69 inManagedObjectContext: (NSManagedObjectContext *) ctxt
71 return [[[[ctxt persistentStoreCoordinator] managedObjectModel]
72 entitiesByName] objectForKey: entityName];
75 + (id) insertNewObjectForEntityForName: (NSString *) anEntityName
76 inManagedObjectContext: (NSManagedObjectContext *) aContext
78 NSEntityDescription * entity;
80 NSManagedObjectModel * model;
82 model = [[aContext persistentStoreCoordinator] managedObjectModel];
83 entity = [[model entitiesByName] objectForKey: anEntityName];
85 entityClass = NSClassFromString([entity managedObjectClassName]);
87 return [[[entityClass alloc]
88 initWithEntity: entity insertIntoManagedObjectContext: aContext]
97 [_properties makeObjectsPerformSelector: @selector(_setEntity:)
99 TEST_RELEASE(_properties);
101 TEST_RELEASE(_userInfo);
102 TEST_RELEASE(_managedObjectClassName);
104 [_subentities makeObjectsPerformSelector: @selector(setSuperentity:)
107 TEST_RELEASE(_subentities);
119 - (void) setName: (NSString *) aName
121 EnsureEntityEditable(_model, _(
@"Tried to set the name of an "
122 @"entity alredy in use."));
123 ASSIGN(_name, aName);
128 - (NSManagedObjectModel *) managedObjectModel
135 - (NSString *) managedObjectClassName
137 return _managedObjectClassName;
140 - (void) setManagedObjectClassName: (NSString *) aName
142 EnsureEntityEditable(_model, _(
@"Tried to set the managed object "
143 @"class name of an entity already in use"));
144 ASSIGN(_managedObjectClassName, aName);
154 - (void) setAbstract: (BOOL) flag
156 EnsureEntityEditable(_model, _(
@"Tried to set abstractness "
157 @"of an entity already in use"));
165 - (BOOL) _isSubentityOfEntity: (NSEntityDescription *) otherEntity
167 NSEntityDescription * entity;
169 for (entity =
self; entity != nil; entity = [entity superentity])
171 if ([entity isEqual: otherEntity])
180 - (NSDictionary *) subentitiesByName
182 NSMutableDictionary * dict;
184 NSEntityDescription * subentity;
186 dict = [NSMutableDictionary dictionaryWithCapacity: [_subentities count]];
187 e = [_subentities objectEnumerator];
188 while ((subentity = [e nextObject]) != nil)
190 [dict setObject: subentity forKey: [subentity name]];
193 return [[dict copy] autorelease];
196 - (NSArray *) subentities
201 - (void) setSubentities: (NSArray *) someEntities
203 EnsureEntityEditable(_model, _(
@"Tried to set sub-entities of an entity "
205 ASSIGN(_subentities, [[someEntities copy] autorelease]);
209 - (NSEntityDescription *) superentity
214 - (void) _setSuperentity: (NSEntityDescription *) entity
216 EnsureEntityEditable(_model, _(
@"Tried to set super-entity of an entity "
218 _superentity = entity;
223 - (NSDictionary *) propertiesByName
225 return [
self filteredPropertiesOfClass: Nil];
228 - (NSArray *) properties
233 - (void) setProperties: (NSArray *) someProperties
235 EnsureEntityEditable(_model, _(
@"Tried to set properties "
236 @"of an entity already in use"));
237 ASSIGN(_properties, [[someProperties copy] autorelease]);
238 [_properties makeObjectsPerformSelector: @selector(_setEntity:)
242 - (NSDictionary *) userInfo
247 - (void) setUserInfo: (NSDictionary *) userInfo
249 EnsureEntityEditable(_model, _(
@"Tried to set properties "
250 @"of an entity already in use"));
251 ASSIGN(_userInfo, [[userInfo copy] autorelease]);
256 - (NSDictionary *) attributesByName
258 return [
self _filteredPropertiesOfClass: [NSAttributeDescription class]];
261 - (NSDictionary *) relationshipsByName
263 return [
self _filteredPropertiesOfClass: [NSRelationshipDescription class]];
266 - (NSArray *) relationshipsWithDestinationEntity:
267 (NSEntityDescription *) destEntity
269 NSMutableArray * array;
271 NSRelationshipDescription * relationship;
272 Class relationshipClass;
274 array = [NSMutableArray arrayWithCapacity: [_properties count]];
275 relationshipClass = [NSRelationshipDescription class];
277 e = [_properties objectEnumerator];
278 while ((relationship = [e nextObject]) != nil)
280 if ([relationship isKindOfClass: relationshipClass] &&
281 [relationship destinationEntity] == destEntity)
283 [array addObject: relationship];
287 return [[array copy] autorelease];
292 - (id) copyWithZone: (NSZone *) aZone
294 NSEntityDescription * entity;
296 entity = [[NSEntityDescription allocWithZone: aZone] init];
298 [entity setName: _name];
299 [entity setManagedObjectClassName: _managedObjectClassName];
300 [entity setAbstract: _abstract];
301 [entity setSubentities: _subentities];
302 [entity _setSuperentity: _superentity];
309 - (id) initWithCoder: (NSCoder *) coder
311 if ((
self = [
self init]))
313 if ([coder allowsKeyedCoding])
315 ASSIGN(_name, [coder decodeObjectForKey:
@"Name"]);
316 _abstract = [coder decodeBoolForKey: @"Abstract"];
317 ASSIGN(_managedObjectClassName,
318 [coder decodeObjectForKey:
@"ManagedObjectClassName"]);
319 ASSIGN(_properties, [coder decodeObjectForKey:
@"Properties"]);
320 ASSIGN(_userInfo, [coder decodeObjectForKey:
@"UserInfo"]);
321 ASSIGN(_subentities, [coder decodeObjectForKey:
@"SubEntities"]);
322 _superentity = [coder decodeObjectForKey: @"SuperEntity"];
323 _model = [coder decodeObjectForKey: @"ManagedObjectModel"];
324 _modelRefCount = [coder decodeIntForKey: @"ModelReferenceCount"];
328 ASSIGN(_name, [coder decodeObject]);
329 [coder decodeValueOfObjCType: @encode(BOOL) at: &_abstract];
330 ASSIGN(_managedObjectClassName, [coder decodeObject]);
331 ASSIGN(_properties, [coder decodeObject]);
332 ASSIGN(_userInfo, [coder decodeObject]);
333 ASSIGN(_subentities, [coder decodeObject]);
334 _superentity = [coder decodeObject];
335 _model = [coder decodeObject];
336 [coder decodeValueOfObjCType: @encode(unsigned int)
337 at: &_modelRefCount];
344 - (void) encodeWithCoder: (NSCoder *) coder
346 if ([coder allowsKeyedCoding])
348 [coder encodeObject: _name forKey: @"Name"];
349 [coder encodeBool: _abstract forKey: @"Abstract"];
350 [coder encodeObject: _managedObjectClassName
351 forKey: @"ManagedObjectClassName"];
352 [coder encodeObject: _properties forKey: @"Properties"];
353 [coder encodeObject: _userInfo forKey: @"UserInfo"];
354 [coder encodeObject: _subentities forKey: @"SubEntities"];
355 [coder encodeObject: _superentity forKey: @"SuperEntity"];
356 [coder encodeObject: _model forKey: @"ManagedObjectModel"];
357 [coder encodeInt: _modelRefCount forKey: @"ModelReferenceCount"];
361 [coder encodeObject: _name];
362 [coder encodeValueOfObjCType: @encode(BOOL) at: &_abstract];
363 [coder encodeObject: _managedObjectClassName];
364 [coder encodeObject: _properties];
365 [coder encodeObject: _userInfo];
366 [coder encodeObject: _subentities];
367 [coder encodeObject: _superentity];
368 [coder encodeObject: _model];
369 [coder encodeValueOfObjCType: @encode(unsigned int)
370 at: &_modelRefCount];
389 - (void) _addReferenceToManagedObjectModel: (NSManagedObjectModel *) aModel
392 NSAssert(aModel != nil && (_model == nil || _model == aModel),
393 _(
@"Attempted to forcefully change the reference from an entity "
394 @"to it's managed object model owner or ``nil'' model argument "
401 - (void) _removeReferenceToManagedObjectModel: (NSManagedObjectModel *) aModel
403 NSAssert(_model == aModel, _(
@"Attempted to forcefully remove the "
404 @"reference from an entity to it's managed object model by some other, "
405 @"unrelated model."));
406 NSAssert(_modelRefCount > 0, _(
@"Attempted to underflow the "
407 @"reference count from an entity to it's managed object model."));
410 if (_modelRefCount == 0)