public LayoutInfo ConvertStringToLayoutInfo(string layoutInfo, Store store)
        {
            LayoutInfo lInfo = null;

            Microsoft.VisualStudio.Modeling.SerializationResult serializationResult = new Microsoft.VisualStudio.Modeling.SerializationResult();
            DomainXmlSerializerDirectory directory = this.GetDirectory(store);

            System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            Microsoft.VisualStudio.Modeling.SerializationContext serializationContext = new SerializationContext(directory, "", serializationResult);
            this.InitializeSerializationContext(store.DefaultPartition, serializationContext, false);

            DomainClassXmlSerializer rootSerializer = directory.GetSerializer(LayoutInfo.DomainClassId);

            using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(layoutInfo)))
            {
                reader.Read(); // Move to the first node - will be the XmlDeclaration if there is one.
                serializationResult.Encoding = encoding;

                reader.MoveToContent();

                lInfo = rootSerializer.TryCreateInstance(serializationContext, reader, store.DefaultPartition) as LayoutInfo;
                rootSerializer.Read(serializationContext, lInfo, reader);
            }

            return(lInfo);
        }
        public LayoutInfo ConvertStringToLayoutInfo(string layoutInfo, Store store)
        {
            LayoutInfo lInfo = null;

            Microsoft.VisualStudio.Modeling.SerializationResult serializationResult = new Microsoft.VisualStudio.Modeling.SerializationResult();
            DomainXmlSerializerDirectory directory = this.GetDirectory(store);
            System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            Microsoft.VisualStudio.Modeling.SerializationContext serializationContext = new SerializationContext(directory, "", serializationResult);
            this.InitializeSerializationContext(store.DefaultPartition, serializationContext, false);

            DomainClassXmlSerializer rootSerializer = directory.GetSerializer(LayoutInfo.DomainClassId);
            using(System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(layoutInfo)) )
            {
                
                reader.Read(); // Move to the first node - will be the XmlDeclaration if there is one.
                serializationResult.Encoding = encoding;

                reader.MoveToContent();

                lInfo = rootSerializer.TryCreateInstance(serializationContext, reader, store.DefaultPartition) as LayoutInfo;
                rootSerializer.Read(serializationContext, lInfo, reader);
            }

            return lInfo;
        }
Example #3
0
 /// <summary>
 /// Saves the specified model.
 /// </summary>
 /// <param name="model">The model.</param>
 /// <param name="fileName">Name of the file.</param>
 /// <returns></returns>
 public static bool Save(CandleModel model, string fileName)
 {
     Microsoft.VisualStudio.Modeling.SerializationResult result =
         new Microsoft.VisualStudio.Modeling.SerializationResult();
     CandleSerializationHelper.Instance.SaveModel(result, model, fileName);
     return(!result.Failed);
 }
Example #4
0
        private string SaveModel(ProductState store, string fileName)
        {
            var result   = new Dsl.SerializationResult();
            var itemName = Path.GetFileName(fileName);

            if (solution.IsOpen)
            {
                // First do the quick lookup in the default location.
                IItemContainer itemParent = this.solution.SolutionFolders.FirstOrDefault(folder =>
                                                                                         folder.Name.Equals(SolutionExtensions.SolutionItemsFolderName, StringComparison.OrdinalIgnoreCase) &&
                                                                                         folder.Items.Any(item => item.PhysicalPath == fileName));

                if (itemParent == null)
                {
                    // Try the slow probing anywhere in the solution.
                    itemParent = (from item in this.solution.Traverse().OfType <IItem>()
                                  where item.PhysicalPath == fileName
                                  select item.Parent)
                                 .FirstOrDefault();
                }

                if (itemParent == null)
                {
                    tracer.Verbose(Resources.PatternManager_TraceSavingDefaultEmptyState, fileName);

                    // Default to SolutionItems.
                    itemParent = this.solution.Items.OfType <ISolutionFolder>().FirstOrDefault(x => x.IsSolutionItemsFolder());
                    if (itemParent == null)
                    {
                        tracer.Verbose(Resources.PatternManager_SaveNoSolutionItems);
                        itemParent = this.solution.CreateSolutionFolder(SolutionExtensions.SolutionItemsFolderName);
                    }
                }

                // Serialize to temp to add or override content next.
                var tempFileName = Path.GetTempFileName();
                ProductStateStoreSerializationHelper.Instance.SaveModel(result, store, tempFileName);

                var addedItem = this.AddStateToSolution(itemParent, itemName, tempFileName);

                // Cleanup the temporary file.
                File.Delete(tempFileName);

                return(addedItem.PhysicalPath);
            }
            else
            {
                ProductStateStoreSerializationHelper.Instance.SaveModel(result, store, fileName);
                return(fileName);
            }
        }
        public string ConvertLayoutInfoToString(LayoutInfo info)
        {
            string result = String.Empty;

            Microsoft.VisualStudio.Modeling.SerializationResult serializationResult = new Microsoft.VisualStudio.Modeling.SerializationResult();
            DomainXmlSerializerDirectory directory = this.GetDirectory(info.Store);

            System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            Microsoft.VisualStudio.Modeling.SerializationContext serializationContext = new SerializationContext(directory, "", serializationResult);
            this.InitializeSerializationContext(info.Partition, serializationContext, false);

            global::System.IO.MemoryStream       newFileContent = new global::System.IO.MemoryStream();
            global::System.Xml.XmlWriterSettings settings       = DiagramsDSLSerializationHelper.Instance.CreateXmlWriterSettings(serializationContext, false, encoding);
            using (global::System.Xml.XmlWriter writer = global::System.Xml.XmlWriter.Create(newFileContent, settings))
            {
                DomainClassXmlSerializer rootSerializer = directory.GetSerializer(LayoutInfo.DomainClassId);

                RootElementSettings rootElementSettings = new RootElementSettings();
                rootElementSettings.SchemaTargetNamespace = "http://schemas.microsoft.com/dsltools/DiagramsDSL";
                rootElementSettings.Version = new global::System.Version("1.0.0.0");

                // Carry out the normal serialization.
                rootSerializer.Write(serializationContext, info, writer, rootElementSettings);
            }

            char[] chars = encoding.GetChars(newFileContent.GetBuffer());

            // search the open angle bracket and trim off the Byte Of Mark.
            result = new string(chars);
            int indexPos = result.IndexOf('<');

            if (indexPos > 0)
            {
                // strip off the leading Byte Of Mark.
                result = result.Substring(indexPos);
            }

            // trim off trailing 0s.
            result = result.TrimEnd('\0');

            return(result);
        }
        public string ConvertLayoutInfoToString(LayoutInfo info)
        {
            string result = String.Empty;

            Microsoft.VisualStudio.Modeling.SerializationResult serializationResult = new Microsoft.VisualStudio.Modeling.SerializationResult();
            DomainXmlSerializerDirectory directory = this.GetDirectory(info.Store);
            System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            Microsoft.VisualStudio.Modeling.SerializationContext serializationContext = new SerializationContext(directory, "", serializationResult);
            this.InitializeSerializationContext(info.Partition, serializationContext, false);

            global::System.IO.MemoryStream newFileContent = new global::System.IO.MemoryStream();
            global::System.Xml.XmlWriterSettings settings = DiagramsDSLSerializationHelper.Instance.CreateXmlWriterSettings(serializationContext, false, encoding);
            using (global::System.Xml.XmlWriter writer = global::System.Xml.XmlWriter.Create(newFileContent, settings))
            {
                DomainClassXmlSerializer rootSerializer = directory.GetSerializer(LayoutInfo.DomainClassId);
                
                RootElementSettings rootElementSettings = new RootElementSettings();
                rootElementSettings.SchemaTargetNamespace = "http://schemas.microsoft.com/dsltools/DiagramsDSL";
                rootElementSettings.Version = new global::System.Version("1.0.0.0");

                // Carry out the normal serialization.
                rootSerializer.Write(serializationContext, info, writer, rootElementSettings);
            }

            char[] chars = encoding.GetChars(newFileContent.GetBuffer());

            // search the open angle bracket and trim off the Byte Of Mark.
            result = new string(chars);
            int indexPos = result.IndexOf('<');
            if (indexPos > 0)
            {
                // strip off the leading Byte Of Mark.
                result = result.Substring(indexPos);
            }

            // trim off trailing 0s.
            result = result.TrimEnd('\0');

            return result;
        }
Example #7
0
 /// <summary>
 /// Reads the model into the given store and returns it.
 /// </summary>
 public static IProductState Read(Dsl.SerializationResult result, Dsl.Store store, string modelFile)
 {
     return(ProductStateStoreSerializationHelper.Instance.LoadModel(result, store, modelFile, null, null, null));
 }
Example #8
0
        public MetaModel LoadLibrary(Microsoft.VisualStudio.Modeling.SerializationResult serializationResult)
        {
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(this.AbsoluteFilePath);
            if (!fileInfo.Exists)
            {
                return(null);
            }

            if (System.String.Compare(fileInfo.Extension, ".lngdsl", System.StringComparison.OrdinalIgnoreCase) != 0)
            {
                return(null);
            }

            MetaModel dslLibrary = FindLibrary(Store, this.AbsoluteFilePath);

            if (dslLibrary != null)
            {
                if (dslLibrary.IsTopMost)
                {
                    MessageBox.Show("Circular dependency to the top most meta model! Can not load library.");
                    throw new ArgumentException("Circular dependency to the top most meta model! Can not load library.");
                }
                //this.ImportedLibrary = dslLibrary;
                this.Name = dslLibrary.Name;
                return(dslLibrary);
            }


            Microsoft.VisualStudio.Modeling.Partition partition = new Microsoft.VisualStudio.Modeling.Partition(Store);

            MetaModel metaModel;

            try
            {
                metaModel = LanguageDSLSerializationHelper.Instance.LoadModel(serializationResult, partition, this.AbsoluteFilePath, null, null, null, false);

                ReadOnlyCollection <ModelElement> elements = this.Store.ElementDirectory.FindElements(MetaModel.DomainClassId);
                foreach (ModelElement element in elements)
                {
                    if (element is MetaModel && element != metaModel)
                    {
                        MetaModel m = element as MetaModel;
                        if (m.Name == metaModel.Name)
                        {
                            metaModel.Delete();
                            throw new ArgumentException("Library can not have a name of an already included library or main meta model.");
                        }
                    }
                }
            }
            catch (System.Xml.XmlException)
            {
                metaModel = null;
            }
            if ((metaModel != null) && !serializationResult.Failed)
            {
                this.ImportedLibrary = metaModel;
                this.Name            = metaModel.Name;

                if (ImmutabilityExtensionMethods.GetLocks(metaModel) != Locks.All)
                {
                    SetLocks(metaModel, Locks.All);
                }
            }
            else
            {
                metaModel = null;
            }
            return(metaModel);
        }
Example #9
0
        public virtual void Open(string storeFile, bool autoCreate = false)
        {
            Guard.NotNullOrEmpty(() => storeFile, storeFile);

            using (tracer.StartActivity(Resources.PatternManager_TraceOpeningStore, storeFile))
                using (new MouseCursor(System.Windows.Input.Cursors.Wait))
                {
                    if (this.IsOpen)
                    {
                        this.Close();
                    }

                    this.StoreFile = storeFile;
                    //tracer.TraceData(TraceEventType.Verbose, Resources.PatternManager_OpeningStoreEventId, storeFile);

                    if (autoCreate && (!File.Exists(storeFile) || new FileInfo(storeFile).Length == 0))
                    {
                        storeFile = CreateEmptyStateFile(storeFile);
                    }

                    //// Do NOT dispose the DSL state or it becomes null in the model elements!!
                    if (VerifyDslVersion(storeFile))
                    {
                        var result = new Dsl.SerializationResult();

                        var dslStore = new Dsl.Store(this.serviceProvider, typeof(Dsl.CoreDomainModel), typeof(ProductStateStoreDomainModel));

                        using (var tx = dslStore.TransactionManager.BeginTransaction(Resources.PatternManager_OpenTransactionDescription, true))
                        {
                            using (new StorePropertyBag(dslStore, ProductState.IsSerializingKey, true))
                            {
                                // Flag the state as being deserialized. This is
                                // required by the ProductState class to ignore
                                // element added events until deserialization is
                                // completed.

                                var store = ProductStateStoreSerializationHelper.Instance.LoadModel(result, dslStore, storeFile, null, null, null);

                                if (!result.Failed)
                                {
                                    this.productStore = store;
                                    tx.Commit();
                                }
                            }
                        }

                        if (!result.Failed)
                        {
                            this.IsOpen = true;

                            this.Store.TransactionCommited += this.OnTransactionCommitedDoSave;
                            this.Store.ElementInstantiated += this.OnElementInstantiated;
                            this.Store.ElementLoaded       += this.OnElementLoaded;
                            this.Store.ElementCreated      += this.OnElementCreated;
                            this.Store.ElementDeleted      += this.OnElementDeleted;
                            this.Store.ElementDeleting     += this.OnElementDeleting;

                            this.RaiseIsOpenChanged();

                            tracer.Info(Resources.PatternManager_OpenedStore, this.StoreFile);
                            //tracer.TraceData(TraceEventType.Verbose, Resources.PatternManager_OpenedStoreEventId, storeFile);
                        }
                        else
                        {
                            this.messageService.ShowError(
                                Properties.Resources.PatternManager_FailedToOpenStore);

                            tracer.Error(Properties.Resources.PatternManager_DeSerializationFailed, this.StoreFile);
                            result.ForEach(msg => tracer.Warn(msg.ToString()));
                        }
                    }
                }
        }
 /// <summary>
 /// Post process gathered information.
 /// </summary>
 /// <param name="alreadyProcessedModels">Already processed models.</param>
 /// <param name="serializationResult">Serialization result.</param>
 /// <param name="store">Store.</param>
 public abstract void DoPostProcess(System.Collections.Generic.List <string> alreadyProcessedModels, Microsoft.VisualStudio.Modeling.SerializationResult serializationResult, Store store);
        /// <summary>
        /// Post process gathered information.
        /// </summary>
        /// <param name="serializationResult">Serialization result.</param>
        /// <param name="store">Store.</param>
        protected virtual void DoPostProcess(Microsoft.VisualStudio.Modeling.SerializationResult serializationResult, Store store)
        {
            foreach (System.Guid domainClassId in this.dictionary.Keys)
            {
                DomainRelationshipInfo relationshipInfo = store.DomainDataDirectory.FindDomainRelationship(domainClassId);
                if (relationshipInfo == null)
                {
                    SerializationUtilities.AddMessage(serializationResult, "", SerializationMessageKind.Warning,
                                                      "Couldn't find domain relationship data. DomainClassId: " + domainClassId, 0, 0);
                    continue;
                }
                foreach (PostProcessRelationshipData data in this.dictionary[domainClassId])
                {
                    // get source and target elements
                    ModelElement source = store.ElementDirectory.FindElement(data.ModelElementSourceId);
                    ModelElement target = store.ElementDirectory.FindElement(data.ModelElementTargetId);
                    if (target == null) // target is link ?
                    {
                        target = store.ElementDirectory.FindElementLink(data.ModelElementTargetId);
                    }

                    if (source == null)
                    {
                        SerializationUtilities.AddMessage(serializationResult, "", SerializationMessageKind.Warning,
                                                          "Couldn't find the source element of the relationship " + relationshipInfo.Name + ". Id of missing element: " + data.ModelElementSourceId, 0, 0);
                        continue;
                    }
                    if (target == null)
                    {
                        SerializationUtilities.AddMessage(serializationResult, "", SerializationMessageKind.Warning,
                                                          "Couldn't find the target element of the relationship " + relationshipInfo.Name + ". Id of missing element: " + data.ModelElementTargetId, 0, 0);
                        continue;
                    }

                    if (data.RelationshipId == System.Guid.Empty)
                    {
                        try
                        {
                            // create new relationship
                            RoleAssignment[] roleAssignments = new RoleAssignment[2];
                            roleAssignments[0] = new RoleAssignment(GetSourceDomainRole(relationshipInfo).Id, source);
                            roleAssignments[1] = new RoleAssignment(GetTargetDomainRole(relationshipInfo).Id, target);

                            store.ElementFactory.CreateElementLink(relationshipInfo, roleAssignments);
                        }
                        catch (System.Exception ex)
                        {
                            SerializationUtilities.AddMessage(serializationResult, "", SerializationMessageKind.Warning,
                                                              "Error while creating new instance of relationship " + relationshipInfo.Name + " between " + source.Id.ToString() + " and " + target.Id.ToString() + ".  Exception: " + ex.Message, 0, 0);
                        }
                    }
                    else
                    {
                        try
                        {
                            // assign role players
                            ElementLink instance = store.ElementDirectory.FindElementLink(data.RelationshipId);
                            if (instance == null)
                            {
                                throw new System.ArgumentNullException("Post processing failed because relationship (id=" + data.RelationshipId + ") is not in the store");
                            }

                            DomainRoleInfo.SetRolePlayer(instance, GetSourceDomainRole(relationshipInfo).Id, source);
                            DomainRoleInfo.SetRolePlayer(instance, GetTargetDomainRole(relationshipInfo).Id, target);

                            this.trackDictionary.Remove(instance.Id);
                        }
                        catch (System.Exception ex)
                        {
                            SerializationUtilities.AddMessage(serializationResult, "", SerializationMessageKind.Warning,
                                                              "Error while creating the instance of the relationship " + relationshipInfo.Name + " (id: " + data.RelationshipId + ") between " + source.Id.ToString() + " and " + target.Id.ToString() + ".  Exception: " + ex.Message, 0, 0);
                        }
                    }
                }
            }

            foreach (Guid id in this.trackDictionary)
            {
                ModelElement m = store.ElementDirectory.FindElement(id);
                if (m != null)
                {
                    m.Delete();
                }
            }
        }