public static EventPropertyGetterSPI ResolveSimpleXMLPropertyGetter( string propertyExpression, BaseXMLEventType baseXMLEventType, string defaultNamespacePrefix, bool isResolvePropertiesAbsolute) { if (!baseXMLEventType.ConfigurationEventTypeXMLDOM.IsXPathPropertyExpr) { var prop = PropertyParser.ParseAndWalkLaxToSimple(propertyExpression); var getter = prop.GetterDOM; if (!prop.IsDynamic) { getter = new DOMConvertingGetter((DOMPropertyGetter) getter, typeof(string)); } return getter; } try { var property = PropertyParserNoDep.ParseAndWalkLaxToSimple(propertyExpression, false); var isDynamic = PropertyParser.IsPropertyDynamic(property); var xPathExpr = SimpleXMLPropertyParser.Walk( property, baseXMLEventType.RootElementName, defaultNamespacePrefix, isResolvePropertiesAbsolute); if (Log.IsInfoEnabled) { Log.Info( "Compiling XPath expression for property '" + propertyExpression + "' as '" + xPathExpr + "'"); } var xPathExpression = baseXMLEventType.CreateXPath(xPathExpr); var xPathReturnType = isDynamic ? XPathResultType.Any : XPathResultType.String; return new XPathPropertyGetter( baseXMLEventType, propertyExpression, xPathExpr, xPathExpression, xPathReturnType, null, null); } catch (XPathException e) { throw new EPException( "Error constructing XPath expression from property name '" + propertyExpression + '\'', e); } }
private EventPropertyGetterSPI DoResolvePropertyGetter( string propertyExpression, bool allowSimpleProperties) { var getter = propertyGetterCache.Get(propertyExpression); if (getter != null) { return getter; } if (!allowSimpleProperties) { // see if this is an indexed property var index = StringValue.UnescapedIndexOfDot(propertyExpression); if (index == -1) { // parse, can be an indexed property var property = PropertyParser.ParseAndWalkLaxToSimple(propertyExpression); if (!property.IsDynamic) { if (!(property is IndexedProperty)) { return null; } var indexedProp = (IndexedProperty) property; getter = propertyGetters.Get(indexedProp.PropertyNameAtomic); if (null == getter) { return null; } var descriptor = PropertyDescriptorMap.Get(indexedProp.PropertyNameAtomic); if (descriptor == null) { return null; } if (!descriptor.IsIndexed) { return null; } if (descriptor.PropertyType == typeof(XmlNodeList)) { FragmentFactorySPI fragmentFactory = new FragmentFactoryDOMGetter( EventBeanTypedEventFactory, this, indexedProp.PropertyNameAtomic); return new XPathPropertyArrayItemGetter(getter, indexedProp.Index, fragmentFactory); } else if (descriptor.PropertyType == typeof(string)) { FragmentFactorySPI fragmentFactory = new FragmentFactoryDOMGetter( EventBeanTypedEventFactory, this, indexedProp.PropertyNameAtomic); return new XPathPropertyArrayItemGetter(getter, indexedProp.Index, fragmentFactory); } } } } if (!isPropertyExpressionXPath) { var prop = PropertyParser.ParseAndWalkLaxToSimple(propertyExpression); var isDynamic = prop.IsDynamic; if (!isDynamic) { var item = prop.GetPropertyTypeSchema(schemaModelRoot); if (item == null) { return null; } getter = prop.GetGetterDOM(schemaModelRoot, EventBeanTypedEventFactory, this, propertyExpression); if (getter == null) { return null; } var returnType = SchemaUtil.ToReturnType(item); if (returnType != typeof(XmlNode) && returnType != typeof(XmlNodeList)) { if (!returnType.IsArray) { getter = new DOMConvertingGetter((DOMPropertyGetter) getter, returnType); } else { getter = new DOMConvertingArrayGetter( (DOMPropertyGetter) getter, returnType.GetElementType()); } } } else { return prop.GetterDOM; } } else { var allowFragments = !ConfigurationEventTypeXMLDOM.IsXPathPropertyExpr; getter = SchemaXMLPropertyParser.GetXPathResolution( propertyExpression, NamespaceContext, RootElementName, rootElementNamespace, SchemaModel, EventBeanTypedEventFactory, this, allowFragments, ConfigurationEventTypeXMLDOM.DefaultNamespace); } propertyGetterCache.Put(propertyExpression, getter); return getter; }