angular-odata
Version:
Client side OData typescript library for Angular
564 lines • 111 kB
JavaScript
import { VERSION_4_0 } from '../constants';
import { ODataMetadata } from './metadata';
var FieldType;
(function (FieldType) {
FieldType[FieldType["ATTRIBUTE"] = 0] = "ATTRIBUTE";
FieldType[FieldType["TAG"] = 1] = "TAG";
})(FieldType || (FieldType = {}));
class Field {
name;
fieldType;
constructor(name, fieldType) {
this.name = name;
this.fieldType = fieldType;
}
}
export class ODataMetadataParser {
// TAGS
static TAG_EDMX = 'edmx:Edmx';
static TAG_DATA_SERVICES = 'edmx:DataServices';
static TAG_REFERENCE = 'edmx:Reference';
static TAG_INCLUDE = 'edmx:Include';
static TAG_INCLUDE_ANNOTATIONS = 'edmx:IncludeAnnotations';
static TAG_TERM = 'Term';
static TAG_ANNOTATIONS = 'Annotations';
static TAG_ANNOTATION = 'Annotation';
static TAG_SCHEMA = 'Schema';
static TAG_ENUM_TYPE = 'EnumType';
static TAG_MEMBER = 'Member';
static TAG_COMPLEX_TYPE = 'ComplexType';
static TAG_ENTITY_TYPE = 'EntityType';
static TAG_PROPERTY = 'Property';
static TAG_KEY = 'Key';
static TAG_PROPERTY_REF = 'PropertyRef';
static TAG_NAVIGATION_PROPERTY = 'NavigationProperty';
static TAG_REFERENTIAL_CONSTRAINT = 'ReferentialConstraint';
static TAG_ON_DELETE = 'OnDelete';
static TAG_FUNCTION = 'Function';
static TAG_RETURN_TYPE = 'ReturnType';
static TAG_PARAMETER = 'Parameter';
static TAG_ACTION = 'Action';
static TAG_ENTITY_CONTAINER = 'EntityContainer';
static TAG_ENTITY_SET = 'EntitySet';
static TAG_SINGLETON = 'Singleton';
static TAG_COLLECTION = 'Collection';
static TAG_RECORD = 'Record';
static TAG_STRING = 'String';
static TAG_ENUM_MEMBER = 'EnumMember';
static TAG_PROPERTY_VALUE = 'PropertyValue';
static TAG_PROPERTY_PATH = 'PropertyPath';
static TAG_NAVIGATION_PROPERTY_PATH = 'NavigationPropertyPath';
static TAG_FUNCTION_IMPORT = 'FunctionImport';
static TAG_ACTION_IMPORT = 'ActionImport';
static TAG_NAVIGATION_PROPERTY_BINDING = 'NavigationPropertyBinding';
static TAG_TYPE_DEFINITION = 'TypeDefinition';
// ATTRIBUTES
static ATTRIBUTE_VERSION = 'Version';
static ATTRIBUTE_URI = 'Uri';
static ATTRIBUTE_ALIAS = 'Alias';
static ATTRIBUTE_NAMESPACE = 'Namespace';
static ATTRIBUTE_TERM_NAMESPACE = 'TermNamespace';
static ATTRIBUTE_QUALIFIER = 'Qualifier';
static ATTRIBUTE_STRING = 'String';
static ATTRIBUTE_DATE = 'Date';
static ATTRIBUTE_BOOL = 'Bool';
static ATTRIBUTE_INT = 'Int';
static ATTRIBUTE_TARGET_NAMESPACE = 'TargetNamespace';
static ATTRIBUTE_TERM = 'Term';
static ATTRIBUTE_NAME = 'Name';
static ATTRIBUTE_VALUE = 'Value';
static ATTRIBUTE_BASE_TYPE = 'BaseType';
static ATTRIBUTE_OPEN_TYPE = 'OpenType';
static ATTRIBUTE_TYPE = 'Type';
static ATTRIBUTE_NULLABLE = 'Nullable';
static ATTRIBUTE_MAX_LENGTH = 'MaxLength';
static ATTRIBUTE_PRECISION = 'Precision';
static ATTRIBUTE_SCALE = 'Scale';
static ATTRIBUTE_UNICODE = 'Unicode';
static ATTRIBUTE_SRID = 'SRID';
static ATTRIBUTE_DEFAULT_VALUE = 'DefaultValue';
static ATTRIBUTE_PARTNER = 'Partner';
static ATTRIBUTE_PROPERTY = 'Property';
static ATTRIBUTE_REFERENCED_PROPERTY = 'ReferencedProperty';
static ATTRIBUTE_HAS_STREAM = 'HasStream';
static ATTRIBUTE_CONTAINS_TARGET = 'ContainsTarget';
static ATTRIBUTE_IS_BOUND = 'IsBound';
static ATTRIBUTE_ENTITY_SET_PATH = 'EntitySetPath';
static ATTRIBUTE_IS_COMPOSABLE = 'IsComposable';
static ATTRIBUTE_ENTITY_TYPE = 'EntityType';
static ATTRIBUTE_PATH = 'Path';
static ATTRIBUTE_TARGET = 'Target';
static ATTRIBUTE_FUNCTION = 'Function';
static ATTRIBUTE_ACTION = 'Action';
static ATTRIBUTE_ENTITY_SET = 'EntitySet';
static ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT = 'IncludeInServiceDocument';
static ATTRIBUTE_ABSTRACT = 'Abstract';
static ATTRIBUTE_UNDERLYING_TYPE = 'UnderlyingType';
static ATTRIBUTE_IS_FLAGS = 'IsFlags';
static ATTRIBUTE_EXTENDS = 'Extends';
static ATTRIBUTE_BASE_TERM = 'BaseTerm';
static ATTRIBUTE_APPLIES_TO = 'AppliesTo';
document;
constructor(xml) {
try {
const parser = new DOMParser();
this.document = parser.parseFromString(xml, 'text/xml');
this.checkVersion(document);
}
catch (error) {
throw new Error('Unable to parse metadata, ' + error);
}
}
metadata() {
const version = this.getFieldValueByAttribute(new Field(ODataMetadataParser.ATTRIBUTE_VERSION, FieldType.ATTRIBUTE), this.document.documentElement.attributes);
const references = this.getObjects(this.document.documentElement, ODataMetadataParser.TAG_REFERENCE, [
new Field(ODataMetadataParser.ATTRIBUTE_URI, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_INCLUDE, FieldType.TAG),
new Field(ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
const dataServices = this.document.documentElement.getElementsByTagName(ODataMetadataParser.TAG_DATA_SERVICES)[0];
const schemas = this.getObjects(dataServices, ODataMetadataParser.TAG_SCHEMA, [
new Field(ODataMetadataParser.ATTRIBUTE_NAMESPACE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ENUM_TYPE, FieldType.TAG),
new Field(ODataMetadataParser.TAG_COMPLEX_TYPE, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ENTITY_TYPE, FieldType.TAG),
new Field(ODataMetadataParser.TAG_FUNCTION, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ACTION, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ENTITY_CONTAINER, FieldType.TAG),
new Field(ODataMetadataParser.TAG_TYPE_DEFINITION, FieldType.TAG),
new Field(ODataMetadataParser.TAG_TERM, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ANNOTATIONS, FieldType.TAG),
]);
return new ODataMetadata(version, references, schemas);
}
checkVersion(document) {
// check version
const attributes = document.documentElement.attributes;
if (!attributes) {
throw new Error('OData version is not specified in the metadata');
}
const attr = attributes.getNamedItem('Version');
if (attr === null) {
throw new Error('OData version is not specified in the metadata');
}
const odataVersion = attr?.nodeValue;
if (odataVersion !== VERSION_4_0) {
throw new Error('OData version "' + odataVersion + '" is not supported');
}
}
getObjects(parentElement, tag, fieldNames) {
let objects = [];
const children = parentElement.children;
for (let index = 0; index < children.length; index++) {
const element = children.item(index);
if (!element || element.nodeName !== tag) {
continue;
}
const attributes = element.attributes;
const fieldValues = this.getFieldValues(fieldNames, attributes, element);
fieldValues['TextContent'] = element.textContent;
switch (tag) {
case ODataMetadataParser.TAG_REFERENCE:
case ODataMetadataParser.TAG_INCLUDE:
case ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS:
case ODataMetadataParser.TAG_TERM:
case ODataMetadataParser.TAG_ANNOTATIONS:
case ODataMetadataParser.TAG_COLLECTION:
case ODataMetadataParser.TAG_RECORD:
case ODataMetadataParser.TAG_STRING:
case ODataMetadataParser.TAG_ENUM_MEMBER:
case ODataMetadataParser.TAG_PROPERTY_VALUE:
case ODataMetadataParser.TAG_PROPERTY_PATH:
case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH:
case ODataMetadataParser.TAG_ANNOTATION:
case ODataMetadataParser.TAG_SCHEMA:
case ODataMetadataParser.TAG_ENUM_TYPE:
case ODataMetadataParser.TAG_COMPLEX_TYPE:
case ODataMetadataParser.TAG_ENTITY_TYPE:
case ODataMetadataParser.TAG_FUNCTION:
case ODataMetadataParser.TAG_MEMBER:
case ODataMetadataParser.TAG_PROPERTY:
case ODataMetadataParser.TAG_PROPERTY_REF:
case ODataMetadataParser.TAG_NAVIGATION_PROPERTY:
case ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT:
case ODataMetadataParser.TAG_PARAMETER:
case ODataMetadataParser.TAG_ACTION:
case ODataMetadataParser.TAG_ENTITY_SET:
case ODataMetadataParser.TAG_SINGLETON:
case ODataMetadataParser.TAG_FUNCTION_IMPORT:
case ODataMetadataParser.TAG_ACTION_IMPORT:
case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING:
case ODataMetadataParser.TAG_TYPE_DEFINITION:
case ODataMetadataParser.TAG_ENTITY_CONTAINER:
objects.push(fieldValues);
break;
default:
throw new Error('Unknwon tag:' + tag);
}
}
return objects;
}
getObject(parentElement, tag, fieldNames) {
let object;
const children = parentElement.children;
let element;
for (let index = 0; index < children.length; index++) {
if (children && children.item(index)?.nodeName === tag) {
if (element !== undefined && element !== null) {
throw new Error('Expected one ' + tag);
}
element = children.item(index);
}
}
if (element !== undefined && element !== null) {
const attributes = element.attributes;
const fieldValues = this.getFieldValues(fieldNames, attributes, element);
fieldValues['TextContent'] = element.textContent;
switch (tag) {
case ODataMetadataParser.TAG_KEY:
case ODataMetadataParser.TAG_RETURN_TYPE:
case ODataMetadataParser.TAG_ON_DELETE:
return fieldValues;
default:
throw new Error('Unknwon tag:' + tag);
}
}
return object;
}
getFieldValues(fields, attributes, element) {
const fieldValues = {};
for (const field of fields) {
if (field.fieldType === FieldType.TAG) {
fieldValues[field.name] = this.getFieldValueByTag(field, element);
}
else if (field.fieldType === FieldType.ATTRIBUTE) {
fieldValues[field.name] = this.getFieldValueByAttribute(field, attributes);
}
else {
throw new Error('Unknown field type: ' + field.fieldType);
}
}
return fieldValues;
}
getFieldValueByAttribute(field, attributes) {
switch (field.name) {
case ODataMetadataParser.ATTRIBUTE_VERSION:
case ODataMetadataParser.ATTRIBUTE_URI:
case ODataMetadataParser.ATTRIBUTE_NAMESPACE:
case ODataMetadataParser.ATTRIBUTE_ALIAS:
case ODataMetadataParser.ATTRIBUTE_TERM_NAMESPACE:
case ODataMetadataParser.ATTRIBUTE_TERM:
case ODataMetadataParser.ATTRIBUTE_QUALIFIER:
case ODataMetadataParser.ATTRIBUTE_STRING:
case ODataMetadataParser.ATTRIBUTE_BOOL:
case ODataMetadataParser.ATTRIBUTE_INT:
case ODataMetadataParser.ATTRIBUTE_TARGET_NAMESPACE:
case ODataMetadataParser.ATTRIBUTE_NAME:
case ODataMetadataParser.ATTRIBUTE_TYPE:
case ODataMetadataParser.ATTRIBUTE_SRID:
case ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE:
case ODataMetadataParser.ATTRIBUTE_PARTNER:
case ODataMetadataParser.ATTRIBUTE_PROPERTY:
case ODataMetadataParser.ATTRIBUTE_REFERENCED_PROPERTY:
case ODataMetadataParser.ATTRIBUTE_BASE_TYPE:
case ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH:
case ODataMetadataParser.ATTRIBUTE_ENTITY_TYPE:
case ODataMetadataParser.ATTRIBUTE_PATH:
case ODataMetadataParser.ATTRIBUTE_TARGET:
case ODataMetadataParser.ATTRIBUTE_FUNCTION:
case ODataMetadataParser.ATTRIBUTE_ACTION:
case ODataMetadataParser.ATTRIBUTE_ENTITY_SET:
case ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE:
case ODataMetadataParser.ATTRIBUTE_EXTENDS:
case ODataMetadataParser.ATTRIBUTE_BASE_TERM:
case ODataMetadataParser.ATTRIBUTE_APPLIES_TO:
return this.getAttributeValue(attributes, field.name);
case ODataMetadataParser.ATTRIBUTE_NULLABLE:
case ODataMetadataParser.ATTRIBUTE_UNICODE:
case ODataMetadataParser.ATTRIBUTE_OPEN_TYPE:
case ODataMetadataParser.ATTRIBUTE_HAS_STREAM:
case ODataMetadataParser.ATTRIBUTE_IS_BOUND:
case ODataMetadataParser.ATTRIBUTE_IS_COMPOSABLE:
case ODataMetadataParser.ATTRIBUTE_CONTAINS_TARGET:
case ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT:
case ODataMetadataParser.ATTRIBUTE_ABSTRACT:
case ODataMetadataParser.ATTRIBUTE_IS_FLAGS:
return this.propertyValueToBoolean(this.getAttributeValue(attributes, field.name));
case ODataMetadataParser.ATTRIBUTE_VALUE:
case ODataMetadataParser.ATTRIBUTE_MAX_LENGTH:
case ODataMetadataParser.ATTRIBUTE_PRECISION:
case ODataMetadataParser.ATTRIBUTE_SCALE:
return this.propertyValueToNumber(this.getAttributeValue(attributes, field.name));
case ODataMetadataParser.ATTRIBUTE_DATE:
return this.propertyValueToDate(this.getAttributeValue(attributes, field.name));
default:
throw new Error('Unknwon attribute:' + field.name);
}
}
getFieldValueByTag(field, element) {
switch (field.name) {
case ODataMetadataParser.TAG_INCLUDE:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAMESPACE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_TERM_NAMESPACE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_QUALIFIER, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TARGET_NAMESPACE, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_TERM:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_BASE_TERM, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_APPLIES_TO, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_BOOL, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_INT, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_ANNOTATIONS:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_TARGET, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_QUALIFIER, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_ANNOTATION:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_TERM, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_BOOL, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_INT, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_COLLECTION, FieldType.TAG),
new Field(ODataMetadataParser.TAG_RECORD, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ENUM_MEMBER, FieldType.TAG),
]);
case ODataMetadataParser.TAG_COLLECTION:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.TAG_STRING, FieldType.TAG),
new Field(ODataMetadataParser.TAG_RECORD, FieldType.TAG),
new Field(ODataMetadataParser.TAG_PROPERTY_PATH, FieldType.TAG),
new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH, FieldType.TAG),
]);
case ODataMetadataParser.TAG_RECORD:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
]);
case ODataMetadataParser.TAG_STRING:
return this.getObjects(element, field.name, []);
case ODataMetadataParser.TAG_ENUM_MEMBER:
return this.getObjects(element, field.name, []);
case ODataMetadataParser.TAG_PROPERTY_VALUE:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_PROPERTY, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_DATE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ENUM_MEMBER, FieldType.TAG),
]);
case ODataMetadataParser.TAG_PROPERTY_PATH:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
]);
case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
]);
case ODataMetadataParser.TAG_ENUM_TYPE:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_MEMBER, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_IS_FLAGS, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_COMPLEX_TYPE:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_PROPERTY, FieldType.TAG),
new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_BASE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_OPEN_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ABSTRACT, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_ENTITY_TYPE:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_KEY, FieldType.TAG),
new Field(ODataMetadataParser.TAG_PROPERTY, FieldType.TAG),
new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_BASE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_OPEN_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ABSTRACT, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_HAS_STREAM, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_FUNCTION:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_RETURN_TYPE, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_IS_BOUND, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_IS_COMPOSABLE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_PARAMETER, FieldType.TAG),
]);
case ODataMetadataParser.TAG_MEMBER:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_VALUE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_PROPERTY:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_UNICODE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_KEY:
return this.getObject(element, field.name, [
new Field(ODataMetadataParser.TAG_PROPERTY_REF, FieldType.TAG),
]);
case ODataMetadataParser.TAG_PROPERTY_REF:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_NAVIGATION_PROPERTY:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_PARTNER, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_CONTAINS_TARGET, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ON_DELETE, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_PROPERTY, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_REFERENCED_PROPERTY, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_ON_DELETE:
return this.getObject(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_ACTION, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_PARAMETER:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_RETURN_TYPE:
return this.getObject(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_ACTION:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_RETURN_TYPE, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_IS_BOUND, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_PARAMETER, FieldType.TAG),
]);
case ODataMetadataParser.TAG_ENTITY_CONTAINER:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_EXTENDS, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ENTITY_SET, FieldType.TAG),
new Field(ODataMetadataParser.TAG_SINGLETON, FieldType.TAG),
new Field(ODataMetadataParser.TAG_FUNCTION_IMPORT, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ACTION_IMPORT, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_ENTITY_SET:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING, FieldType.TAG),
new Field(ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_SINGLETON:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING, FieldType.TAG),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
case ODataMetadataParser.TAG_FUNCTION_IMPORT:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_FUNCTION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_ACTION_IMPORT:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ACTION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_PATH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_TARGET, FieldType.ATTRIBUTE),
]);
case ODataMetadataParser.TAG_TYPE_DEFINITION:
return this.getObjects(element, field.name, [
new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_UNICODE, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
]);
default:
throw new Error('Unknwon tag:' + field.name);
}
}
getAttributeValue(attributes, attributeName) {
const attribute = attributes.getNamedItem(attributeName);
return attribute !== null && attribute.nodeValue
? attribute.nodeValue
: undefined;
}
propertyValueToNumber(attributeValue) {
return attributeValue !== undefined ? Number(attributeValue) : undefined;
}
propertyValueToBoolean(attributeValue) {
return attributeValue !== undefined ? attributeValue === 'true' : false;
}
propertyValueToDate(attributeValue) {
return attributeValue !== undefined ? new Date(attributeValue) : undefined;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL21ldGFkYXRhL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0MsSUFBSyxTQUdKO0FBSEQsV0FBSyxTQUFTO0lBQ1osbURBQVMsQ0FBQTtJQUNULHVDQUFHLENBQUE7QUFDTCxDQUFDLEVBSEksU0FBUyxLQUFULFNBQVMsUUFHYjtBQUVELE1BQU0sS0FBSztJQUVBO0lBQ0E7SUFGVCxZQUNTLElBQVksRUFDWixTQUFvQjtRQURwQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osY0FBUyxHQUFULFNBQVMsQ0FBVztJQUMxQixDQUFDO0NBQ0w7QUFFRCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLE9BQU87SUFDQyxNQUFNLENBQVUsUUFBUSxHQUFHLFdBQVcsQ0FBQztJQUN2QyxNQUFNLENBQVUsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7SUFDeEQsTUFBTSxDQUFVLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztJQUNqRCxNQUFNLENBQVUsV0FBVyxHQUFHLGNBQWMsQ0FBQztJQUM3QyxNQUFNLENBQVUsdUJBQXVCLEdBQUcseUJBQXlCLENBQUM7SUFDcEUsTUFBTSxDQUFVLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFDbEMsTUFBTSxDQUFVLGVBQWUsR0FBRyxhQUFhLENBQUM7SUFDaEQsTUFBTSxDQUFVLGNBQWMsR0FBRyxZQUFZLENBQUM7SUFDOUMsTUFBTSxDQUFVLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDdEMsTUFBTSxDQUFVLGFBQWEsR0FBRyxVQUFVLENBQUM7SUFDM0MsTUFBTSxDQUFVLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDdEMsTUFBTSxDQUFV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