]> err.no Git - sope/commitdiff
changes to component activation and context tracking
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Mon, 23 Aug 2004 00:58:37 +0000 (00:58 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Mon, 23 Aug 2004 00:58:37 +0000 (00:58 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@39 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

12 files changed:
sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/SoObjects/SoProductClassInfo.m
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WOApplication.m
sope-appserver/NGObjWeb/WOComponent.m
sope-appserver/NGObjWeb/WOComponentDefinition.m
sope-appserver/NGObjWeb/WOComponentRequestHandler.m
sope-appserver/NGObjWeb/WOContext+private.h
sope-appserver/NGObjWeb/WOContext.m
sope-appserver/NGObjWeb/WOCoreApplication.m
sope-appserver/NGObjWeb/WORequestHandler.m
sope-appserver/NGObjWeb/WOResourceManager.m

index 8c09dd3c3d32533c41861331b491a938b5e72bcc..9f09b4d8f1d25288a753010e588574c294367a98 100644 (file)
@@ -1,3 +1,17 @@
+2004-08-23  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.3.5
+
+       * WOContext.m, WOComponent.m: modified component awake handling, should
+         fix some awake-in-context logs
+
+       * WOComponentRequestHandler.m: use _setCurrentContext: method
+
+       * WOApplication.m: added -_setCurrentContext: method to set the global
+         context (should be avoided, but not always possible ..)
+
+       * SoObjects/SoProductClassInfo.m: improved error handling (v4.3.4)
+
 2004-08-22  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.3.3
index 229c66b57933cc08ae8100d4709309505031d8fb..80669f7fa8794dbc2780470abe6738b21190a3a4 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: SoProductClassInfo.m 1 2004-08-20 10:08:27Z znek $
 
 #include "SoProductClassInfo.h"
 #include "SoPageInvocation.h"
@@ -220,6 +220,12 @@ static int loadDebugOn = 0;
 - (void)applyOnRegistry:(SoClassRegistry *)_registry {
   SoClass *soClass;
   id security;
+
+  if (_registry == nil) {
+    [self logWithFormat:@"WARNING(%s): did not pass a registry?!",
+           __PRETTY_FUNCTION__];
+    return;
+  }
   
   if ((soClass = [_registry soClassWithName:[self className]]) == nil) {
     [self logWithFormat:
index fbecef63c37170d0bf2048e9a85a1a4133dc58cd..8c98006ab1a9c9a313af1eed8096e8ad306e7e04 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=3
+SUBMINOR_VERSION:=4
 
 # v4.2.413 requires libSaxObjC      v4.2.33
 # v4.2.341 requires libNGExtensions v4.2.77
index 7732412885feed7a0fabb3c852f0229bda3a85fa..64dc6924300e5476924928780730fb0043b6af65 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: WOApplication.m 1 2004-08-20 10:08:27Z znek $
 
 #include <NGObjWeb/WOApplication.h>
 #include "WOContext+private.h"
@@ -236,7 +236,8 @@ static NSString *rapidTurnAroundPath = nil;
     /* setup request handlers */
     
     self->defaultRequestHandler =
-      [[NSClassFromString([[self class] defaultRequestHandlerClassName]) alloc] init];
+      [[NSClassFromString([[self class] defaultRequestHandlerClassName])
+                        alloc] init];
     
     self->requestHandlerRegistry =
       NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 8);
@@ -372,6 +373,15 @@ static NSString *rapidTurnAroundPath = nil;
   return self->instanceNumber;
 }
 
+- (void)_setCurrentContext:(WOContext *)_ctx {
+  NSMutableDictionary *info;
+
+  info = [[NSThread currentThread] threadDictionary];
+  if (_ctx != nil)
+    [info setObject:_ctx forKey:@"WOContext"];
+  else
+    [info removeObjectForKey:@"WOContext"];
+}
 - (WOContext *)context {
   // deprecated in WO4
   NSThread     *t;
index 94e3cb7ce9960966905ec3392397fd1820dff152..54550173907dd8c6fd75e1e064f9837c37d31f5e 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: WOComponent.m 1 2004-08-20 10:08:27Z znek $
 
 #include <NGObjWeb/WOComponent.h>
 #include "WOComponent+private.h"
@@ -268,6 +268,7 @@ static inline id _getExtraVar(WOComponent *self, NSString *_key) {
     self->session = [_ctx session];
   
   self->componentFlags.isAwake = 1;
+  [_ctx _addAwakeComponent:self]; /* ensure that sleep is called */
   
   /* awake subcomponents */
   {
index 4791d9cdbcbb657e1dce1b50a1aa2e7291b9a197..9b9200e8e2ab2fbda6b7ff8c4a938ca678bc5793 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "WOComponentDefinition.h"
 #include "WOComponent+private.h"
index 870fece111fdb44ffe0cb4b54b9dfb80ce07d45c..0209ec3994a8c30c9dd2108285de3fc665c8362e 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "WOComponentRequestHandler.h"
 #include "WORequestHandler+private.h"
@@ -32,6 +31,7 @@
 
 @interface WOApplication(Privates)
 - (WOSession *)_initializeSessionInContext:(WOContext *)_ctx;
+- (void)_setCurrentContext:(WOContext *)_ctx;
 @end
 
 @implementation WOComponentRequestHandler
   }
   
   context = [WOContext contextWithRequest:_request];
-  [[[NSThread currentThread] threadDictionary]
-              setObject:context forKey:@"WOContext"];
+  [application _setCurrentContext:context];
   
   /*
     parse handler path (URL)
     [application unlockRequestHandling];
     isLocked = NO;
   }
-
-  [[[NSThread currentThread] threadDictionary]
-              removeObjectForKey:@"WOContext"];
+  
+  [application _setCurrentContext:nil];
   return response;
 }
 
index 31552e7895cc5c0bc70b740797f09ce158065a3e..6ab75c0c3741aa88ad721671eae317f4ab368e54 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  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
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGObjWeb_WOContext_private_H__
 #define __NGObjWeb_WOContext_private_H__
@@ -33,6 +32,8 @@ extern void WOContext_leaveComponent(WOContext *_ctx, WOComponent *_component);
 
 @interface WOContext(NGObjWebInternal)
 
+- (void)_addAwakeComponent:(WOComponent *)_component;
+
 - (void)enterComponent:(WOComponent *)_component content:(WOElement *)_content;
 - (void)leaveComponent:(WOComponent *)_component;
 - (void)sleepComponents;
index a565c141578233f5ebe3d4accfde966b938ba1ac..d5403214555e945437ae530d85cdef4cf27cebab 100644 (file)
@@ -112,25 +112,67 @@ static NSString *WOApplicationSuffix = nil;
 
 /* components */
 
+- (void)_addAwakeComponent:(WOComponent *)_component {
+  if (_component == nil)
+    return;
+
+  if ([self->awakeComponents containsObject:_component])
+    return;
+
+  /* wake up component */
+  if (debugComponentAwake)
+    [self logWithFormat:@"mark component awake: %@", _component];
+  
+  [self->awakeComponents addObject:_component];
+}
+
+- (void)_awakeComponent:(WOComponent *)_component {
+  if (_component == nil)
+    return;
+
+  if ([self->awakeComponents containsObject:_component])
+    return;
+
+  /* wake up component */
+  if (debugComponentAwake)
+    [self logWithFormat:@"awake component: %@", _component];
+    
+  [_component _awakeWithContext:self];
+
+  [self _addAwakeComponent:_component];
+  
+  if (debugComponentAwake)
+    [self logWithFormat:@"woke up component: %@", _component];
+}
+
 - (void)sleepComponents {
   NSEnumerator *e;
   WOComponent  *component;
   BOOL sendSleepToPage;
+
+  if (debugComponentAwake) {
+    [self logWithFormat:@"sleep %d components ...", 
+           [self->awakeComponents count]];
+  }
   
   sendSleepToPage = YES;
   e = [self->awakeComponents objectEnumerator];
   while ((component = [e nextObject])) {
     if (debugComponentAwake)
-      [self logWithFormat:@"sleep component: %@", component];
+      [self logWithFormat:@"  sleep component: %@", component];
     [component _sleepWithContext:self];
     if (component == self->page) sendSleepToPage = NO;
   }
   if (sendSleepToPage && (self->page != nil)) {
     if (debugComponentAwake)
-      [self logWithFormat:@"sleep page: %@", self->page];
+      [self logWithFormat:@"  sleep page: %@", self->page];
     [self->page _sleepWithContext:self];
   }
   
+  if (debugComponentAwake) {
+    [self logWithFormat:@"done sleep %d components.", 
+           [self->awakeComponents count]];
+  }
   [self->awakeComponents removeAllObjects];
 }
 
@@ -347,17 +389,7 @@ void WOContext_enterComponent
   self->contentStack[(int)self->componentStackCount]   = [_content   retain];
   self->componentStackCount++;
   
-  if (![self->awakeComponents containsObject:_component]) {
-    /* wake up component */
-    if (debugComponentAwake)
-      [self logWithFormat:@"awake component: %@", _component];
-    
-    [_component _awakeWithContext:self];
-    [self->awakeComponents addObject:_component];
-
-    if (debugComponentAwake)
-      [self logWithFormat:@"woke up component: %@", _component];
-  }
+  [self _awakeComponent:_component];
   
   if (parent) {
     if ([_component synchronizesVariablesWithBindings])
index 490702087413c28aeebeb204849236d3358f2965..218ec0bea2572ffaf7e594b36da992b545a2423b 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include <NGObjWeb/WOCoreApplication.h>
 #include <NGObjWeb/WOAdaptor.h>
index 5c7546c9f4072b6683f88ca5fa4776cdf327b259..faccd753074a9700e6e815744c37b9f036392843 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "WORequestHandler+private.h"
 #include "WOApplication+private.h"
 @end
 #endif
 
+@interface WOApplication(Privates)
+- (void)_setCurrentContext:(WOContext *)_ctx;
+@end
+
 @implementation WORequestHandler
 
 static BOOL  perflog = NO;
@@ -122,7 +125,6 @@ static Class NSDateClass = Nil;
   WOResponse    *response   = nil;
   WOContext     *context    = nil;
   NSThread      *thread;
-  NSMutableDictionary *threadDict;
   NSString      *sessionId  = nil;
   WOSession     *session    = nil;
   NSString *uri;
@@ -143,8 +145,6 @@ static Class NSDateClass = Nil;
   
   thread = [NSThread currentThread];
   NSAssert(thread, @"missing current thread ...");
-  threadDict = [thread threadDictionary];
-  NSAssert(threadDict, @"missing current thread's dictionary ...");
   
   if (_request == nil) return nil;
 
@@ -158,8 +158,7 @@ static Class NSDateClass = Nil;
     /* setup context */
     context = [WOContext contextWithRequest:_request];
     NSAssert(context,    @"no context assigned ..");
-    NSAssert(threadDict, @"missing current thread's dictionary ...");
-    [threadDict setObject:context forKey:@"WOContext"];
+    [app _setCurrentContext:context];
     
     /* check session id */
     *(&session)   = nil;
@@ -269,8 +268,7 @@ static Class NSDateClass = Nil;
     }
     NS_ENDHANDLER;
     
-    NSAssert(threadDict, @"missing current thread's dictionary ...");
-    [threadDict removeObjectForKey:@"WOContext"];
+    [app _setCurrentContext:nil];
   }
 #if USE_POOLS
   [pool release]; pool = nil;
index b347b9a7e6d86a16862251fa745fe2b2757651ed..79c763a510fec5128f976d5ddac2aaa200515a3e 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include <NGObjWeb/WOResourceManager.h>
 #include "WOComponentDefinition.h"
@@ -646,7 +645,8 @@ _pathExists(WOResourceManager *self, NSFileManager *fm, NSString *path)
   
   if (DefClass == Nil)
     DefClass = [WOComponentDefinition class];
-  
+
+  // TODO: is retained response intended?
   cdef = [[DefClass alloc] initWithName:_name
                            path:[_url path]
                            baseURL:_baseURL frameworkName:_fwname];
@@ -843,7 +843,8 @@ _pathExists(WOResourceManager *self, NSFileManager *fm, NSString *path)
         
         /* take a look into the file system */
         languagePath = [language stringByAppendingPathExtension:@"lproj"];
-        languagePath = [componentPath stringByAppendingPathComponent:languagePath];
+        languagePath = 
+         [componentPath stringByAppendingPathComponent:languagePath];
         
         if ([fm fileExistsAtPath:languagePath isDirectory:&isDirectory]) {
           NSString *baseUrl = nil;