/*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
 */

#import "CMISExtensionElement.h"

@interface CMISExtensionElement ()

@property (nonatomic, strong, readwrite) NSString *name;
@property (nonatomic, strong, readwrite) NSString *namespaceUri;
@property (nonatomic, strong, readwrite) NSString *value;
@property (nonatomic, strong, readwrite) NSDictionary *attributes;
@property (nonatomic, strong, readwrite) NSArray *children;

/// Designated Initializer.  This initializer is private since we do not want the user to use one of the two public init methods defined in the header
- (id)initWithName:(NSString *)name namespaceUri:(NSString *)namespaceUri;

@end

@implementation CMISExtensionElement

@synthesize name = _name;
@synthesize namespaceUri = _namespaceUri;
@synthesize value = _value;
@synthesize attributes = _attributes;
@synthesize children = _children;

#pragma mark -
#pragma mark Initializers

- (id)initWithName:(NSString *)name namespaceUri:(NSString *)namespaceUri
{
    self = [super init];
    if (self)
    {
        self.name = name;
        self.namespaceUri = namespaceUri;
    }
    return self;
}

- (id)initNodeWithName:(NSString *)name namespaceUri:(NSString *)namespaceUri attributes:(NSDictionary *)attributesDict children:(NSArray *)children
{
    self = [self initWithName:name namespaceUri:namespaceUri];
    if (self)
    {
        self.value = nil;
        self.attributes = attributesDict;
        self.children = children;
    }
    return self;
}

- (id)initLeafWithName:(NSString *)name namespaceUri:(NSString *)namespaceUri attributes:(NSDictionary *)attributesDict value:(NSString *)value
{
    self = [self initWithName:name namespaceUri:namespaceUri];
    if (self)
    {
        self.value = value;
        self.attributes = attributesDict;
        self.children = nil;
    }
    return self;
}

#pragma mark - 
#pragma mark NSObject Overrides

- (NSString *)description
{
    return [NSString stringWithFormat:@"CMISExtensionElement: %@%@ %@: %@", 
            (self.namespaceUri ? ([NSString stringWithFormat:@"{%@}", self.namespaceUri]) : @""), 
            self.name, 
            (([self.attributes count] > 0) ? self.attributes : @"{}"), 
            ((self.children.count == 0)  ? self.value : self.children)];
}


@end
