libs-gsweb/GSWeb.framework/GSWComponent.m
Manuel Guesdon 714083cdbd *** empty log message ***
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@19053 72102866-910b-0410-8b05-ffd578937521
2004-04-06 11:18:33 +00:00

2024 lines
62 KiB
Objective-C

/** GSWComponent.m - <title>GSWeb: Class GSWComponent</title>
Copyright (C) 1999-2004 Free Software Foundation, Inc.
Written by: Manuel Guesdon <mguesdon@orange-concept.com>
Date: Jan 1999
$Revision$
$Date$
$Id$
<abstract></abstract>
This file is part of the GNUstep Web Library.
<license>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
</license>
**/
#include "config.h"
RCS_ID("$Id$")
#include "GSWeb.h"
#ifdef HAVE_GDL2
#include <EOControl/EOKeyValueCoding.h>
#endif
//====================================================================
@implementation GSWComponent
//--------------------------------------------------------------------
// init
-(id)init
{
//OK
LOGObjectFnStart();
if ((self=[super init]))
{
NSMutableDictionary* currentThreadDictionary=GSCurrentThreadDictionary();
GSWContext* aContext=[currentThreadDictionary objectForKey:GSWThreadKey_Context];
// This was set by GSWComponentDefintion -componentInstanceInContext:
GSWComponentDefinition* aComponentDefinition=[currentThreadDictionary objectForKey:GSWThreadKey_ComponentDefinition];
NSAssert(aContext,@"No Context in GSWComponent Init");
NSAssert(aComponentDefinition,@"No ComponentDefinition in GSWComponent Init");
ASSIGN(_componentDefinition,aComponentDefinition);
_name=[[NSString stringWithCString:object_get_class_name(self)]retain];
NSDebugMLLog(@"GSWComponent",@"_name=%@",_name);
_isCachingEnabled=YES;
[self _setContext:aContext];
NSDebugMLLog(@"GSWComponent",@"_context=%@",_context);
_templateName=[[self _templateNameFromClass:[self class]] retain];
NSDebugMLLog(@"GSWComponent",@"_templateName=%@",_templateName);
[self setCachingEnabled:[GSWApp isCachingEnabled]];
[_componentDefinition _finishInitializingComponent:self];
_isParentToComponentSynchronized=[self synchronizesParentToComponentVariablesWithBindings];
_isComponentToParentSynchronized=[self synchronizesComponentToParentVariablesWithBindings];
NSDebugMLLog(@"GSWComponent",@"_isParentToComponentSynchronized=%s",(_isParentToComponentSynchronized ? "YES" : "NO"));
NSDebugMLLog(@"GSWComponent",@"_isComponentToParentSynchronized=%s",(_isComponentToParentSynchronized ? "YES" : "NO"));
};
LOGObjectFnStop();
return self;
};
//--------------------------------------------------------------------
-(void)dealloc
{
GSWLogAssertGood(self);
GSWLogC("Dealloc GSWComponent");
GSWLogC("Dealloc GSWComponent: name");
DESTROY(_name);
GSWLogC("Dealloc GSWComponent: subComponents");
DESTROY(_subComponents);
GSWLogC("Dealloc GSWComponent: templateName");
DESTROY(_templateName);
GSWLogC("Dealloc GSWComponent: template");
DESTROY(_template);
GSWLogC("Dealloc GSWComponent: componentDefinition");
DESTROY(_componentDefinition);
_parent=nil;
GSWLogC("Dealloc GSWComponent: associationsKeys");
DESTROY(_associationsKeys);
GSWLogC("Dealloc GSWComponent: associations");
DESTROY(_associations);
GSWLogC("Dealloc GSWComponent: childTemplate");
DESTROY(_childTemplate);
GSWLogC("Dealloc GSWComponent: userDictionary");
DESTROY(_userDictionary);
GSWLogC("Dealloc GSWComponent: userAssociations");
DESTROY(_userAssociations);
GSWLogC("Dealloc GSWComponent: defaultAssociations");
DESTROY(_defaultAssociations);
GSWLogC("Dealloc GSWComponent: validationFailureMessages");
DESTROY(_validationFailureMessages);
GSWLogC("Dealloc GSWComponent: context (set to nil)");
_context=nil;
GSWLogC("Dealloc GSWComponent: session (set to nil)");
_session=nil;
GSWLogC("Dealloc GSWComponent Super");
[super dealloc];
GSWLogC("End Dealloc GSWComponent");
}
//--------------------------------------------------------------------
-(id)copyWithZone: (NSZone*)zone
{
GSWComponent* clone = [[isa allocWithZone: zone] init];
ASSIGNCOPY(clone->_name,_name);
ASSIGNCOPY(clone->_subComponents,_subComponents);
ASSIGNCOPY(clone->_templateName,_templateName);
ASSIGN(clone->_template,_template);
ASSIGN(clone->_componentDefinition,_componentDefinition);
ASSIGN(clone->_parent,_parent);
ASSIGNCOPY(clone->_associationsKeys,_associationsKeys);
ASSIGNCOPY(clone->_associations,_associations);
ASSIGNCOPY(clone->_childTemplate,_childTemplate);
ASSIGNCOPY(clone->_context,_context);
ASSIGNCOPY(clone->_session,_session);
clone->_isPage=_isPage;
clone->_isCachingEnabled=_isCachingEnabled;
clone->_isParentToComponentSynchronized=_isParentToComponentSynchronized;
clone->_isComponentToParentSynchronized=_isComponentToParentSynchronized;
return clone;
};
//--------------------------------------------------------------------
-(void)encodeWithCoder:(NSCoder*)aCoder
{
//TODOV
[super encodeWithCoder:aCoder];
[aCoder encodeObject:_name];
[aCoder encodeObject:_subComponents];
[aCoder encodeObject:_templateName];
[aCoder encodeObject:_template];
[aCoder encodeObject:_componentDefinition];
[aCoder encodeObject:_parent];
[aCoder encodeObject:_associationsKeys];
[aCoder encodeObject:_associations];
[aCoder encodeObject:_childTemplate];
[aCoder encodeObject:_context];
[aCoder encodeObject:_session];
[aCoder encodeValueOfObjCType:@encode(BOOL)
at:&_isPage];
[aCoder encodeValueOfObjCType:@encode(BOOL)
at:&_isCachingEnabled];
[aCoder encodeValueOfObjCType:@encode(BOOL)
at:&_isParentToComponentSynchronized];
[aCoder encodeValueOfObjCType:@encode(BOOL)
at:&_isComponentToParentSynchronized];
}
//--------------------------------------------------------------------
-(id)initWithCoder:(NSCoder*)aCoder
{
//TODOV
if ((self = [super initWithCoder:aCoder]))
{
[aCoder decodeValueOfObjCType:@encode(id)
at:&_name];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_subComponents];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_templateName];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_template];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_componentDefinition];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_parent];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_associationsKeys];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_associations];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_childTemplate];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_context];
[aCoder decodeValueOfObjCType:@encode(id)
at:&_session];
[aCoder decodeValueOfObjCType:@encode(BOOL)
at:&_isPage];
[aCoder decodeValueOfObjCType:@encode(BOOL)
at:&_isCachingEnabled];
[aCoder decodeValueOfObjCType:@encode(BOOL)
at:&_isParentToComponentSynchronized];
[aCoder decodeValueOfObjCType:@encode(BOOL)
at:&_isComponentToParentSynchronized];
};
return self;
}
//--------------------------------------------------------------------
// frameworkName
-(NSString*)frameworkName
{
//OK
NSString* aFrameworkName=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
aComponentDefinition=[self _componentDefinition];
NSAssert(aComponentDefinition,@"No componentDefinition");
aFrameworkName=[aComponentDefinition frameworkName];
NSDebugMLLog(@"GSWComponent",@"aFrameworkName=%@",aFrameworkName);
LOGObjectFnStop();
return aFrameworkName;
};
//--------------------------------------------------------------------
// logWithFormat:
-(void)logWithFormat:(NSString*)format,...
{
LOGObjectFnNotImplemented(); //TODOFN
};
//--------------------------------------------------------------------
// logWithFormat:arguments:
-(void)logWithFormat:(NSString*)format
arguments:(va_list)arguments
{
LOGObjectFnNotImplemented(); //TODOFN
};
//--------------------------------------------------------------------
// name
-(NSString*)name
{
return _name;
};
//--------------------------------------------------------------------
// path
-(NSString*)path
{
//TODOV
NSBundle* bundle=[NSBundle mainBundle];
return [bundle pathForResource:_name
ofType:GSWPageSuffix[GSWebNamingConv]];
};
//--------------------------------------------------------------------
// baseURL
-(NSString*)baseURL
{
LOGObjectFnNotImplemented(); //TODOFN
return nil;
};
//--------------------------------------------------------------------
-(NSString*)_templateNameFromClass:(Class)aClass
{
//OK
NSString* aTemplateName=nil;
LOGObjectFnStart();
aTemplateName=[NSString stringWithCString:class_get_class_name(aClass)];
LOGObjectFnStop();
return aTemplateName;
};
//--------------------------------------------------------------------
-(NSString*)description
{
//TODO
NSString* dscr=nil;
GSWLogAssertGood(self);
NSDebugMLLog(@"GSWComponent",@"GSWComponent description self=%p",self);
dscr=[NSString stringWithFormat:@"<%s %p>",
object_get_class_name(self),
(void*)self];
return dscr;
};
// GSWeb Additions {
-(NSDictionary*)userDictionary
{
return _userDictionary;
};
-(void)setUserDictionary:(NSDictionary*)aUserDictionary
{
ASSIGN(_userDictionary,aUserDictionary);
NSDebugMLLog(@"GSWComponent",@"userDictionary:%@",_userDictionary);
};
-(NSDictionary*)userAssociations
{
return _userAssociations;
};
-(void)setUserAssociations:(NSDictionary*)userAssociations
{
ASSIGN(_userAssociations,userAssociations);
NSDebugMLLog(@"GSWComponent",@"userAssociations:%@",_userAssociations);
};
-(NSDictionary*)defaultAssociations
{
return _defaultAssociations;
};
-(void)setDefaultAssociations:(NSDictionary*)defaultAssociations
{
ASSIGN(_defaultAssociations,defaultAssociations);
NSDebugMLLog(@"GSWComponent",@"defaultAssociations:%@",_defaultAssociations);
};
// }
@end
//====================================================================
@implementation GSWComponent (GSWCachingPolicy)
//--------------------------------------------------------------------
//setCachingEnabled:
-(void)setCachingEnabled:(BOOL)caching
{
//OK
_isCachingEnabled=caching;
};
//--------------------------------------------------------------------
//isCachingEnabled
-(BOOL)isCachingEnabled
{
//OK
return _isCachingEnabled;
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentA)
//--------------------------------------------------------------------
-(void)setParent:(GSWComponent*)parent
associationsKeys:(NSArray*)associationsKeys
associations:(NSArray*)associations
template:(GSWElement*)template
{
//OK
LOGObjectFnStart();
_parent=parent;
NSDebugMLLog(@"GSWComponent",@"name=%@ parent=%p (%@)",
[self declarationName],
(void*)parent,[parent class]);
NSDebugMLLog(@"GSWComponent",@"associations=%@",_associations);
ASSIGN(_associations,associations);
ASSIGN(_associationsKeys,associationsKeys);
NSDebugMLLog(@"GSWComponent",@"associationsKeys=%@",_associationsKeys);
ASSIGN(_childTemplate,template);
NSDebugMLLog(@"GSWComponent",@"template=%@",_childTemplate);
[self validateAPIAssociations];
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(void)synchronizeComponentToParent
{
//OK
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"Name=%@ - isComponentToParentSynchronized=%s",
[self declarationName],(_isComponentToParentSynchronized ? "YES" : "NO"));
if (_isComponentToParentSynchronized)
{
int i=0;
id aKey=nil;
GSWAssociation* anAssociation=nil;
id aValue=nil;
id logValue=[self valueForBinding:@"GSWDebug"];
BOOL doLog=boolValueWithDefaultFor(logValue,NO);
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - Synchro SubComponent->Component",
[self declarationName]);
for(i=0;i<[_associationsKeys count];i++)
{
aKey=[_associationsKeys objectAtIndex:i];
anAssociation=[_associations objectAtIndex:i];
NSDebugMLLog(@"GSWComponent",@"aKey=%@ anAssociation=%@",aKey,anAssociation);
if ([anAssociation isValueSettable]
&& ![anAssociation isKindOfClass:[GSWBindingNameAssociation class]]) //TODOV
{
aValue=[self valueForKey:aKey];
NSDebugMLLog(@"GSWComponent",@"aValue=%@",aValue);
if (doLog)
[anAssociation logSynchronizeComponentToParentForValue:aValue
inComponent:_parent];
[anAssociation setValue:aValue
inComponent:_parent];
};
};
};
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(void)synchronizeParentToComponent
{
//OK
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"Name=%@ - isParentToComponentSynchronized=%s",
[self declarationName],(_isParentToComponentSynchronized ? "YES" : "NO"));
if (_isParentToComponentSynchronized)
{
//Synchro Component->SubComponent
int i=0;
id aKey=nil;
GSWAssociation* anAssociation=nil;
id aValue=nil;
id logValue=[self valueForBinding:@"GSWDebug"];
BOOL doLog=boolValueWithDefaultFor(logValue,NO);
NSDebugMLLog(@"GSWComponent",@"Name=%@ - Synchro Component->SubComponent",
[self declarationName]);
for(i=0;i<[_associationsKeys count];i++)
{
aKey=[_associationsKeys objectAtIndex:i];
anAssociation=[_associations objectAtIndex:i];
NSDebugMLLog(@"GSWComponent",@"aKey=%@ anAssociation=%@",aKey,anAssociation);
if (![anAssociation isKindOfClass:[GSWBindingNameAssociation class]]) //TODOV
{
aValue=[anAssociation valueInComponent:_parent];
NSDebugMLLog(@"GSWComponent",@"aValue=%@",aValue);
if (doLog)
[anAssociation logSynchronizeParentToComponentForValue:aValue
inComponent:self];
#if HAVE_GDL2 // GDL2 implementation
[self smartTakeValue:aValue
forKey:aKey];
#else
[self takeValue:aValue
forKey:aKey];
#endif
};
};
};
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(GSWElement*)_childTemplate
{
//OK
return _childTemplate;
};
//--------------------------------------------------------------------
-(GSWElement*)_template
{
//OK
GSWElement* template=_template;
LOGObjectFnStart();
if (!template)
{
NSDebugMLLog(@"GSWComponent",@"templateName=%@",[self _templateName]);
template=[self templateWithName:[self _templateName]];
NSDebugMLLog(@"GSWComponent",@"template=%p",template);
if ([self isCachingEnabled])
{
ASSIGN(_template,template);
};
};
LOGObjectFnStop();
return template;
};
//--------------------------------------------------------------------
-(GSWComponentDefinition*)_componentDefinition
{
//OK
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"_componentDefinition=%@",_componentDefinition);
if (_componentDefinition)
aComponentDefinition=_componentDefinition;
else
{
NSArray* languages=[self languages];
NSDebugMLLog(@"GSWComponent",@"languages=%@",languages);
NSDebugMLLog(@"GSWComponent",@"_name=%@",_name);
aComponentDefinition=[GSWApp componentDefinitionWithName:_name
languages:languages];
NSDebugMLLog(@"GSWComponent",@"aComponentDefinition=%@",aComponentDefinition);
if ([self isCachingEnabled])
{
ASSIGN(_componentDefinition,aComponentDefinition);
};
};
LOGObjectFnStop();
return aComponentDefinition;
};
//--------------------------------------------------------------------
-(NSString*)_templateName
{
return _templateName;
};
//--------------------------------------------------------------------
-(NSString*)declarationName
{
return [self _templateName];
};
//--------------------------------------------------------------------
-(BOOL)_isPage
{
//OK
return _isPage;
};
//--------------------------------------------------------------------
-(void)_setIsPage:(BOOL)isPage
{
//OK
_isPage=isPage;
};
//--------------------------------------------------------------------
-(void)_setContext:(GSWContext*)aContext
{
//OK
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"aContext=%p",(void*)aContext);
_context=aContext;//NO retain !
LOGObjectFnStop();
};
@end
//====================================================================
@implementation GSWComponent (GSWResourceManagement)
//--------------------------------------------------------------------
// templateWithName:
-(GSWElement*)templateWithName:(NSString*)aName
{
//OK
GSWElement* template=nil;
NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
NSAssert(aComponentDefinition,@"No componentDefinition");
template=[aComponentDefinition templateWithName:aName
languages:languages];
NSDebugMLLog(@"GSWComponent",@"aName=%@ template=%@",aName,template);
LOGObjectFnStop();
return template;
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentC)
-(GSWComponent*)subComponentForElementID:(NSString*)elementId
{
//OK
GSWComponent* subc=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"_elementId=%@",elementId);
NSDebugMLLog(@"GSWComponent",@"subComponents=%@",_subComponents);
subc=[_subComponents objectForKey:elementId];
NSDebugMLLog(@"GSWComponent",@"subc=%@",subc);
NSDebugMLLog(@"GSWComponent",@"subComponent %@ for _elementId=%@",[subc class],elementId);
LOGObjectFnStop();
return subc;
};
//--------------------------------------------------------------------
-(void)setSubComponent:(GSWComponent*)component
forElementID:(NSString*)elementId
{
//OK
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"setSubComponent %@ for _elementId=%@",[component class],elementId);
NSDebugMLLog(@"GSWComponent",@"elementId=%@",elementId);
NSDebugMLLog(@"GSWComponent",@"component=%@",component);
NSDebugMLLog(@"GSWComponent",@"_subComponents=%@",_subComponents);
if (!_subComponents)
_subComponents=[NSMutableDictionary new];
[_subComponents setObject:component
forKey:elementId];
NSDebugMLLog(@"GSWComponent",@"_subComponents=%@",_subComponents);
LOGObjectFnStop();
};
//--------------------------------------------------------------------
//NDFN
-(void)makeParentsPerformSelectorIfPossible:(SEL)aSelector
{
NSArray* parents=nil;
LOGObjectFnStart();
parents=[self parents];
NSDebugMLLog(@"GSWComponent",@"parents=%@",parents);
[parents makeObjectsPerformSelectorIfPossible:aSelector];
LOGObjectFnStop();
};
//--------------------------------------------------------------------
//NDFN
-(void)makeParentsPerformSelectorIfPossible:(SEL)aSelector
withObject:(id)object
{
NSArray* parents=nil;
LOGObjectFnStart();
parents=[self parents];
NSDebugMLLog(@"GSWComponent",@"parents=%@",parents);
[parents makeObjectsPerformSelectorIfPossible:aSelector
withObject:object];
LOGObjectFnStop();
};
//--------------------------------------------------------------------
//NDFN
-(void)makeParentsPerformSelectorIfPossible:(SEL)aSelector
withObject:(id)object1
withObject:(id)object2
{
NSArray* parents=nil;
LOGObjectFnStart();
parents=[self parents];
NSDebugMLLog(@"GSWComponent",@"parents=%@",parents);
[parents makeObjectsPerformSelectorIfPossible:aSelector
withObject:object1
withObject:object2];
LOGObjectFnStop();
};
//--------------------------------------------------------------------
//NDFN
-(id)makeAParentPerformSelectorIfPossible:(SEL)aSelector
{
id retValue=nil;
GSWComponent* obj=[self parent];
LOGObjectFnStart();
while(obj)
{
if ([obj respondsToSelector:aSelector])
{
retValue=[obj performSelector:aSelector];
obj=nil;
}
else
obj=[obj parent];
};
LOGObjectFnStop();
return retValue;
};
//--------------------------------------------------------------------
//NDFN
-(id)makeAParentPerformSelectorIfPossible:(SEL)aSelector
withObject:(id)object
{
id retValue=nil;
GSWComponent* obj=[self parent];
LOGObjectFnStart();
while(obj)
{
if ([obj respondsToSelector:aSelector])
{
retValue=[obj performSelector:aSelector
withObject:object];
obj=nil;
}
else
obj=[obj parent];
};
LOGObjectFnStop();
return retValue;
};
//--------------------------------------------------------------------
//NDFN
-(id)makeAParentPerformSelectorIfPossible:(SEL)aSelector
withObject:(id)object1
withObject:(id)object2
{
id retValue=nil;
GSWComponent* obj=[self parent];
LOGObjectFnStart();
while(obj)
{
if ([obj respondsToSelector:aSelector])
{
retValue=[obj performSelector:aSelector
withObject:object1
withObject:object2];
obj=nil;
}
else
obj=[obj parent];
};
LOGObjectFnStop();
return retValue;
};
//--------------------------------------------------------------------
//NDFN
-(void)makeSubComponentsPerformSelectorIfPossible:(SEL)aSelector
{
NSEnumerator* enumerator=nil;
GSWComponent* component=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"_subComponents=%@",_subComponents);
enumerator= [_subComponents objectEnumerator];
while ((component=[enumerator nextObject]))
{
[component performSelectorIfPossible:aSelector];
[component makeSubComponentsPerformSelectorIfPossible:aSelector];
};
LOGObjectFnStop();
};
//--------------------------------------------------------------------
//NDFN
-(void)makeSubComponentsPerformSelectorIfPossible:(SEL)aSelector
withObject:(id)object
{
NSEnumerator* enumerator=nil;
GSWComponent* component=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"_subComponents=%@",_subComponents);
enumerator= [_subComponents objectEnumerator];
while ((component=[enumerator nextObject]))
{
[component performSelectorIfPossible:aSelector
withObject:object];
[component makeSubComponentsPerformSelectorIfPossible:aSelector
withObject:object];
};
LOGObjectFnStop();
};
//--------------------------------------------------------------------
//NDFN
-(void)makeSubComponentsPerformSelectorIfPossible:(SEL)aSelector
withObject:(id)object1
withObject:(id)object2
{
NSEnumerator* enumerator=nil;
GSWComponent* component=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"_subComponents=%@",_subComponents);
enumerator= [_subComponents objectEnumerator];
while ((component=[enumerator nextObject]))
{
[component performSelectorIfPossible:aSelector
withObject:object1
withObject:object2];
[component makeSubComponentsPerformSelectorIfPossible:aSelector
withObject:object1
withObject:object2];
};
LOGObjectFnStop();
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentD)
-(GSWAssociation*)_associationWithName:(NSString*)aName
{
//OK
GSWAssociation* assoc=nil;
unsigned int index=NSNotFound;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"_associationsKeys=%@",_associationsKeys);
//NSDebugMLLog(@"GSWComponent",@"_associations=%@",[_associations description]);
if (_associationsKeys)
{
index=[_associationsKeys indexOfObject:aName];
NSDebugMLLog(@"GSWComponent",@"index=%u",index);
if (index!=NSNotFound)
assoc=[_associations objectAtIndex:index];
};
if (!WOStrictFlag && index==NSNotFound)
{
assoc=[_defaultAssociations objectForKey:aName];
};
NSDebugMLLog(@"GSWComponent",@"assoc=%@",assoc);
LOGObjectFnStop();
return assoc;
};
@end
//====================================================================
@implementation GSWComponent (GSWSynchronizing)
//--------------------------------------------------------------------
-(BOOL)hasBinding:(NSString*)parentBindingName
{
//OK
BOOL hasBinding=NO;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - parentBindingName_=%@",
[self declarationName],
parentBindingName);
if (_associationsKeys)
{
int index=[_associationsKeys indexOfObject:parentBindingName];
NSDebugMLLog(@"GSWComponent",@"index=%u",index);
hasBinding=(index!=NSNotFound);
};
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - hasBinding=%s",
[self declarationName],
(hasBinding ? "YES" : "NO"));
if (!WOStrictFlag && !hasBinding)
{
hasBinding=([_defaultAssociations objectForKey:parentBindingName]!=nil);
};
LOGObjectFnStop();
return hasBinding;
};
//--------------------------------------------------------------------
-(void)setValue:(id)value
forBinding:(NSString*)parentBindingName
{
//OK
GSWAssociation* assoc=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - parentBindingName_=%@",
[self declarationName],
parentBindingName);
NSDebugMLLog(@"GSWComponent",@"value_=%@",value);
NSDebugMLLog(@"GSWComponent",@"_parent=%p",(void*)_parent);
if (_parent)
{
assoc=[self _associationWithName:parentBindingName];
NSDebugMLLog(@"GSWComponent",@"assoc=%@",assoc);
if(assoc)
[assoc setValue:value
inComponent:_parent];
/* // Why doing this ? Be carefull: it may make a loop !
#if HAVE_GDL2
else
{
NS_DURING
{
[self smartTakeValue:value_
forKey:parentBindingName_];
}
NS_HANDLER;
{
//TODO
}
NS_ENDHANDLER;
}
#endif
*/
};
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(id)valueForBinding:(NSString*)parentBindingName
{
//OK
id aValue=nil;
GSWAssociation* assoc=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"declarationName=%@",
[self declarationName]);
NSDebugMLLog(@"GSWComponent",@"parentBindingName=%@",
parentBindingName);
NSDebugMLLog(@"GSWComponent",@"parent=%p of class %@",(void*)_parent,[_parent class]);
if (_parent)
{
assoc=[self _associationWithName:parentBindingName];
NSDebugMLLog(@"GSWComponent",@"assoc=%@",assoc);
if(assoc)
aValue=[assoc valueInComponent:_parent];
/* // Why doing this ? Be carefull: it may make a loop !
#if HAVE_GDL2
else
{
NS_DURING
{
aValue = [self valueForKey:parentBindingName_];
}
NS_HANDLER
{
//TODO
}
NS_ENDHANDLER;
}
#endif
*/
NSDebugMLLog(@"GSWComponent",@"aValue=%@",aValue);
};
LOGObjectFnStop();
return aValue;
};
//--------------------------------------------------------------------
//NDFN
/** Do we need to synchronize parent to component **/
-(BOOL)synchronizesParentToComponentVariablesWithBindings
{
//OK
NSDictionary* userDictionary=nil;
id synchronizesParentToComponentVariablesWithBindingsValue=nil;
BOOL synchronizesParentToComponentVariablesWithBindings=YES;
LOGObjectFnStart();
userDictionary=[self userDictionary];
synchronizesParentToComponentVariablesWithBindingsValue=[userDictionary objectForKey:@"synchronizesParentToComponentVariablesWithBindings"];
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - userDictionary _synchronizesVariablesWithBindingsValue=%@",
[self declarationName],
synchronizesParentToComponentVariablesWithBindingsValue);
//NDFN
if (synchronizesParentToComponentVariablesWithBindingsValue)
{
synchronizesParentToComponentVariablesWithBindings=[synchronizesParentToComponentVariablesWithBindingsValue boolValue];
NSDebugMLLog(@"GSWComponent",@"userDictionary synchronizesParentToComponentVariablesWithBindings=%s",
(synchronizesParentToComponentVariablesWithBindings ? "YES" : "NO"));
}
else
synchronizesParentToComponentVariablesWithBindings=[self synchronizesVariablesWithBindings];
LOGObjectFnStop();
return synchronizesParentToComponentVariablesWithBindings;
};
//--------------------------------------------------------------------
//NDFN
/** Do we need to synchronize component to parent **/
-(BOOL)synchronizesComponentToParentVariablesWithBindings
{
//OK
NSDictionary* userDictionary=nil;
id synchronizesComponentToParentVariablesWithBindingsValue=nil;
BOOL synchronizesComponentToParentVariablesWithBindings=YES;
LOGObjectFnStart();
userDictionary=[self userDictionary];
synchronizesComponentToParentVariablesWithBindingsValue=[userDictionary objectForKey:@"synchronizesComponentToParentVariablesWithBindings"];
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - userDictionary _synchronizesVariablesWithBindingsValue=%@",
[self declarationName],
synchronizesComponentToParentVariablesWithBindingsValue);
//NDFN
if (synchronizesComponentToParentVariablesWithBindingsValue)
{
synchronizesComponentToParentVariablesWithBindings=[synchronizesComponentToParentVariablesWithBindingsValue boolValue];
NSDebugMLLog(@"GSWComponent",@"userDictionary synchronizesComponentToParentVariablesWithBindings=%s",
(synchronizesComponentToParentVariablesWithBindings ? "YES" : "NO"));
}
else
synchronizesComponentToParentVariablesWithBindings=[self synchronizesVariablesWithBindings];
LOGObjectFnStop();
return synchronizesComponentToParentVariablesWithBindings;
};
//--------------------------------------------------------------------
-(BOOL)synchronizesVariablesWithBindings
{
//OK
NSDictionary* userDictionary=nil;
id synchronizesVariablesWithBindingsValue=nil;
BOOL synchronizesVariablesWithBindings=YES;
LOGObjectFnStart();
userDictionary=[self userDictionary];
synchronizesVariablesWithBindingsValue=[userDictionary objectForKey:@"synchronizesVariablesWithBindings"];
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - userDictionary _synchronizesVariablesWithBindingsValue=%@",
[self declarationName],
synchronizesVariablesWithBindingsValue);
//NDFN
if (synchronizesVariablesWithBindingsValue)
{
synchronizesVariablesWithBindings=[synchronizesVariablesWithBindingsValue boolValue];
NSDebugMLLog(@"GSWComponent",@"userDictionary synchronizesVariablesWithBindings=%s",
(synchronizesVariablesWithBindings ? "YES" : "NO"));
};
LOGObjectFnStop();
return synchronizesVariablesWithBindings;
};
//--------------------------------------------------------------------
//NDFN
-(NSDictionary*)bindingAssociations
{
return [NSDictionary dictionaryWithObjects:_associations
forKeys:_associationsKeys];
};
@end
//====================================================================
@implementation GSWComponent (GSWRequestHandling)
//--------------------------------------------------------------------
// sleep
-(void)sleep
{
LOGObjectFnStart();
//Does Nothing
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(void)sleepInContext:(GSWContext*)aContext
{
//OK
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
NS_DURING
{
aComponentDefinition=[self _componentDefinition];
[aComponentDefinition sleep];
[self sleep];
[self _setContext:nil];
NSDebugMLLog(@"GSWComponent",@"declarationName=%@ - subComponents=%@",
[self declarationName],
_subComponents);
[_subComponents makeObjectsPerformSelector:@selector(sleepInContext:)
withObject:aContext];
}
NS_HANDLER
{
localException=ExceptionByAddingUserInfoObjectFrameInfo0(localException,@"In sleepInContext:");
LOGException(@"%@ (%@)",localException,[localException reason]);
[localException raise];
}
NS_ENDHANDLER;
LOGObjectFnStop();
};
//--------------------------------------------------------------------
// appendToResponse:inContext:
-(void)appendToResponse:(GSWResponse*)aResponse
inContext:(GSWContext*)aContext
{
//OK
GSWElement* template=nil;
GSWRequest* request=nil;
BOOL isFromClientComponent=NO;
GSWComponent* component=nil;
#ifndef NDEBUG
GSWElementIDString* debugElementID=[aContext elementID];
#endif
LOGObjectFnStart();
NSAssert(aContext,@"No Context");
NSAssert(aResponse,@"No Response");
GSWStartElement(aContext);
GSWSaveAppendToResponseElementID(aContext);
template=[self _template];
NSAssert(template,@"No template");
#ifndef NDEBUG
if(GSDebugSet(@"gswcomponents"))
[aResponse appendDebugCommentContentString:[NSString stringWithFormat:@"Start %@ [%@]",[self _templateName],[aContext elementID]]];
#endif
request=[aContext request];
NSAssert(request,@"No request");
isFromClientComponent=[request isFromClientComponent];
component=[aContext component];
[aContext appendZeroElementIDComponent];
NS_DURING
{
[aResponse appendDebugCommentContentString:[NSString stringWithFormat:@"declarationName=%@ ID=%@",[self declarationName],[aContext elementID]]];
NSDebugMLLog(@"GSWComponent",@"COMPONENT START %p declarationName=%@ [aContext elementID]=%@",
self,[self declarationName],[aContext elementID]);
[template appendToResponse:aResponse
inContext:aContext];
}
NS_HANDLER
{
LOGException(@"exception in %@ appendToResponse:inContext",
[self class]);
LOGException(@"exception=%@",localException);
localException=ExceptionByAddingUserInfoObjectFrameInfo(localException,
@"In %@ appendToResponse:inContext",
[self class]);
LOGException(@"exception=%@",localException);
[localException raise];
}
NS_ENDHANDLER;
NSDebugMLLog(@"GSWComponent",@"COMPONENT STOP %p declarationName=%@ [aContext elementID]=%@",
self,[self declarationName],[aContext elementID]);
[aContext deleteLastElementIDComponent];
GSWStopElement(aContext);
#ifndef NDEBUG
if (![debugElementID isEqualToString:[aContext elementID]])
{
NSDebugMLLog(@"GSWComponent",@"WARNING: class=%@ debugElementID=%@ [aContext elementID]=%@",
[self class],debugElementID,[aContext elementID]);
};
#endif
#ifndef NDEBUG
if(GSDebugSet(@"gswcomponents") == YES)
[aResponse appendDebugCommentContentString:
[NSString stringWithFormat:@"\n<!-- Stop %@ [%@]-->\n",
[self _templateName],
[aContext elementID]]];//TODO enlever
#endif
GSWAssertIsElementID(aContext);
LOGObjectFnStop();
};
//--------------------------------------------------------------------
// invokeActionForRequest:inContext:
-(GSWElement*)invokeActionForRequest:(GSWRequest*)aRequest
inContext:(GSWContext*)aContext
{
//OK
GSWElement* element=nil;
GSWElement* template=nil;
#ifndef NDEBUG
GSWElementIDString* debugElementID=[aContext elementID];
#endif
LOGObjectFnStart();
GSWStartElement(aContext);
NS_DURING
{
GSWAssertCorrectElementID(aContext);
template=[self _template];
[aContext appendZeroElementIDComponent];
element=[[self _template] invokeActionForRequest:aRequest
inContext:aContext];
[aContext deleteLastElementIDComponent];
}
NS_HANDLER
{
LOGException(@"exception in %@ invokeActionForRequest:inContext",
[self class]);
LOGException(@"exception=%@",localException);
localException=ExceptionByAddingUserInfoObjectFrameInfo(localException,
@"In %@ invokeActionForRequest:inContext",
[self class]);
LOGException(@"exception=%@",localException);
[localException raise];
}
NS_ENDHANDLER;
GSWStopElement(aContext);
#ifndef NDEBUG
if (![debugElementID isEqualToString:[aContext elementID]])
{
NSDebugMLLog(@"GSWComponent",@"class=%@ debugElementID=%@ [aContext elementID]=%@",
[self class],debugElementID,[aContext elementID]);
};
#endif
// if (![aContext _wasActionInvoked] && [[[aContext elementID] parentElementIDString] compare:[aContext senderID]]==NSOrderedDescending)
if (![aContext _wasActionInvoked]
&& [(GSWElementIDString*)[[aContext elementID] parentElementIDString] isSearchOverForSenderID:[aContext senderID]])
{
LOGError(@"Action not invoked at the end of %@ (id=%@) senderId=%@",
[self class],
[aContext elementID],
[aContext senderID]);
};
GSWAssertIsElementID(aContext);
LOGObjectFnStop();
return element;
};
//--------------------------------------------------------------------
// takeValuesFromRequest:inContext:
-(void)takeValuesFromRequest:(GSWRequest*)aRequest
inContext:(GSWContext*)aContext
{
//OK
BOOL oldValidateFlag=NO;
GSWElement* template=nil;
#ifndef NDEBUG
GSWElementIDString* debugElementID=[aContext elementID];
#endif
LOGObjectFnStart();
GSWStartElement(aContext);
GSWAssertCorrectElementID(aContext);
[_validationFailureMessages removeAllObjects];
oldValidateFlag=[aContext isValidate];
[aContext setValidate:YES];
template=[self _template];
[aContext appendZeroElementIDComponent];
NSDebugMLLog(@"GSWComponent",@"COMPONENT START %p declarationName=%@ [aContext elementID]=%@",
self,[self declarationName],[aContext elementID]);
[template takeValuesFromRequest:aRequest
inContext:aContext];
NSDebugMLLog(@"GSWComponent",@"COMPONENT STOP %p declarationName=%@ [aContext elementID]=%@",
self,[self declarationName],[aContext elementID]);
[aContext deleteLastElementIDComponent];
GSWStopElement(aContext);
#ifndef NDEBUG
if (![debugElementID isEqualToString:[aContext elementID]])
{
NSDebugMLLog(@"GSWComponent",@"WARNING class=%@ debugElementID=%@ [aContext elementID]=%@",
[self class],debugElementID,[aContext elementID]);
};
#endif
[aContext setValidate:oldValidateFlag];
GSWAssertIsElementID(aContext);
LOGObjectFnStop();
};
//GSWeb Additions {
//--------------------------------------------------------------------
-(void)setValidationFailureMessage:(NSString*)message
forElement:(GSWDynamicElement*)element
{
if (!_validationFailureMessages)
_validationFailureMessages=[NSMutableDictionary new];
[_validationFailureMessages setObject:message
forKey:[NSValue valueWithNonretainedObject:element]];
};
//--------------------------------------------------------------------
-(NSString*)validationFailureMessageForElement:(GSWDynamicElement*)element
{
return [_validationFailureMessages objectForKey:[NSValue valueWithNonretainedObject:element]];
};
//--------------------------------------------------------------------
-(NSString*)handleValidationExceptionDefault
{
return nil; //Raise !
};
//--------------------------------------------------------------------
-(BOOL)isValidationFailure
{
//TODO ameliorate
return [[self allValidationFailureMessages] count]>0;
};
//--------------------------------------------------------------------
-(NSDictionary*)validationFailureMessages
{
LOGObjectFnStart();
LOGObjectFnStop();
return _validationFailureMessages;
};
//--------------------------------------------------------------------
-(NSArray*)allValidationFailureMessages
{
NSMutableArray* msgs=[NSMutableArray array];
NSEnumerator* subComponentsEnum=nil;
GSWComponent* component=nil;
LOGObjectFnStart();
// NSDebugMLLog(@"GSWComponent",@"validationFailureMessages=%@",validationFailureMessages);
[msgs addObjectsFromArray:[[self validationFailureMessages] allValues]];
// NSDebugMLLog(@"GSWComponent",@"_msgs=%@",_msgs);
subComponentsEnum=[_subComponents objectEnumerator];
while((component=[subComponentsEnum nextObject]))
{
// NSDebugMLLog(@"GSWComponent",@"_component=%@",_component);
[msgs addObjectsFromArray:[component allValidationFailureMessages]];
// NSDebugMLLog(@"GSWComponent",@"_msgs=%@",_msgs);
};
msgs=[NSArray arrayWithArray:msgs];
// NSDebugMLLog(@"GSWComponent",@"_msgs=%@",_msgs);
LOGObjectFnStop();
return msgs;
};
// }
//--------------------------------------------------------------------
-(void)ensureAwakeInContext:(GSWContext*)aContext
{
//LOGObjectFnNotImplemented(); //TODOFN
LOGObjectFnStart();
if (![self context])
{
NSDebugMLLog(@"GSWComponent",@"component sleeps, we awake it = %@",self);
[self awakeInContext:aContext];
}
else
{
if ([self context] != aContext)
{
NSDebugMLLog(@"GSWComponent",
@"component is already awaken, but has not the current context, we awake it twice with current context = %@",
self);
[self awakeInContext:aContext];
}
}
LOGObjectFnStop();
};
//--------------------------------------------------------------------
// awake
-(void)awake
{
LOGObjectFnStart();
//Does Nothing
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(void)awakeInContext:(GSWContext*)aContext
{
//OK
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent",@"aContext=%@",aContext);
NSDebugMLLog(@"GSWComponent",@"declarationName=%@",[self declarationName]);
NSAssert(aContext,@"No Context");
[self _setContext:aContext];
aComponentDefinition=[self _componentDefinition];
[aComponentDefinition setCachingEnabled:[self isCachingEnabled]];
[aComponentDefinition awake];
[_subComponents makeObjectsPerformSelector:@selector(awakeInContext:)
withObject:aContext];
[aComponentDefinition _awakeObserversForComponent:self];
[self awake];
LOGObjectFnStop();
};
@end
//====================================================================
@implementation GSWComponent (GSWActionInvocation)
//--------------------------------------------------------------------
// performParentAction:
- (id)performParentAction:(NSString *)attribute
{
GSWAssociation *assoc=nil;
id ret=nil;
LOGObjectFnStart();
NSDebugMLLog(@"GSWComponent", @"name=%@ - parent=%p",
[self declarationName],
(void*)_parent);
if (_parent)
{
assoc = [self _associationWithName:attribute];
NSDebugMLLog(@"GSWComponent", @"assoc=%@", assoc);
if(assoc && [assoc isValueConstant] == YES)
{
NSString *aValue = [assoc valueInComponent:self];
if(aValue)
ret = [_parent performSelector:NSSelectorFromString(aValue)];
}
}
LOGObjectFnStop();
return ret;
};
//--------------------------------------------------------------------
-(GSWComponent*)parent
{
//OK
return _parent;
};
//--------------------------------------------------------------------
//NDFN
-(GSWComponent*)topParent
{
GSWComponent* parent=[self parent];
GSWComponent* topParent=parent;
while (parent)
{
topParent=parent;
parent=[parent parent];
};
return topParent;
};
//--------------------------------------------------------------------
//NDFN
-(NSArray*)parents
{
NSMutableArray* parents=[NSMutableArray array];
GSWComponent* parent=[self parent];
while (parent)
{
[parents addObject:parent];
parent=[parent parent];
};
return [NSArray arrayWithArray:parents];
};
//--------------------------------------------------------------------
//NDFN
-(NSArray*)parentsClasses
{
NSMutableArray* parents=[NSMutableArray array];
GSWComponent* parent=[self parent];
while (parent)
{
[parents addObject:[parent class]];
parent=[parent parent];
};
return [NSArray arrayWithArray:parents];
};
@end
//====================================================================
@implementation GSWComponent (GSWConveniences)
-(GSWComponent*)pageWithName:(NSString*)aName
{
//OK
GSWComponent* page=nil;
GSWContext* aContext=nil;
LOGObjectFnStart();
aContext=[self context];
page=[GSWApp pageWithName:aName
inContext:aContext];
LOGObjectFnStop();
return page;
};
//--------------------------------------------------------------------
// session
-(GSWSession*)session
{
GSWSession* session=nil;
if (_session)
session=_session;
else if (_context)
session=[_context session];
return session;
};
//--------------------------------------------------------------------
-(BOOL)hasSession
{
return (_session!=nil);
};
//--------------------------------------------------------------------
// application
-(GSWApplication*)application
{
return [GSWApplication application];
};
//--------------------------------------------------------------------
// context
-(GSWContext*)context
{
return _context;
};
//--------------------------------------------------------------------
//NDFN
-(NSArray*)languages
{
NSArray* languages=nil;
LOGObjectFnStart();
languages=[[self context] languages];
LOGObjectFnStop();
return languages;
};
@end
//====================================================================
@implementation GSWComponent (GSWLogging)
//--------------------------------------------------------------------
//Called when an Enterprise Object or formatter failed validation during an
//assignment.
//The default implementation ignores the error. Subclassers can override to
// record the error and possibly return a different page for the current action.
-(void)validationFailedWithException:(NSException*)exception
value:(id)aValue
keyPath:(id)keyPath
{
// Does nothing
LOGObjectFnStart();
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(void)_debugWithString:(NSString*)string
{
LOGObjectFnNotImplemented(); //TODOFN
/* Seems there's a problem with patches... Why this code is here ?
LOGObjectFnStart();
if (![self context])
{
NSDebugMLLog(@"GSWComponent",@"component sleeps, we awake it = %@",self);
[self awakeInContext:aContext];
}
else
{
if ([self context] != aContext)
{
NSDebugMLLog(@"GSWComponent",@"component is already awaken, but has not the current context, we awake it twice with current context = %@",self);
[self awakeInContext:aContext];
};
};
LOGObjectFnStop();
*/
};
//--------------------------------------------------------------------
-(void)debugWithFormat:(NSString*)format,...
{
LOGObjectFnNotImplemented(); //TODOFN
};
//--------------------------------------------------------------------
-(void)logWithFormat:(NSString*)format,...
{
LOGObjectFnNotImplemented(); //TODOFN
};
//--------------------------------------------------------------------
-(void)logWithFormat:(NSString*)format
arguments:(va_list)argList
{
LOGObjectFnNotImplemented(); //TODOFN
};
//--------------------------------------------------------------------
+(void)logWithFormat:(NSString*)format,...
{
LOGClassFnNotImplemented(); //TODOFN
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentJ)
-(NSString*)_uniqueID
{
LOGObjectFnNotImplemented(); //TODOFN
return nil;
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentK)
//--------------------------------------------------------------------
-(void)_appendPageToResponse:(GSWResponse*)response
inContext:(GSWContext*)aContext
{
//OK
GSWSession* session=nil;
GSWRequest* request=nil;
NSString* httpVersion=nil;
GSWElement* pageElement=nil;
BOOL pageChanged=NO;
LOGObjectFnStart();
NSAssert(aContext,@"No context");
NS_DURING
{
[aContext deleteAllElementIDComponents];
request=[aContext request];
NSDebugMLLog(@"GSWComponent",@"request=%@",request);
httpVersion=(request ? [request httpVersion] : @"HTTP/1.0");
[response setHTTPVersion:httpVersion];
if (request)
[response setAcceptedEncodings:[request browserAcceptedEncodings]];
[response setHeader:@"text/html"
forKey:@"content-type"];
NSDebugMLLog(@"GSWComponent",@"response=%@",response);
[aContext _setResponse:response];
pageElement=[aContext _pageElement];
NSDebugMLLog(@"GSWComponent",@"pageElement=%@",pageElement);
pageChanged=(self!=(GSWComponent*)pageElement);
NSDebugMLLog(@"GSWComponent",@"pageChanged=%d",pageChanged);
[aContext _setPageChanged:pageChanged];
if (pageChanged)
[aContext _setPageElement:self];
[aContext _setCurrentComponent:self];
}
NS_HANDLER
{
localException=ExceptionByAddingUserInfoObjectFrameInfo0(localException,
@"in GSWComponent -_generateResponseInContext:");
LOGException(@"%@ (%@)",localException,[localException reason]);
[localException raise];
};
NS_ENDHANDLER;
NS_DURING
{
[self appendToResponse:response
inContext:aContext];
}
NS_HANDLER
{
localException=ExceptionByAddingUserInfoObjectFrameInfo0(localException,
@"in GSWComponent -_generateResponseInContext:");
LOGException(@"%@ (%@)",localException,[localException reason]);
[localException raise];
};
NS_ENDHANDLER;
NS_DURING
{
session=[aContext _session];
NSDebugMLLog(@"GSWComponent",@"session=%@",session);
if (session)
{
NSDebugMLLog(@"GSWComponent",@"sessionID=%@",[session sessionID]);
[session appendCookieToResponse:response];
NSDebugMLLog(@"GSWComponent",@"sessionID=%@",[session sessionID]);
[session _saveCurrentPage];
};
[aContext _incrementContextID];
[aContext deleteAllElementIDComponents];
[aContext _setPageChanged:YES];
//[aContext _setPageReplaced:NO];
NSDebugMLLog(@"GSWComponent",@"sessionID=%@",[session sessionID]);
}
NS_HANDLER
{
localException=ExceptionByAddingUserInfoObjectFrameInfo0(localException,
@"in GSWComponent -_generateResponseInContext:");
LOGException(@"%@ (%@)",localException,[localException reason]);
[localException raise];
};
NS_ENDHANDLER;
LOGObjectFnStop();
};
//--------------------------------------------------------------------
-(GSWResponse*)_generateResponseInContext:(GSWContext*)aContext
{
GSWResponse* response=nil;
LOGObjectFnStart();
NSAssert(aContext,@"No context");
response=[GSWApp createResponseInContext:aContext];
[self _appendPageToResponse:response
inContext:aContext];
return response;
};
//--------------------------------------------------------------------
-(NSException*)validateValue:(id*)valuePtr
forKey:(NSString*)key
{
NSException* exception=nil;
LOGObjectFnStart();
/*
// Should all default implementation (i.e. the one which call validateXX:
exception=[super validateValue:valuePtr
forKey:key];
*/
LOGObjectFnStop();
return exception;
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentL)
//--------------------------------------------------------------------
// stringForKey:inTableNamed:withDefaultValue:
-(NSString*)stringForKey:(NSString*)key
inTableNamed:(NSString*)tableName
withDefaultValue:(NSString*)defaultValue
{
//OK
NSString* string=nil;
/*
NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
if (aComponentDefinition)
string=[aComponentDefinition stringForKey:key
inTableNamed:tableName
withDefaultValue:defaultValue
languages:languages];
else
string=defaultValue;
*/
LOGObjectFnStart();
string=[GSWApp stringForKey:key
inTableNamed:tableName
withDefaultValue:defaultValue
inFramework:[self frameworkName]
languages:[self languages]];
LOGObjectFnStop();
return string;
};
//--------------------------------------------------------------------
//NDFN
-(NSDictionary*)stringsTableNamed:(NSString*)aName
{
//OK
NSDictionary* stringsTable=nil;
/* NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
if (aComponentDefinition)
stringsTable=[aComponentDefinition stringsTableNamed:aName
withLanguages:languages];
*/
LOGObjectFnStart();
stringsTable=[GSWApp stringsTableNamed:aName
inFramework:[self frameworkName]
languages:[self languages]];
LOGObjectFnStop();
return stringsTable;
};
//--------------------------------------------------------------------
//NDFN
-(NSArray*)stringsTableArrayNamed:(NSString*)aName
{
//OK
NSArray* stringsTableArray=nil;
/*
NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
if (aComponentDefinition)
stringsTableArray=[aComponentDefinition stringsTableArrayNamed:aName
withLanguages:languages];
*/
LOGObjectFnStart();
stringsTableArray=[GSWApp stringsTableArrayNamed:aName
inFramework:[self frameworkName]
languages:[self languages]];
LOGObjectFnStop();
return stringsTableArray;
};
//--------------------------------------------------------------------
// urlForResourceNamed:ofType:
-(NSString*)urlForResourceNamed:(NSString*)aName
ofType:(NSString*)type
{
//TODO
NSString* url=nil;
/* NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
if (aComponentDefinition)
url=[aComponentDefinition urlForResourceNamed:aName
ofType:type
languages:languages
request:nil];//TODO
*/
LOGObjectFnStart();
url=[GSWApp urlForResourceNamed:(type ? [NSString stringWithFormat:@"%@.%@",aName,type] : aName)
inFramework:[self frameworkName]
languages:[self languages]
request:nil];//TODO
LOGObjectFnStop();
return url;
};
//--------------------------------------------------------------------
-(NSString*)_urlForResourceNamed:(NSString*)aName
ofType:(NSString*)type
{
LOGObjectFnNotImplemented(); //TODOFN
return nil;
};
//--------------------------------------------------------------------
// pathForResourceNamed:ofType:
// Normally: local search. Here we do a resourceManager serahc.
-(NSString*)pathForResourceNamed:(NSString*)aName
ofType:(NSString*)type
{
NSString* path=nil;
/* NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
if (aComponentDefinition)
path=[aComponentDefinition pathForResourceNamed:aName
ofType:type
languages:languages];
*/
LOGObjectFnStart();
path=[GSWApp pathForResourceNamed:aName
ofType:type
inFramework:[self frameworkName]
languages:[self languages]];
LOGObjectFnStop();
return path;
};
//--------------------------------------------------------------------
//NDFN
-(NSString*)pathForComponentResourceNamed:(NSString*)aName
ofType:(NSString*)type_
{
NSString* path=nil;
NSArray* languages=nil;
GSWComponentDefinition* aComponentDefinition=nil;
LOGObjectFnStart();
languages=[self languages];
aComponentDefinition=[self _componentDefinition];
if (aComponentDefinition)
path=[aComponentDefinition pathForResourceNamed:aName
ofType:type_
languages:languages];
return path;
};
//--------------------------------------------------------------------
//NDFN
-(NSString*)stringForKey:(id)key
inTableNamed:(NSString*)aName
withDefaultValue:(NSString*)defaultValue
inFramework:(NSString*)aFrameworkName
{
return [GSWApp stringForKey:key
inTableNamed:aName
withDefaultValue:defaultValue
inFramework:aFrameworkName
languages:[self languages]];
};
//--------------------------------------------------------------------
//NDFN
-(NSDictionary*)stringsTableNamed:(NSString*)aName
inFramework:(NSString*)aFrameworkName
{
return [GSWApp stringsTableNamed:aName
inFramework:aFrameworkName
languages:[self languages]];
};
//--------------------------------------------------------------------
//NDFN
-(NSArray*)stringsTableArrayNamed:(NSString*)aName
inFramework:(NSString*)aFrameworkName
{
return [GSWApp stringsTableArrayNamed:aName
inFramework:aFrameworkName
languages:[self languages]];
};
//--------------------------------------------------------------------
//NDFN
-(NSString*)urlForResourceNamed:(NSString*)aName
ofType:(NSString*)extension
inFramework:(NSString*)aFrameworkName;
{
return [GSWApp urlForResourceNamed:(extension ? [NSString stringWithFormat:@"%@.%@",aName,extension] : aName)
inFramework:aFrameworkName
languages:[self languages]
request:nil];//TODO
};
//--------------------------------------------------------------------
//NDFN
-(NSString*)pathForResourceNamed:(NSString*)aName
ofType:(NSString*)extension
inFramework:(NSString*)aFrameworkName
{
return [GSWApp pathForResourceNamed:aName
ofType:(NSString*)extension
inFramework:aFrameworkName
languages:[self languages]];
};
@end
//====================================================================
@implementation GSWComponent (GSWTemplateParsing)
//--------------------------------------------------------------------
// templateWithHTMLString:declarationString:languages
//--------------------------------------------------------------------
+(GSWElement*)templateWithHTMLString:(NSString*)htmlString
declarationString:(NSString*)pageDefString
languages:(NSArray*)languages
{
GSWElement* rootElement=nil;
NSDebugMLog0(@"Begin GSWComponent:templateWithHTMLString...");
rootElement=[GSWTemplateParser templateWithHTMLString:htmlString
declarationString:pageDefString
languages:languages];
return rootElement;
};
@end
//====================================================================
@implementation GSWComponent (GSWTemplateParsingOldFn)
//--------------------------------------------------------------------
// templateWithHTMLString:declarationString:
//old
+(GSWElement*)templateWithHTMLString:(NSString*)htmlString
declarationString:(NSString*)pageDefString
{
return [self templateWithHTMLString:htmlString
declarationString:pageDefString
languages:nil];
};
@end
//====================================================================
@implementation GSWComponent (GSWActionResults)
//--------------------------------------------------------------------
-(GSWResponse*)generateResponse
{
//OK
GSWResponse* response=nil;
GSWContext* aContext=nil;
LOGObjectFnStart();
aContext=[self context];
response=[self _generateResponseInContext:aContext];
LOGObjectFnStop();
return response;
};
@end
//====================================================================
@implementation GSWComponent (GSWStatistics)
//--------------------------------------------------------------------
// descriptionForResponse:inContext:
-(NSString*)descriptionForResponse:(GSWResponse*)aResponse
inContext:(GSWContext*)aContext
{
LOGObjectFnNotImplemented(); //TODOFN
return nil;
};
@end
//====================================================================
@implementation GSWComponent (GSWComponentClassA)
+(void)_registerObserver:(id)observer
{
LOGClassFnNotImplemented(); //TODOFN
};
@end
//====================================================================
@implementation GSWComponent (GSWVerifyAPI)
-(void)validateAPIAssociations
{
NSDictionary* api=[[self _componentDefinition] componentAPI];
if (api)
{
NSArray* required=[api objectForKey:@"Required"];
//TODO useit NSArray* optional=[api objectForKey:@"Optional"];
int i=0;
int count=[required count];
id aName=nil;
for(i=0;i<count;i++)
{
aName=[required objectAtIndex:i];
if (![self hasBinding:aName])
{
[NSException raise:NSGenericException
format:@"There is no binding for '%@' in parent '%@' for component '%@' [parents : %@]",
aName,
[_parent class],
[self class],
[self parentsClasses]];
};
};
};
};
@end