Skip to content

Commit

Permalink
- Added cycle detection support
Browse files Browse the repository at this point in the history
- To run a cycle detection on strong (non-transient) relationships, include the following tag into the template:
<$checkNonTransientRelationshipCycles $>
- This will cause mogenerator to exit with failure status if cycles are found.
  • Loading branch information
nikita-zhuk committed Jun 5, 2011
1 parent d5c21ba commit 4e9f4f5
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
Expand Up @@ -10,7 +10,7 @@


#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "ModelObject.h" #import "ModelObject.h"

<$checkNonTransientRelationshipCycles $>
<$foreach Relationship noninheritedRelationships do$>@class <$Relationship.destinationEntity.managedObjectClassName$>; <$foreach Relationship noninheritedRelationships do$>@class <$Relationship.destinationEntity.managedObjectClassName$>;
<$endforeach do$> <$endforeach do$>


Expand Down
4 changes: 4 additions & 0 deletions ponso/MKCNSEntityDescriptionAdditions.h
Expand Up @@ -25,4 +25,8 @@
/** @TypeInfo NSAttributeDescription */ /** @TypeInfo NSAttributeDescription */
@property(nonatomic, readonly) NSArray *noninheritedRelationshipsInIDKeyPathTopologicalOrder; @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 @end
29 changes: 29 additions & 0 deletions ponso/MKCNSEntityDescriptionAdditions.m
Expand Up @@ -38,6 +38,22 @@ - (BOOL)includeRelationship:(NSRelationshipDescription *)relationship


@end @end


@interface MKCNSRelationshipDescriptionNonTransientDependencyFilter : NSObject <MKCNSRelationshipDescriptionDependencyFilter> @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) @implementation NSEntityDescription(MKCNSEntityDescriptionAdditions)


/** @TypeInfo NSAttributeDescription */ /** @TypeInfo NSAttributeDescription */
Expand Down Expand Up @@ -80,4 +96,17 @@ - (NSArray*)noninheritedRelationshipsInIDKeyPathTopologicalOrder
return sortedRelationships; 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 @end

0 comments on commit 4e9f4f5

Please sign in to comment.