]> err.no Git - sope/commitdiff
generate relative action links if possible
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 14 Mar 2006 16:50:44 +0000 (16:50 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 14 Mar 2006 16:50:44 +0000 (16:50 +0000)
fixed a log crasher in keypath association
code cleanups

git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1228 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/Associations/WOKeyPathAssociation.m
sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/DynamicElements/WOImage.m
sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.m
sope-appserver/NGObjWeb/NGObjWeb/WOContext.h
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WOApplication.m
sope-appserver/NGObjWeb/WOComponentRequestHandler.m
sope-appserver/NGObjWeb/WOContext+private.h
sope-appserver/NGObjWeb/WOContext.m

index fd06a27e3624a2a5a7d3dde972db8fc4a3ba240e..f7cb400cbd0b465c95c7a1b15cfe8cf0b59b6626 100644 (file)
@@ -792,15 +792,17 @@ static BOOL _setValue(WOKeyPathAssociation *self, id _value, id root) {
     SEL setSel = _getSetSel(info->ckey, info->keyLen);
       
     if (![object respondsToSelector:setSel]) {
-#if 1
+#if 0
       [self errorWithFormat:@"Could not set value for key '%s', "
-            @"object %@ doesn't respond to %@.",
-            self, info->ckey, object,
-            setSel ? NSStringFromSelector(setSel) : @"<NULL>"];
+              @"object %@ doesn't respond to %@.",
+              info->ckey, object,
+              setSel ? NSStringFromSelector(setSel) : @"<NULL>"];
 #endif
       return NO;
     }
-    else {
+    
+    /* object responds to the selector */
+    {
       WOSetMethodType sm;
 
       if ((sm.method = [object methodForSelector:setSel]) != NULL) {
index b6400efc7aabbc4f0d54a09e30a5ec7be3cc4dda..774b6123ed4f3ff50a086c6baf3b22d6913378d3 100644 (file)
@@ -1,3 +1,16 @@
+2006-03-14  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.5.224
+
+       * Associations/WOKeyPathAssociation.m: fixed a crasher in a debug log
+
+       * WOContext.m: changed to generate relative component action URLs in
+         case the request already was a valid component action URL. added a
+         way to detect whether the context session is a fresh one.
+
+       * WOComponentRequestHandler.m, WOApplication.m: minor code cleanups,
+         use -isNotEmpty
+
 2006-03-12  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.5.223
index 69e4725e02e775f73eda3864d3f19aea70e8b049..cc18cf76465047c680e9d87319b4b24195eff8f3 100644 (file)
 #endif
   return;
   
-#if __APPLE__  
+#if __APPLE__
+  // TODO: same issue with gcc 4.1 on Linux ...
   // make Tiger GCC happy
   [super dealloc];
 #endif
index 96b416daa6d9d8bedc30e221fd865876e84b000c..2f1f88c56826eec6cc84aa76311165bac36109d3 100644 (file)
@@ -90,7 +90,8 @@ NSString *methodNames[] = {
   return self->method;
 }
 - (NSString *)methodName {
-  return (self->method < NGHttpMethod_last) ? methodNames[self->method] : nil;
+  return (self->method < NGHttpMethod_last) 
+    ? methodNames[self->method] : (NSString *)nil;
 }
 
 - (NSString *)path {
index 8d64a544510dbef92397391c0d35e2f37818f583..b272562658518f3ef206d5c9e2d29c2505a29d85 100644 (file)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2000-2005 SKYRIX Software AG
+  Copyright (C) 2006      Helge Hess
 
   This file is part of SOPE.
 
@@ -78,7 +79,8 @@
     int inForm:1;
     int xmlStyleEmptyElements:1;
     int allowEmptyAttributes:1;
-    int reserved:28;
+    int hasNewSession:1;    /* session was created during the run */
+    int reserved:27;
   } wcFlags;
   
 @protected
 
 @interface WOContext(SOPEAdditions)
 
+- (BOOL)hasNewSession;
+
 /* languages for resource lookup (non-WO) */
 
 - (NSArray *)resourceLookupLanguages;
index 3f44974553ed87cea24e88db9cab71311acfa907..f5718974e6014b3eb2edaec17483a4b511fe9d05 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=223
+SUBMINOR_VERSION:=224
 
 # v4.5.214 requires libNGExtensions v4.5.179
 # v4.5.122 requires libNGExtensions v4.5.153
index b71baa1d95b2f701be698b2c4c3da2d4dbdfeffb..a79b58717900cf1707391d9b43ed17946974c167 100644 (file)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2000-2005 SKYRIX Software AG
+  Copyright (C) 2006      Helge Hess
 
   This file is part of SOPE.
 
@@ -192,7 +193,7 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
       
       pi  = [NSProcessInfo processInfo];
       env = [pi environment];
-      if ([env objectForKey:@"GNUSTEP_SYSTEM_ROOT"] != nil) {
+      if ([[env objectForKey:@"GNUSTEP_SYSTEM_ROOT"] isNotNull]) {
        isFlattened = [[[env objectForKey:@"GNUSTEP_FLATTENED"]
                              lowercaseString] isEqualToString:@"yes"];
       }
@@ -248,7 +249,7 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
 - (id)initWithName:(NSString *)_name {
   [WOApplication _initializeWOApp];
   
-  if ((self = [super init])) {
+  if ((self = [super init]) != nil) {
     NSUserDefaults   *ud;
     WORequestHandler *rh;
     NSString *rk;
@@ -502,7 +503,7 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
   WOSession *sn;
 
   sn = [self createSessionForRequest:[_ctx request]];
-  [_ctx setSession:sn];
+  [_ctx setNewSession:sn];
   
   if ([sn respondsToSelector:@selector(prepare)]) {
 #if DEBUG
@@ -526,7 +527,7 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
   
   /* first look into form values */
   if ((sessionId = [_request formValueForKey:WORequestValueSessionID])!=nil) {
-    if ([sessionId length] > 0)
+    if ([sessionId isNotEmpty])
       return sessionId;
   }
   
@@ -537,12 +538,12 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
       
       e = [(id)sessionId objectEnumerator];
       while ((sessionId = [e nextObject]) != nil) {
-        if ([sessionId length] > 0 && ![sessionId isEqual:@"nil"])
+        if ([sessionId isNotEmpty] && ![sessionId isEqual:@"nil"])
           return sessionId;
       }
     }
     else {
-      if ([sessionId length] > 0 && ![sessionId isEqual:@"nil"])
+      if ([sessionId isNotEmpty] && ![sessionId isEqual:@"nil"])
         return sessionId;
     }
   }
@@ -599,7 +600,7 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
     }
     else {
       session = [store restoreSessionWithID:_sid request:[_ctx request]];
-      if (session) {
+      if ([session isNotNull]) {
         [_ctx setSession:session];
         [session _awakeWithContext:_ctx];
       }
@@ -829,9 +830,9 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
   
   ud = [NSUserDefaults standardUserDefaults];
   p  = [ud stringForKey:@"WODefaultResourceManager"];
-  rmClass = ([p length] == 0)
-    ? [WOResourceManager class]
-    : NSClassFromString(p);
+  rmClass = [p isNotEmpty]
+    ? NSClassFromString(p)
+    : [WOResourceManager class];
   
   if (rmClass == Nil) {
     [self errorWithFormat:
index 6e49f3e23947ed87ff14bcacc8ef5322067e40a7..70b5bf3f77c14b5b71611a037afd52071221cf8d 100644 (file)
 - (WOResponse *)restoreSessionWithID:(NSString *)_sid
   inContext:(WOContext *)_ctx
 {
-  WOApplication *app = [WOApplication application];
+  WOApplication *app;
   WOSession *session;
   
+  app = [WOApplication application];
   if (_sid == nil) {
     // invalid session ID (or no session-ID ?!, which is no error ?) */
     return [app handleSessionRestorationErrorInContext:_ctx];
 
       session/context.element-id
   */
-  if ([handlerPath length] > 0) {
+  if ([handlerPath isNotEmpty]) {
     NSArray *spath = [_request requestHandlerPathArray];
-
+    
     if ([spath count] > 1)
       [context setRequestSenderID:[spath objectAtIndex:1]];
-    if ([spath count] > 0)
+    if ([spath isNotEmpty])
       sessionID = [spath objectAtIndex:0];
   }
   
-  if ([sessionID length] == 0)
+  if (![sessionID isNotEmpty])
     sessionID = [application sessionIDFromRequest:_request];
   
 #if 1
   [application awake];
   
   /* restore or create session */
-  if ([sessionID isNotNull]) {
+  if ([sessionID isNotEmpty]) {
     if ((response = [self restoreSessionWithID:sessionID inContext:context]))
       session = nil;
     else {
index e1c110d9faafbc61d6f084410ac0b9a11c531928..51b4e773611ac427ce24ecba88408701bf7ae9da 100644 (file)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2000-2005 SKYRIX Software AG
+  Copyright (C) 2006      Helge Hess
 
   This file is part of SOPE.
 
@@ -41,6 +42,7 @@ extern void WOContext_leaveComponent(WOContext *_ctx, WOComponent *_component);
 - (WODynamicElement *)componentContent;
 
 - (void)setSession:(WOSession *)_session;
+- (void)setNewSession:(WOSession *)_session;
 - (void)setPage:(WOComponent *)_page;
 - (void)setResponse:(WOResponse *)_response;
 
index 6209859b863bb9e8c22e6c94711dd01610e7e337..eb20581943984e8208622b9e4b4e8b958f9058fb 100644 (file)
@@ -1,5 +1,6 @@
 /*
-  Copyright (C) 2000-2005 SKYRIX Software AG
+  Copyright (C) 2000-2006 SKYRIX Software AG
+  Copyright (C) 2006      Helge Hess
 
   This file is part of SOPE.
 
@@ -28,7 +29,7 @@
 #include <NGObjWeb/WORequest.h>
 #include <NGObjWeb/WOResponse.h>
 #include <NGObjWeb/WOSession.h>
-#import <EOControl/EONull.h>
+#include <Foundation/NSNull.h>
 #include "WOElementID.h"
 #include "common.h"
 #include <time.h>
@@ -288,19 +289,26 @@ static NSString *WOApplicationSuffix = nil;
   [super dealloc];
 }
 
+/* session */
+
 - (void)setSession:(WOSession *)_session {
   ASSIGN(self->session, _session);
 }
+- (void)setNewSession:(WOSession *)_session {
+  [self setSession:_session];
+  self->wcFlags.hasNewSession = 1;
+}
 
 - (id)session {
-  // in WO4 -session creates a new session if none is associated
+  /* in WO4 -session creates a new session if none is associated */
   
   if (self->session == nil) {
     [[self application] _initializeSessionInContext:self];
     
-    if (self->session == nil)
+    if (self->session == nil) {
       [self logWithFormat:@"%s: missing session for context ..",
               __PRETTY_FUNCTION__];
+    }
   }
   
   return self->session;
@@ -335,6 +343,11 @@ static NSString *WOApplicationSuffix = nil;
 - (BOOL)hasSession {
   return (self->session != nil) ? YES : NO;
 }
+- (BOOL)hasNewSession {
+  if (!self->wcFlags.hasNewSession)
+    return NO;
+  return [self hasSession];
+}
 
 - (BOOL)savePageRequired {
   return self->wcFlags.savePageRequired ? YES : NO;
@@ -615,7 +628,7 @@ void WOContext_leaveComponent(WOContext *self, WOComponent *_component) {
     return;
   else if (WOGetKVCGetMethod(self, _key) == NULL) {
     if (_value == nil)
-      _value = [EONull null];
+      _value = [NSNull null];
     
     if (self->variables == nil) {
       self->variables =
@@ -811,11 +824,20 @@ void WOContext_leaveComponent(WOContext *self, WOComponent *_component) {
   //   26% -urlWithRequestHandler...
   //   21% -elementID (was 40% !! :-)
   //   ~20% mutable string ops
+  
+  /* 
+     This makes the request handler save the page in the session at the
+     end of the request (only necessary if the page generates URLs which
+     refer the context).
+  */
+  self->wcFlags.savePageRequired = 1;
+  
   if (newCURLStyle) {
+    // TODO: who uses that? Its not enabled per default
+    // TODO: what does this do?
     NSMutableString *qs;
     NSString *p;
   
-    self->wcFlags.savePageRequired = 1;
     qs = [MutableStrClass stringWithCapacity:64];
   
     [qs appendString:WORequestValueSenderID];
@@ -846,8 +868,19 @@ void WOContext_leaveComponent(WOContext *self, WOComponent *_component) {
     static NSMutableString *url = nil; // THREAD
     static IMP addStr = NULL;
     NSString *s;
+    NSString *coRqhKey;
+
+    coRqhKey = [WOAppClass componentRequestHandlerKey];
+
+    /* 
+       Optimization: use relative URL if the request already was a component
+                     action (with a valid session)
+    */
+    if (!self->wcFlags.hasNewSession) {
+      if ([[self->request requestHandlerKey] isEqualToString:coRqhKey])
+       return [self->elementID elementID];
+    }
     
-    self->wcFlags.savePageRequired = 1;
     if (url == nil) {
       url = [[MutableStrClass alloc] initWithCapacity:256];
       addStr = [url methodForSelector:@selector(appendString:)];
@@ -855,7 +888,7 @@ void WOContext_leaveComponent(WOContext *self, WOComponent *_component) {
     }
     else
       [url setString:@"/"];
-  
+    
     /*
       Note: component actions *always* require sessions to be able to locate
       the request component !
@@ -864,8 +897,7 @@ void WOContext_leaveComponent(WOContext *self, WOComponent *_component) {
     addStr(url, @selector(appendString:), @"/");
     addStr(url, @selector(appendString:), [self->elementID elementID]);
   
-    s = [self urlWithRequestHandlerKey:
-               [WOAppClass componentRequestHandlerKey]
+    s = [self urlWithRequestHandlerKey:coRqhKey
              path:url queryString:nil];
     return s;
   }