// $Id$
#include "XmlSchemaComplexType.h"
#include "XmlSchemaContent.h"
#include "XmlSchemaAttribute.h"
#include "XmlSchemaAttributeGroup.h"
#include "common.h"
@interface XmlSchemaComplexType(PrivateMethods)
- (void)setContent:(XmlSchemaContent *)_content;
@end
@implementation XmlSchemaComplexType
#if !LIB_FOUNDATION_BOEHM_GC
- (void)dealloc {
RELEASE(self->abstract);
RELEASE(self->block);
RELEASE(self->content);
RELEASE(self->attributes);
RELEASE(self->attributeGroups);
[super dealloc];
}
#endif
/* attributes */
- (NSString *)abstract {
return self->abstract;
}
- (NSString *)block {
return self->block;
}
- (BOOL)mixed {
return self->mixed;
}
/* accessors */
- (BOOL)isSimpleType {
return NO;
}
- (BOOL)isScalar {
return YES;
}
- (NSArray *)elementNames {
return [self->content elementNames];
}
- (XmlSchemaElement *)elementWithName:(NSString *)_name {
return [self->content elementWithName:_name];
}
- (NSArray *)attributeNames {
return [self->attributes allKeys];
}
- (XmlSchemaAttribute *)attributeWithName:(NSString *)_key {
return [self->attributes objectForKey:_key];
}
- (void)setContent:(XmlSchemaContent *)_content {
ASSIGN(self->content, _content);
}
- (XmlSchemaContent *)content {
return self->content;
}
/* ***************** */
- (NSString *)description {
NSMutableString *str = [NSMutableString stringWithCapacity:128];
[str appendString:@""];
[str appendString:[self->content description]];
[str appendString:@"\n"];
return str;
}
@end /* XmlSchemaComplexType */
@implementation XmlSchemaComplexType(XmlSchemaSaxBuilder)
static NSSet *Valid_complexType_ContentTags = nil;
+ (void)initialize {
if (Valid_complexType_ContentTags == nil) {
Valid_complexType_ContentTags = [[NSSet alloc] initWithObjects:
@"simpleContent",
@"complexContent",
@"group",
@"all",
@"choice",
@"sequence",
@"attribute",
@"attributeGroup",
nil];
}
}
- (id)initWithAttributes:(id)_attrs
namespace:(NSString *)_namespace
namespaces:(NSDictionary *)_ns {
if ((self = [super initWithAttributes:_attrs
namespace:_namespace
namespaces:_ns])) {
self->abstract = [[_attrs valueForRawName:@"abstract"] copy];
self->block = [[_attrs valueForRawName:@"block"] copy];
if ([[_attrs valueForRawName:@"mixed"] isEqualToString:@"true"])
self->mixed = YES;
self->attributes = [[NSMutableDictionary alloc] initWithCapacity:8];
self->attributeGroups = [[NSMutableArray alloc] initWithCapacity:8];
}
return self;
}
- (void)prepareWithSchema:(XmlSchema *)_schema {
NSEnumerator *groupEnum;
XmlSchemaAttributeGroup *group;
[super prepareWithSchema:_schema];
groupEnum = [self->attributeGroups objectEnumerator];
while ((group = [groupEnum nextObject])) {
NSEnumerator *nameEnum;
NSString *attrName;
[group prepareWithSchema:_schema];
nameEnum = [[group attributeNames] objectEnumerator];
while ((attrName = [nameEnum nextObject])) {
XmlSchemaAttribute *attr = [group attributeWithName:attrName];
if (attr)
[self->attributes setObject:attr forKey:attrName];
}
}
[self->content prepareWithSchema:_schema];
}
- (NSString *)tagName {
return @"complexType";
}
- (BOOL)isTagNameAccepted:(NSString *)_tagName {
if ([super isTagNameAccepted:_tagName])
return YES;
else
return [Valid_complexType_ContentTags containsObject:_tagName];
}
- (BOOL)addTag:(XmlSchemaTag *)_tag {
NSString *tagName;
tagName = [_tag tagName];
if ([tagName isEqualToString:@"attribute"]) {
return [self _insertTag:(XmlSchemaType *)_tag intoDict:self->attributes];
}
else if ([tagName isEqualToString:@"attributeGroup"]) {
[self->attributeGroups addObject:_tag];
return YES;
}
else {
[self setContent:(XmlSchemaContent *)_tag];
return YES;
}
return [super addTag:_tag];
}
@end /* XmlSchemaComplexType(XmlSchemaSaxBuilder) */