blob: d8b218a284325b45fd4c6db1723b0a4e0731a9c3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012-2014 SAP SE.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP SE - initial API and implementation and/or initial documentation
*
*******************************************************************************/
package org.eclipse.ogee.client.parser.impl;
import org.eclipse.ogee.client.model.atom.ODataPropertyImpl;
import org.eclipse.ogee.client.model.generic.Arrays;
import org.eclipse.ogee.client.model.generic.ComplexTypeCollection;
import org.eclipse.ogee.client.model.generic.ODataProperty;
import org.xml.sax.Attributes;
/**
* Auxiliary class for parsing a complex type collection. Not to be used
* explicitly.
*
*/
public class CollectionComplexTagFactory implements TagFactory {
private ComplexTypeCollection root;
public CollectionComplexTagFactory(String serviceOperation) {
super();
root = new ComplexTypeCollection(serviceOperation);
}
public TagObject createTagObject(String tagName, Attributes attr) {
TagObject result = new TagObject();
result.setTag(tagName);
int attrCount = attr.getLength();
if (tagName.equalsIgnoreCase(this.root.getQualifiedName())) {
if (attrCount > 0) {
String attrName, attrValue;
for (int i = 0; i < attrCount; i++) {
attrName = attr.getQName(i);
attrValue = attr.getValue(i);
this.root.setAttribute(attrName, attrValue);
}
}
result.setObject(this.root);
} else if (tagName.equalsIgnoreCase("d:element")) {
ODataPropertyImpl element = new ODataPropertyImpl();
if (attrCount > 0) {
String attrName, attrValue;
for (int i = 0; i < attrCount; i++) {
attrName = attr.getQName(i);
attrValue = attr.getValue(i);
if (attrName.equalsIgnoreCase(M_TYPE))
element.setType(attr.getValue(i));
else
element.setAttribute(attrName, attrValue);
}
}
result.setObject(element);
} else if (tagName.startsWith(D)) {
ODataPropertyImpl valueObject = new ODataPropertyImpl();
if (attrCount > 0) {
String attrName, attrValue;
for (int i = 0; i < attrCount; i++) {
attrName = attr.getQName(i);
attrValue = attr.getValue(i);
if (attrName.equalsIgnoreCase(M_TYPE))
valueObject.setType(attrValue);
else
valueObject.setAttribute(attrName, attrValue);
}
}
result.setObject(valueObject);
}
return result;
}
public void setValue(TagObject tagObject, String value) {
String tagName = tagObject.getTag();
if (!tagName.equalsIgnoreCase(this.root.getName())) {
if (tagName.startsWith(D)
&& !tagName.equalsIgnoreCase(this.root.getQualifiedName())) {
ODataPropertyImpl valueObject = (ODataPropertyImpl) tagObject
.getObject();
valueObject.setValue(value);
valueObject.setName(tagName);
} else if (tagObject.getObject() == null && value != null) {
tagObject.setObject(value);
}
}
}
public void addChild(TagObject parent, TagObject tagObject) {
String tag = tagObject.getTag();
String parentTag = parent.getTag();
if (parentTag.equalsIgnoreCase(this.root.getQualifiedName())) {
this.root = (ComplexTypeCollection) parent.getObject();
if (tag.equalsIgnoreCase("d:element")) {
ODataProperty[] elements = (ODataProperty[]) this.root
.getElements();
if (elements == null) {
this.root.setElements(new ODataPropertyImpl[0]);
elements = (ODataPropertyImpl[]) this.root.getElements();
}
ODataPropertyImpl element = (ODataPropertyImpl) tagObject
.getObject();
Arrays.add(this.root, elements, element);
}
} else if (parentTag.equalsIgnoreCase("d:element")) {
ODataPropertyImpl element = (ODataPropertyImpl) parent.getObject();
if (tag.startsWith(D)) {
ODataPropertyImpl dataValue = (ODataPropertyImpl) tagObject
.getObject();
element.putChildDataValue(dataValue);
}
} else if (!parentTag.equalsIgnoreCase(this.root.getQualifiedName())) {
ODataPropertyImpl parentDataValue = (ODataPropertyImpl) parent
.getObject();
if (tag.startsWith(D)) {
ODataPropertyImpl dataValue = (ODataPropertyImpl) tagObject
.getObject();
parentDataValue.putChildDataValue(dataValue);
}
}
}
}