]> err.no Git - sope/commitdiff
map Java-like class names
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 Aug 2005 01:06:08 +0000 (01:06 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 Aug 2005 01:06:08 +0000 (01:06 +0000)
compile EOCoreData on OSX

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

sope-core/EOControl/ChangeLog
sope-core/EOControl/EOKeyValueArchiver.h
sope-core/EOControl/EOKeyValueArchiver.m
sope-core/EOControl/Version
sope-core/GNUmakefile

index 94bb6f7bdb381840fa87a589207d95fa64b94a7d..dcfcc871f99a0f3d47f43e8c4d3d20578eff4a13 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-04  Helge Hess  <helge.hess@opengroupware.org>
+
+       * EOKeyValueArchiver.m: process class names containing a dot by
+         first looking up the class using the last dot-component and then
+         by trying to map some known prefixes (eg D2W) (v4.5.54)
+
 2005-05-03  Helge Hess  <helge.hess@opengroupware.org>
 
        * EOQualifier.h: fixed prototypes of -isLike/-isCaseInsensitiveLike:
index 4be5846576aad4e9b40f64bdb0697ee09c70f5a3..e451fc9eb8caec418386ad37c3a8cc235529f5bc 100644 (file)
@@ -56,7 +56,7 @@
   NSMutableSet   *awakeObjects;
   id parent;
   
-  id delegate; // non-retained
+  id delegate; // non-retained (eg a WOComponent)
 }
 
 - (id)initWithDictionary:(NSDictionary *)_dict;
@@ -64,7 +64,7 @@
 /* decoding */
 
 - (id)decodeObjectForKey:(NSString *)_key;
-- (id)decodeObjectReferenceForKey:(NSString *)_key;
+- (id)decodeObjectReferenceForKey:(NSString *)_key; /* ask delegate for obj */
 - (BOOL)decodeBoolForKey:(NSString *)_key;
 - (int)decodeIntForKey:(NSString *)_key;
 
@@ -91,7 +91,7 @@
 
 @interface NSObject(EOKeyValueArchivingAwakeMethods)
 
-- (void)finishInitializationWithKeyValueUnarchiver:(EOKeyValueUnarchiver *)_una;
+- (void)finishInitializationWithKeyValueUnarchiver:(EOKeyValueUnarchiver *)_un;
 - (void)awakeFromKeyValueUnarchiver:(EOKeyValueUnarchiver *)_unarchiver;
 
 @end
index ec932804692025b5e5658c3ab949b79691aa8511..6ef7cb28fdff74ecb2472edfb5b752a5c883664d 100644 (file)
@@ -132,6 +132,54 @@ static BOOL isPListObject(id _obj) {
   [super dealloc];
 }
 
+/* class handling */
+
+- (Class)classForName:(NSString *)_name {
+  /*
+    This method maps class names. It is intended for archives which are
+    written by the Java bridge and therefore use fully qualified Java
+    package names.
+    
+    The mapping is hardcoded for now, this could be extended to use a
+    dictionary if considered necessary.
+  */
+  NSString *lastComponent = nil;
+  Class   clazz;
+  NSRange r;
+
+  if (_name == nil)
+    return nil;
+  
+  if ((clazz = NSClassFromString(_name)) != Nil)
+    return clazz;
+  
+  /* check for Java like . names (eg com.webobjects.directtoweb.Assignment) */
+  
+  r = [_name rangeOfString:@"." options:NSBackwardsSearch];
+  if (r.length > 0) {
+    lastComponent = [_name substringFromIndex:(r.location + r.length)];
+    
+    /* first check whether the last name directly matches a class */
+    if ((clazz = NSClassFromString(lastComponent)) != Nil)
+      return clazz;
+    
+    /* then check some hardcoded prefixes */
+    
+    if ([_name hasPrefix:@"com.webobjects.directtoweb"]) {
+      NSString *s;
+      
+      s = [@"D2W" stringByAppendingString:lastComponent];
+      if ((clazz = NSClassFromString(lastComponent)) != Nil)
+       return clazz;
+    }
+    
+    NSLog(@"WARNING(%s): could not map Java class in unarchiver: '%@'",
+         __PRETTY_FUNCTION__, _name);
+  }
+  
+  return Nil;
+}
+
 /* decoding */
 
 - (id)decodeObjectForKey:(NSString *)_key {
@@ -147,10 +195,15 @@ static BOOL isPListObject(id _obj) {
     obj = [[self->plist copy] autorelease];
   }
   else if ((className = [self->plist objectForKey:@"class"]) != nil) {
-    obj = [NSClassFromString(className) alloc];
+    obj = [[self classForName:className] alloc];
     obj = [obj initWithKeyValueUnarchiver:self];
     
-    [self->unarchivedObjects addObject:obj];
+    if (obj != nil)
+      [self->unarchivedObjects addObject:obj];
+    else {
+      NSLog(@"WARNING(%s): could not unarchive object %@",
+           __PRETTY_FUNCTION__, self->plist);
+    }
     [obj release];
   }
   else {
index d124b50f26de387d248a94761fd62b6a22df310b..5a9103fbcfe3a90091d3e23c80df915537dcc5fd 100644 (file)
@@ -1,3 +1,3 @@
 # version file
 
-SUBMINOR_VERSION:=53
+SUBMINOR_VERSION:=54
index 085c6f22a9362d4ee4a7556a6c16c214a074a946..1f0416a77d5688c281f076869dd31cd29ca23be9 100644 (file)
@@ -6,9 +6,14 @@ include $(GNUSTEP_MAKEFILES)/common.make
 PACKAGE_NAME=sope-core
 VERSION=4.5.0
 
-SUBPROJECTS = \
+SUBPROJECTS += \
        EOControl       \
        NGExtensions    \
-       NGStreams       \
+       NGStreams
+
+# compile EOCoreData if we are on Tiger
+ifeq ($(findstring darwin8, $(GNUSTEP_TARGET_OS)), darwin8)
+SUBPROJECTS += EOCoreData
+endif
 
 include $(GNUSTEP_MAKEFILES)/aggregate.make