/// <summary>
        /// Creates a new view digram for the pattern model.
        /// </summary>
        /// <param name="patternModel">The pattern model</param>
        /// <param name="docData">The document window data</param>
        /// <returns></returns>
        public static Guid CreateNewViewDiagram(PatternModelSchema patternModel, ModelingDocData docData)
        {
            Guard.NotNull(() => patternModel, patternModel);
            Guard.NotNull(() => docData, docData);

            // Create a new diagram file
            var docView = docData.DocViews.FirstOrDefault() as SingleDiagramDocView;
            PatternModelSchemaDiagram diagram = null;
            patternModel.Store.TransactionManager.DoWithinTransaction(() =>
            {
                diagram = PatternModelSerializationHelper.CreatePatternModelSchemaDiagram(
                    new SerializationResult(),
                    patternModel.Store.DefaultPartition,
                    patternModel.Store.GetRootElement(),
                    string.Empty);
            });
            if (diagram != null)
            {
                SetCurrentDiagram(docView, diagram, patternModel.Pattern);

                FixUpDiagram(patternModel, patternModel.Pattern, diagram.Id.ToString(),
                    PresentationViewsSubject.GetPresentation(patternModel.Pattern).OfType<ShapeElement>());

                return diagram.Id;
            }

            return Guid.Empty;
        }
        private MemoryStream InternalSaveModel2(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string fileName, global::System.Text.Encoding encoding, bool writeOptionalPropertiesWithDefaultValue)
        {
            #region Check Parameters
            global::System.Diagnostics.Debug.Assert(serializationResult != null);
            global::System.Diagnostics.Debug.Assert(modelRoot != null);
            global::System.Diagnostics.Debug.Assert(!serializationResult.Failed);
            #endregion

            serializationResult.Encoding = encoding;

            DslModeling::DomainXmlSerializerDirectory directory = this.GetDirectory(modelRoot.Store);


            global::System.IO.MemoryStream newFileContent = new global::System.IO.MemoryStream();

            DslModeling::SerializationContext serializationContext = new DslModeling::SerializationContext(directory, fileName, serializationResult);
            this.InitializeSerializationContext(modelRoot.Partition, serializationContext, false);
            // MonikerResolver shouldn't be required in Save operation, so not calling SetupMonikerResolver() here.
            serializationContext.WriteOptionalPropertiesWithDefaultValue = writeOptionalPropertiesWithDefaultValue;
            global::System.Xml.XmlWriterSettings settings = PatternModelSerializationHelper.Instance.CreateXmlWriterSettings(serializationContext, false, encoding);
            using (global::System.Xml.XmlWriter writer = global::System.Xml.XmlWriter.Create(newFileContent, settings))
            {
                this.WriteRootElement(serializationContext, modelRoot, writer);
            }

            return newFileContent;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PatternModelCloner"/> class.
        /// </summary>
        /// <param name="sourcePatternModel">The source pattern line.</param>
        /// <param name="sourceVersion">The source version.</param>
        /// <param name="targetPatternModel">The target pattern line.</param>
        public PatternModelCloner(PatternModelSchema sourcePatternModel, Version sourceVersion, PatternModelSchema targetPatternModel)
        {
            Guard.NotNull(() => sourcePatternModel, sourcePatternModel);
            Guard.NotNull(() => sourceVersion, sourceVersion);
            Guard.NotNull(() => targetPatternModel, targetPatternModel);

            this.SourcePatternModel = sourcePatternModel;
            this.SourceVersion = sourceVersion;
            this.TargetPatternModel = targetPatternModel;
        }
Beispiel #4
0
        /// <summary>
        /// Saves the model.
        /// </summary>
        /// <param name="modelRoot">The model root.</param>
        /// <param name="stream">The stream.</param>
        internal void SaveModel(PatternModelSchema modelRoot, Stream stream)
        {
            Guard.NotNull(() => modelRoot, modelRoot);
            Guard.NotNull(() => stream, stream);

            var context = new DslModeling.SerializationContext(GetDirectory(modelRoot.Store));

            this.InitializeSerializationContext(modelRoot.Partition, context, false);

            var settings = CreateXmlWriterSettings(context, false, Encoding.UTF8);

            using (var writer = XmlWriter.Create(stream, settings))
            {
                this.WriteRootElement(context, modelRoot, writer);
            }
        }
		private static void WriteChildElements(DslModeling::SerializationContext serializationContext, PatternModelSchema element, global::System.Xml.XmlWriter writer)
		{
			// PatternModelHasPattern
			PatternModelHasPattern thePatternModelHasPatternInstance = PatternModelHasPattern.GetLinkToPattern(element);
			if (!serializationContext.Result.Failed && thePatternModelHasPatternInstance != null)
			{
				global::System.Type typeofPatternModelHasPattern = typeof(PatternModelHasPattern);
				if (thePatternModelHasPatternInstance.GetType() != typeofPatternModelHasPattern)
				{	// Derived relationships will be serialized in full-form.
					DslModeling::DomainClassXmlSerializer derivedRelSerializer = serializationContext.Directory.GetSerializer(thePatternModelHasPatternInstance.GetDomainClass().Id);
					global::System.Diagnostics.Debug.Assert(derivedRelSerializer != null, "Cannot find serializer for " + thePatternModelHasPatternInstance.GetDomainClass().Name + "!");			
					derivedRelSerializer.Write(serializationContext, thePatternModelHasPatternInstance, writer);
				}
				else
				{	// No need to serialize the relationship itself, just serialize the role-player directly.
					DslModeling::ModelElement targetElement = thePatternModelHasPatternInstance.PatternSchema;
					DslModeling::DomainClassXmlSerializer targetSerializer = serializationContext.Directory.GetSerializer(targetElement.GetDomainClass().Id);
					global::System.Diagnostics.Debug.Assert(targetSerializer != null, "Cannot find serializer for " + targetElement.GetDomainClass().Name + "!");			
					targetSerializer.Write(serializationContext, targetElement, writer);
				}
			}
	
		}
		internal virtual void SaveModelAndDiagram(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string modelFileName, PatternModelSchemaDiagram diagram, string diagramFileName, global::System.Text.Encoding encoding, bool writeOptionalPropertiesWithDefaultValue)
		{
			#region Check Parameters
			if (serializationResult == null)
				throw new global::System.ArgumentNullException("serializationResult");
			if (string.IsNullOrEmpty(modelFileName))
				throw new global::System.ArgumentNullException("modelFileName");
			if (diagram == null)
				throw new global::System.ArgumentNullException("diagram");
			if (string.IsNullOrEmpty(diagramFileName))
				throw new global::System.ArgumentNullException("diagramFileName");
			#endregion
	
			if (serializationResult.Failed)
				return;
	
			// Save the model file first
			using (global::System.IO.MemoryStream modelFileContent = this.InternalSaveModel(serializationResult, modelRoot, modelFileName, encoding, writeOptionalPropertiesWithDefaultValue))
			{
				if (serializationResult.Failed)
					return;
	
				using (global::System.IO.MemoryStream diagramFileContent = this.InternalSaveDiagram(serializationResult, diagram, diagramFileName, encoding, writeOptionalPropertiesWithDefaultValue))
				{
					if (!serializationResult.Failed)
					{
						// Only write the contents if there's no error encountered during serialization.
						if (modelFileContent != null)
						{
							using (global::System.IO.FileStream fileStream = new global::System.IO.FileStream(modelFileName, global::System.IO.FileMode.Create, global::System.IO.FileAccess.Write, global::System.IO.FileShare.None))
							{
								using (global::System.IO.BinaryWriter writer = new global::System.IO.BinaryWriter(fileStream, encoding))
								{
									writer.Write(modelFileContent.ToArray());
								}
							}
						}
						if (diagramFileContent != null)
						{
							using (global::System.IO.FileStream fileStream = new global::System.IO.FileStream(diagramFileName, global::System.IO.FileMode.Create, global::System.IO.FileAccess.Write, global::System.IO.FileShare.None))
							{
								using (global::System.IO.BinaryWriter writer = new global::System.IO.BinaryWriter(fileStream, encoding))
								{
									writer.Write(diagramFileContent.ToArray());
								}
							}
						}
					}
				}
			}
		}
		/// <summary>
		/// Saves the given diagram to the given file, with default encoding (UTF-8).
		/// </summary>
		/// <param name="serializationResult">Stores serialization result from the save operation.</param>
		/// <param name="modelRoot">PatternModelSchema instance to be saved.</param>
		/// <param name="modelFileName">Name of the file in which the CanonicalSampleRoot instance will be saved.</param>
		/// <param name="diagram">PatternModelSchemaDiagram to be saved.</param>
		/// <param name="diagramFileName">Name of the file in which the diagram will be saved.</param>
		/// <param name="writeOptionalPropertiesWithDefaultValue">Whether optional properties with default value will be saved.</param>
		internal virtual void SaveModelAndDiagram(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string modelFileName, PatternModelSchemaDiagram diagram, string diagramFileName, bool writeOptionalPropertiesWithDefaultValue)
		{
			this.SaveModelAndDiagram(serializationResult, modelRoot, modelFileName, diagram, diagramFileName, global::System.Text.Encoding.UTF8, writeOptionalPropertiesWithDefaultValue);
		}
		/// <summary>
		/// Saves the given diagram to the given file, with default encoding (UTF-8), and optional properties with default value will not
		/// be written out.
		/// </summary>
		/// <param name="serializationResult">Stores serialization result from the save operation.</param>
		/// <param name="modelRoot">PatternModelSchema instance to be saved.</param>
		/// <param name="modelFileName">Name of the file in which the CanonicalSampleRoot instance will be saved.</param>
		/// <param name="diagram">PatternModelSchemaDiagram to be saved.</param>
		/// <param name="diagramFileName">Name of the file in which the diagram will be saved.</param>
		internal virtual void SaveModelAndDiagram(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string modelFileName, PatternModelSchemaDiagram diagram, string diagramFileName)
		{
			this.SaveModelAndDiagram(serializationResult, modelRoot, modelFileName, diagram, diagramFileName, global::System.Text.Encoding.UTF8, false);
		}
		/// <summary>
		/// Helper method to create and initialize a new PatternModelSchema.
		/// </summary>
		internal protected virtual PatternModelSchema CreateModelHelper(DslModeling::Partition modelPartition)
		{
			PatternModelSchema model = new PatternModelSchema(modelPartition);
			return model;
		}
Beispiel #10
0
        public PatternModelSchema LoadModel(DslModeling.Store store, Stream stream, DslModeling.ISchemaResolver schemaResolver, DslModeling.ISerializerLocator serializerLocator)
        {
            Guard.NotNull(() => store, store);
            Guard.NotNull(() => stream, stream);

            if (!store.DefaultPartition.Store.TransactionActive)
            {
                throw new InvalidOperationException(PatternModelDomainModel.SingletonResourceManager.GetString("MissingTransaction"));
            }

            var directory           = this.GetDirectory(store.DefaultPartition.Store);
            var modelRootSerializer = directory.GetSerializer(PatternModelSchema.DomainClassId);
            var serializationResult = new DslModeling.SerializationResult();

            Debug.Assert(modelRootSerializer != null, @"Cannot find serializer for PatternModel!");

            if (modelRootSerializer != null)
            {
                PatternModelSchema modelRoot = null;

                var serializationContext = new DslModeling.SerializationContext(directory, string.Empty, serializationResult);
                this.InitializeSerializationContext(store.DefaultPartition, serializationContext, true);

                var transactionContext = new DslModeling.TransactionContext();
                transactionContext.Add(DslModeling.SerializationContext.TransactionContextKey, serializationContext);

                using (var tx = store.DefaultPartition.Store.TransactionManager.BeginTransaction(Resources.PatternModelSerializationHelper_TransactionDescriptionLoadingModel, true, transactionContext))
                {
                    try
                    {
                        var settings = PatternModelSerializationHelper.Instance.CreateXmlReaderSettings(serializationContext, false);

                        using (var reader = XmlReader.Create(stream, settings))
                        {
                            reader.Read();
                            Encoding encoding;
                            if (this.TryGetEncoding(reader, out encoding))
                            {
                                serializationResult.Encoding = encoding;
                            }

                            DslModeling.SerializationUtilities.ResolveDomainModels(reader, serializerLocator, store.DefaultPartition.Store);

                            reader.MoveToContent();

                            modelRoot = modelRootSerializer.TryCreateInstance(serializationContext, reader, store.DefaultPartition) as PatternModelSchema;

                            if (modelRoot != null && !serializationResult.Failed)
                            {
                                this.ReadRootElement(serializationContext, modelRoot, reader, schemaResolver);
                            }
                        }
                    }
                    catch (XmlException ex)
                    {
                        DslModeling.SerializationUtilities.AddMessage(serializationContext, DslModeling.SerializationMessageKind.Error, ex);
                    }

                    if (modelRoot == null && !serializationResult.Failed)
                    {
                        modelRoot = this.CreateModelHelper(store.DefaultPartition);
                    }

                    if (tx.IsActive)
                    {
                        tx.Commit();
                    }
                }

                // Set tracking properties
                ResetTrackingProperties(store);

                return(modelRoot);
            }

            return(null);
        }
        internal static PatternModelSchemaDiagram CreatePatternModelSchemaDiagram(DslModeling.SerializationResult serializationResult, DslModeling.Partition diagramPartition, PatternModelSchema modelRoot, string diagramId)
        {
            var diagram = new PatternModelSchemaDiagram(
                diagramPartition.Store,
                new DslModeling.PropertyAssignment(DslDiagrams.Diagram.NameDomainPropertyId, diagramId),
                new DslModeling.PropertyAssignment(
                    DslModeling.ElementFactory.IdPropertyAssignment,
                    !string.IsNullOrEmpty(diagramId) ? new Guid(diagramId) : Guid.NewGuid()));

            diagram.ModelElement = modelRoot;
            diagram.PostDeserialization(true);
            DoCheckForOrphanedShapes(diagram, serializationResult);

            return diagram;
        }
        /// <summary>
        /// Saves the model.
        /// </summary>
        /// <param name="modelRoot">The model root.</param>
        /// <param name="stream">The stream.</param>
        internal void SaveModel(PatternModelSchema modelRoot, Stream stream)
        {
            Guard.NotNull(() => modelRoot, modelRoot);
            Guard.NotNull(() => stream, stream);

            var context = new DslModeling.SerializationContext(GetDirectory(modelRoot.Store));

            this.InitializeSerializationContext(modelRoot.Partition, context, false);

            var settings = CreateXmlWriterSettings(context, false, Encoding.UTF8);
            using (var writer = XmlWriter.Create(stream, settings))
            {
                this.WriteRootElement(context, modelRoot, writer);
            }
        }
        protected override void Load(string fileName, bool reload)
        {
            Guard.NotNullOrEmpty(() => fileName, fileName);

            var serializationResult      = new SerializationResult();
            PatternModelSchema modelRoot = null;
            var schemaResolver           = new ModelingSchemaResolver(this.ServiceProvider);

            PatternModelDomainModel.EnableDiagramRules(this.Store);
            this.Store.RuleManager.DisableRule(typeof(FixUpDiagram));
            this.Store.RuleManager.EnableRule(typeof(FixUpMultipleDiagram));

            var diagramFileNames =
                Directory.GetFiles(
                    Path.GetDirectoryName(fileName), string.Concat("*", DesignerConstants.ModelExtension, DesignerConstants.DiagramFileExtension));

            // Run migration rules
            this.ExecuteUpgradeRules(fileName, diagramFileNames);

            // Load models
            modelRoot = PatternModelSerializationHelper.Instance.LoadModelAndDiagrams(
                serializationResult,
                this.GetModelPartition(),
                fileName,
                this.GetDiagramPartition(),
                diagramFileNames,
                schemaResolver,
                null /* no load-time validation */,
                this.SerializerLocator);

            this.SuspendErrorListRefresh();

            try
            {
                foreach (SerializationMessage serializationMessage in serializationResult)
                {
                    this.AddErrorListItem(new SerializationErrorListItem(this.ServiceProvider, serializationMessage));
                }
            }
            finally
            {
                this.ResumeErrorListRefresh();
            }

            if (serializationResult.Failed)
            {
                throw new InvalidOperationException(PatternModelDomainModel.SingletonResourceManager.GetString("CannotOpenDocument"));
            }
            else
            {
                this.SetRootElement(modelRoot);

                // Attempt to set the encoding
                if (serializationResult.Encoding != null)
                {
                    this.ModelingDocStore.SetEncoding(serializationResult.Encoding);
                    Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(this.SetDocDataDirty(0)); // Setting the encoding will mark the document as dirty, so clear the dirty flag.
                }
            }

            this.RehydrateModel();
        }
		/// <summary>
		/// This method deserializes all child model elements.
		/// </summary>
		/// <remarks>
		/// The caller will position the reader at the open tag of the first child XML element to deserialized.
		/// This method will read as many child elements as it can. It returns under three circumstances:
		/// 1) When an unknown child XML element is encountered. In this case, this method will position the reader at the 
		///    open tag of the unknown element. This implies that if the first child XML element is unknown, this method 
		///    should return immediately and do nothing.
		/// 2) When all child XML elemnets are read. In this case, the reader will be positioned at the end tag of the parent element.
		/// 3) EOF.
		/// </remarks>
		/// <param name="serializationContext">Serialization context.</param>
		/// <param name="reader">XmlReader to read serialized data from.</param>
		/// <param name="element">In-memory PatternModelSchema instance that will get the deserialized data.</param>
		private static void ReadChildElements(DslModeling::SerializationContext serializationContext, PatternModelSchema element, global::System.Xml.XmlReader reader)
		{
			if (!serializationContext.Result.Failed && !reader.EOF && reader.NodeType == global::System.Xml.XmlNodeType.Element)
			{
				if (DslModeling::DomainRoleInfo.GetElementLinks<PatternModelHasPattern> (element, PatternModelHasPattern.PatternModelSchemaDomainRoleId).Count == 0)
				{
					DslModeling::DomainClassXmlSerializer newPatternSchemaOfPatternModelHasPatternSerializer = serializationContext.Directory.GetSerializer(PatternSchema.DomainClassId);
					global::System.Diagnostics.Debug.Assert(newPatternSchemaOfPatternModelHasPatternSerializer != null, "Cannot find serializer for PatternSchema!");
					PatternSchema newPatternSchemaOfPatternModelHasPattern = newPatternSchemaOfPatternModelHasPatternSerializer.TryCreateInstance(serializationContext, reader, element.Partition) as PatternSchema;
					if (newPatternSchemaOfPatternModelHasPattern != null)
					{
						element.Pattern = newPatternSchemaOfPatternModelHasPattern;
							
						DslModeling::DomainClassXmlSerializer targetSerializer = serializationContext.Directory.GetSerializer (newPatternSchemaOfPatternModelHasPattern.GetDomainClass().Id);	
						global::System.Diagnostics.Debug.Assert (targetSerializer != null, "Cannot find serializer for " + newPatternSchemaOfPatternModelHasPattern.GetDomainClass().Name + "!");
						targetSerializer.Read(serializationContext, newPatternSchemaOfPatternModelHasPattern, reader);
					}
					else
					{
						DslModeling::DomainRelationshipXmlSerializer newPatternModelHasPatternSerializer = serializationContext.Directory.GetSerializer(PatternModelHasPattern.DomainClassId) as DslModeling::DomainRelationshipXmlSerializer;
						global::System.Diagnostics.Debug.Assert(newPatternModelHasPatternSerializer != null, "Cannot find serializer for PatternModelHasPattern!");
						PatternModelHasPattern newPatternModelHasPattern = newPatternModelHasPatternSerializer.TryCreateDerivedInstance (serializationContext, reader, element.Partition) as PatternModelHasPattern;
						if (newPatternModelHasPattern != null)
						{
							DslModeling::DomainRoleInfo.SetRolePlayer (newPatternModelHasPattern, PatternModelHasPattern.PatternModelSchemaDomainRoleId, element);
							DslModeling::DomainClassXmlSerializer targetSerializer = serializationContext.Directory.GetSerializer (newPatternModelHasPattern.GetDomainClass().Id);	
							global::System.Diagnostics.Debug.Assert (targetSerializer != null, "Cannot find serializer for " + newPatternModelHasPattern.GetDomainClass().Name + "!");
							targetSerializer.Read(serializationContext, newPatternModelHasPattern, reader);
						}
					}
				}
			}
		}
Beispiel #15
0
        private void LoadDiagram(
            DslModeling.SerializationResult serializationResult,
            DslModeling.Partition diagramPartition,
            PatternModelSchema modelRoot,
            DslModeling.DomainXmlSerializerDirectory directory,
            DslModeling.DomainClassXmlSerializer diagramSerializer,
            string diagramFileName,
            DslModeling.ISchemaResolver schemaResolver,
            ValidationController validationController)
        {
            if (diagramSerializer != null)
            {
                PatternModelSchemaDiagram diagram = null;

                using (FileStream fileStream = File.OpenRead(diagramFileName))
                {
                    var serializationContext = new DslModeling.SerializationContext(directory, fileStream.Name, serializationResult);
                    this.InitializeSerializationContext(diagramPartition, serializationContext, true);
                    var transactionContext = new DslModeling.TransactionContext();
                    transactionContext.Add(DslModeling.SerializationContext.TransactionContextKey, serializationContext);

                    using (var transaction = diagramPartition.Store.TransactionManager.BeginTransaction(Resources.PatternModelSerializationHelper_TransactionDescriptionLoadingDiagram, true, transactionContext))
                    {
                        // Ensure there is some content in the file. Blank (or almost blank, to account for encoding header bytes, etc.)
                        // files will cause a new diagram to be created and returned
                        if (fileStream.Length > 5)
                        {
                            var settings = PatternModelSerializationHelper.Instance.CreateXmlReaderSettings(serializationContext, false);
                            try
                            {
                                using (var reader = XmlReader.Create(fileStream, settings))
                                {
                                    reader.MoveToContent();
                                    diagram = diagramSerializer.TryCreateInstance(serializationContext, reader, diagramPartition) as PatternModelSchemaDiagram;
                                    if (diagram != null)
                                    {
                                        this.ReadRootElement(serializationContext, diagram, reader, schemaResolver);
                                    }
                                }
                            }
                            catch (XmlException ex)
                            {
                                DslModeling.SerializationUtilities.AddMessage(serializationContext, DslModeling.SerializationMessageKind.Error, ex);
                            }

                            if (serializationResult.Failed)
                            {
                                // Serialization error encountered, rollback the transaction.
                                diagram = null;
                                transaction.Rollback();
                            }
                        }

                        if (diagram == null && !serializationResult.Failed)
                        {
                            // Create diagram if it doesn't exist
                            if (diagramFileName.EndsWith(DesignerConstants.DiagramFileExtension, StringComparison.OrdinalIgnoreCase))
                            {
                                diagram = new PatternModelSchemaDiagram(
                                    diagramPartition.Store,
                                    new DslModeling.PropertyAssignment(DslDiagrams.Diagram.NameDomainPropertyId, Guid.NewGuid()));
                            }
                            else
                            {
                                diagram = this.CreateDiagramHelper(diagramPartition, modelRoot);
                            }
                        }

                        if (transaction.IsActive)
                        {
                            transaction.Commit();
                        }
                    } // End inner Tx

                    // Do load-time validation if a ValidationController is provided.
                    if (!serializationResult.Failed && validationController != null)
                    {
                        using (new SerializationValidationObserver(serializationResult, validationController))
                        {
                            validationController.Validate(diagramPartition, ValidationCategories.Load);
                        }
                    }
                }

                if (diagram != null)
                {
                    if (!serializationResult.Failed)
                    {   // Succeeded.
                        diagram.ModelElement = modelRoot;
                        diagram.PostDeserialization(true);
                        this.CheckForOrphanedShapes(diagram, serializationResult);
                    }
                    else
                    {   // Failed.
                        diagram.PostDeserialization(false);
                    }
                }
            }
        }
Beispiel #16
0
        internal static PatternModelSchemaDiagram CreatePatternModelSchemaDiagram(DslModeling.SerializationResult serializationResult, DslModeling.Partition diagramPartition, PatternModelSchema modelRoot, string diagramId)
        {
            var diagram = new PatternModelSchemaDiagram(
                diagramPartition.Store,
                new DslModeling.PropertyAssignment(DslDiagrams.Diagram.NameDomainPropertyId, diagramId),
                new DslModeling.PropertyAssignment(
                    DslModeling.ElementFactory.IdPropertyAssignment,
                    !string.IsNullOrEmpty(diagramId) ? new Guid(diagramId) : Guid.NewGuid()));

            diagram.ModelElement = modelRoot;
            diagram.PostDeserialization(true);
            DoCheckForOrphanedShapes(diagram, serializationResult);

            return(diagram);
        }
Beispiel #17
0
        private MemoryStream InternalSaveModel2(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string fileName, global::System.Text.Encoding encoding, bool writeOptionalPropertiesWithDefaultValue)
        {
            #region Check Parameters
            global::System.Diagnostics.Debug.Assert(serializationResult != null);
            global::System.Diagnostics.Debug.Assert(modelRoot != null);
            global::System.Diagnostics.Debug.Assert(!serializationResult.Failed);
            #endregion

            serializationResult.Encoding = encoding;

            DslModeling::DomainXmlSerializerDirectory directory = this.GetDirectory(modelRoot.Store);


            global::System.IO.MemoryStream newFileContent = new global::System.IO.MemoryStream();

            DslModeling::SerializationContext serializationContext = new DslModeling::SerializationContext(directory, fileName, serializationResult);
            this.InitializeSerializationContext(modelRoot.Partition, serializationContext, false);
            // MonikerResolver shouldn't be required in Save operation, so not calling SetupMonikerResolver() here.
            serializationContext.WriteOptionalPropertiesWithDefaultValue = writeOptionalPropertiesWithDefaultValue;
            global::System.Xml.XmlWriterSettings settings = PatternModelSerializationHelper.Instance.CreateXmlWriterSettings(serializationContext, false, encoding);
            using (global::System.Xml.XmlWriter writer = global::System.Xml.XmlWriter.Create(newFileContent, settings))
            {
                this.WriteRootElement(serializationContext, modelRoot, writer);
            }

            return(newFileContent);
        }
 /// <summary>
 /// Tailors the given pattern line, making this pattern line tailored.
 /// </summary>
 internal void Tailor(PatternModelSchema basePatternModel, Version baseVersion)
 {
     this.ClonerFactory(basePatternModel, baseVersion, this).Clone();
     this.ApplyTailoringCustomizationRules();
 }
		/// <summary>
		/// Saves the given model root to the given file, with default encoding (UTF-8), and optional properties with default value will not
		/// be written out.
		/// </summary>
		/// <param name="serializationResult">Stores serialization result from the save operation.</param>
		/// <param name="modelRoot">PatternModelSchema instance to be saved.</param>
		/// <param name="fileName">Name of the file in which the PatternModelSchema instance will be saved.</param>
		public virtual void SaveModel(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string fileName)
		{
			this.SaveModel(serializationResult, modelRoot, fileName, global::System.Text.Encoding.UTF8, false);
		}
        internal void SaveModelAndDiagrams(
            DslModeling.SerializationResult serializationResult,
            PatternModelSchema modelRoot,
            string modelFileName,
            Dictionary<string, PatternModelSchemaDiagram> diagrams,
            Encoding encoding,
            bool writeOptionalPropertiesWithDefaultValue)
        {
            Guard.NotNull(() => serializationResult, serializationResult);
            Guard.NotNull(() => modelRoot, modelRoot);
            Guard.NotNullOrEmpty(() => modelFileName, modelFileName);
            Guard.NotNull(() => diagrams, diagrams);
            Guard.NotNull(() => encoding, encoding);

            if (serializationResult.Failed)
            {
                return;
            }

            using (MemoryStream modelFileContent =
                this.InternalSaveModel2(serializationResult, modelRoot, modelFileName, encoding, writeOptionalPropertiesWithDefaultValue))
            {
                if (serializationResult.Failed)
                {
                    return;
                }

                foreach (var diagram in diagrams)
                {
                    using (MemoryStream diagramFileContent =
                        this.InternalSaveDiagram2(serializationResult, diagram.Value, diagram.Key, encoding, writeOptionalPropertiesWithDefaultValue))
                    {
                        if (!serializationResult.Failed)
                        {
                            if (modelFileContent != null)
                            {
                                using (FileStream fileStream = new FileStream(modelFileName, FileMode.Create, FileAccess.Write, FileShare.None))
                                {
                                    using (BinaryWriter writer = new BinaryWriter(fileStream, encoding))
                                    {
                                        writer.Write(modelFileContent.ToArray());
                                    }
                                }
                            }

                            if (diagramFileContent != null)
                            {
                                using (FileStream fileStream = new FileStream(diagram.Key, FileMode.Create, FileAccess.Write, FileShare.None))
                                {
                                    using (BinaryWriter writer = new BinaryWriter(fileStream, encoding))
                                    {
                                        writer.Write(diagramFileContent.ToArray());
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
		/// <summary>
		/// Saves the given model to the given file, with default encoding (UTF-8).
		/// </summary>
		/// <param name="serializationResult">Stores serialization result from the save operation.</param>
		/// <param name="modelRoot">PatternModelSchema instance to be saved.</param>
		/// <param name="fileName">Name of the file in which the PatternModelSchema instance will be saved.</param>
		/// <param name="writeOptionalPropertiesWithDefaultValue">Whether optional properties with default value will be saved.</param>
		public virtual void SaveModel(DslModeling::SerializationResult serializationResult, PatternModelSchema modelRoot, string fileName, bool writeOptionalPropertiesWithDefaultValue)
		{
			this.SaveModel(serializationResult, modelRoot, fileName, global::System.Text.Encoding.UTF8, writeOptionalPropertiesWithDefaultValue);
		}
        private void LoadDiagram(
            DslModeling.SerializationResult serializationResult,
            DslModeling.Partition diagramPartition,
            PatternModelSchema modelRoot,
            DslModeling.DomainXmlSerializerDirectory directory,
            DslModeling.DomainClassXmlSerializer diagramSerializer,
            string diagramFileName,
            DslModeling.ISchemaResolver schemaResolver,
            ValidationController validationController)
        {
            if (diagramSerializer != null)
            {
                PatternModelSchemaDiagram diagram = null;

                using (FileStream fileStream = File.OpenRead(diagramFileName))
                {
                    var serializationContext = new DslModeling.SerializationContext(directory, fileStream.Name, serializationResult);
                    this.InitializeSerializationContext(diagramPartition, serializationContext, true);
                    var transactionContext = new DslModeling.TransactionContext();
                    transactionContext.Add(DslModeling.SerializationContext.TransactionContextKey, serializationContext);

                    using (var transaction = diagramPartition.Store.TransactionManager.BeginTransaction(Resources.PatternModelSerializationHelper_TransactionDescriptionLoadingDiagram, true, transactionContext))
                    {
                        // Ensure there is some content in the file. Blank (or almost blank, to account for encoding header bytes, etc.)
                        // files will cause a new diagram to be created and returned 
                        if (fileStream.Length > 5)
                        {
                            var settings = PatternModelSerializationHelper.Instance.CreateXmlReaderSettings(serializationContext, false);
                            try
                            {
                                using (var reader = XmlReader.Create(fileStream, settings))
                                {
                                    reader.MoveToContent();
                                    diagram = diagramSerializer.TryCreateInstance(serializationContext, reader, diagramPartition) as PatternModelSchemaDiagram;
                                    if (diagram != null)
                                    {
                                        this.ReadRootElement(serializationContext, diagram, reader, schemaResolver);
                                    }
                                }
                            }
                            catch (XmlException ex)
                            {
                                DslModeling.SerializationUtilities.AddMessage(serializationContext, DslModeling.SerializationMessageKind.Error, ex);
                            }

                            if (serializationResult.Failed)
                            {
                                // Serialization error encountered, rollback the transaction.
                                diagram = null;
                                transaction.Rollback();
                            }
                        }

                        if (diagram == null && !serializationResult.Failed)
                        {
                            // Create diagram if it doesn't exist
                            if (diagramFileName.EndsWith(DesignerConstants.DiagramFileExtension, StringComparison.OrdinalIgnoreCase))
                            {
                                diagram = new PatternModelSchemaDiagram(
                                    diagramPartition.Store,
                                    new DslModeling.PropertyAssignment(DslDiagrams.Diagram.NameDomainPropertyId, Guid.NewGuid()));
                            }
                            else
                            {
                                diagram = this.CreateDiagramHelper(diagramPartition, modelRoot);
                            }
                        }

                        if (transaction.IsActive)
                        {
                            transaction.Commit();
                        }
                    } // End inner Tx

                    // Do load-time validation if a ValidationController is provided.
                    if (!serializationResult.Failed && validationController != null)
                    {
                        using (new SerializationValidationObserver(serializationResult, validationController))
                        {
                            validationController.Validate(diagramPartition, ValidationCategories.Load);
                        }
                    }
                }

                if (diagram != null)
                {
                    if (!serializationResult.Failed)
                    {	// Succeeded.
                        diagram.ModelElement = modelRoot;
                        diagram.PostDeserialization(true);
                        this.CheckForOrphanedShapes(diagram, serializationResult);
                    }
                    else
                    {	// Failed.
                        diagram.PostDeserialization(false);
                    }
                }
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PatternModelCloner"/> class.
        /// </summary>
        /// <param name="sourcePatternModel">The source pattern line.</param>
        /// <param name="sourceVersion">The source version.</param>
        /// <param name="targetPatternModel">The target pattern line.</param>
        public PatternModelCloner(PatternModelSchema sourcePatternModel, Version sourceVersion, PatternModelSchema targetPatternModel)
        {
            Guard.NotNull(() => sourcePatternModel, sourcePatternModel);
            Guard.NotNull(() => sourceVersion, sourceVersion);
            Guard.NotNull(() => targetPatternModel, targetPatternModel);

            this.SourcePatternModel = sourcePatternModel;
            this.SourceVersion      = sourceVersion;
            this.TargetPatternModel = targetPatternModel;
        }