diff --git a/contributed templates/Nikita Zhuk/ponso/templates/machine.h.motemplate b/contributed templates/Nikita Zhuk/ponso/templates/machine.h.motemplate index 96c76c74..9733a04c 100755 --- a/contributed templates/Nikita Zhuk/ponso/templates/machine.h.motemplate +++ b/contributed templates/Nikita Zhuk/ponso/templates/machine.h.motemplate @@ -10,7 +10,7 @@ #import #import "ModelObject.h" - +<$checkNonTransientRelationshipCycles $> <$foreach Relationship noninheritedRelationships do$>@class <$Relationship.destinationEntity.managedObjectClassName$>; <$endforeach do$> diff --git a/ponso/MKCNSEntityDescriptionAdditions.h b/ponso/MKCNSEntityDescriptionAdditions.h index fd1b53d5..e4007744 100644 --- a/ponso/MKCNSEntityDescriptionAdditions.h +++ b/ponso/MKCNSEntityDescriptionAdditions.h @@ -25,4 +25,8 @@ /** @TypeInfo NSAttributeDescription */ @property(nonatomic, readonly) NSArray *noninheritedRelationshipsInIDKeyPathTopologicalOrder; +// Checks if the managed object model of the receiver contains cycles in non-transient relationships. +// If cycles are found, an exception is raised. +- (void)checkNonTransientRelationshipCycles; + @end diff --git a/ponso/MKCNSEntityDescriptionAdditions.m b/ponso/MKCNSEntityDescriptionAdditions.m index 03f001c4..24f51251 100644 --- a/ponso/MKCNSEntityDescriptionAdditions.m +++ b/ponso/MKCNSEntityDescriptionAdditions.m @@ -38,6 +38,22 @@ - (BOOL)includeRelationship:(NSRelationshipDescription *)relationship @end +@interface MKCNSRelationshipDescriptionNonTransientDependencyFilter : NSObject @end +@implementation MKCNSRelationshipDescriptionNonTransientDependencyFilter + +- (BOOL)includeRelationship:(NSRelationshipDescription *)relationship +{ + if([[relationship entity] isEqual:[relationship destinationEntity]]) + return NO; + + if([relationship isTransient]) + return NO; + + return YES; +} + +@end + @implementation NSEntityDescription(MKCNSEntityDescriptionAdditions) /** @TypeInfo NSAttributeDescription */ @@ -80,4 +96,17 @@ - (NSArray*)noninheritedRelationshipsInIDKeyPathTopologicalOrder return sortedRelationships; } +- (void)checkNonTransientRelationshipCycles +{ + id dependencyFilter = [[[MKCNSRelationshipDescriptionNonTransientDependencyFilter alloc] init] autorelease]; + NSArray *entities = [[self managedObjectModel] entitiesInTopologicalOrderUsingDependencyFilter:dependencyFilter]; + + if(entities == nil) + { + NSString *desc = @"Cycles were found in non-transient relationships."; + + [[NSException exceptionWithName:@"StrongRelationshipCyclesFoundException" reason:desc userInfo:nil] raise]; + } +} + @end