Exemple #1
0
        protected override FragmentEventType DoResolveFragmentType(String property)
        {
            if ((!ConfigurationEventTypeXMLDOM.IsAutoFragment) || (ConfigurationEventTypeXMLDOM.IsXPathPropertyExpr))
            {
                return(null);
            }

            Property prop = PropertyParser.ParseAndWalkLaxToSimple(property);

            SchemaItem item = prop.GetPropertyTypeSchema(_schemaModelRoot, EventAdapterService);

            if ((item == null) || (!CanFragment(item)))
            {
                return(null);
            }
            var complex = (SchemaElementComplex)item;

            // build name of event type
            String[] atomicProps          = prop.ToPropertyArray();
            String   delimiterDot         = ".";
            var      eventTypeNameBuilder = new StringBuilder(Name);

            foreach (String atomic in atomicProps)
            {
                eventTypeNameBuilder.Append(delimiterDot);
                eventTypeNameBuilder.Append(atomic);
            }
            String eventTypeName = eventTypeNameBuilder.ToString();

            // check if the type exists, use the existing type if found
            EventType existingType = EventAdapterService.GetEventTypeByName(eventTypeName);

            if (existingType != null)
            {
                return(new FragmentEventType(existingType, complex.IsArray, false));
            }

            // add a new type
            var xmlDom = new ConfigurationEventTypeXMLDOM();

            xmlDom.RootElementName                  = "//" + complex.Name; // such the reload of the type can resolve it
            xmlDom.RootElementNamespace             = complex.Namespace;
            xmlDom.IsAutoFragment                   = ConfigurationEventTypeXMLDOM.IsAutoFragment;
            xmlDom.IsEventSenderValidatesRoot       = ConfigurationEventTypeXMLDOM.IsEventSenderValidatesRoot;
            xmlDom.IsXPathPropertyExpr              = ConfigurationEventTypeXMLDOM.IsXPathPropertyExpr;
            xmlDom.IsXPathResolvePropertiesAbsolute = ConfigurationEventTypeXMLDOM.IsXPathResolvePropertiesAbsolute;
            xmlDom.SchemaResource                   = ConfigurationEventTypeXMLDOM.SchemaResource;
            xmlDom.SchemaText            = ConfigurationEventTypeXMLDOM.SchemaText;
            xmlDom.XPathFunctionResolver = ConfigurationEventTypeXMLDOM.XPathFunctionResolver;
            xmlDom.XPathVariableResolver = ConfigurationEventTypeXMLDOM.XPathVariableResolver;
            xmlDom.DefaultNamespace      = ConfigurationEventTypeXMLDOM.DefaultNamespace;
            xmlDom.AddNamespacePrefixes(ConfigurationEventTypeXMLDOM.NamespacePrefixes);

            EventType newType;

            try
            {
                newType = EventAdapterService.AddXMLDOMType(eventTypeName, xmlDom, _schemaModel, true);
            }
            catch (Exception ex)
            {
                Log.Error(
                    "Failed to add dynamic event type for fragment of XML schema for property '" + property + "' :" +
                    ex.Message, ex);
                return(null);
            }
            return(new FragmentEventType(newType, complex.IsArray, false));
        }