private void DoPropertyBind(PropertyTreeBinderImpl parent,
                                        PropertyTreeMetaObject target,
                                        PropertyTreeNavigator navigator,
                                        PropertyDefinition property)
            {
                object ancestor = null;
                PropertyTreeMetaObject ancestorMeta = null;

                if (property.IsExtender) {
                    var ancestorType = property.DeclaringTreeDefinition.SourceClrType;
                    ancestorMeta = target.GetAncestors().Cast<PropertyTreeMetaObject>().FirstOrDefault(
                        t => ancestorType.IsAssignableFrom(t.ComponentType));

                    if (ancestorMeta != null)
                        ancestor = ancestorMeta.Component;
                }

                var component = target.Component;
                PropertyTreeMetaObject propertyTarget = target.CreateChild(property, navigator.QualifiedName, ancestorMeta);

                var services = new PropertyBindContext(
                    component,
                    property,
                    ServiceProvider.Compose(ServiceProvider.FromValue(navigator), parent))
                {
                    LineNumber = navigator.LineNumber,
                    LinePosition = navigator.LinePosition,
                };

                propertyTarget = parent.Bind(propertyTarget, navigator, services);
                target.BindSetMember(property, navigator.QualifiedName, propertyTarget, ancestorMeta, services);
            }
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent,
                                                           PropertyTreeMetaObject target,
                                                           PropertyTreeNavigator self,
                                                           NodeList children)
            {
                Type type = target.ComponentType ?? typeof(object);

                // Select providers
                if (type.IsProviderType())
                {
                    var node = children.FindAndRemove(ImplicitDirective(target, "provider")).FirstOrDefault();

                    if (node != null)
                    {
                        var serviceProvider = parent.GetBasicServices(node);
                        var pro             = parent.DirectiveFactory.CreateTargetProvider(type, node);
                        if (pro != null)
                        {
                            target = target.BindTargetProvider(pro, serviceProvider);
                            return(target);
                        }
                    }
                }

                return(target);
            }
        public TargetSourceDirective CreateTargetSource(PropertyTreeNavigator nav, IUriContext uriContext)
        {
            if (nav.IsProperty)
            {
                Exception error;
                try {
                    Uri uri = Utility.NewUri(nav.Value.ToString());
                    uri = Utility.CombineUri(uriContext, uri);

                    return(new TargetSourceDirective(uri));
                } catch (ArgumentException e) {
                    error = e;
                } catch (UriFormatException e) {
                    error = e;
                }

                Errors.BadSourceDirective(error, nav.FileLocation);
                return(null);
            }

            else
            {
                return(nav.Bind <TargetSourceDirective>());
            }
        }
            public override PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                foreach (var child in children.Rest()) {

                    string msg;
                    if (target.ComponentType.IsHiddenUX()) {
                        msg = SR.BinderMissingPropertyNoType(child.QualifiedName);
                    } else {
                        msg = SR.BinderMissingProperty(child.QualifiedName, target.ComponentType);
                    }

                    try {
                        var info = new InterfaceUsageInfo(InterfaceUsage.Missing, msg, null, true);
                        Parent.Callback.OnPropertyAnnotation(child.QualifiedName.ToString(), info);

                    } catch (Exception ex) {
                        if (ex.IsCriticalException())
                            throw;

                        throw PropertyTreesFailure.UnmatchedMembersGenericError(ex, child.FileLocation);
                    }
                }

                return target;
            }
        protected PropertyTreeNavigatorWrapper(PropertyTreeNavigator navigator)
        {
            if (navigator == null)
                throw new ArgumentNullException("navigator");

            this.navigator = navigator;
        }
        public TargetTypeDirective CreateTargetType(PropertyTreeNavigator nav)
        {
            if (nav.IsProperty)
            {
                Exception error;

                try {
                    var tr = TypeReference.Parse(Convert.ToString(nav.Value), parent.GetBasicServices(nav));
                    return(new TargetTypeDirective(tr, null));
                } catch (Exception ex) {
                    if (Failure.IsCriticalException(ex))
                    {
                        throw;
                    }

                    error = ex;
                    Errors.BadTargetTypeDirective(error, nav.FileLocation);
                    return(null);
                }
            }
            else
            {
                try {
                    return(nav.Bind <TargetTypeDirective>());
                } catch (Exception ex) {
                    if (Failure.IsCriticalException(ex))
                    {
                        throw;
                    }

                    Errors.BadTargetTypeDirective(ex, nav.FileLocation);
                    return(null);
                }
            }
        }
            public override PropertyTreeMetaObject StartStep(
                PropertyTreeMetaObject target,
                PropertyTreeNavigator self,
                NodeList children)
            {
                if (!(target is UntypedToTypedMetaObject))
                    return target;

                if (!children.Any())
                    return target;

                try {
                    // TODO Only supports one child (lame spec)
                    var rootType = target.Root.ComponentType;
                    var types = children.Select(t => ConvertToType(t, rootType)).ToArray();

                    target = target.BindGenericParameters(types);

                } catch (Exception ex) {
                    if (ex.IsCriticalException())
                        throw;

                    Parent.errors.CouldNotBindGenericParameters(target.ComponentType, ex, self.FileLocation);
                }

                Parent.Bind(target, children.First(), null);
                children.Clear();
                return target;
            }
        public TargetProviderDirective CreateTargetProvider(Type providerType, PropertyTreeNavigator nav)
        {
            var serviceProvider = parent.GetBasicServices(nav);

            if (nav.IsProperty) {
                string text = nav.Value.ToString();
                Exception error;

                try {
                    var qn = QualifiedName.Parse(text, serviceProvider);
                    return new TargetProviderDirective { Name = qn };

                } catch (ArgumentException e) {
                    error = e;
                } catch (FormatException e) {
                    error = e;
                }

                Errors.BadTargetProviderDirective(error, nav.FileLocation);
                return null;
            }
            else {
                try {
                    return nav.Bind<TargetProviderDirective>();

                } catch (Exception ex) {
                    if (Require.IsCriticalException(ex))
                        throw;

                    Errors.BadTargetProviderDirective(ex, nav.FileLocation);
                    return null;
                }
            }
        }
            private PropertyTreeMetaObject DoOperatorBind(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator navigator, OperatorDefinition op)
            {
                OperatorDefinition addon = op;

                if (addon.DefaultParameter != null) {
                    Type itemType = ((PropertyTreeFactoryDefinition) addon).OutputType;
                    // TODO Use service activation (we have the output type)

                    var item = target.CreateChild(itemType);
                    var model = parent.Bind(item, navigator, null);
                    var args = new Dictionary<string, PropertyTreeMetaObject>
                    {
                        { addon.DefaultParameter.Name, model }
                    };

                    try {
                        target.BindAddChild(op, args);

                    } catch (Exception ex) {
                        if (ex.IsCriticalException())
                            throw;

                        parent.errors.BadAddChild(target.ComponentType, ex, navigator.FileLocation);
                    }

                } else {
                    // TODO The number and kinds of arguments are constrained.  This should probably
                    // be enforced within schema operator reflection (spec)

                    Action<IReadOnlyDictionary<string, PropertyTreeMetaObject>> func;
                    var children = NodeList.Create(SelectChildren(navigator));

                    switch (addon.OperatorType) {
                        case OperatorType.Add:
                            func = args => {
                                var child = target.BindAddChild(addon, args);

                                if (child.ShouldBindChildren) {
                                    parent.BindChildNodes(child, navigator, children);
                                }
                            };
                            break;

                        case OperatorType.Remove:
                            func = args => target.BindRemoveChild(addon, args);
                            break;

                        case OperatorType.Clear:
                        default:
                            func = args => target.BindClearChildren(addon, args);
                            break;
                    }

                    var services = parent.GetBasicServices(navigator);
                    var args2 = parent.ExtractParameterDictionary(op, target, services, children);
                    func(args2);
                }

                return target;
            }
            private Type ConvertToType(PropertyTreeNavigator nav, Type rootType)
            {
                QualifiedName fixedName = nav.QualifiedName;
                string name = fixedName.LocalName;

                if (char.IsLower(name[0])) {
                    name = char.ToUpperInvariant(name[0]) + name.Substring(1);
                    fixedName = fixedName.ChangeLocalName(name);
                }

                if (string.IsNullOrEmpty(nav.Namespace)) {
                    // Try looking for the name in the same assembly
                    var choices = rootType.Assembly.GetTypesHelper()
                        .Where(t => t.IsPublic && t.Name == name);

                    if (choices.Any()) {
                        return choices.SingleOrThrow(() => PropertyTreesFailure.UnableToMatchTypeNameAmbiguous(nav.Name, choices));
                    } else {
                        throw PropertyTreesFailure.UnableToMatchTypeNameZero(name);
                    }

                } else {
                    return AppDomain.CurrentDomain.GetTypeByQualifiedName(fixedName, true);
                }
            }
            public override PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                Predicate<PropertyTreeNavigator> predicate = ImplicitDirective(target, "source");

                var node = children.FindAndRemove(predicate).FirstOrDefault();
                if (node != null) {
                    IServiceProvider serviceProvider = Parent.GetBasicServices(node);
                    var uriContext = node as IUriContext;
                    TargetSourceDirective ss;
                    ss = this.DirectiveFactory.CreateTargetSource(node, uriContext);

                    if (ss != null) {
                        try {
                            target = target.BindStreamingSource(ss, serviceProvider);
                        } catch (Exception ex) {
                            if (ex.IsCriticalException())
                                throw;

                            Parent.errors.FailedToLoadFromSource(ss.Uri, ex, node.FileLocation);
                        }
                    }
                }

                return target;
            }
            private Type ConvertToType(PropertyTreeNavigator nav, Type rootType)
            {
                QualifiedName fixedName = nav.QualifiedName;
                string        name      = fixedName.LocalName;

                if (char.IsLower(name[0]))
                {
                    name      = char.ToUpperInvariant(name[0]) + name.Substring(1);
                    fixedName = fixedName.ChangeLocalName(name);
                }

                if (string.IsNullOrEmpty(nav.Namespace))
                {
                    // Try looking for the name in the same assembly
                    var choices = rootType.GetTypeInfo().Assembly.GetTypesHelper()
                                  .Where(t => t.IsPublic && t.Name == name);

                    if (choices.Any())
                    {
                        return(choices.SingleOrThrow(() => PropertyTreesFailure.UnableToMatchTypeNameAmbiguous(nav.Name, choices)).AsType());
                    }
                    else
                    {
                        throw PropertyTreesFailure.UnableToMatchTypeNameZero(name);
                    }
                }
                else
                {
                    return(App.GetTypeByQualifiedName(fixedName, true));
                }
            }
            private void ApplyType(PropertyTreeMetaObject target,
                                   PropertyTreeNavigator node)
            {
                if (node == null)
                    return;

                Type type = target.ComponentType ?? typeof(object);
                var serviceProvider = Parent.GetBasicServices(node);
                target.BindTargetType(this.DirectiveFactory.CreateTargetType(node), serviceProvider);
            }
        internal PropertyTreeMetaObject BindChildNodes(PropertyTreeMetaObject target,
                                                       PropertyTreeNavigator self,
                                                       NodeList children)
        {
            foreach (var step in Pipeline)
            {
                target = step.Process(this, target, self, children);
            }

            return(target);
        }
            bool IApplyMemberStep.Apply(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator node)
            {
                var member = target.SelectOperator(ImpliedName(node, target));

                if (member != null) {
                    DoOperatorBind(parent, target, node, member);
                    return true;
                }

                return false;
            }
        private static IEnumerable <PropertyTreeNavigator> SelectChildren(PropertyTreeNavigator navigator)
        {
            navigator = navigator.Clone();

            if (navigator.MoveToFirstChild())
            {
                do
                {
                    yield return(navigator.Clone());
                } while (navigator.MoveToNext());
            }
        }
Example #17
0
            private void ApplyType(PropertyTreeBinderImpl parent,
                                   PropertyTreeMetaObject target,
                                   PropertyTreeNavigator node)
            {
                if (node == null)
                {
                    return;
                }

                var serviceProvider = parent.GetBasicServices(node);

                target.BindTargetType(parent.DirectiveFactory.CreateTargetType(node), serviceProvider);
            }
            public override PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                QualifiedName name = self.QualifiedName;
                var ctor = PropertyTreeDefinition.FromType(target.ComponentType).Constructor;

                if (target.ShouldConstruct && ctor != null) {
                    OperatorDefinition op = ctor;
                    var args = ExtractParameterDictionary(op, target, Parent.GetBasicServices(self), children);

                    target = target.BindConstructor(ctor, args);
                }

                return target;
            }
        private void DoPropertyBind(PropertyTreeMetaObject target,
                                    PropertyTreeNavigator navigator,
                                    PropertyDefinition property)
        {
            object ancestor = null;
            PropertyTreeMetaObject ancestorMeta = null;

            if (property.IsExtender)
            {
                var ancestorType = property.DeclaringTreeDefinition.SourceClrType;
                ancestorMeta = target.Ancestors.FirstOrDefault(
                    t => ancestorType.IsAssignableFrom(t.ComponentType));

                if (ancestorMeta != null)
                {
                    ancestor = ancestorMeta.Component;
                }
            }

            var component = target.Component;
            PropertyTreeMetaObject propertyTarget = target.CreateChild(property, navigator.QualifiedName, ancestorMeta);

            var services = new PropertyBindContext(
                component,
                property,
                ServiceProvider.Compose(ServiceProvider.FromValue(navigator), this))
            {
                LineNumber   = navigator.LineNumber,
                LinePosition = navigator.LinePosition,
            };

            try {
                propertyTarget = Bind(propertyTarget, navigator, services);
                target.BindSetMember(property, navigator.QualifiedName, propertyTarget, ancestorMeta, services);
            } catch (NullReferenceException nre) {
                // Normally a "critical" exception, consider it a conversion error
                _errors.BinderConversionError(property.Name, target.ComponentType, nre, navigator.FileLocation);
            } catch (ArgumentException a) {
                _errors.BinderConversionError(property.Name, target.ComponentType, a, navigator.FileLocation);
            } catch (PropertyTreeException) {
                throw;
            } catch (Exception ex) {
                if (ex.IsCriticalException())
                {
                    throw;
                }
                _errors.BinderConversionError(property.Name, target.ComponentType, ex, navigator.FileLocation);
            }
        }
        public override PropertyTreeMetaObject Bind(PropertyTreeMetaObject target,
                                                    PropertyTreeNavigator navigator,
                                                    IServiceProvider serviceProvider)
        {
            if (target == null)
            {
                throw new ArgumentNullException("target");
            }
            if (navigator == null)
            {
                throw new ArgumentNullException("navigator");
            }

            if (navigator.IsProperty)
            {
                var textValue = navigator.Value as string;
                if (textValue != null)
                {
                    return(BindInitializeValue(
                               target,
                               navigator,
                               serviceProvider,
                               () => target.BindInitializeValue(textValue, serviceProvider)));
                }

                var exprValue = navigator.Value as Expression;
                if (exprValue != null)
                {
                    var exprContext = ExpressionContext.Compose(
                        CurrentExpressionContext,
                        ExpressionContext.FromNameScope(FindNameScope(target))
                        );
                    exprValue = ExpressionUtility.LiftToCall(exprValue, exprContext);
                    return(BindInitializeValue(
                               target,
                               navigator,
                               serviceProvider,
                               () => target.BindInitializer(exprValue, exprContext, serviceProvider)));
                }

                throw new NotImplementedException();
            }

            var children = SelectChildren(navigator);

            return(BindChildNodes(target, navigator, NodeList.Create(children)));
        }
            bool IApplyMemberStep.Apply(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator node)
            {
                PropertyDefinition prop;
                if (_allowDefault) {
                    prop = target.GetDefinition().DefaultProperty;
                    if (prop == null)
                        return false;

                } else {
                    var im = ImpliedName(node, target);
                    prop = target.SelectProperty(im);
                    if (prop == null || prop.IsIndexer)
                        return false;
                }

                DoPropertyBind(parent, target, node, prop);
                return true;
            }
        private PropertyTreeMetaObject BindInitializeValue(PropertyTreeMetaObject target,
                                                           PropertyTreeNavigator navigator,
                                                           IServiceProvider serviceProvider,
                                                           Func <PropertyTreeMetaObject> thunk)
        {
            try {
                return(thunk());
            } catch (PropertyTreeException) {
                throw;
            } catch (Exception ex) {
                var sp = ServiceProvider.Compose(ServiceProvider.FromValue(navigator), serviceProvider, this);
                // Throw critical exceptions if they originate within PT; otherwise, allow
                // callback to decide how to handle them.
                if (ex.IsCriticalException())
                {
                    throw;
                }

                var    descriptor = serviceProvider.GetServiceOrDefault <IValueSerializerContext>();
                string property   = navigator.QualifiedName.ToString();
                Type   componentType;

                if (descriptor == null || descriptor.Instance == null)
                {
                    componentType = target.ComponentType;
                }
                else if (descriptor.Property == null)
                {
                    componentType = descriptor.Instance.GetType();
                }
                else
                {
                    property      = descriptor.Property.Name;
                    componentType = descriptor.Property.DeclaringType;
                }

                FileLocation loc   = navigator.FileLocation;
                object       value = navigator.Value;

                _errors.BinderConversionError(property, componentType, ex, loc);
            }

            return(target);
        }
        private static QualifiedName ImpliedName(PropertyTreeNavigator nav, PropertyTreeMetaObject target)
        {
            QualifiedName qualifiedName = nav.QualifiedName;

            if (nav.IsExpressNamespace)
            {
                return(qualifiedName);
            }

            NamespaceUri impliedNS = Utility.GetXmlnsNamespaceSafe(target.ComponentType);

            if (impliedNS == null)
            {
                return(qualifiedName);
            }
            else
            {
                return(qualifiedName.ChangeNamespace(impliedNS));
            }
        }
            public override PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                Type type = target.ComponentType ?? typeof(object);
                Type concreteClass = type.GetConcreteClass();
                QualifiedName name = self.QualifiedName;
                IServiceProvider serviceProvider = Parent;

                if (concreteClass != null && type != concreteClass) {
                    target.BindTargetType(TypeReference.FromType(concreteClass), serviceProvider);

                } else if (type.IsComposable()) {
                    target.BindTargetProvider(name, null, serviceProvider);
                }

                if (target.Component == null && !target.ComponentType.IsSealed) {
                    // TODO This predicate is probably too loose
                    Predicate<PropertyTreeNavigator> predicate = t => t.Name == "type";
                    var node = children.FindAndRemove(predicate).FirstOrDefault();
                    ApplyType(target, node);
                }
                return target;
            }
            public override PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target,
                                                             PropertyTreeNavigator self,
                                                             NodeList children)
            {
                Type type = target.ComponentType ?? typeof(object);

                // Select providers
                if (type.IsProviderType()) {
                    var node = children.FindAndRemove(ImplicitDirective(target, "provider")).FirstOrDefault();

                    if (node != null) {
                        var serviceProvider = Parent.GetBasicServices(node);
                        var pro = DirectiveFactory.CreateTargetProvider(type, node);
                        if (pro != null) {
                            target = target.BindTargetProvider(pro, serviceProvider);
                            return target;
                        }
                    }
                }

                return target;
            }
        public TargetProviderDirective CreateTargetProvider(Type providerType, PropertyTreeNavigator nav)
        {
            var serviceProvider = parent.GetBasicServices(nav);

            if (nav.IsProperty)
            {
                string    text = nav.Value.ToString();
                Exception error;

                try {
                    var qn = QualifiedName.Parse(text, serviceProvider);
                    return(new TargetProviderDirective {
                        Name = qn
                    });
                } catch (ArgumentException e) {
                    error = e;
                } catch (FormatException e) {
                    error = e;
                }

                Errors.BadTargetProviderDirective(error, nav.FileLocation);
                return(null);
            }
            else
            {
                try {
                    return(nav.Bind <TargetProviderDirective>());
                } catch (Exception ex) {
                    if (Failure.IsCriticalException(ex))
                    {
                        throw;
                    }

                    Errors.BadTargetProviderDirective(ex, nav.FileLocation);
                    return(null);
                }
            }
        }
            public override PropertyTreeMetaObject Process(
                PropertyTreeBinderImpl parent,
                PropertyTreeMetaObject target,
                PropertyTreeNavigator self,
                NodeList children)
            {
                if (!(target is UntypedToTypedMetaObject))
                {
                    return(target);
                }

                if (!children.Any())
                {
                    return(target);
                }

                try {
                    // TODO Only supports one child (lame spec)
                    var rootType = target.Root.ComponentType;
                    var types    = children.Select(t => ConvertToType(t, rootType)).ToArray();

                    target = target.BindGenericParameters(types);
                } catch (PropertyTreeException) {
                    throw;
                } catch (Exception ex) {
                    if (ex.IsCriticalException())
                    {
                        throw;
                    }

                    parent._errors.CouldNotBindGenericParameters(target.ComponentType, ex, self.FileLocation);
                }

                parent.Bind(target, children.First(), null);
                children.Clear();
                return(target);
            }
Example #28
0
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                Predicate <PropertyTreeNavigator> predicate = ImplicitDirective(target, "id");

                var node = children.FindAndRemove(predicate).FirstOrDefault();

                if (node == null)
                {
                    node = children.FindAndRemove("name").FirstOrDefault();
                }
                if (node != null)
                {
                    // TODO Handle when a name is duplicated or contains whitespace
                    var    ns = parent.FindNameScope(target);
                    string id = Convert.ToString(node.Value);

                    if (string.IsNullOrEmpty(id))
                    {
                        parent._errors.IdCannotBeBlank(node.FileLocation);
                    }
                    else if (ns.FindName(id) == null)
                    {
                        ns.RegisterName(id, target.Component);
                    }
                    else
                    {
                        parent._errors.IdAlreadyRegistered(id, node.FileLocation);
                    }

                    var nameProperty = target.SelectProperty(NamespaceUri.Default + "name");
                    if (nameProperty != null)
                    {
                        parent.DoPropertyBind(target, node, nameProperty);
                    }
                }

                return(target);
            }
            bool IApplyMemberStep.Apply(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator node)
            {
                PropertyDefinition prop = null;

                if (_allowDefault)
                {
                    var defaultProperties = target.GetDefinition().DefaultProperties;

                    if (defaultProperties.Skip(1).Any())
                    {
                        prop = defaultProperties.FirstOrDefault(p => p.TryGetValue(target.Component, node.QualifiedName));
                    }

                    if (prop == null)
                    {
                        prop = defaultProperties.FirstOrDefault();
                    }

                    if (prop == null)
                    {
                        return(false);
                    }
                }
                else
                {
                    var im = ImpliedName(node, target);
                    prop = target.SelectProperty(im);
                    if (prop == null || prop.IsIndexer)
                    {
                        return(false);
                    }
                }

                parent.DoPropertyBind(target, node, prop);
                return(true);
            }
 // TODO Implement property ordering based on [DependsOn]
 private bool Apply(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator node)
 {
     return(_items.Any(t => t.Apply(parent, target, node)));
 }
        public TargetSourceDirective CreateTargetSource(PropertyTreeNavigator nav, IUriContext uriContext)
        {
            if (nav.IsProperty) {

                Exception error;
                try {
                    Uri uri = new Uri(nav.Value.ToString(), UriKind.RelativeOrAbsolute);
                    uri = Utility.CombineUri(uriContext, uri);

                    return new TargetSourceDirective(uri);

                } catch (ArgumentException e) {
                    error = e;
                } catch (UriFormatException e) {
                    error = e;
                }

                Errors.BadSourceDirective(error, nav.FileLocation);
                return null;
            }

            else {
                return nav.Bind<TargetSourceDirective>();
            }
        }
        public TargetTypeDirective CreateTargetType(PropertyTreeNavigator nav)
        {
            if (nav.IsProperty) {
                Exception error;

                try {
                    var tr = TypeReference.Parse(Convert.ToString(nav.Value), parent.GetBasicServices(nav));
                    return new TargetTypeDirective(tr, null);

                } catch (Exception ex) {
                    if (Require.IsCriticalException(ex))
                        throw;

                    error = ex;
                    Errors.BadTargetTypeDirective(error, nav.FileLocation);
                    return null;
                }
            }
            else {

                try {
                    return nav.Bind<TargetTypeDirective>();

                } catch (Exception ex) {
                    if (Require.IsCriticalException(ex))
                        throw;

                    Errors.BadTargetTypeDirective(ex, nav.FileLocation);
                    return null;
                }
            }
        }
 public PropertyTreeNavigatorReader(PropertyTreeNavigator nav)
 {
     this.nav = nav;
 }
        internal PropertyTreeMetaObject BindChildNodes(PropertyTreeMetaObject target,
                                                       PropertyTreeNavigator self,
                                                       NodeList children)
        {
            foreach (var step in Pipeline) {
                target = step.Process(target, self, children);
            }

            return target;
        }
 public PropertyTreeMetaObject Process(
     PropertyTreeMetaObject target,
     PropertyTreeNavigator self,
     NodeList children)
 {
     target = StartStep(target, self, children);
     return EndStep(target);
 }
 public virtual PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target,
                                                 PropertyTreeNavigator self,
                                                 NodeList children)
 {
     return target;
 }
 internal IServiceProvider GetBasicServices(PropertyTreeNavigator nav)
 {
     return(ServiceProvider.Compose(this,
                                    ServiceProvider.FromValue(nav)));
 }
            private PropertyTreeMetaObject DoOperatorBind(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator navigator, OperatorDefinition op)
            {
                OperatorDefinition addon = op;

                if (addon.DefaultParameter != null)
                {
                    Type itemType = addon.OutputType;
                    // TODO Use service activation (we have the output type)

                    var item  = target.CreateChild(itemType);
                    var model = parent.Bind(item, navigator, null);
                    var args  = new Dictionary <string, PropertyTreeMetaObject>
                    {
                        { addon.DefaultParameter.Name, model }
                    };

                    try {
                        target.BindAddChild(op, args);
                    } catch (PropertyTreeException) {
                        throw;
                    } catch (Exception ex) {
                        if (ex.IsCriticalException())
                        {
                            throw;
                        }

                        parent._errors.BadAddChild(target.ComponentType, ex, navigator.FileLocation);
                    }
                }
                else
                {
                    // TODO The number and kinds of arguments are constrained.  This should probably
                    // be enforced within schema operator reflection (spec)

                    Action <IReadOnlyDictionary <string, PropertyTreeMetaObject> > func;
                    var children = NodeList.Create(SelectChildren(navigator));

                    switch (addon.OperatorType)
                    {
                    case OperatorType.Add:
                        func = args => {
                            var child = target.BindAddChild(addon, args);

                            if (child.ShouldBindChildren)
                            {
                                parent.BindChildNodes(child, navigator, children);
                            }
                        };
                        break;

                    case OperatorType.Remove:
                        func = args => target.BindRemoveChild(addon, args);
                        break;

                    case OperatorType.Clear:
                    default:
                        func = args => target.BindClearChildren(addon, args);
                        break;
                    }

                    var services = parent.GetBasicServices(navigator);
                    var args2    = parent.ExtractParameterDictionary(op, target, services, children);
                    func(args2);
                }

                return(target);
            }
            bool IApplyMemberStep.Apply(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator node)
            {
                var member = target.SelectOperator(ImpliedName(node, target));

                if (member != null)
                {
                    DoOperatorBind(parent, target, node, member);
                    return(true);
                }

                return(false);
            }
 public abstract PropertyTreeMetaObject Bind(PropertyTreeMetaObject target, PropertyTreeNavigator navigator, IServiceProvider serviceProvider);
 public override PropertyTreeMetaObject StartStep(PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
 {
     children.FindAndRemove(t => Apply(target, t)).All();
     return target;
 }
 // TODO Implement property ordering based on [DependsOn]
 private bool Apply(PropertyTreeMetaObject target, PropertyTreeNavigator node)
 {
     return _items.Any(t => t.Apply(Parent, target, node));
 }
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                IServiceProvider serviceProvider = parent.GetBasicServices(self);
                int lineNumber   = self.LineNumber;
                int linePosition = self.LinePosition;

                return(target.BindFileLocation(lineNumber, linePosition, serviceProvider));
            }
        public override PropertyTreeMetaObject Bind(PropertyTreeMetaObject target,
                                                    PropertyTreeNavigator navigator,
                                                    IServiceProvider serviceProvider)
        {
            if (target == null)
                throw new ArgumentNullException("target");
            if (navigator == null)
                throw new ArgumentNullException("navigator");

            if (navigator.IsProperty) {
                string value = Convert.ToString(navigator.Value);
                var sp = ServiceProvider.Compose(ServiceProvider.FromValue(navigator), serviceProvider, this);
                var xml = (IXmlNamespaceResolver) sp.GetService(typeof(IXmlNamespaceResolver));
                try {
                    return target.BindInitializeValue(value, sp);

                } catch (Exception ex) {
                    // Throw critical exceptions if they originate within PT; otherwise, allow
                    // callback to decide how to handle them.
                    if (ex.IsCriticalException())
                        throw;

                    var descriptor = serviceProvider.GetService<ITypeDescriptorContext>();
                    string property;
                    Type componentType;
                    if (descriptor == null || descriptor.PropertyDescriptor == null) {
                        property = navigator.QualifiedName.ToString();
                        componentType = descriptor.Instance.GetType();
                    } else {
                        property = descriptor.PropertyDescriptor.Name;
                        componentType = descriptor.PropertyDescriptor.ComponentType;
                    }

                    FileLocation loc = navigator.FileLocation;

                    try {
                        Callback.OnConversionException(property, value, ex);

                    } catch (Exception ex2) {
                        if (Require.IsCriticalException(ex2))
                            throw;

                        throw PropertyTreesFailure.BinderConversionError(value, property, componentType, ex2, loc);
                    }
                }
            }

            var children = SelectChildren(navigator);
            return BindChildNodes(target, navigator, NodeList.Create(children));
        }
 public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
 {
     return(target.BindEndObject(parent));
 }
        private static IEnumerable<PropertyTreeNavigator> SelectChildren(PropertyTreeNavigator navigator)
        {
            navigator = navigator.Clone();

            if (navigator.MoveToFirstChild()) {
                do {
                    yield return navigator.Clone();
                } while (navigator.MoveToNext());
            }
        }
Example #47
0
 public abstract PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent,
                                                PropertyTreeMetaObject target,
                                                PropertyTreeNavigator self,
                                                NodeList children);
        private static QualifiedName ImpliedName(PropertyTreeNavigator nav, PropertyTreeMetaObject target)
        {
            QualifiedName qualifiedName = nav.QualifiedName;
            if (nav.IsExpressNamespace)
                return qualifiedName;

            NamespaceUri impliedNS = Utility.GetXmlnsNamespaceSafe(target.ComponentType);
            if (impliedNS == null)
                return qualifiedName;
            else
                return qualifiedName.ChangeNamespace(impliedNS);
        }
        public override bool MoveTo(PropertyTreeNavigator other)
        {
            if (other == null)
                throw new ArgumentNullException("other");

            DocumentPTNavigator otherNav = other as DocumentPTNavigator;
            if (otherNav != null && this.current.Root == otherNav.current.Root) {
                this.current = otherNav.current;
                return true;
            }
            return false;
        }
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                QualifiedName name = self.QualifiedName;
                var           ctor = PropertyTreeDefinition.FromType(target.ComponentType).Constructor;

                if (target.ShouldConstruct && ctor != null)
                {
                    OperatorDefinition op = ctor;
                    var args = parent.ExtractParameterDictionary(op, target, parent.GetBasicServices(self), children);

                    target = target.BindConstructor(ctor, args);
                }

                return(target);
            }
Example #51
0
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                if (target.ShouldConstruct)
                {
                    var ctor = target.GetDefinition().Constructor;

                    if (ctor != null)
                    {
                        return(target.BindConstructor(ctor, Empty <string, PropertyTreeMetaObject> .ReadOnlyDictionary));
                    }
                }
                return(target);
            }
Example #52
0
 public abstract PropertyTreeMetaObject Bind(PropertyTreeMetaObject target, PropertyTreeNavigator navigator, IServiceProvider serviceProvider);
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                target.ApplyUriContextToProperties(self.BaseUri);

                children.FindAndRemove(t => Apply(parent, target, t)).All();
                return(target);
            }
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                Predicate <PropertyTreeNavigator> predicate = ImplicitDirective(target, "source");

                var node = children.FindAndRemove(predicate).FirstOrDefault();

                if (node != null)
                {
                    IServiceProvider serviceProvider = parent.GetBasicServices(node);
                    var uriContext = node as IUriContext;
                    TargetSourceDirective ss;
                    ss = parent.DirectiveFactory.CreateTargetSource(node, uriContext);

                    if (ss != null)
                    {
                        try {
                            target = target.BindStreamingSource(ss, serviceProvider);
                        } catch (PropertyTreeException) {
                            throw;
                        } catch (Exception ex) {
                            if (ex.IsCriticalException())
                            {
                                throw;
                            }

                            parent._errors.FailedToLoadFromSource(ss.Uri, ex, node.FileLocation);
                        }
                    }
                }

                return(target);
            }
Example #55
0
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                Type             type            = target.ComponentType ?? typeof(object);
                Type             concreteClass   = type.GetConcreteClass();
                QualifiedName    name            = self.QualifiedName;
                IServiceProvider serviceProvider = parent;

                if (concreteClass != null && type != concreteClass)
                {
                    target.BindTargetType(TypeReference.FromType(concreteClass), serviceProvider);
                }
                else if (type.IsComposable())
                {
                    target.BindTargetProvider(name, null, serviceProvider);
                }

                if (target.Component == null && !target.ComponentType.GetTypeInfo().IsSealed)
                {
                    // TODO This predicate is probably too loose
                    Predicate <PropertyTreeNavigator> predicate = t => t.Name == "type";
                    var node = children.FindAndRemove(predicate).FirstOrDefault();
                    ApplyType(parent, target, node);
                }
                return(PickBuilderTypeIfAvailable(target));
            }
 internal IServiceProvider GetBasicServices(PropertyTreeNavigator nav)
 {
     return ServiceProvider.Compose(this,
                                    ServiceProvider.FromValue(nav));
 }
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                foreach (var child in children.Rest())
                {
                    parent._errors.BindUnmatchedProperty(child.QualifiedName, target.ComponentType, child.FileLocation);
                }

                return(target);
            }
            public override PropertyTreeMetaObject Process(PropertyTreeBinderImpl parent, PropertyTreeMetaObject target, PropertyTreeNavigator self, NodeList children)
            {
                Predicate <PropertyTreeNavigator> predicate = ImplicitDirective(target, "base");

                var node = children.FindAndRemove(predicate).FirstOrDefault();

                Uri baseUri;
                IServiceProvider serviceProvider;

                if (node == null)
                {
                    baseUri         = self.BaseUri;
                    serviceProvider = parent;
                }
                else
                {
                    baseUri         = Utility.NewUri(Convert.ToString(node.Value));
                    serviceProvider = parent.GetBasicServices(node);
                }
                return(target.BindBaseUri(baseUri, serviceProvider));
            }