Ejemplo n.º 1
0
 /// <summary>
 /// Gets called when a Uri cannot be resolved
 /// </summary>
 /// <param name="e">The event data</param>
 protected virtual void OnUnresolvedModelElement(UnresolvedModelElementEventArgs e)
 {
     if (UnresolvedModelElement != null)
     {
         UnresolvedModelElement(this, e);
     }
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Gets called when a Uri cannot be resolved
 /// </summary>
 /// <param name="e">The event data</param>
 protected virtual void OnUnresolvedModelElement(UnresolvedModelElementEventArgs e)
 {
     if (UnresolvedModelElement != null) UnresolvedModelElement(this, e);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Resolves the given Uri and returns the model element
        /// </summary>
        /// <param name="uri">The Uri where to look for the model element</param>
        /// <param name="hintPath">The path where the model can be found</param>
        /// <param name="loadOnDemand">A boolean flag indicating whether the uri should be attempted
        /// to load, if the model is not already registered with the repository</param>
        /// <returns>A model element at the given Uri or null if none can be found</returns>
        public IModelElement Resolve(Uri uri, string hintPath, bool loadOnDemand = true)
        {
            if (uri == null) throw new ArgumentNullException("uri");
            Model model;
            Uri modelUri;
            Func<Stream> streamCreator;
            if (!models.TryGetValue(uri, out model))
            {
                var parentResolved = Parent.Resolve(uri, false);
                if (parentResolved != null) return parentResolved;

                if (loadOnDemand)
                {
                    if (hintPath == null)
                    {
                        var locator = Locators.Where(l => l.CanLocate(uri)).FirstOrDefault();

                        if (locator == null)
                        {
                            if (parentResolved != null) return parentResolved;

                            var e = new UnresolvedModelElementEventArgs(uri);
                            OnUnresolvedModelElement(e);
                            return e.ModelElement;
                        }
                        modelUri = locator.GetRepositoryUri(uri);
                        streamCreator = () => locator.Open(modelUri);
                    }
                    else
                    {
                        modelUri = uri;
                        streamCreator = () => File.OpenRead(hintPath);
                    }
                    if (!models.TryGetValue(modelUri, out model))
                    {
                        using (var stream = streamCreator())
                        {
                            model = Serializer.Deserialize(stream, modelUri, this, true);
                            if (model.RootElements.Count == 1)
                            {
                                var ns = model.RootElements[0] as INamespace;
                                if (ns != null)
                                {
                                    model.ModelUri = ns.Uri;
                                    if (!models.ContainsKey(ns.Uri))
                                    {
                                        models.Add(ns.Uri, model);
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    return null;
                }
            }

            if (uri.IsAbsoluteUri)
            {
                var element = model.Resolve(uri.Fragment);

                if (element == null)
                {
                    var e = new UnresolvedModelElementEventArgs(uri);
                    OnUnresolvedModelElement(e);
                    element = e.ModelElement;
                }

                return element;
            }
            else
            {
                return model;
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Resolves the given Uri and returns the model element
        /// </summary>
        /// <param name="uri">The Uri where to look for the model element</param>
        /// <param name="hintPath">The path where the model can be found</param>
        /// <param name="loadOnDemand">A boolean flag indicating whether the uri should be attempted
        /// to load, if the model is not already registered with the repository</param>
        /// <returns>A model element at the given Uri or null if none can be found</returns>
        public IModelElement Resolve(Uri uri, string hintPath, bool loadOnDemand = true)
        {
            if (uri == null)
            {
                throw new ArgumentNullException("uri");
            }
            Model         model;
            Uri           modelUri;
            Func <Stream> streamCreator;

            if (!models.TryGetValue(uri, out model))
            {
                var parentResolved = Parent.Resolve(uri, false);
                if (parentResolved != null)
                {
                    return(parentResolved);
                }

                if (loadOnDemand)
                {
                    if (hintPath == null)
                    {
                        var locator = Locators.Where(l => l.CanLocate(uri)).FirstOrDefault();

                        if (locator == null)
                        {
                            if (parentResolved != null)
                            {
                                return(parentResolved);
                            }

                            var e = new UnresolvedModelElementEventArgs(uri);
                            OnUnresolvedModelElement(e);
                            return(e.ModelElement);
                        }
                        modelUri      = locator.GetRepositoryUri(uri);
                        streamCreator = () => locator.Open(modelUri);
                    }
                    else
                    {
                        modelUri      = uri;
                        streamCreator = () => File.OpenRead(hintPath);
                    }
                    if (!models.TryGetValue(modelUri, out model))
                    {
                        using (var stream = streamCreator())
                        {
                            model = Serializer.Deserialize(stream, modelUri, this, true);
                            if (model.RootElements.Count == 1)
                            {
                                var ns = model.RootElements[0] as INamespace;
                                if (ns != null)
                                {
                                    model.ModelUri = ns.Uri;
                                    if (!models.ContainsKey(ns.Uri))
                                    {
                                        models.Add(ns.Uri, model);
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    return(null);
                }
            }

            if (uri.IsAbsoluteUri)
            {
                var element = model.Resolve(uri.Fragment);

                if (element == null)
                {
                    var e = new UnresolvedModelElementEventArgs(uri);
                    OnUnresolvedModelElement(e);
                    element = e.ModelElement;
                }

                return(element);
            }
            else
            {
                return(model);
            }
        }