All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hisrc.jsonix.Jsonix.Model.Module.js Maven / Gradle / Ivy

There is a newer version: 3.0.0
Show newest version
Jsonix.Model.Module = Jsonix
		.Class(Jsonix.Mapping.Styled, {
			name : null,
			typeInfos : null,
			elementInfos : null,
			targetNamespace : '',
			defaultElementNamespaceURI : '',
			defaultAttributeNamespaceURI : '',
			initialize : function(mapping, options) {
				Jsonix.Mapping.Styled.prototype.initialize.apply(this, [options]);
				this.typeInfos = [];
				this.elementInfos = [];
				if (typeof mapping !== 'undefined') {
					Jsonix.Util.Ensure.ensureObject(mapping);
					var n = mapping.name||mapping.n||null;
					this.name = n;
					var dens = mapping.defaultElementNamespaceURI||mapping.dens||mapping.targetNamespace||mapping.tns||'';
					this.defaultElementNamespaceURI = dens;
					var tns =  mapping.targetNamespace||mapping.tns||mapping.defaultElementNamespaceURI||mapping.dens||this.defaultElementNamespaceURI;
					this.targetNamespace = tns;
					var dans = mapping.defaultAttributeNamespaceURI||mapping.dans||'';
					this.defaultAttributeNamespaceURI = dans;
					// Initialize type infos
					var tis = mapping.typeInfos||mapping.tis||[];
					this.initializeTypeInfos(tis);

					// Backwards compatibility: class infos can also be defined
					// as properties of the schema, for instance Schema.MyType
					for ( var typeInfoName in mapping) {
						if (mapping.hasOwnProperty(typeInfoName)) {
							if (mapping[typeInfoName] instanceof this.mappingStyle.classInfo) {
								this.typeInfos.push(mapping[typeInfoName]);
							}
						}
					}
					var eis = mapping.elementInfos||mapping.eis||[];
					// Initialize element infos
					this.initializeElementInfos(eis);
				}
			},
			initializeTypeInfos : function(typeInfoMappings) {
				Jsonix.Util.Ensure.ensureArray(typeInfoMappings);
				var index, typeInfoMapping, typeInfo;
				for (index = 0; index < typeInfoMappings.length; index++) {
					typeInfoMapping = typeInfoMappings[index];
					typeInfo = this.createTypeInfo(typeInfoMapping);
					this.typeInfos.push(typeInfo);
				}
			},
			initializeElementInfos : function(elementInfoMappings) {
				Jsonix.Util.Ensure.ensureArray(elementInfoMappings);
				var index, elementInfoMapping, elementInfo;
				for (index = 0; index < elementInfoMappings.length; index++) {
					elementInfoMapping = elementInfoMappings[index];
					elementInfo = this.createElementInfo(elementInfoMapping);
					this.elementInfos.push(elementInfo);
				}
			},
			createTypeInfo : function(mapping) {
				Jsonix.Util.Ensure.ensureObject(mapping);
				var typeInfo;
				// If mapping is already a type info, do nothing
				if (mapping instanceof Jsonix.Model.TypeInfo) {
					typeInfo = mapping;
				}
				// Else create it via generic mapping configuration
				else {
					var type = mapping.type||mapping.t||'classInfo';
					// Locate the creator function
					if (Jsonix.Util.Type
							.isFunction(this.typeInfoCreators[type])) {
						var typeInfoCreator = this.typeInfoCreators[type];
						// Call the creator function
						typeInfo = typeInfoCreator.call(this, mapping);
					} else {
						throw new Error("Unknown type info type [" + type + "].");
					}
				}
				return typeInfo;
			},
			initializeNames : function(mapping) {
				var ln = mapping.localName||mapping.ln||null;
				mapping.localName = ln;
				var n = mapping.name||mapping.n||null;
				mapping.name = n;
				// Calculate both name as well as localName
				// name is provided
				if (Jsonix.Util.Type.isString(mapping.name)) {
					// Nothing to do - only name matters
					
					// Obsolete code below
//					// localName is not provided
//					if (!Jsonix.Util.Type.isString(mapping.localName)) {
//						// But module name is provided
//						if (Jsonix.Util.Type.isString(this.name)) {
//							// If name starts with module name, use second part
//							// as local name
//							if (mapping.name.indexOf(this.name + '.') === 0) {
//								mapping.localName = mapping.name
//										.substring(this.name.length + 1);
//							}
//							// Else use name as local name
//							else {
//								mapping.localName = mapping.name;
//							}
//						}
//						// Module name is not provided, use name as local name
//						else {
//							mapping.localName = mapping.name;
//						}
//					}
					if (mapping.name.length > 0 && mapping.name.charAt(0) === '.' && Jsonix.Util.Type.isString(this.name))
					{
						mapping.name = this.name + mapping.name;
					}
				}
				// name is not provided but local name is provided
				else if (Jsonix.Util.Type.isString(mapping.localName)) {
					// Module name is provided
					if (Jsonix.Util.Type.isString(this.name)) {
						mapping.name = this.name + '.' + mapping.localName;
					}
					// Module name is not provided
					else {
						mapping.name = mapping.localName;
					}
				} else {
					throw new Error("Neither [name/n] nor [localName/ln] was provided for the class info.");
				}
			},
			createClassInfo : function(mapping) {
				Jsonix.Util.Ensure.ensureObject(mapping);
				var dens = mapping.defaultElementNamespaceURI||mapping.dens||this.defaultElementNamespaceURI;
				mapping.defaultElementNamespaceURI = dens;
				var tns =  mapping.targetNamespace||mapping.tns||this.targetNamespace;
				mapping.targetNamespace = tns;
				var dans = mapping.defaultAttributeNamespaceURI||mapping.dans||this.defaultAttributeNamespaceURI;
				mapping.defaultAttributeNamespaceURI = dans;
				this.initializeNames(mapping);
				// Now both name an local name are initialized
				var classInfo = new this.mappingStyle.classInfo(mapping,
				{
					mappingStyle : this.mappingStyle
				});
				return classInfo;
			},
			createEnumLeafInfo : function(mapping) {
				Jsonix.Util.Ensure.ensureObject(mapping);
				this.initializeNames(mapping);
				// Now both name an local name are initialized
				var enumLeafInfo = new this.mappingStyle.enumLeafInfo(mapping,
				{
					mappingStyle : this.mappingStyle
				});
				return enumLeafInfo;
			},
			createList : function(mapping) {
				Jsonix.Util.Ensure.ensureObject(mapping);
				var ti = mapping.baseTypeInfo||mapping.typeInfo||mapping.bti||mapping.ti||'String';
				var tn = mapping.typeName||mapping.tn||null;
				
				if (Jsonix.Util.Type.exists(tn))
				{
					if (Jsonix.Util.Type.isString(tn))
					{
						tn = new Jsonix.XML.QName(this.targetNamespace, tn);
					}
					else {
						tn = Jsonix.XML.QName.fromObject(tn);
					}
				}
				var s = mapping.separator||mapping.sep||' ';
				Jsonix.Util.Ensure.ensureExists(ti);
				return new Jsonix.Schema.XSD.List(ti, tn, s);
			},
			createElementInfo : function(mapping) {
				Jsonix.Util.Ensure.ensureObject(mapping);
				var dens = mapping.defaultElementNamespaceURI||mapping.dens||this.defaultElementNamespaceURI;
				mapping.defaultElementNamespaceURI = dens;
				var en = mapping.elementName||mapping.en||undefined;
				Jsonix.Util.Ensure.ensureExists(en);
				
				var ti = mapping.typeInfo||mapping.ti||'String';
				Jsonix.Util.Ensure.ensureExists(ti);
				
				mapping.typeInfo = ti;
				if (Jsonix.Util.Type.isObject(en)) {
					mapping.elementName = Jsonix.XML.QName.fromObject(en);
				} else if (Jsonix.Util.Type.isString(en)) {
					mapping.elementName = new Jsonix.XML.QName(this.defaultElementNamespaceURI, en);
				} else {
					throw new Error('Element info [' + mapping + '] must provide an element name.');
				}
				
				var sh = mapping.substitutionHead||mapping.sh||null;
				if (Jsonix.Util.Type.exists(sh)) {
					if (Jsonix.Util.Type.isObject(sh)) {
						mapping.substitutionHead = Jsonix.XML.QName.fromObject(sh);
					} else {
						Jsonix.Util.Ensure.ensureString(sh);
						mapping.substitutionHead = new Jsonix.XML.QName(this.defaultElementNamespaceURI, sh);
					}
				}
				
				var elementInfo = new this.mappingStyle.elementInfo(mapping,
				{
					mappingStyle : this.mappingStyle
				});
				return elementInfo;
			},
			registerTypeInfos : function(context) {
				for ( var index = 0; index < this.typeInfos.length; index++) {
					var typeInfo = this.typeInfos[index];
					context.registerTypeInfo(typeInfo, this);
				}
			},
			buildTypeInfos : function(context) {
				for ( var index = 0; index < this.typeInfos.length; index++) {
					var typeInfo = this.typeInfos[index];
					typeInfo.build(context, this);
				}
			},
			registerElementInfos : function(context) {
				for ( var index = 0; index < this.elementInfos.length; index++) {
					var elementInfo = this.elementInfos[index];
					context.registerElementInfo(elementInfo, this);
				}
			},
			buildElementInfos : function(context) {
				for ( var index = 0; index < this.elementInfos.length; index++) {
					var elementInfo = this.elementInfos[index];
					elementInfo.build(context, this);
				}
			},
			// Obsolete, retained for backwards compatibility
			cs : function() {
				return this;
			},
			// Obsolete, retained for backwards compatibility
			es : function() {
				return this;
			},
			CLASS_NAME : 'Jsonix.Model.Module'
		});
Jsonix.Model.Module.prototype.typeInfoCreators = {
	"classInfo" : Jsonix.Model.Module.prototype.createClassInfo,
	"c" : Jsonix.Model.Module.prototype.createClassInfo,
	"enumInfo" : Jsonix.Model.Module.prototype.createEnumLeafInfo,
	"enum" : Jsonix.Model.Module.prototype.createEnumLeafInfo,
	"list" : Jsonix.Model.Module.prototype.createList,
	"l" : Jsonix.Model.Module.prototype.createList
};




© 2015 - 2024 Weber Informatics LLC | Privacy Policy