Example #1
0
        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);
            }
        }
Example #2
0
        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;
        }