示例#1
0
        /// <summary>
        /// Instantiates an existent Domain from the supplied Uri.
        /// </summary>
        /// <param name="DomainLocation">Optional location of an existent Domain.</param>
        /// <returns>Opened root Domain, plus possible error-message.</returns>
        public static Tuple <Domain, string> MaterializeDomain(Uri DomainLocation = null)
        {
            // Load Domain's document package from Uri
            Tuple <ISphereModel, string> Result = null;

            try
            {
                Result = LoadFromLocation <ISphereModel>(FileDataType.FileTypeDomain.Name, DomainLocation, DomainsManager.DomainDocumentUri);
            }
            catch (Exception Problem)
            {
                Console.WriteLine("Cannot load Domain from '{0}'.", DomainLocation.LocalPath);
                AppExec.LogException(Problem);
                return(Tuple.Create <Domain, string>(null, Problem.Message));
            }

            var Content = Result.Item1;

            if (Content == null)
            {
                return(Tuple.Create <Domain, string>(null, Result.Item2));
            }

            var RootDomain = Content as Domain;

            if (RootDomain == null)
            {
                throw new ExternalAnomaly("Cannot load Domain from the specified location.", DomainLocation);
            }

            ModelFixes.ApplyModelFixes(RootDomain);

            return(Tuple.Create(RootDomain, ""));
        }
示例#2
0
        /// <summary>
        /// Instantiates a new CompositionEngine, either for a new Composition or for one existent from supplied as a Uri.
        /// </summary>
        /// <param name="SourceLocation">Optional location of an existent Composition.</param>
        /// <param name="RootDomain">Optional Domain to serve as root/basis of a new Composition.</param>
        /// <param name="UseDomainCompositionAsTemplate">Indicates to use the Domain's Composition as Template instead of create an empty new one.</param>
        /// <returns>Engine for edit a created/opened Composition plus possible error-message.</returns>
        public static Tuple <CompositionEngine, string> Materialize(Uri SourceLocation = null, Domain RootDomain = null, bool UseDomainCompositionAsTemplate = false)
        {
            Tuple <CompositionEngine, string> Result = null;

            var Engine = CompositionEngine.ActiveCompositionEngine;

            Composition TargetComposition = null;

            // IF LOADING FROM COMPOSITION FILE
            if (SourceLocation != null)
            {
                /* Better ignore...
                 * if (RootDomain != null)
                 *  throw new UsageAnomaly("Cannot specify root Domain for an already existent Composition."); */

                try
                {
                    // Load Composition's document package from Uri
                    var LoadResult = LoadFromLocation <ISphereModel>(FileDataType.FileTypeComposition.Name, SourceLocation, CompositionDocumentUri);
                    var Content    = LoadResult.Item1;

                    if (Content == null)
                    {
                        return(Tuple.Create <CompositionEngine, string>(null, LoadResult.Item2));
                    }

                    TargetComposition = Content as Composition;

                    if (TargetComposition == null)
                    {
                        throw new ExternalAnomaly("Cannot load Composition from the specified location.", SourceLocation);
                    }

                    Engine.TargetComposition = TargetComposition;
                    Engine.Location          = SourceLocation;

                    // IMPORTANT: This Engine will overwrite its Global-ID with that of the loaded Compositon.
                    Engine.GlobalId = TargetComposition.GlobalId;
                    TargetComposition.CompositionDefinitor.SetOwnerComposition(TargetComposition);    // Reattach of owner Composition (which is non-serializable)

                    ModelFixes.ApplyModelFixes(TargetComposition.CompositionDefinitor);
                    TargetComposition.Initialize();

                    Result = Tuple.Create(Engine, "");
                }
                catch (Exception Problem)
                {
                    Console.WriteLine("Cannot load Composition from '{0}'.\nProblem: {1}", SourceLocation.LocalPath, Problem);
                    AppExec.LogException(Problem);
                    Engine = null;

                    Result = Tuple.Create <CompositionEngine, string>(null, Problem.Message);
                }
            }
            else
            {
                string DocName = Engine.Manager.DocumentsPrefix + Engine.Manager.GetNewDocumentNumber().ToString();

                // IF LOADING FROM COMPOSITION AS TEMPLATE IN DOMAIN FILE
                if (RootDomain != null && RootDomain.OwnerComposition != null && UseDomainCompositionAsTemplate)
                {
                    try
                    {
                        TargetComposition          = RootDomain.OwnerComposition;
                        TargetComposition.GlobalId = Guid.NewGuid();

                        /* Cancelled
                         * TargetComposition.Name = DocName;
                         * TargetComposition.TechName = DocName.TextToIdentifier();
                         * TargetComposition.Summary = ""; */
                        TargetComposition.Version = new VersionCard();

                        Engine.GlobalId          = TargetComposition.GlobalId;
                        Engine.TargetComposition = TargetComposition;
                        Engine.Location          = null;

                        TargetComposition.Initialize();

                        Result = Tuple.Create(Engine, "");
                    }
                    catch (Exception Problem)
                    {
                        Console.WriteLine("Cannot load Composition from '{0}'.\nProblem: {1}", SourceLocation.LocalPath, Problem);
                        AppExec.LogException(Problem);
                        Engine = null;

                        Result = Tuple.Create <CompositionEngine, string>(null, Problem.Message);
                    }
                }
                else    // CREATING NEW EMPTY COMPOSITION
                {
                    // IMPORTANT: The new Compositon will initialize its Global-ID with that of the Engine.
                    TargetComposition = new Composition(Engine, RootDomain.NullDefault(Domain.Create(Engine)), DocName, DocName.TextToIdentifier());
                    TargetComposition.CompositionDefinitor.SetOwnerComposition(TargetComposition);    // Initial attach of owner Composition (which is non-serializable)
                    TargetComposition.Initialize();
                    Engine.TargetComposition = TargetComposition;

                    //- TargetComposition.RootView = TargetComposition.OpenCompositeView(TargetComposition.CompositionDefinitor);

                    Result = Tuple.Create(Engine, "");
                }
            }

            return(Result);
        }