diff --git a/src/Spring/Spring.Core/Objects/Factory/Xml/AbstractObjectDefinitionParser.cs b/src/Spring/Spring.Core/Objects/Factory/Xml/AbstractObjectDefinitionParser.cs index 909d3aa2..09cfd758 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Xml/AbstractObjectDefinitionParser.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Xml/AbstractObjectDefinitionParser.cs @@ -105,7 +105,7 @@ namespace Spring.Objects.Factory.Xml /// and was called to process the root node. ///

/// - public IObjectDefinition ParseElement(XmlElement element, ParserContext parserContext) + public virtual IObjectDefinition ParseElement(XmlElement element, ParserContext parserContext) { AbstractObjectDefinition definition = ParseInternal(element, parserContext); diff --git a/src/Spring/Spring.Core/Objects/Factory/Xml/DefaultObjectDefinitionDocumentReader.cs b/src/Spring/Spring.Core/Objects/Factory/Xml/DefaultObjectDefinitionDocumentReader.cs index d6c2d972..db1f0ef5 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Xml/DefaultObjectDefinitionDocumentReader.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Xml/DefaultObjectDefinitionDocumentReader.cs @@ -153,27 +153,101 @@ namespace Spring.Objects.Factory.Xml /// in case an error happens during parsing and registering object definitions /// protected virtual void ParseObjectDefinitions(XmlElement root, ObjectDefinitionParserHelper helper) - { - foreach (XmlNode node in root.ChildNodes) + { + if (helper.IsDefaultNamespace(root.NamespaceURI)) + { + foreach (XmlNode node in root.ChildNodes) + { + if (node.NodeType != XmlNodeType.Element) continue; + + try + { + XmlElement element = (XmlElement)node; + if (helper.IsDefaultNamespace(element.NamespaceURI)) + { + ParseDefaultElement(element, helper); + } + else + { + helper.ParseCustomElement(element); + } + } + catch (ObjectDefinitionStoreException) + { + throw; + } + catch (Exception ex) + { + helper.ReaderContext.ReportException(node, null, "Failed parsing element", ex); + } + } + } + else + { + helper.ParseCustomElement(root); + } + } + + private void ParseDefaultElement(XmlElement element, ObjectDefinitionParserHelper helper) + { + if (element.LocalName == ObjectDefinitionConstants.ImportElement) + { + ImportObjectDefinitionResource(element); + } + else if (element.LocalName == ObjectDefinitionConstants.AliasElement) + { + ParseAlias(element, helper.ReaderContext.Registry); + } + else if (element.LocalName == ObjectDefinitionConstants.ObjectElement) + { + ProcessObjectDefinition(element, helper); + } + } + + /// + /// Process an alias element. + /// + protected virtual void ProcessAlias(XmlElement element) + { + this.ParseAlias(element, this.ReaderContext.Registry); + } + + /// + /// Process the object element + /// + protected virtual void ProcessObjectDefinition(XmlElement element, ObjectDefinitionParserHelper helper) + { + // TODO: add event handling + try + { + ObjectDefinitionHolder bdHolder = helper.ParseObjectDefinitionElement(element); + if (bdHolder == null) + { + return; + } + bdHolder = helper.DecorateObjectDefinitionIfRequired(element, bdHolder); + + #region Instrumentation + + if (log.IsDebugEnabled) + { + log.Debug(string.Format(CultureInfo.InvariantCulture, "Registering object definition with id '{0}'.", bdHolder.ObjectName)); + } + + #endregion + + ObjectDefinitionReaderUtils.RegisterObjectDefinition(bdHolder, ReaderContext.Registry); + // TODO: Send registration event. + // ReaderContext.FireComponentRegistered(new BeanComponentDefinition(bdHolder)); + } + catch (ObjectDefinitionStoreException) + { + throw; + } + catch (Exception ex) { - if (node.NodeType == XmlNodeType.Element) - { - XmlElement element = (XmlElement) node; - try - { - INamespaceParser parser = GetNamespaceParser(element, helper); - ParserContext parserContext = new ParserContext(helper.ReaderContext, helper); - parser.ParseElement(element, parserContext); - } - catch( ObjectDefinitionStoreException ) - { - throw; - } - catch (Exception ex) - { - helper.ReaderContext.ReportException(node, null, "Failed parsing element", ex); - } - } + throw new ObjectDefinitionStoreException( + string.Format("Failed parsing object definition '{0}'", element.OuterXml), ex); } } @@ -233,37 +307,7 @@ namespace Spring.Objects.Factory.Xml /// protected virtual void RegisterObjectDefinition(XmlElement element, ObjectDefinitionParserHelper helper) { - ObjectDefinitionHolder holder = null; - try - { - INamespaceParser parser = GetNamespaceParser(element, helper); - - //holder = ParseObjectDefinition(element, parserContext); - //holder = helper.ParseObjectDefinitionElement(element); - if (holder == null) - { - return; - } - } - catch (Exception ex) - { - throw new ObjectDefinitionStoreException( - string.Format("Failed parsing object definition '{0}'", element.OuterXml), ex); - } - - #region Instrumentation - - if (log.IsDebugEnabled) - { - log.Debug( - string.Format( - CultureInfo.InvariantCulture, - "Registering object definition with id '{0}'.", holder.ObjectName)); - } - - #endregion - - ObjectDefinitionReaderUtils.RegisterObjectDefinition(holder, ReaderContext.Registry); + ProcessObjectDefinition(element, helper); } /// @@ -313,20 +357,20 @@ namespace Spring.Objects.Factory.Xml return helper; } - private INamespaceParser GetNamespaceParser(XmlElement element, ObjectDefinitionParserHelper helper) - { - INamespaceParser parser = NamespaceParserRegistry.GetParser(element.NamespaceURI); - if (parser == null) - { - helper.ReaderContext.ReportException(element, null, GetNoParserForNamespaceMessage(element.NamespaceURI)); - } - return parser; - } - - private string GetNoParserForNamespaceMessage(string namespaceURI) - { - return "There is no parser registered for namespace '" + namespaceURI + "'"; - } +// private INamespaceParser GetNamespaceParser(XmlElement element, ObjectDefinitionParserHelper helper) +// { +// INamespaceParser parser = NamespaceParserRegistry.GetParser(element.NamespaceURI); +// if (parser == null) +// { +// helper.ReaderContext.ReportException(element, null, GetNoParserForNamespaceMessage(element.NamespaceURI)); +// } +// return parser; +// } +// +// private string GetNoParserForNamespaceMessage(string namespaceURI) +// { +// return "There is no parser registered for namespace '" + namespaceURI + "'"; +// } #endregion } diff --git a/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectDefinitionParserHelper.cs b/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectDefinitionParserHelper.cs index cf61115b..ff8a9f18 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectDefinitionParserHelper.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectDefinitionParserHelper.cs @@ -19,6 +19,7 @@ #endregion using System; +using System.Collections; using System.Globalization; using System.Xml; using Common.Logging; @@ -170,8 +171,156 @@ namespace Spring.Objects.Factory.Xml //TODO decoration processing. return holder; - } - + } + + /// + /// Parse a standard object definition into a + /// , + /// including object name and aliases. + /// + /// The element containing the object definition. + /// + /// The parsed object definition wrapped within an + /// + /// instance. + /// + /// + /// + /// Object elements specify their canonical name via the "id" attribute + /// and their aliases as a delimited "name" attribute. + /// + /// + /// If no "id" is specified, uses the first name in the "name" attribute + /// as the canonical name, registering all others as aliases. + /// + /// + public ObjectDefinitionHolder ParseObjectDefinitionElement(XmlElement element) + { + return ParseObjectDefinitionElement(element, null); + } + + /// + /// Parse a standard object definition into a + /// , + /// including object name and aliases. + /// + /// The element containing the object definition. + /// The containing object definition if is a nested element. + /// + /// The parsed object definition wrapped within an + /// + /// instance. + /// + /// + /// + /// Object elements specify their canonical name via the "id" attribute + /// and their aliases as a delimited "name" attribute. + /// + /// + /// If no "id" is specified, uses the first name in the "name" attribute + /// as the canonical name, registering all others as aliases. + /// + /// + public ObjectDefinitionHolder ParseObjectDefinitionElement(XmlElement element, IObjectDefinition containingDefinition) + { + // TODO: move code from ObjectsNamespaceParser into this class to eliminate ONP + ObjectsNamespaceParser parser = (ObjectsNamespaceParser) NamespaceParserRegistry.GetParser(ObjectsNamespaceParser.Namespace); + + string id = GetAttributeValue(element, ObjectDefinitionConstants.IdAttribute); + string nameAttr = GetAttributeValue(element, ObjectDefinitionConstants.NameAttribute); + ArrayList aliases = new ArrayList(); + if (StringUtils.HasText(nameAttr)) + { + aliases.AddRange(GetObjectNames(nameAttr)); + } + + // if we ain't got an id, check if object is page definition or assign any existing (first) alias... + string objectName = id; + if (StringUtils.IsNullOrEmpty(objectName)) + { + // TODO (EE): pass parserContext to CalculateId as well (resolving relative Urls in WebApps is parserContext-dependent) (EE) + objectName = parser.CalculateId(element, aliases); + } + + + ParserContext parserContext = new ParserContext(this, containingDefinition); + IConfigurableObjectDefinition definition = parser.ParseObjectDefinitionElement(element, objectName, parserContext); + if (definition != null) + { + if (StringUtils.IsNullOrEmpty(objectName)) + { + if (containingDefinition != null) + { + objectName = + ObjectDefinitionReaderUtils.GenerateObjectName(definition, parserContext.Registry, true); + } + else + { + objectName = ObjectDefinitionReaderUtils.GenerateObjectName(definition, parserContext.Registry); + } + + #region Instrumentation + + if (log.IsDebugEnabled) + { + log.Debug(string.Format( + "Neither XML '{0}' nor '{1}' specified - using object " + + "class name [{2}] as the id.", + id, ObjectDefinitionConstants.IdAttribute, ObjectDefinitionConstants.NameAttribute)); + } + + #endregion + } + string[] aliasesArray = (string[])aliases.ToArray(typeof(string)); + return new ObjectDefinitionHolder(definition, objectName, aliasesArray); + } + return null; + } + + /// + /// Parses an element in a custom namespace. + /// + /// + /// the parsed object definition or null if not supported by the corresponding parser. + public IObjectDefinition ParseCustomElement(XmlElement ele) + { + return ParseCustomElement(ele, null); + } + + /// + /// Parses an element in a custom namespace. + /// + /// + /// if a nested element, the containing object definition + /// the parsed object definition or null if not supported by the corresponding parser. + public IObjectDefinition ParseCustomElement(XmlElement ele, IObjectDefinition containingDefinition) + { + String namespaceUri = ele.NamespaceURI; + INamespaceParser handler = NamespaceParserRegistry.GetParser(namespaceUri); + if (handler == null) + { + Error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele); + return null; + } + return handler.ParseElement(ele, new ParserContext(this, containingDefinition)); + } + + /// + /// Given a string containing delimited object names, returns + /// a string array split on the object name delimeter. + /// + /// + /// The string containing delimited object names. + /// + /// + /// A string array split on the object name delimeter. + /// + /// + private string[] GetObjectNames(string value) + { + return StringUtils.Split( + value, ObjectDefinitionConstants.ObjectNameDelimiters, true, true); + } /// /// Determines whether the string represents a 'true' boolean value. @@ -237,5 +386,13 @@ namespace Spring.Objects.Factory.Xml } return defaultValue; } + + /// + /// Report a parser error. + /// + protected virtual void Error(string message, XmlElement element) + { + this.ReaderContext.ReportFatalException(element, message); + } } } diff --git a/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectsNamespaceParser.cs b/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectsNamespaceParser.cs index ba046ed3..3759d2ee 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectsNamespaceParser.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectsNamespaceParser.cs @@ -61,11 +61,12 @@ namespace Spring.Objects.Factory.Xml [ NamespaceParser( Namespace = "http://www.springframework.net", - SchemaLocationAssemblyHint = typeof(ObjectsNamespaceParser), - SchemaLocation = "/Spring.Objects.Factory.Xml/spring-objects-1.1.xsd" - ) + SchemaLocationAssemblyHint = typeof(ObjectsNamespaceParser), + SchemaLocation = "/Spring.Objects.Factory.Xml/spring-objects-1.1.xsd" + ) ] - public class ObjectsNamespaceParser : INamespaceParser +// [Obsolete("ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] + public class ObjectsNamespaceParser : AbstractObjectDefinitionParser, INamespaceParser { /// /// The namespace URI for the standard Spring.NET object definition schema. @@ -87,11 +88,32 @@ namespace Spring.Objects.Factory.Xml /// This is a NoOp public void Init() { - + } #endregion + /// + /// Parse the specified XmlElement and register the resulting + /// ObjectDefinitions with the IObjectDefinitionRegistry + /// embedded in the supplied + /// + /// The element to be parsed. + /// TThe object encapsulating the current state of the parsing process. + /// Provides access to a IObjectDefinitionRegistry + /// The primary object definition. + /// + ///

+ /// This method is never invoked if the parser is namespace aware + /// and was called to process the root node. + ///

+ ///
+ [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] + public override IObjectDefinition ParseElement(XmlElement element, ParserContext parserContext) + { + // TODO (EE): overridden just to stay binary compatible between 1.2.0 and 1.2.1 + return base.ParseElement(element, parserContext); + } /// /// Parse the specified element and register any resulting @@ -112,9 +134,8 @@ namespace Spring.Objects.Factory.Xml /// be used in a nested scenario. /// /// - public virtual IObjectDefinition ParseElement(XmlElement element, ParserContext parserContext) + protected override AbstractObjectDefinition ParseInternal(XmlElement element, ParserContext parserContext) { - if (element.LocalName == ObjectDefinitionConstants.ImportElement) { ImportObjectDefinitionResource(element, parserContext); @@ -125,9 +146,14 @@ namespace Spring.Objects.Factory.Xml } else if (element.LocalName == ObjectDefinitionConstants.ObjectElement) { - RegisterObjectDefinition(element, parserContext); + // atm this will call back into this ns parsers + ObjectDefinitionHolder odh = parserContext.ParserHelper.ParseObjectDefinitionElement(element); + if (odh != null) + { + return odh.ObjectDefinition as AbstractObjectDefinition; + } } - + return null; } @@ -152,6 +178,7 @@ namespace Spring.Objects.Factory.Xml /// or simply the original object definition if no decoration is required. A null value is strickly /// speaking invalid, but will leniently treated like the case where the original object definition /// gets returned. + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] public ObjectDefinitionHolder Decorate(XmlNode node, ObjectDefinitionHolder definition, ParserContext parserContext) { @@ -161,7 +188,7 @@ namespace Spring.Objects.Factory.Xml private void ParseAlias(XmlElement aliasElement, IObjectDefinitionRegistry registry) { string name = GetAttributeValue(aliasElement, ObjectDefinitionConstants.NameAttribute); - string alias = GetAttributeValue(aliasElement, ObjectDefinitionConstants.AliasAttribute); + string alias = GetAttributeValue(aliasElement, ObjectDefinitionConstants.AliasAttribute); registry.RegisterAlias(name, alias); } @@ -174,6 +201,7 @@ namespace Spring.Objects.Factory.Xml /// /// If the resource could not be imported. /// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] protected virtual void ImportObjectDefinitionResource(XmlElement resource, ParserContext parserContext) { string location = GetAttributeValue(resource, ObjectDefinitionConstants.ImportResourceAttribute); @@ -201,7 +229,7 @@ namespace Spring.Objects.Factory.Xml location), ex); } } - + /// Parses an event listener definition. /// @@ -249,22 +277,21 @@ namespace Spring.Objects.Factory.Xml case ObjectDefinitionConstants.TypeAttribute: // we're wiring up to a static event exposed on a Type (class) myHandler.Source = parserContext.ReaderContext.Reader.Domain == null ? - (object) sourceAtt.Value : + (object)sourceAtt.Value : (object)TypeResolutionUtils.ResolveType(sourceAtt.Value); break; } events.AddHandler(myHandler); } - - /// /// Parse an object definition and register it with the object factory.. /// /// The element containing the object definition. /// The parser context. /// - protected void RegisterObjectDefinition(XmlElement element, ParserContext parserContext) + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] + protected ObjectDefinitionHolder ParseObjectDefinition(XmlElement element, ParserContext parserContext) { ObjectDefinitionHolder holder = null; try @@ -272,16 +299,16 @@ namespace Spring.Objects.Factory.Xml holder = ParseObjectDefinitionElement(element, parserContext, false); if (holder == null) { - return; + return null; } } - catch(ObjectDefinitionStoreException) + catch (ObjectDefinitionStoreException) { throw; } catch (Exception ex) { - //throw new ObjectDefinitionStoreException(string.Format("Failed parsing object definition '{0}'", element.OuterXml), ex); + //throw new ObjectDefinitionStoreException(string.Format("Failed parsing object definition '{0}'", element.OuterXml), ex); parserContext.ReaderContext.ReportException(element, null, null, ex); } @@ -300,7 +327,33 @@ namespace Spring.Objects.Factory.Xml #endregion + return holder; + } + + /// + /// Parse an object definition and register it with the object factory.. + /// + /// The element containing the object definition. + /// The parser context. + /// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] + protected ObjectDefinitionHolder ParseAndRegisterObjectDefinition(XmlElement element, ParserContext parserContext) + { + ObjectDefinitionHolder holder = ParseObjectDefinition(element, parserContext); ObjectDefinitionReaderUtils.RegisterObjectDefinition(holder, parserContext.ReaderContext.Registry); + return holder; + } + + /// + /// Parse an object definition and register it with the object factory.. + /// + /// The element containing the object definition. + /// The parser context. + /// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] + protected void RegisterObjectDefinition(XmlElement element, ParserContext parserContext) + { + ParseAndRegisterObjectDefinition(element, parserContext); } @@ -328,6 +381,7 @@ namespace Spring.Objects.Factory.Xml /// as the canonical name, registering all others as aliases. ///

/// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] protected ObjectDefinitionHolder ParseObjectDefinitionElement(XmlElement element, ParserContext parserContext, bool nestedDefinition) { string id = GetAttributeValue(element, ObjectDefinitionConstants.IdAttribute); @@ -345,7 +399,7 @@ namespace Spring.Objects.Factory.Xml // TODO (EE): pass parserContext to CalculateId as well (resolving relative Urls in WebApps is parserContext-dependent) (EE) objectName = CalculateId(element, aliases); } - + IConfigurableObjectDefinition definition = ParseObjectDefinitionElement(element, objectName, parserContext); if (definition != null) @@ -374,7 +428,7 @@ namespace Spring.Objects.Factory.Xml #endregion } - string[] aliasesArray = (string[]) aliases.ToArray(typeof (string)); + string[] aliasesArray = (string[])aliases.ToArray(typeof(string)); return new ObjectDefinitionHolder(definition, objectName, aliasesArray); } return null; @@ -399,7 +453,7 @@ namespace Spring.Objects.Factory.Xml /// /// A calculated object definition id. /// - protected virtual string CalculateId(XmlElement element, ArrayList aliases) + protected internal virtual string CalculateId(XmlElement element, ArrayList aliases) { string id = null; if (aliases.Count > 0) @@ -434,7 +488,8 @@ namespace Spring.Objects.Factory.Xml /// The id of the object definition. /// parsing state holder /// The object (definition). - protected virtual IConfigurableObjectDefinition ParseObjectDefinitionElement( +// [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] + protected internal virtual IConfigurableObjectDefinition ParseObjectDefinitionElement( XmlElement element, string id, ParserContext parserContext) { string typeName = null; @@ -466,7 +521,7 @@ namespace Spring.Objects.Factory.Xml EventValues events = ParseEventHandlerSubElements(id, element, parserContext); MethodOverrides methodOverrides = ParseMethodOverrideSubElements(id, element, parserContext); - bool isPage = StringUtils.HasText(typeName) && typeName!= null && typeName.ToLower().EndsWith(".aspx"); + bool isPage = StringUtils.HasText(typeName) && typeName != null && typeName.ToLower().EndsWith(".aspx"); if (!isPage) { od.ConstructorArgumentValues = arguments; @@ -620,7 +675,7 @@ namespace Spring.Objects.Factory.Xml ReplacedMethodOverride theOverride = new ReplacedMethodOverride(methodName, targetReplacerObjectName); foreach (XmlNode node in this.SelectNodes(element, ObjectDefinitionConstants.ReplacedMethodArgumentTypeElement)) { - XmlElement argElement = (XmlElement) node; + XmlElement argElement = (XmlElement)node; string match = GetAttributeValue(argElement, ObjectDefinitionConstants.ReplacedMethodArgumentTypeMatchAttribute); if (StringUtils.IsNullOrEmpty(match)) { @@ -683,7 +738,7 @@ namespace Spring.Objects.Factory.Xml MutablePropertyValues properties = new MutablePropertyValues(); foreach (XmlNode node in this.SelectNodes(element, ObjectDefinitionConstants.PropertyElement)) { - ParsePropertyElement(name, properties, (XmlElement) node, parserContext); + ParsePropertyElement(name, properties, (XmlElement)node, parserContext); } return properties; } @@ -834,7 +889,7 @@ namespace Spring.Objects.Factory.Xml { return new ExpressionHolder(inlineExpressionAtt.Value); } - + // should only have one element child: value, ref, collection... XmlNodeList nodes = element.ChildNodes; XmlElement valueRefOrCollectionElement = null; @@ -879,58 +934,68 @@ namespace Spring.Objects.Factory.Xml protected virtual object ParsePropertySubElement( XmlElement element, string name, ParserContext parserContext) { - if (element.Name.Equals(ObjectDefinitionConstants.ObjectElement)) + if (element.NamespaceURI == Namespace) { - return ParseObjectDefinitionElement(element, parserContext, true); - } - else if (element.Name.Equals(ObjectDefinitionConstants.RefElement)) - { - return ParseReference(element, parserContext.ParserHelper, name); - } - else if (element.Name.Equals(ObjectDefinitionConstants.IdRefElement)) - { - return ParseIdReference(element, parserContext.ParserHelper, name); - } - else if (element.Name.Equals(ObjectDefinitionConstants.ListElement)) - { - return ParseListElement(element, name, parserContext); - } - else if (element.Name.Equals(ObjectDefinitionConstants.SetElement)) - { - return ParseSetElement(element, name, parserContext); - } - else if (element.Name.Equals(ObjectDefinitionConstants.DictionaryElement)) - { - return ParseDictionaryElement(element, name, parserContext); - } - else if (element.Name.Equals(ObjectDefinitionConstants.NameValuesElement)) - { - return ParseNameValueCollectionElement(element, name); - } - else if (element.Name.Equals(ObjectDefinitionConstants.ValueElement)) - { - return ParseValueElement(element, name); - } - else if (element.Name.Equals(ObjectDefinitionConstants.ExpressionElement)) - { - return ParseExpressionElement(element, name, parserContext); - } - else if (element.Name.Equals(ObjectDefinitionConstants.NullElement)) - { - // it's a distinguished null value... - return null; - } - else - { - // it may match another Parser - INamespaceParser otherParser = GetParser(element.NamespaceURI); - if (otherParser != null) + switch(element.LocalName) { - // The other parser uses nestings tags and thus returns the definition - // of the parsed object. - return otherParser.ParseElement(element, new ParserContext(parserContext.ReaderContext, parserContext.ParserHelper)); + case ObjectDefinitionConstants.ObjectElement: + { + return ParseObjectDefinitionElement(element, parserContext, true); + } + case ObjectDefinitionConstants.RefElement: + { + return ParseReference(element, parserContext.ParserHelper, name); + } + case ObjectDefinitionConstants.IdRefElement: + { + return ParseIdReference(element, parserContext.ParserHelper, name); + } + case ObjectDefinitionConstants.ListElement: + { + return ParseListElement(element, name, parserContext); + } + case ObjectDefinitionConstants.SetElement: + { + return ParseSetElement(element, name, parserContext); + } + case ObjectDefinitionConstants.DictionaryElement: + { + return ParseDictionaryElement(element, name, parserContext); + } + case ObjectDefinitionConstants.NameValuesElement: + { + return ParseNameValueCollectionElement(element, name); + } + case ObjectDefinitionConstants.ValueElement: + { + return ParseValueElement(element, name); + } + case ObjectDefinitionConstants.ExpressionElement: + { + return ParseExpressionElement(element, name, parserContext); + } + case ObjectDefinitionConstants.NullElement: + { + // it's a distinguished null value... + return null; + } + default: + throw new ObjectDefinitionStoreException( + parserContext.ReaderContext.Resource, + name, + "Unknown subelement of : <" + element.Name + ">"); } } + + // it may match another Parser + INamespaceParser otherParser = GetParser(element.NamespaceURI); + if (otherParser != null) + { + // The other parser uses nestings tags and thus returns the definition + // of the parsed object. + return otherParser.ParseElement(element, new ParserContext(parserContext.ParserHelper)); + } + throw new ObjectDefinitionStoreException( parserContext.ReaderContext.Resource, name, @@ -950,7 +1015,7 @@ namespace Spring.Objects.Factory.Xml return null; } } - + private static object ParseIdReference(XmlElement element, ObjectDefinitionParserHelper parserHelper, string name) { // a generic reference to any name of any object @@ -1046,7 +1111,7 @@ namespace Spring.Objects.Factory.Xml { list.ElementTypeName = elementTypeName; } - + foreach (XmlNode node in element.ChildNodes) { XmlElement ele = node as XmlElement; @@ -1153,7 +1218,7 @@ namespace Spring.Objects.Factory.Xml ObjectDefinitionConstants.DictionaryKeyRefShortcutAttribute, ObjectDefinitionConstants.EntryElement)); } - XmlElement keyElement = (XmlElement) keyNode; + XmlElement keyElement = (XmlElement)keyNode; XmlNodeList keyNodes = keyElement.GetElementsByTagName("*"); if (keyNodes == null || keyNodes.Count == 0) { @@ -1236,6 +1301,7 @@ namespace Spring.Objects.Factory.Xml /// with the supplied /// . /// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] protected XmlNodeList SelectNodes(XmlElement element, string childElementName) { XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable()); @@ -1263,6 +1329,7 @@ namespace Spring.Objects.Factory.Xml /// with the supplied /// . /// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] protected XmlNode SelectSingleNode(XmlElement element, string childElementName) { XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable()); @@ -1301,7 +1368,7 @@ namespace Spring.Objects.Factory.Xml } else { - nvc.Add(key,value); + nvc.Add(key, value); } } return nvc; @@ -1351,7 +1418,7 @@ namespace Spring.Objects.Factory.Xml { try { - code = (DependencyCheckingMode) Enum.Parse( + code = (DependencyCheckingMode)Enum.Parse( typeof(DependencyCheckingMode), value, true); } catch (ArgumentException ex) @@ -1393,7 +1460,7 @@ namespace Spring.Objects.Factory.Xml { try { - mode = (AutoWiringMode) Enum.Parse( + mode = (AutoWiringMode)Enum.Parse( typeof(AutoWiringMode), value, true); } catch (ArgumentException ex) @@ -1440,37 +1507,37 @@ namespace Spring.Objects.Factory.Xml return StringUtils.HasText(element.Prefix) ? element.Prefix : "spring"; } - /// - /// Returns the value of the element's attribute or null, if the attribute is not specified. - /// - /// - /// This is a helper for bypassing the behavior of - /// to return if the attribute does not exist. - /// - protected static string GetAttributeValue(XmlElement element, string attributeName) - { - if (element.HasAttribute(attributeName)) - { - return element.GetAttribute(attributeName); - } - return null; - } - - /// - /// Returns the value of the element's attribute or , - /// if the attribute is not specified. - /// - /// - /// This is a helper for bypassing the behavior of - /// to return if the attribute does not exist. - /// - protected static string GetAttributeValue(XmlElement element, string attributeName, string defaultValue) - { - if (element.HasAttribute(attributeName)) - { - return element.GetAttribute(attributeName); - } - return defaultValue; - } +// /// +// /// Returns the value of the element's attribute or null, if the attribute is not specified. +// /// +// /// +// /// This is a helper for bypassing the behavior of +// /// to return if the attribute does not exist. +// /// +// protected static string GetAttributeValue(XmlElement element, string attributeName) +// { +// if (element.HasAttribute(attributeName)) +// { +// return element.GetAttribute(attributeName); +// } +// return null; +// } +// +// /// +// /// Returns the value of the element's attribute or , +// /// if the attribute is not specified. +// /// +// /// +// /// This is a helper for bypassing the behavior of +// /// to return if the attribute does not exist. +// /// +// protected static string GetAttributeValue(XmlElement element, string attributeName, string defaultValue) +// { +// if (element.HasAttribute(attributeName)) +// { +// return element.GetAttribute(attributeName); +// } +// return defaultValue; +// } } } diff --git a/src/Spring/Spring.Core/Objects/Factory/Xml/ParserContext.cs b/src/Spring/Spring.Core/Objects/Factory/Xml/ParserContext.cs index 99f1c890..338995c3 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Xml/ParserContext.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Xml/ParserContext.cs @@ -18,6 +18,7 @@ #endregion +using System; using System.Collections; using Spring.Objects.Factory.Config; using Spring.Objects.Factory.Support; @@ -30,20 +31,43 @@ namespace Spring.Objects.Factory.Xml ///
public class ParserContext { - private XmlReaderContext readerContext; + private readonly XmlReaderContext readerContext; - private ObjectDefinitionParserHelper parserHelper; + private readonly ObjectDefinitionParserHelper parserHelper; - private IObjectDefinition containingObjectDefinition; - - private Stack containingComponents = new Stack(); + private readonly IObjectDefinition containingObjectDefinition; +// private Stack containingComponents = new Stack(); /// /// Initializes a new instance of the class. /// - /// The reader context. /// The parser helper. + public ParserContext(ObjectDefinitionParserHelper parserHelper) + { + this.readerContext = parserHelper.ReaderContext; + this.parserHelper = parserHelper; + } + + + /// + /// Initializes a new instance of the class. + /// + /// The parser helper. + /// The containing object definition. + public ParserContext(ObjectDefinitionParserHelper parserHelper, IObjectDefinition containingObjectDefinition) + { + this.readerContext = parserHelper.ReaderContext; + this.parserHelper = parserHelper; + this.containingObjectDefinition = containingObjectDefinition; + } + + /// + /// Initializes a new instance of the class. + /// + /// The reader context. + /// The parser helper. + [Obsolete("consider using ParserContext(ObjectDefinitionParserHelper) instead", false)] public ParserContext(XmlReaderContext readerContext, ObjectDefinitionParserHelper parserHelper) { this.readerContext = readerContext; @@ -56,7 +80,8 @@ namespace Spring.Objects.Factory.Xml ///
/// The reader context. /// The parser helper. - /// The containing object definition. + /// The containing object definition. + [Obsolete("consider using ParserContext(ObjectDefinitionParserHelper, IObjectDefinition) instead", false)] public ParserContext(XmlReaderContext readerContext, ObjectDefinitionParserHelper parserHelper, IObjectDefinition containingObjectDefinition) { this.readerContext = readerContext; diff --git a/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs b/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs index 7fcd0cc8..b818b38a 100644 --- a/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs +++ b/src/Spring/Spring.Core/Validation/Config/ValidationNamespaceParser.cs @@ -98,6 +98,7 @@ namespace Spring.Validation.Config /// be used in a nested scenario. /// /// + [Obsolete("not used anymore - ObjectsNamespaceParser will be dropped with 2.x, use ObjectDefinitionParserHelper instead", false)] public override IObjectDefinition ParseElement(XmlElement element, ParserContext parserContext) { if (!element.HasAttribute("id")) diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectDefinitionReaderTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectDefinitionReaderTests.cs index adc9f4e6..198bf255 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectDefinitionReaderTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectDefinitionReaderTests.cs @@ -246,5 +246,34 @@ namespace Spring.Objects.Factory.Xml ")); } + + [Test] + public void ParsesNonDefaultNamespace() + { + try + { + NamespaceParserRegistry.Reset(); + + DefaultListableObjectFactory of = new DefaultListableObjectFactory(); + XmlObjectDefinitionReader reader = new XmlObjectDefinitionReader(of); + reader.LoadObjectDefinitions(new StringResource( +@" + + + + + + + +")); + TestObject test2 = (TestObject) of.GetObject("test2"); + Assert.AreEqual(typeof(TestObject), test2.GetType()); + Assert.IsNotNull(test2.Sibling); + } + finally + { + NamespaceParserRegistry.Reset(); + } + } } } \ No newline at end of file