]> err.no Git - scalable-opengroupware.org/commitdiff
work on iCal file fetch
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 19 Oct 2004 16:52:05 +0000 (16:52 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 19 Oct 2004 16:52:05 +0000 (16:52 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@409 d1b88da0-ebda-0310-925b-ed51d893ca5b

23 files changed:
OGoContentStore/ChangeLog
OGoContentStore/OCSFolder.h
OGoContentStore/OCSFolder.m
OGoContentStore/Version
SOGo/Protocols/iCalHTTP/ChangeLog
SOGo/Protocols/iCalHTTP/GNUmakefile
SOGo/Protocols/iCalHTTP/SOGoICalFileFetch.m [new file with mode: 0644]
SOGo/Protocols/iCalHTTP/SOGoICalHTTPHandler.h
SOGo/Protocols/iCalHTTP/SOGoICalHTTPHandler.m
SOGo/Protocols/iCalHTTP/Version
SOGo/Protocols/iCalHTTP/product.plist
SOGo/SoObjects/Appointments/ChangeLog
SOGo/SoObjects/Appointments/SOGoAppointmentFolder.h
SOGo/SoObjects/Appointments/SOGoAppointmentFolder.m
SOGo/SoObjects/Appointments/Version
SOGo/SoObjects/SOGo/ChangeLog
SOGo/SoObjects/SOGo/SOGoFolder.h
SOGo/SoObjects/SOGo/SOGoFolder.m
SOGo/SoObjects/SOGo/Version
SOGoLogic/ChangeLog
SOGoLogic/SOGoAppointment.h
SOGoLogic/SOGoAppointment.m
SOGoLogic/Version

index 57eda4a15cb5917f074c019d782482d7341f40c4..0d53641fdd651ad028962ddf373b2ac0159ef054 100644 (file)
@@ -1,3 +1,10 @@
+2004-10-19  Helge Hess  <helge.hess@opengroupware.org>
+
+       * OCSFolder.m: added new method -fetchContentsOfAllFiles method which
+         fetches the contents of all files stored in the folder (required for
+         iCal generation, such bulk fetches should be avoided if possible!)
+         (v0.9.13)
+
 2004-10-15  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * OCSStringFormatter.[hm]: minor cleanup (v0.9.12)
index 267de0ea198eac27a44861c4411e59e2ec8dcc5a..89000bad3c024be846a08628348bc38eff02c5cc 100644 (file)
@@ -26,6 +26,7 @@
 #import <Foundation/NSObject.h>
 
 @class NSString, NSURL, NSNumber, NSArray, NSException, NSMutableString;
+@class NSDictionary;
 @class EOQualifier, EOFetchSpecification;
 @class EOAdaptorChannel;
 @class OCSFolderManager, OCSFolderType, OCSChannelManager;
@@ -81,6 +82,8 @@
 - (NSException *)writeContent:(NSString *)_content toName:(NSString *)_name;
 - (NSException *)deleteContentWithName:(NSString *)_name;
 
+- (NSDictionary *)fetchContentsOfAllFiles;
+
 - (NSArray *)fetchFields:(NSArray *)_flds 
   fetchSpecification:(EOFetchSpecification *)_fs;
 - (NSArray *)fetchFields:(NSArray *)_flds matchingQualifier:(EOQualifier *)_q;
index adedbf24cb90cd5dc3e17a342f54aefb22f4d408..b0f92c94507f1b014d422d76337b397ace5dae12 100644 (file)
@@ -223,6 +223,66 @@ static OCSStringFormatter *stringFormatter = nil;
               inContentWithName:_name];
 }
 
+- (NSDictionary *)fetchContentsOfAllFiles {
+  /*
+    Note: try to avoid the use of this method! The key of the dictionary
+          will be filename, the value the content.
+  */
+  NSMutableDictionary *result;
+  EOAdaptorChannel *channel;
+  NSException  *error;
+  NSDictionary *row;
+  NSArray      *attrs;
+  NSString     *sql;
+  
+  if ((channel = [self acquireStoreChannel]) == nil) {
+    [self logWithFormat:@"ERROR(%s): could not open storage channel!",
+            __PRETTY_FUNCTION__];
+    return nil;
+  }
+  
+  /* generate SQL */
+  
+  sql = @"SELECT \"c_name\", \"c_content\" FROM ";
+  sql = [sql stringByAppendingString:[self storeTableName]];
+  
+  /* run SQL */
+  
+  if ((error = [channel evaluateExpressionX:sql]) != nil) {
+    [self logWithFormat:@"ERROR(%s): cannot execute SQL '%@': %@", 
+           __PRETTY_FUNCTION__, sql, error];
+    [self releaseChannel:channel];
+    return nil;
+  }
+  
+  /* fetch results */
+  
+  result = [NSMutableDictionary dictionaryWithCapacity:128];
+  attrs  = [channel describeResults];
+  while ((row = [channel fetchAttributes:attrs withZone:NULL]) != nil) {
+    NSString *cName, *cContent;
+
+    cName    = [row objectForKey:@"cName"];
+    cContent = [row objectForKey:@"cContent"];
+    
+    if (![cName isNotNull]) {
+      [self logWithFormat:@"ERROR: missing cName in row: %@", row];
+      continue;
+    }
+    if (![cContent isNotNull]) {
+      [self logWithFormat:@"ERROR: missing cContent in row: %@", row];
+      continue;
+    }
+    
+    [result setObject:cContent forKey:cName];
+  }
+  
+  /* release and return result */
+  
+  [self releaseChannel:channel];
+  return result;
+}
+
 /* writing content */
 
 - (NSString *)_formatRowValue:(id)_value {
index 7254d8b0fdf0b71b710f7a614642dafe4eabafe0..2194d3bea48067a4e5c56edc80c9f72893dd8669 100644 (file)
@@ -2,7 +2,7 @@
 
 MAJOR_VERSION=0
 MINOR_VERSION=9
-SUBMINOR_VERSION:=12
+SUBMINOR_VERSION:=13
 
 # v0.9.11 requires libFoundation   v1.0.63
 # v0.9.11 requires libNGExtensions v4.3.125
index 59ecd8c72a072b87a855cd788f1402e606a07906..5f48bd54d1c6920abb89880fd15036aa3af67e7a 100644 (file)
@@ -1,8 +1,9 @@
 2004-10-19  Helge Hess  <helge.hess@opengroupware.org>
 
+       * moved fetch method to a direct action SoMethod (v0.9.3)
+
        * SOGoICalHTTPHandler.m: some work on assembly support (v0.9.2)
 
 2004-10-08  Helge Hess  <helge.hess@opengroupware.org>
 
        * created ChangeLog
-
index ebbde8f4bc8cc051d797b7fe6915fba7d5cfeb23..119e77a92cc57ac42ab0f7a422fbf7b434a374ea 100644 (file)
@@ -11,6 +11,7 @@ iCalHTTP_LANGUAGES = English French
 iCalHTTP_OBJC_FILES = \
        iCalHTTPProduct.m       \
        SOGoICalHTTPHandler.m   \
+       SOGoICalFileFetch.m     \
 
 iCalHTTP_RESOURCE_FILES += \
        Version         \
diff --git a/SOGo/Protocols/iCalHTTP/SOGoICalFileFetch.m b/SOGo/Protocols/iCalHTTP/SOGoICalFileFetch.m
new file mode 100644 (file)
index 0000000..2ec3f46
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+  Copyright (C) 2004 SKYRIX Software AG
+
+  This file is part of OpenGroupware.org.
+
+  OGo is free software; you can redistribute it and/or modify it under
+  the terms of the GNU Lesser General Public License as published by the
+  Free Software Foundation; either version 2, or (at your option) any
+  later version.
+
+  OGo is distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+  License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with OGo; see the file COPYING.  If not, write to the
+  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+  02111-1307, USA.
+*/
+
+#include <NGObjWeb/WODirectAction.h>
+
+@interface SOGoICalFileFetch : WODirectAction
+{
+}
+
+@end
+
+#include "SOGoICalHTTPHandler.h"
+#include <SOGo/SoObjects/Appointments/SOGoAppointmentFolder.h>
+#include <SOGoLogic/SOGoAppointment.h>
+#include "common.h"
+
+@implementation SOGoICalFileFetch
+
+- (id)clientObject {
+  return [[super clientObject] aptFolderInContext:[self context]];
+}
+
+- (id)defaultAction {
+  NSArray *events;
+  
+  [self logWithFormat:@"assemble iCal events ..."];
+  events = [[self clientObject] fetchAllSOGoAppointments];
+  [self logWithFormat:@"  events: %@", events];
+  
+  return nil;
+}
+
+@end /* SOGoICalFileFetch */
index 32fef61ab53c244a2500105352bbacece53ed1a4..312e1407c804ddacf61f61ccb086e6d90f0e7fae 100644 (file)
   Object to represent a SOGoAppointmentFolder as a single iCalendar file.
 */
 
+@class SOGoAppointmentFolder;
+
 @interface SOGoICalHTTPHandler : NSObject
 {
   // TODO: remember for ivars: there is _one_ handler per class! Not per ctx!
 }
 
+- (SOGoAppointmentFolder *)aptFolderInContext:(id)_ctx;
+
 @end
 
 #endif /* __iCalHTTP_SOGoICalHTTPHandler_H__ */
index 67fd669114d21b7f6de56efa95828846661f4637..2dda1c16245a2bcff62e374968a487c9eeb95309 100644 (file)
@@ -20,6 +20,7 @@
 */
 
 #include "SOGoICalHTTPHandler.h"
+#include <SOGo/SoObjects/Appointments/SOGoAppointmentFolder.h>
 #include "common.h"
 #include <NGObjWeb/WOContext+SoObjects.h>
 
 
 /* clientObject */
 
-- (id)clientObjectInContext:(id)_ctx {
+- (SOGoAppointmentFolder *)aptFolderInContext:(id)_ctx {
   /*
     The handler object is _not_ a method, its just a regular object
     itself! (because methods are defined on it).
   */
+  SOGoAppointmentFolder *folder;
   NSArray *stack;
   
   stack = [_ctx objectTraversalStack];
     return nil;
   }
   
-  if ([stack lastObject] != self) // TODO: hm, hm, not really OK
-    return [stack lastObject];
-  
-  return [stack objectAtIndex:[stack count] - 2];
-}
-
-/* fetching */
-
-- (NSArray *)storedNamesInContext:(id)_ctx {
-  /* the client object will cache the names */
-  return [[self clientObjectInContext:_ctx] toOneRelationshipKeys];
+  folder = ([stack lastObject] != self) // TODO: hm, hm, not really OK
+    ? [stack lastObject]
+    : [stack objectAtIndex:[stack count] - 2];
+  if (![folder isKindOfClass:NSClassFromString(@"SOGoAppointmentFolder")]) {
+    [self logWithFormat:@"ERROR: unexpected object in stack: %@", folder];
+    return nil;
+  }
+  return folder;
 }
 
 /* actions */
 
-- (id)assembleEventsInContext:(id)_ctx {
-  [self logWithFormat:@"assemble iCal events ..."];
-  [self logWithFormat:@"  names: %@", [self storedNamesInContext:_ctx]];
-  return self;
-}
-
 - (id)updateEventsInContext:(id)_ctx {
   [self logWithFormat:@"updates iCal events from a full collection ..."];
   return [NSException exceptionWithHTTPStatus:501 /* Not Implemented */
index bbf7bd6367c2556c0266bc218c1bc4b375d6783e..bdf5923429d5ba1e5aeff0854d5fc5d5b17c5330 100644 (file)
@@ -1,3 +1,3 @@
 # $Id: Version 368 2004-10-06 19:28:12Z znek $
 
-SUBMINOR_VERSION:=2
+SUBMINOR_VERSION:=3
index 51e2e8cce26c36f050ae7caa2ceccace68c3bb83..8429db3f1100b23d795d31d0ff9c4c377b4c6765 100644 (file)
       methods = {
         GET = {
           protectedBy = "View";
-          selector = { 
-            name                = "assembleEventsInContext:"; 
-            addContextParameter = YES;
-          };
+          actionClass = "SOGoICalFileFetch";
         };
         PUT = {
           protectedBy = "View";
index 1853d2acd6400eb9e3aeb5a8c8dfa756ee48169c..9f6a87600d539b6104545a6b381859a80ecf7f6f 100644 (file)
@@ -1,3 +1,11 @@
+2004-10-19  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoAppointmentFolder.h: added -fetchAllSOGoAppointments method
+         which performs a bulk fetch on all files contained in the folder
+         and parses all contents into an array of SOGoAppointment objects
+         (used in the iCal file support, try to avoid this method, expensive!)
+         (v0.9.13)
+
 2004-09-25  Helge Hess  <helge.hess@opengroupware.org>
 
        * fixed compilation on MacOSX (v0.9.12)
index 588bf666c73a197dd7334d431665aff7773fbc32..753e2314fb917430f986c761c2782d1103961638 100644 (file)
 - (id)lookupGroupFolderForUIDs:(NSArray *)_uids         inContext:(id)_ctx;
 - (id)lookupGroupCalendarFolderForUIDs:(NSArray *)_uids inContext:(id)_ctx;
 
+/* bulk fetches */
+
+- (NSArray *)fetchAllSOGoAppointments;
+
 @end
 
 #endif /* __Appointments_SOGoAppointmentFolder_H__ */
index 4037c09da02e5764235e16e0aa80a852e5d66db4..fadb0f293542dc90f0e9d4350756dd8a9538608a 100644 (file)
@@ -374,6 +374,48 @@ static NSTimeZone *MET = nil;
   return folder;
 }
 
+/* bulk fetches */
+
+- (NSArray *)fetchAllSOGoAppointments {
+  /* 
+     Note: very expensive method, do not use unless absolutely required.
+           returns an array of SOGoAppointment objects.
+          
+     Note that we can leave out the filenames, supposed to be stored
+     in the 'uid' field of the iCalendar object!
+  */
+  NSMutableArray *events;
+  NSDictionary *files;
+  NSEnumerator *contents;
+  NSString     *content;
+  
+  /* fetch all raw contents */
+  
+  files = [self fetchContentStringsAndNamesOfAllObjects];
+  if (![files isNotNull]) return nil;
+  if ([files isKindOfClass:[NSException class]]) return (id)files;
+  
+  /* transform to SOGo appointments */
+  
+  events   = [NSMutableArray arrayWithCapacity:[files count]];
+  contents = [files objectEnumerator];
+  while ((content = [contents nextObject]) != nil) {
+    SOGoAppointment *event;
+    
+    event = [[SOGoAppointment alloc] initWithICalString:content];
+    if (![event isNotNull]) {
+      [self logWithFormat:@"ERROR(%s): could not parse an iCal file!",
+             __PRETTY_FUNCTION__];
+      continue;
+    }
+
+    [events addObject:event];
+    [event release];
+  }
+  
+  return events;
+}
+
 /* GET */
 
 - (id)GETAction:(WOContext *)_ctx {
index 171da9b3edab5ab633751b2c64735329942131f8..1df7b254b2a5fec41491147029ed397517a86109 100644 (file)
@@ -1,3 +1,5 @@
 # $Id: Version,v 1.9 2004/05/19 14:30:45 helge Exp $
 
-SUBMINOR_VERSION:=12
+SUBMINOR_VERSION:=13
+
+# v0.9.13 requires libSOGo v0.9.26
index b8d02601f1724e1c36e159f82a4e15fdba0b9c69..1e299fc425c097b9f7c1d66b6c8991212bc29ae3 100644 (file)
@@ -1,3 +1,10 @@
+2004-10-19  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoFolder: added method -fetchContentStringsAndNamesOfAllObjects
+         which fetches the contents of all folders objects (avoid to use this
+         high overhead method!). Required for iCalendar file generation.
+         (v0.9.26)
+
 2004-10-08  Helge Hess  <helge.hess@opengroupware.org>
        
        * SOGoUserFolder.m: enhanced object lookup so that when a Calendar
index df3a330194e11338b671b3ce675d0bf1a96c7eb3..09ab714d93e39c01c859137a7606c34c9356484b 100644 (file)
 
 #include <SOGo/SOGoObject.h>
 
+@class NSString, NSArray, NSDictionary;
 @class OCSFolder;
 
+/*
+  SOGoFolder
+  
+  A common superclass for folders stored in OCS. Already deals with all OCS
+  folder specific things.
+*/
+
 @interface SOGoFolder : SOGoObject
 {
   NSString  *ocsPath;
 - (OCSFolder *)ocsFolderForPath:(NSString *)_path;
 - (OCSFolder *)ocsFolder;
 
+/* lower level fetches */
+
+- (NSArray *)fetchContentObjectNames;
+- (NSDictionary *)fetchContentStringsAndNamesOfAllObjects;
+
 @end
 
 #endif /* __SOGo_SOGoFolder_H__ */
index 4eee453b58cd8256439a7a762a27cd88d8816683..1c33b944c4d7e20d6aab56572971d9a701e27d13 100644 (file)
@@ -67,7 +67,7 @@
 }
 
 - (NSArray *)fetchContentObjectNames {
-  NSArray     *fields, *records;
+  NSArray *fields, *records;
   
   fields = [NSArray arrayWithObject:@"c_name"];
   records = [[self ocsFolder] fetchFields:fields matchingQualifier:nil];
     return records;
   return [records valueForKey:@"cName"];
 }
+- (NSDictionary *)fetchContentStringsAndNamesOfAllObjects {
+  NSDictionary *files;
+  
+  files = [[self ocsFolder] fetchContentsOfAllFiles];
+  if (![files isNotNull]) {
+    [self logWithFormat:@"ERROR(%s): fetch failed!", __PRETTY_FUNCTION__];
+    return nil;
+  }
+  if ([files isKindOfClass:[NSException class]])
+    return files;
+  return files;
+}
 
 /* reflection */
 
index 886efe19a74a05ae69b4ee133997cd998f712b64..caf5c58313c6106fbbd614ff4f892b4976e1b31c 100644 (file)
@@ -1,3 +1,5 @@
 # $Id: Version 170 2004-08-11 10:45:40Z helge $
 
-SUBMINOR_VERSION:=25
+SUBMINOR_VERSION:=26
+
+# v0.9.26 requires libOGoContentStore v0.9.13
index a8f4c88fca1b318c46ebcd328efd0bfee399cabb..6caa57141c6fea734d8748b4f2f4f7831cf075a0 100644 (file)
@@ -1,3 +1,7 @@
+2004-10-19  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoAppointment.m: added a -description (v0.9.20)
+
 2004-10-17  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * SOGoAppointmentICalRenderer.m: it's never wrong to escape '\', thus
index 8fcf8cfda8e147cd4636852f602802769d09535a..d5cf0e0df8c80d9464f594ae48d492402eec93b6 100644 (file)
@@ -38,9 +38,9 @@
 
 @interface SOGoAppointment : NSObject
 {
-  id calendar;
+  id        calendar;
   iCalEvent *event;
-  id participants;
+  id        participants;
 }
 
 - (id)initWithICalString:(NSString *)_iCal;
index c0251d5ed90852e35be2a4ae4b98ffd87dca2bc8..de8dd2d001b47e64ac519bed00eab5dfe7961466 100644 (file)
@@ -326,4 +326,21 @@ static SaxObjectDecoder          *sax   = nil;
   return filtered;
 }
 
+/* description */
+
+- (void)appendAttributesToDescription:(NSMutableString *)_ms {
+  [_ms appendFormat:@" uid=%@",  [self uid]];
+  [_ms appendFormat:@" date=%@", [self startDate]];
+}
+
+- (NSString *)description {
+  NSMutableString *ms;
+
+  ms = [NSMutableString stringWithCapacity:64];
+  [ms appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
+  [self appendAttributesToDescription:ms];
+  [ms appendString:@">"];
+  return ms;
+}
+
 @end /* SOGoAppointment */
index 6225fe32e0ea83748b5031800d262d95b4569a42..c331e5f9560a9c8ac40eac5083db40271f964a2b 100644 (file)
@@ -1,6 +1,6 @@
 # $Id$
 
-SUBMINOR_VERSION:=19
+SUBMINOR_VERSION:=20
 
 # v0.9.18 requires NGExtensions  v4.3.123
 # v0.9.13 requires libFoundation v1.0.62