]> err.no Git - sope/commitdiff
changed handling of default method
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 12 Oct 2004 17:22:56 +0000 (17:22 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 12 Oct 2004 17:22:56 +0000 (17:22 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@248 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/Associations/WOValueAssociation.h
sope-appserver/NGObjWeb/Associations/WOValueAssociation.m
sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/Defaults.plist
sope-appserver/NGObjWeb/DynamicElements/WOForm.h
sope-appserver/NGObjWeb/NGHttp/NGHttpBodyParser.m
sope-appserver/NGObjWeb/SoObjects/SoApplication.m
sope-appserver/NGObjWeb/SoObjects/SoObject.m
sope-appserver/NGObjWeb/SoObjects/SoObjectMethodDispatcher.m
sope-appserver/NGObjWeb/SoObjects/SoObjectRequestHandler.m
sope-appserver/NGObjWeb/Version

index e63746341fff0f5178911bcb393286ab8124f54f..c3ccaa1a8b3f6a9093c7c1521f7344dcef095163 100644 (file)
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: WOValueAssociation.h 1 2004-08-20 10:08:27Z znek $
 
 #ifndef __NGObjWeb_WOValueAssociation_H__
 #define __NGObjWeb_WOValueAssociation_H__
 
 #include <NGObjWeb/WOAssociation.h>
 
+/*
+  WOValueAssociation
+  
+  Represents a constant value.
+*/
+
 @interface WOValueAssociation : WOAssociation < NSCoding, NSCopying >
 {
   id value;
index f3caab5d9bfd087fa1a2631fb7b1850069bba5b4..69ef5bed1bf30fc9cdff9356bb9bb7bed24d3198 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "WOValueAssociation.h"
 #include "common.h"
@@ -28,6 +27,8 @@
 
 @implementation WOValueAssociation
 
+static Class StrClass = Nil;
+
 + (int)version {
   return [super version] /* v2 */;
 }
@@ -35,6 +36,7 @@
   NSAssert2([super version] == 2,
             @"invalid superclass (%@) version %i !",
             NSStringFromClass([self superclass]), [super version]);
+  StrClass = [NSString class];
 }
 
 + (WOAssociation *)associationWithValue:(id)_value {
   case 1: return YES;
   case 2: return NO;
   default:
-    self->cacheFlags.boolValue = [self->value boolValue] ? 1 : 2;
+    if (self->value == nil)
+      self->cacheFlags.boolValue = 2; /* false */
+    else
+      self->cacheFlags.boolValue = [self->value boolValue] ? 1 : 2;
     return self->cacheFlags.boolValue == 1 ? YES : NO;
   }
 }
   str = [NSMutableString stringWithCapacity:64];
   [str appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
   [str appendString:@" value="];
-  if ([self->value isKindOfClass:[NSString class]]) {
+  if ([self->value isKindOfClass:StrClass]) {
     NSString *v = self->value;
     
     [str appendString:@"\""];
index 93e410a2673732028ad263efad47ae78435579d8..8cae8af9f82c3f864c85b84c97a4cced825e6d54 100644 (file)
@@ -1,3 +1,19 @@
+2004-10-12  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.3.64
+
+       * Associations/WOValueAssociation.m: small tweak for bool values of nil
+
+       * SoObjects/SoObject.m: added baseURL support for appnames which end
+         with a slash
+
+       * SoObjects/SoObjectMethodDispatcher.m: do not call default methods in
+         place, but rather redirect to the method URL (can be disabled with
+         the SoRedirectToDefaultMethods default)
+
+       * SoObjects/SoObjectMethodDispatcher.m, SoObjects/SoApplication.m:
+         minor improvements to logging
+
 2004-10-12  Helge Hess  <helge.hess@skyrix.com>
 
        * _WOStringTable.m: always open .strings files in ISO-Latin-1 encoding
index e06361c4f09566485e4b6e56a8ada17da645f81c..961c0e23699f0844e18fe93ccc599f1c6d430b6c 100644 (file)
   SoPageInvocationDebugEnabled         = NO;
   SoProductResourceManagerDebugEnabled = NO;
   SoRendererDebugEnabled               = NO;
+  SoRedirectToDefaultMethods           = YES;
   SoSecurityManagerDebugEnabled        = NO;
   SoPreferredNamespacePrefixes = {
     "DAV:" = "D";
index 7401fd638a21d94dd684cfeaaba74bdc72b3cc56..86cb450feb7033e2bb5185f000f4d97888bbefda 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGObjWeb_DynElem_WOForm_H__
 #define __NGObjWeb_DynElem_WOForm_H__
index 70f14b59cb244357401f15e6b17562846f0685a7..9efd3285ba32a46a908a9ea3ff82214fadedca10 100644 (file)
@@ -32,7 +32,7 @@
   unsigned   len;
   id         body;
 
-  [self logWithFormat:@"parse part %@ data: %@", _part, _data];
+  [self debugWithFormat:@"parse part %@ data: %@", _part, _data];
   
   len   = [_data length];
   bytes = [_data bytes];
   return [body autorelease];
 }
 
+- (BOOL)isDebuggingEnabled {
+  return NO;
+}
+
 @end /* NGFormUrlBodyParser */
 
+
 @implementation NGHttpMultipartFormDataBodyParser
 
 + (int)version {
@@ -64,8 +69,8 @@
 }
 
 - (BOOL)parseImmediatlyWithDelegate:(id)_delegate
-  multipart:(id<NGMimePart>)_part data:(NSData *)_data {
-
+  multipart:(id<NGMimePart>)_part data:(NSData *)_data 
+{
   return YES;
 }
 
index dd654cd5871599d239663dd7ffd77a0a558a50cb..3ac382ee81471fa3a3a723788e6501057fac096f 100644 (file)
@@ -202,8 +202,10 @@ static BOOL debugLookup = NO;
      hack to allow "/myapp/folder/", it is a hack because it also allows
      /myapp/myapp/myapp/.../folder/ ...
   */
-  if (v == nil && [self isApplicationNameLookup:_name inContext:_ctx])
+  if (v == nil && [self isApplicationNameLookup:_name inContext:_ctx]) {
     v = self;
+    if (debugLookup) [self logWithFormat:@"  => rewrote value: %@", self];
+  }
   
   return v;
 }
index b3d81996dd0c7f3a6c5ebe2828e2911fa8b44ac9..b38e748ee1648aa4b48d3e8ebaa1ceba41208fa9 100644 (file)
@@ -348,7 +348,7 @@ static void _initialize(void) {
   /*   a) direct access,  eg /MyFolder */
   /*   b) access via app, eg /MyApp/so/MyFolder */
   [ms appendString:[rq applicationName]];
-  [ms appendString:@"/"];
+  if (![ms hasSuffix:@"/"]) [ms appendString:@"/"];
   
   /* done */
   rootURL = [[ms copy] autorelease];
index ddc70e3272dcc2a00c533bc35180e34a982ecbc8..3315f51f7dae66352e263e5ff33548e7baa5d11d 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "SoObjectMethodDispatcher.h"
 #include "SoObject.h"
 @implementation SoObjectMethodDispatcher
 
 static BOOL debugOn = NO;
+static BOOL useRedirectsForDefaultMethods = NO;
 
 + (void)initialize {
   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
   static BOOL didInit = NO;
   if (didInit) return;
   didInit = YES;
-
+  
   debugOn = [ud boolForKey:@"SoObjectMethodDispatcherDebugEnabled"];
+  useRedirectsForDefaultMethods = 
+    [ud boolForKey:@"SoRedirectToDefaultMethods"];
 }
 
 - (id)initWithObject:(id)_object {
@@ -91,14 +93,40 @@ static BOOL debugOn = NO;
   }
   else if ([[self->object soClass] hasKey:[rq method] inContext:_ctx]) {
     // TODO: I'm not sure whether this step is correct
-    /* the class has a GET method */
+    /* the class has a GET/PUT/xxx method */
     methodObject = [self->object lookupName:[rq method] 
                                 inContext:_ctx
                                 acquire:NO];
   }
+  else if (useRedirectsForDefaultMethods) {
+    /*
+      Redirect to a default method if available.
+    */
+    NSString *defaultName;
+    
+    defaultName = [self->object defaultMethodNameInContext:_ctx];
+    if ([defaultName isNotNull]) {
+      if ([defaultName length] > 0) {
+       WOResponse *r;
+       NSString   *url;
+       
+       url = [self->object baseURLInContext:_ctx];
+       if (![url hasSuffix:@"/"]) url = [url stringByAppendingString:@"/"];
+       url = [url stringByAppendingString:defaultName];
+       
+       r = [[_ctx response] retain];
+       [r setStatus:302 /* moved */];
+       [r setHeader:url forKey:@"location"];
+       [pool release];
+       return [r autorelease];
+      }
+    }
+  }
   else {
-    // TODO: should we replace the methodObject with a redirect to the
-    //       default method name? This would ensure proper URLs
+    /* 
+       Note: this can lead to incorrect URLs if the base URL of the method is
+             not set (the method will run in the client URL).
+    */
     methodObject = [self->object lookupDefaultMethod];
     if (debugOn)
       [self debugWithFormat:@"using default method: %@", methodObject];
@@ -114,16 +142,29 @@ static BOOL debugOn = NO;
   }
 
   /* perform call */
-    
+  
   if (methodObject == nil || ![methodObject isCallable]) {
     /*
       The object is neither callable nor does it have a default method,
       so we just pass it through.
+      
+      Note: you can run into situations where there is a methodObject, but
+            it isn't callable. Eg this situation can occur if the default
+           method name leads to an object which isn't a method (occured in
+           the OFS context if 'index' maps to an OFSFile which itself isn't
+           callable).
     */
     resultObject = self->object;
     if (debugOn) {
-      [self debugWithFormat:@"got no method, using object as result: %@", 
-             resultObject];
+      if (methodObject == nil) {
+       [self debugWithFormat:@"got no method, using object as result: %@", 
+               resultObject];
+      }
+      else {
+       [self debugWithFormat:
+               @"method is not callable %@, using object as result: %@", 
+               methodObject, resultObject];
+      }
     }
   }
   else {
index 6b12551aeedd78dc02463d9e6d314bef018fa3c9..f8af72cb7243cce0aaa2a77f5714c97662859f53 100644 (file)
@@ -294,8 +294,10 @@ static NSString *rapidTurnAroundPath = nil;
   
 #if 0
   /* 
-    if we resolve in this location, we won't be able to resolve
+    If we resolve in this location, we won't be able to resolve
     application names like "Control_Panel".
+    
+    TODO: explain better!
   */
   if ([object respondsToSelector:@selector(rootObjectInContext:)])
     object = [object rootObjectInContext:_ctx];
index a3c02e77dde68dc1a7755d5d672d27b0a621d45a..7fa3a4aa24335d3c068cec5427da1e25c4e3cda7 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=63
+SUBMINOR_VERSION:=64
 
 # v4.3.42  requires libNGExtensions v4.3.116
 # v4.3.40  requires libNGExtensions v4.3.115