org.hisrc.jsonix.Jsonix.Model.AbstractElementsPropertyInfo.js Maven / Gradle / Ivy
Jsonix.Model.AbstractElementsPropertyInfo = Jsonix.Class(Jsonix.Model.PropertyInfo, {
wrapperElementName : null,
initialize : function(mapping) {
Jsonix.Util.Ensure.ensureObject(mapping);
Jsonix.Model.PropertyInfo.prototype.initialize.apply(this, [ mapping ]);
var wen = mapping.wrapperElementName||mapping.wen||undefined;
if (Jsonix.Util.Type.isObject(wen)) {
this.wrapperElementName = Jsonix.XML.QName.fromObject(wen);
} else if (Jsonix.Util.Type.isString(wen)) {
this.wrapperElementName = new Jsonix.XML.QName(this.defaultElementNamespaceURI, wen);
} else {
this.wrapperElementName = null;
}
},
unmarshal : function(context, input, scope) {
var result = null;
var that = this;
var callback = function(value) {
if (that.collection) {
if (result === null) {
result = [];
}
result.push(value);
} else {
if (result === null) {
result = value;
} else {
// TODO Report validation error
throw new Error("Value already set.");
}
}
};
if (Jsonix.Util.Type.exists(this.wrapperElementName)) {
this.unmarshalWrapperElement(context, input, scope, callback);
} else {
this.unmarshalElement(context, input, scope, callback);
}
return result;
},
unmarshalWrapperElement : function(context, input, scope, callback) {
var et = input.next();
while (et !== Jsonix.XML.Input.END_ELEMENT) {
// New sub-element starts
if (et === Jsonix.XML.Input.START_ELEMENT) {
this.unmarshalElement(context, input, scope, callback);
} else if (et === Jsonix.XML.Input.SPACE || et === Jsonix.XML.Input.COMMENT || et === Jsonix.XML.Input.PROCESSING_INSTRUCTION) {
// Skip whitespace
} else {
// TODO ignore comments, processing
// instructions
throw new Error("Illegal state: unexpected event type [" + et + "].");
}
et = input.next();
}
},
unmarshalElement : function(context, input, scope, callback) {
throw new Error("Abstract method [unmarshalElement].");
},
marshal : function(value, context, output, scope) {
if (!Jsonix.Util.Type.exists(value)) {
// Do nothing
return;
}
if (Jsonix.Util.Type.exists(this.wrapperElementName)) {
output.writeStartElement(this.wrapperElementName);
}
if (!this.collection) {
this.marshalElementNode(value, context, output, scope);
} else {
Jsonix.Util.Ensure.ensureArray(value);
// TODO Exception if not array
for ( var index = 0; index < value.length; index++) {
var item = value[index];
// TODO Exception if item does not exist
this.marshalElementNode(item, context, output, scope);
}
}
if (Jsonix.Util.Type.exists(this.wrapperElementName)) {
output.writeEndElement();
}
},
marshalElementNode : function(value, context, output, scope) {
throw new Error("Abstract method [marshalElement].");
},
marshalElementTypeInfo : function(elementName, value, typeInfo, context, output, scope) {
output.writeStartElement(elementName);
typeInfo.marshal(value, context, output, scope);
output.writeEndElement();
},
buildStructure : function(context, structure) {
Jsonix.Util.Ensure.ensureObject(structure);
if (Jsonix.Util.Type.exists(structure.value)) {
// TODO better exception
throw new Error("The structure already defines a value property.");
} else if (!Jsonix.Util.Type.exists(structure.elements)) {
structure.elements = {};
}
if (Jsonix.Util.Type.exists(this.wrapperElementName)) {
structure.elements[this.wrapperElementName.key] = this;
} else {
this.buildStructureElements(context, structure);
}
},
buildStructureElements : function(context, structure) {
throw new Error("Abstract method [buildStructureElements].");
},
CLASS_NAME : 'Jsonix.Model.AbstractElementsPropertyInfo'
});
© 2015 - 2024 Weber Informatics LLC | Privacy Policy