/*
- Copyright (C) 2000-2004 SKYRIX Software AG
+ Copyright (C) 2000-2005 SKYRIX Software AG
- This file is part of OpenGroupware.org.
+ This file is part of SOPE.
- OGo is free software; you can redistribute it and/or modify it under
+ SOPE 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
+ SOPE 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
+ License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include <time.h>
@interface WOApplication(PrivateMethods)
++ (id)logger;
- (id)_loadComponentDefinitionWithName:(NSString *)_name
language:(NSArray *)_langs;
- (NSDictionary *)memoryStatistics;
@implementation WOApplication
+#if 1
+static NSString *defaultCompRqHandlerClassName = @"OWViewRequestHandler";
+#else
+static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
+#endif
+
+ (int)version {
return [super version] + 5 /* v6 */;
}
c = [(id<NSObject>)clazz performSelector:@selector(defaultSNSConnection)];
if (c == nil) {
- [self logFatalWithFormat:@"could not connect SNS, exiting .."];
+ [[self logger] fatalWithFormat:@"could not connect SNS, exiting .."];
exit(20);
}
- [self logInfoWithFormat:@"SNS enabled"];
+ [[self logger] logWithFormat:@"SNS enabled"];
}
+ (void)_initializeWOApp {
debugOn = [WOApplication isDebuggingEnabled];
if (!debugOn)
[[self logger] setLogLevel:NGLogLevelInfo];
+ else
+ NSLog(@"Note: WOApplication debugging is enabled.");
if (classLock == nil) classLock = [[NSRecursiveLock alloc] init];
ud = [NSUserDefaults standardUserDefaults];
if ([ud boolForKey:@"WOContactSNS"])
[self _setupSNS];
else
- [self logInfoWithFormat:@"SNS support disabled."];
+ [[self logger] logWithFormat:@"SNS support disabled."];
NSDateClass = [NSDate class];
WOTemplateClass = [WOTemplate class];
e = [keys objectEnumerator];
while((key = [e nextObject]) != nil) {
if ([key hasPrefix:@"WO"] || [key isEqualToString:@"NSProjectSearchPath"])
- [self logInfoWithFormat:@"[default]: %@ = %@",
+ [self logWithFormat:@"[default]: %@ = %@",
key,
[[ud objectForKey:key] description]];
}
self->requestHandlerRegistry =
NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 8);
- rk = [WOApplication componentRequestHandlerKey];
-#if 1
- rh = [[NSClassFromString(@"OWViewRequestHandler") alloc] init];
-#else
- rh = [[NSClassFromString(@"WOComponentRequestHandler") alloc] init];
-#endif
+ if ((rk = [WOApplication componentRequestHandlerKey]) == nil) {
+ [self logWithFormat:
+ @"WARNING: no component request handler key is specified, "
+ @"this probably means that share/ngobjweb/Defaults.plist "
+ @"could not get loaded (permissions?)"];
+ }
+ rh = [[NSClassFromString(defaultCompRqHandlerClassName) alloc] init];
if ([rk length] > 0 && (rh != nil))
[self registerRequestHandler:rh forKey:rk];
[rh release]; rh = nil;
- (void)processHupSignal:(int)_signal {
/* this isn't called immediatly */
- [self logInfoWithFormat:@"terminating on SIGHUP ..."];
+ [self logWithFormat:@"terminating on SIGHUP ..."];
[self terminate];
}
if (self->path == nil) {
if ((self->path = [[self _lookupAppPath] copy]) == nil) {
- [self logDebugWithFormat:@"could not find wrapper of application !"];
+ [self debugWithFormat:@"could not find wrapper of application !"];
missingPath = YES;
return nil;
}
NSDictionary *td;
if ((t = [NSThread currentThread]) == nil) {
- [self logErrorWithFormat:@"missing current thread !!!"];
+ [self errorWithFormat:@"missing current thread !!!"];
return nil;
}
if ((td = [t threadDictionary]) == nil) {
- [self logErrorWithFormat:
+ [self errorWithFormat:
@"missing current thread's dictionary (thread=%@) !!!",
t];
return nil;
if (_request == nil) return nil;
/* first look into form values */
- if ((sessionId = [_request formValueForKey:WORequestValueSessionID])) {
+ if ((sessionId = [_request formValueForKey:WORequestValueSessionID])!=nil) {
if ([sessionId length] > 0)
return sessionId;
}
/* now look into the cookies */
- if ((sessionId = [_request cookieValueForKey:[self name]])) {
+ if ((sessionId = [_request cookieValueForKey:[self name]]) != nil) {
if ([sessionId respondsToSelector:@selector(objectEnumerator)]) {
NSEnumerator *e;
e = [(id)sessionId objectEnumerator];
- while ((sessionId = [e nextObject])) {
+ while ((sessionId = [e nextObject]) != nil) {
if ([sessionId length] > 0 && ![sessionId isEqual:@"nil"])
return sessionId;
}
- (WOSession *)createSessionForRequest:(WORequest *)_request {
if ([self respondsToSelector:@selector(createSession)]) {
/* call deprecated method */
- [self logWarnWithFormat:@"calling deprecated -createSession .."];
+ [self warnWithFormat:@"calling deprecated -createSession .."];
return [self createSession];
}
else {
if ([self respondsToSelector:@selector(restoreSession)]) {
/* call deprecated method */
- [self logWarnWithFormat:@"calling deprecated -restoreSession .."];
+ [self warnWithFormat:@"calling deprecated -restoreSession .."];
return [self restoreSession];
}
WOSessionStore *store;
if ((store = [self sessionStore]) == nil) {
- [self logErrorWithFormat:@"missing session store ..."];
+ [self errorWithFormat:@"missing session store ..."];
}
else {
session = [store restoreSessionWithID:_sid request:[_ctx request]];
if ([sid respondsToSelector:@selector(objectEnumerator)]) {
NSEnumerator *e;
- [self logErrorWithFormat:@"got multiple session IDs !"];
+ [self errorWithFormat:@"got multiple session IDs !"];
e = [sid objectEnumerator];
while ((_sid = [e nextObject])) {
if ((session = [self restoreSessionWithID:_sid inContext:_ctx]))
return session;
- //NSLog(@"WARNING: did not find session for sid %@", _sid);
+ //[self warnWithFormat:@"did not find session for sid %@", _sid);
}
}
}
if ([self respondsToSelector:@selector(saveSession:)]) {
/* call deprecated method */
- [self logWarnWithFormat:@"calling deprecated -saveSession: .."];
+ [self warnWithFormat:@"calling deprecated -saveSession: .."];
[self saveSession:[_ctx session]];
return;
}
if (perfLogger) {
NSTimeInterval rt;
rt = [[NSDateClass date] timeIntervalSince1970] - startSnSleep;
- [perfLogger logInfoWithFormat:@"[woapp]: session -sleep took %4.3fs.",
+ [perfLogger logWithFormat:@"[woapp]: session -sleep took %4.3fs.",
rt < 0.0 ? -1.0 : rt];
}
if (perfLogger) {
NSTimeInterval rt;
rt = [[NSDateClass date] timeIntervalSince1970] - startStore;
- [perfLogger logInfoWithFormat:@"[woapp]: storing sn in store took %4.3fs.",
+ [perfLogger logWithFormat:@"[woapp]: storing sn in store took %4.3fs.",
rt < 0.0 ? -1.0 : rt];
}
}
if (perfLogger) {
NSTimeInterval rt;
rt = [[NSDateClass date] timeIntervalSince1970] - startSave;
- [perfLogger logInfoWithFormat:@"[woapp]: saveSessionForContext took %4.3fs.",
+ [perfLogger logWithFormat:@"[woapp]: saveSessionForContext took %4.3fs.",
rt < 0.0 ? -1.0 : rt];
}
}
#endif
if ([self respondsToSelector:@selector(handleSessionCreationError)]) {
- [self logWarnWithFormat:@"called deprecated -handleSessionCreationError method"];
+ [self warnWithFormat:@"called deprecated -handleSessionCreationError method"];
return [self handleSessionCreationError];
}
- [self logErrorWithFormat:@"could not create session for context %@", _ctx];
+ [self errorWithFormat:@"could not create session for context %@", _ctx];
[response setStatus:200];
[response appendContentString:@"<h4>Session Creation Error</h4>\n<pre>"];
- (WOResponse *)handleSessionRestorationErrorInContext:(WOContext *)_ctx {
if ([self respondsToSelector:@selector(handleSessionRestorationError)]) {
- [self logWarnWithFormat:@"calling deprecated "
+ [self warnWithFormat:@"calling deprecated "
@"-handleSessionRestorationError method"];
return [self handleSessionRestorationError];
}
- [self logErrorWithFormat:@"could not restore session for context %@", _ctx];
+ [self errorWithFormat:@"could not restore session for context %@", _ctx];
return nil;
}
/* resources */
+- (void)_setupDefaultResourceManager {
+ NSUserDefaults *ud;
+ Class rmClass;
+ NSString *p;
+
+ ud = [NSUserDefaults standardUserDefaults];
+ p = [ud stringForKey:@"WODefaultResourceManager"];
+ rmClass = ([p length] == 0)
+ ? [WOResourceManager class]
+ : NSClassFromString(p);
+
+ if (rmClass == Nil) {
+ [self errorWithFormat:
+ @"failed to locate class of resource manager: '%@'", p];
+ return;
+ }
+
+ if ([rmClass instancesRespondToSelector:@selector(initWithPath:)])
+ self->resourceManager = [[rmClass alloc] init];
+ else {
+ self->resourceManager =
+ [(WOResourceManager *)[rmClass alloc] initWithPath:[self path]];
+ }
+}
+
- (void)setResourceManager:(WOResourceManager *)_manager {
ASSIGN(self->resourceManager, _manager);
}
- (WOResourceManager *)resourceManager {
- if (self->resourceManager == nil) {
- NSString *p;
-
-#if 0 && DEBUG
- if ([(p = [self path]) length] > 0)
- [self logDebugWithFormat:@"setup WOResourceManager at path '%@' ...", p];
-#else
- p = [self path];
-#endif
-
- self->resourceManager =
- [(WOResourceManager *)[WOResourceManager alloc] initWithPath:p];
- }
+ if (self->resourceManager == nil)
+ [self _setupDefaultResourceManager];
+
return self->resourceManager;
}
Class dynamicElementClass = NSClassFromString(_name);
if (dynamicElementClass == Nil) {
- [self logWarnWithFormat:@"did not find dynamic element class %@ !", _name];
+ [self warnWithFormat:@"did not find dynamic element class %@ !", _name];
return nil;
}
if (![dynamicElementClass isDynamicElement]) {
- [self logWarnWithFormat:@"class %@ is not a dynamic element class !", _name];
+ [self warnWithFormat:@"class %@ is not a dynamic element class !", _name];
return nil;
}
start = [self memoryStatistics];
#endif
- pool = [[NSAutoreleasePool alloc] init];
+ pool = [[NSAutoreleasePool alloc] init];
- languages = [_ctx hasSession]
- ? [(WOSession *)[_ctx session] languages]
- : [[_ctx request] browserLanguages];
+ languages = [_ctx resourceLookupLanguages];
if ((rm = [[_ctx component] resourceManager]) == nil)
rm = [self resourceManager];
- page = [rm pageWithName:(_name != nil ? _name : @"Main")
- languages:languages];
+ page = [rm pageWithName:(_name != nil ? _name : @"Main")
+ languages:languages];
[page ensureAwakeInContext:_ctx];
page = [page retain];
[[start objectForKey:@"VmSize"] intValue];
lib = [[stop objectForKey:@"VmLib"] intValue] -
[[start objectForKey:@"VmLib"] intValue];
- [self logDebugWithFormat:@"loaded component %@; rss=%i vm=%i lib=%i.",
- _name, rss,vmsize,lib];
+ [self debugWithFormat:@"loaded component %@; rss=%i vm=%i lib=%i.",
+ _name, rss,vmsize,lib];
}
#endif
}
- (WOResponse *)handlePageRestorationErrorInContext:(WOContext *)_ctx {
- [self logErrorWithFormat:
+ [self errorWithFormat:
@"could not restore page for context-id %@\n in context %@",
[_ctx currentElementID], _ctx];
WOResponse *r = nil;
if ([self respondsToSelector:@selector(handleException:)]) {
- [self logWarnWithFormat:@"calling deprecated -handleException method !"];
+ [self warnWithFormat:@"calling deprecated -handleException method !"];
return [self handleException:_exc];
}
? 1 : 0;
}
if (doCore) {
- [self logFatalWithFormat:@"%@: caught (ctx=%@):\n %@.",
- self, _ctx, _exc];
+ [self fatalWithFormat:@"%@: caught (ctx=%@):\n %@.",
+ self, _ctx, _exc];
abort();
}
}
#endif
if (_ctx == nil) {
- [self logFatalWithFormat:@"%@: caught (without context):\n %@.",
- self, _exc];
+ [self fatalWithFormat:@"%@: caught (without context):\n %@.",
+ self, _exc];
[self terminate];
}
else if (rq == nil) {
- [self logFatalWithFormat:@"%@: caught (without request):\n %@.",
- self, _exc];
+ [self fatalWithFormat:@"%@: caught (without request):\n %@.",
+ self, _exc];
[self terminate];
}
else {
NSString *str = nil;
NSString *bt = nil;
- [self logErrorWithFormat:@"%@: caught:\n %@\nin context:\n %@.",
+ [self errorWithFormat:@"%@: caught:\n %@\nin context:\n %@.",
self, _exc, _ctx];
#if LIB_FOUNDATION_LIBRARY
#endif
if ((r = [WOResponse responseWithRequest:rq]) == nil)
- [self logErrorWithFormat:@"could not create response !"];
+ [self errorWithFormat:@"could not create response !"];
[r setHeader:@"text/html" forKey:@"content-type"];
[r setHeader:@"no-cache" forKey:@"cache-control"];
#if !LIB_FOUNDATION_LIBRARY
- (id)valueForUndefinedKey:(NSString *)_key {
- [self logWarnWithFormat:@"tried to access undefined KVC key: '%@'",
+ [self warnWithFormat:@"tried to access undefined KVC key: '%@'",
_key];
return nil;
}