]> err.no Git - scalable-opengroupware.org/commitdiff
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@212 d1b88da0-ebda-0310-925b-ed51d...
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sat, 14 Aug 2004 16:50:06 +0000 (16:50 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sat, 14 Aug 2004 16:50:06 +0000 (16:50 +0000)
SOGo/SoObjects/Appointments/ChangeLog
SOGo/SoObjects/Appointments/SOGoGroupAppointmentFolder.h
SOGo/SoObjects/Appointments/SOGoGroupAppointmentFolder.m
SOGo/SoObjects/Appointments/Version
SOGo/SoObjects/SOGo/ChangeLog
SOGo/SoObjects/SOGo/SOGoGroupFolder.h
SOGo/SoObjects/SOGo/SOGoGroupFolder.m
SOGo/SoObjects/SOGo/SOGoObject.h
SOGo/SoObjects/SOGo/SOGoObject.m
SOGo/SoObjects/SOGo/Version

index eacac779c7220a8056f1feb8430a7becadec6e0e..6fc2d0523d8d602a53002b4664f9d30065e80995 100644 (file)
@@ -1,5 +1,9 @@
 2004-08-14  Helge Hess  <helge.hess@skyrix.com>
 
+       * SOGoGroupAppointmentFolder.m: implemented proper URL generation for
+         group calendars (will lookup the appointment in the proper "exact"
+         folder (v0.9.6)
+
        * SOGoAppointmentFolder.m: fetch location, isallday, iscycle and
          partmails fields in -fetchCoreInfo (v0.9.5)
 
@@ -35,4 +39,3 @@
        * redirect to weekoverview if GET is run on the folder itself
        
        * created ChangeLog
-
index 4dfb99eec5698276ad3d6c6261e29bb16473ef4c..b2f0e05077ee2c6d5b0a1c5e75ab8da8fafbeaf3 100644 (file)
         rather looks up the "child" folders for aggregation using regular SOPE
         techniques.
         => hm, do we need "aspects" in SOPE? ;-)
+
+  Note: this class retains appointment folders looked up, so watch out for
+        reference cycles!
 */
 
+@class NSMutableDictionary;
+
 @interface SOGoGroupAppointmentFolder : SOGoAppointmentFolder
 {
+  NSMutableDictionary *uidToFolder;
 }
 
 @end
index 3089b558c65f8e6fc267ad6f805d6929ac79d87c..c19463f4d358fdd0396e7e72eb1fe0de14afb34e 100644 (file)
 
 @implementation SOGoGroupAppointmentFolder
 
+- (void)dealloc {
+  [self->uidToFolder release];
+  [super dealloc];
+}
+
 /* looking up shared objects */
 
 - (SOGoGroupsFolder *)lookupGroupsFolder {
   return [[self container] valueForKey:@"uids"];
 }
 
+/* folders */
+
+- (SOGoAppointmentFolder *)folderForUID:(NSString *)_uid {
+  if (self->uidToFolder == nil) {
+    // TODO: can we trigger a fetch?
+    [self logWithFormat:
+           @"ERROR: called -folderForUID method before fetchCoreInfos .."];
+    return nil;
+  }
+  
+  return [self->uidToFolder objectForKey:_uid];
+}
+
 /* merging */
 
 - (BOOL)doesRecord:(NSDictionary *)_rec conflictWith:(NSDictionary *)_other {
 
 /* functionality */
 
-- (NSArray *)fetchCoreInfosFrom:(NSCalendarDate *)_startDate
-  to:(NSCalendarDate *)_endDate
-  memberFolder:(id)_folder
-{
+- (SOGoAppointmentFolder *)calendarFolderForMemberFolder:(id)_folder {
   SOGoAppointmentFolder *aptFolder;
   
   if (![_folder isNotNull])
     return nil;
   
   aptFolder = [_folder lookupName:@"Calendar" inContext:nil acquire:NO];
-  if (![aptFolder isNotNull]) {
-    [self logWithFormat:@"ERROR: member folder no 'Calendar': %@", _folder];
+  if (![aptFolder isNotNull])
     return nil;
-  }
   
   if (![aptFolder respondsToSelector:@selector(fetchCoreInfosFrom:to:)]) {
     [self logWithFormat:@"ERROR: folder does not implemented required API: %@",
            _folder];
     return nil;
   }
-  
-  return [aptFolder fetchCoreInfosFrom:_startDate to:_endDate];
+  return aptFolder;
+}
+
+- (NSArray *)fetchCoreInfosFrom:(NSCalendarDate *)_startDate
+  to:(NSCalendarDate *)_endDate
+  folder:(SOGoAppointmentFolder *)_folder
+{
+  if (![_folder isNotNull])
+    return nil;
+  return [_folder fetchCoreInfosFrom:_startDate to:_endDate];
 }
 
 - (NSArray *)fetchCoreInfosFrom:(NSCalendarDate *)_startDate
   NSMutableDictionary *uidToRecord;
   unsigned i, count;
   
+  [self sleep];
+  
   if ((count = [_folders count]) == 0)
     return [NSArray array];
-  if (count == 1) {
-    return [self fetchCoreInfosFrom:_startDate to:_endDate 
-                memberFolder:[_folders objectAtIndex:0]];
-  }
+  
+  if (self->uidToFolder == nil)
+    self->uidToFolder = [[NSMutableDictionary alloc] initWithCapacity:7*count];
+  else
+    [self->uidToFolder removeAllObjects];
   
   uidToRecord = [NSMutableDictionary dictionaryWithCapacity:(7 * count)];
   result      = [NSMutableArray arrayWithCapacity:(7 * count)];
   for (i = 0; i < count; i++) {
+    SOGoAppointmentFolder *aptFolder;
     id           results;
     NSDictionary *record;
     
+    aptFolder = [self calendarFolderForMemberFolder:
+                       [_folders objectAtIndex:i]];
+    if (![aptFolder isNotNull]) {
+      [self debugWithFormat:@"did not find a Calendar folder in folder: %@",
+             [_folders objectAtIndex:i]];
+      continue;
+    }
+    
     results = [self fetchCoreInfosFrom:_startDate to:_endDate 
-                   memberFolder:[_folders objectAtIndex:i]];
+                   folder:aptFolder];
     if (![results isNotNull]) continue;
-
+    
     results = [results objectEnumerator];
     while ((record = [results nextObject])) {
       NSString     *uid;
        /* record not yet in result set */
        [uidToRecord setObject:record forKey:uid];
        [result addObject:record];
+       
+       [self->uidToFolder setObject:aptFolder forKey:uid];
       }
       else if ([self doesRecord:existingRecord conflictWith:record]) {
        /* record already registered and it conflicts (diff values) */
 /* URL generation */
 
 - (NSString *)baseURLForAptWithUID:(NSString *)_uid inContext:(id)_ctx {
-  //NSString *url;
+  /* Note: fetchCore must have been called before this works */
+  SOGoAppointmentFolder *folder;
+  
+  if ([_uid length] == 0) {
+    [self logWithFormat:@"ERROR: got invalid UID."];
+    return nil;
+  }
   
-  if ([_uid length] == 0)
+  if ((folder = [self folderForUID:_uid]) == nil) {
+    [self logWithFormat:@"ERROR: did not find a folder containing UID: '%@'",
+           _uid];
+    return nil;
+  }
+  if (![folder respondsToSelector:_cmd]) {
+    [self logWithFormat:@"ERROR: found folder cannot construct UID URLs: %@",
+           folder];
     return nil;
+  }
   
-#warning TODO: fix URL generation for aggregate
-  [self logWithFormat:@"FIXME: URL generation for viewer"];
+  [self debugWithFormat:@"found ID %@ in folder: %@", _uid, folder];
   
-  // need to locate the folder containing the apt, then call it
-  return [super baseURLForAptWithUID:_uid inContext:_ctx];
+  return [folder baseURLForAptWithUID:_uid inContext:_ctx];
 }
 
 @end /* SOGoGroupAppointmentFolder */
index 3a46c165479bba38ec2ce1c7c125d0981d06d354..c49415d6d6b53b3e01afb7b4f8de69f27486dba2 100644 (file)
@@ -1,3 +1,3 @@
 # $Id: Version,v 1.9 2004/05/19 14:30:45 helge Exp $
 
-SUBMINOR_VERSION:=5
+SUBMINOR_VERSION:=6
index 11e4c4f405ec8210aeddd6d7fe5c008d85322a8b..09965357dbc361f8aa5deaeefdb4440aaac9aeae 100644 (file)
@@ -1,4 +1,15 @@
-2004-08-11    <helge@agenor.opengroupware.org>
+2004-08-14  Helge Hess  <helge.hess@skyrix.com>
+
+       * v0.9.7
+
+       * SOGoGroupFolder.m: renamed -reset method to -sleep (called by SOPE)
+
+       * SOGoObject.m: added SOPE -sleep method (resets container and can be
+         called by subclasses)
+
+       * SOGoGroupFolder.m: made the folder found note log a debug log
+
+2004-08-11  Helge Hess  <helge.hess@skyrix.com>
 
        * v0.9.6
 
index ce8e5756a989a207aca670cecce949445d3a2533..3dd94823e0a4f081a1ab3ff9668c6dc702a4ea51 100644 (file)
@@ -48,7 +48,7 @@
 - (NSArray *)memberFolders;
 - (id)folderForUID:(NSString *)_uid;
 
-- (void)reset;
+- (void)sleep;
 
 /* pathes */
 
index c0d66829f2bbf08f7cbf77e936d7c94806dc42a9..196d8f937d1bacfc827baf4c0ec3ea6ab379fb15 100644 (file)
@@ -27,6 +27,7 @@
 
 - (void)dealloc {
   [self->uidToFolder release];
+  [self->folders     release];
   [super dealloc];
 }
 
@@ -53,7 +54,7 @@
   
   /* build path */
   
-  path = [NSArray arrayWithObjects:&_uid count:1];
+  path = _uid != nil ? [NSArray arrayWithObjects:&_uid count:1] : nil;
   
   /* traverse path */
   
@@ -65,7 +66,7 @@
     return nil;
   }
   
-  [self logWithFormat:@"Note: got folder for uid %@ path %@: %@",
+  [self debugWithFormat:@"Note: got folder for uid %@ path %@: %@",
          _uid, [path componentsJoinedByString:@"=>"], result];
   return result;
 }
   return [self->uidToFolder objectForKey:_uid];
 }
 
-- (void)reset {
+- (void)sleep {
   [self->uidToFolder release]; self->uidToFolder = nil;
   [self->folders     release]; self->folders     = nil;
+  [super sleep];
 }
 
 /* SOPE */
index 92095ccea6dee588c193173b9ee2e8511286e36f..cd3171b78bfc8ca536cd94e901ab092fc45d88ed 100644 (file)
@@ -47,6 +47,8 @@
 - (SOGoUserFolder *)lookupUserFolder;
 - (SOGoGroupsFolder *)lookupGroupsFolder;
 
+- (void)sleep;
+
 /* operations */
 
 - (NSException *)delete;
index b18e7a4639f0897cdecc2498ec8aa9056d893fdb..3d70a8e660088ce0279467b569026cb5cc544a2b 100644 (file)
   return [[self lookupUserFolder] lookupGroupsFolder];
 }
 
+- (void)sleep {
+  if ([self doesRetainContainer])
+    [self->container release];
+  self->container = nil;
+}
+
 /* operations */
 
 - (NSException *)delete {
index d085094254656ffd8e84e93badbe1027c688e351..070d88113cc41409bfe2a03b091728598a6e909f 100644 (file)
@@ -1,3 +1,3 @@
 # $Id: Version 170 2004-08-11 10:45:40Z helge $
 
-SUBMINOR_VERSION:=6
+SUBMINOR_VERSION:=7