5 // Created by Mike Mayo on 12/7/10.
6 // The OpenStack project is provided under the Apache 2.0 license.
10 #import "StorageObject.h"
11 #import "NSObject+NSCoding.h"
14 @implementation Folder
16 @synthesize name, parent, folders, objects, metadata;
19 Folder *folder = [[[self alloc] init] autorelease];
20 folder.folders = [[NSMutableDictionary alloc] init];
21 folder.objects = [[NSMutableDictionary alloc] init];
26 #pragma mark Serialization
29 if (self = [super init]) {
30 self.folders = [[NSMutableDictionary alloc] init];
31 self.objects = [[NSMutableDictionary alloc] init];
36 - (void)encodeWithCoder:(NSCoder *)coder {
37 [self autoEncodeWithCoder:coder];
39 [coder encodeObject:name forKey:@"name"];
40 [coder encodeObject:parent forKey:@"parent"];
41 [coder encodeObject:folders forKey:@"folders"];
42 [coder encodeObject:objects forKey:@"objects"];
46 - (id)initWithCoder:(NSCoder *)coder {
47 if (self = [super init]) {
48 [self autoDecode:coder];
50 name = [[coder decodeObjectForKey:@"name"] retain];
51 parent = [[coder decodeObjectForKey:@"parent"] retain];
52 folders = [[coder decodeObjectForKey:@"folders"] retain];
53 objects = [[coder decodeObjectForKey:@"objects"] retain];
60 - (void)setObjects:(NSMutableDictionary *)objs {
61 if (self.objects != objs) {
62 [self.objects release];
64 NSMutableDictionary *folderedFiles = [[NSMutableDictionary alloc] init];
65 NSMutableDictionary *files = [[NSMutableDictionary alloc] init];
66 folders = [[NSMutableDictionary alloc] init];
68 for (NSString *key in objs) {
69 StorageObject *object = [objs objectForKey:key];
71 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"/" options:NSRegularExpressionCaseInsensitive error:nil];
72 NSInteger matches = [regex numberOfMatchesInString:object.name options:0 range:NSMakeRange(0, [object.name length])];
75 // build up the folder structure
76 NSArray *components = [object.name componentsSeparatedByString:@"/"];
77 NSString *folderName = [components objectAtIndex:0];
78 object.name = [components lastObject];
80 for (int i = [components count] - 2; i > 0; i--) {
81 object.name = [NSString stringWithFormat:@"%@/%@", [components objectAtIndex:i], object.name];
84 if (![folderedFiles objectForKey:folderName]) {
85 [folderedFiles setObject:[[NSMutableDictionary alloc] init] forKey:folderName];
88 NSMutableDictionary *files = [folderedFiles objectForKey:folderName];
89 [files setObject:object forKey:object.name];
91 } else if ([object.contentType isEqualToString:@"application/directory"]) {
92 Folder *folder = [[Folder alloc] init];
93 folder.name = object.name;
95 folder.metadata = object.metadata;
96 [self.folders setObject:folder forKey:folder.name];
99 // put the files in this folder
100 [files setObject:object forKey:object.name];
104 // take the foldered files and recursively build the rest of the folder structure
105 NSArray *keys = [folderedFiles allKeys];
106 for (int i = 0; i < [keys count]; i++) {
107 NSString *folderName = [keys objectAtIndex:i];
108 NSMutableDictionary *files = [folderedFiles objectForKey:folderName];
109 Folder *folder = [[Folder alloc] init];
110 folder.name = folderName;
111 folder.parent = self;
112 folder.objects = files;
113 StorageObject *object = [objs objectForKey:folderName];
114 folder.metadata = object.metadata;
115 [self.folders setObject:folder forKey:folder.name];
119 [folderedFiles release];
125 - (NSArray *)sortedContents {
126 NSMutableArray *contents = [[NSMutableArray alloc] initWithArray:[self.folders allValues]];
127 [contents addObjectsFromArray:[self.objects allValues]];
128 if (!sortedContents || [sortedContents count] != [contents count]) {
129 sortedContents = [[NSArray alloc] initWithArray:[contents sortedArrayUsingSelector:@selector(compare:)]];
132 return sortedContents;
135 - (NSComparisonResult)compare:(Folder *)aFolder {
136 return [self.name caseInsensitiveCompare:aFolder.name];
139 - (NSString *)fullPath {
140 NSString *result = self.name;
142 result = [NSString stringWithFormat:@"%@/%@", [parent fullPath], self.name];
155 [sortedContents release];