From: <mcu...@us...> - 2008-11-19 22:47:21
|
Revision: 1337 http://orm.svn.sourceforge.net/orm/?rev=1337&view=rev Author: mcurland Date: 2008-11-19 22:47:15 +0000 (Wed, 19 Nov 2008) Log Message: ----------- Modified LinqToSql service layer generation based on forum recommendations from John Bailey. refs #364 Incremented version number in preparation for 2008-10 CTP release. refs #193 Modified Paths: -------------- trunk/VersionGenerator.exe.config trunk/XML/DCILtoLINQ/DCILtoLinqAttributeMapping.xslt trunk/XML/DCILtoLINQ/LinqToSqlSettings.xml trunk/XML/DCILtoLINQ/LinqToSqlSettings.xslt Modified: trunk/VersionGenerator.exe.config =================================================================== --- trunk/VersionGenerator.exe.config 2008-11-18 22:29:11 UTC (rev 1336) +++ trunk/VersionGenerator.exe.config 2008-11-19 22:47:15 UTC (rev 1337) @@ -2,7 +2,7 @@ <configuration> <appSettings> <add key="RevisionStartYearMonth" value="2006-01"/> - <add key="ReleaseYearMonth" value="2008-05"/> + <add key="ReleaseYearMonth" value="2008-10"/> <!-- ReleaseType: "CTP" or "RTM" --> <add key="ReleaseType" value="CTP"/> <!-- Changes to the major and/or minor version numbers have extreme effects across every part of the product. --> Modified: trunk/XML/DCILtoLINQ/DCILtoLinqAttributeMapping.xslt =================================================================== --- trunk/XML/DCILtoLINQ/DCILtoLinqAttributeMapping.xslt 2008-11-18 22:29:11 UTC (rev 1336) +++ trunk/XML/DCILtoLINQ/DCILtoLinqAttributeMapping.xslt 2008-11-19 22:47:15 UTC (rev 1337) @@ -131,14 +131,14 @@ <xsl:variable name="setting" select="string($LinqToSqlSettings/opt:ServiceLayer/@Generate)"/> <xsl:choose> <xsl:when test="$setting"> - <xsl:value-of select="$setting='false' or $setting='0'"/> + <xsl:value-of select="$setting='true' or $setting='1'"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="false()"/> </xsl:otherwise> </xsl:choose> </xsl:variable> - <xsl:variable name="GenerateServiceLayer" select="string($GenerateServiceLayerFragment)"/> + <xsl:variable name="GenerateServiceLayer" select="string($GenerateServiceLayerFragment)='true'"/> <xsl:variable name="CreateKeywordFragment"> <xsl:variable name="setting" select="string($LinqToSqlSettings/opt:ServiceLayer/@CreateKeyword)"/> <xsl:choose> @@ -234,7 +234,31 @@ </xsl:otherwise> </xsl:choose> </xsl:variable> - <xsl:variable name="UseTransactionScopes" select="string($UseTransactionScopesFragment)"/> + <xsl:variable name="UseTransactionScopes" select="string($UseTransactionScopesFragment)='true'"/> + <xsl:variable name="UseTransactionFlowFragment"> + <xsl:variable name="setting" select="string($LinqToSqlSettings/opt:ServiceLayer/@UseTransactionFlow)"/> + <xsl:choose> + <xsl:when test="$setting"> + <xsl:value-of select="$setting='true' or $setting='1'"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="false()"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="UseTransactionFlow" select="string($UseTransactionFlowFragment)='true'"/> + <xsl:variable name="OptimizeOperationalMethodsFragment"> + <xsl:variable name="setting" select="string($LinqToSqlSettings/opt:ServiceLayer/@OptimizeOperationalMethods)"/> + <xsl:choose> + <xsl:when test="$setting"> + <xsl:value-of select="$setting='true' or $setting='1'"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="false()"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="OptimizeOperationalMethods" select="string($OptimizeOperationalMethodsFragment)='true'"/> <xsl:variable name="InstanceContextModeFragment"> <xsl:variable name="setting" select="string($LinqToSqlSettings/opt:ServiceLayer/@InstanceContextMode)"/> <xsl:choose> @@ -324,7 +348,7 @@ </xsl:template> <xsl:template name="GenerateOperationContractAttribute"> - <xsl:param name="isOneWay" select="true()"/> + <xsl:param name="isOneWay" select="$OptimizeOperationalMethods"/> <plx:attribute dataTypeName="OperationContract"> <plx:passParam> <plx:binaryOperator type="assignNamed"> @@ -367,13 +391,11 @@ <xsl:variable name="deleteFunctionParameterName" select="concat($parameterEntityNamePrefix,$to,$DeleteKeyword)"/> <!--NOTE: readFunctionName & readFunctionParameterName are more complicated and are not defined here.--> <plx:function visibility="public" name="{$createFunctionName}"> - <xsl:call-template name="GenerateOperationContractAttribute"> - <xsl:with-param name="isOneWay" select="true()"/> - </xsl:call-template> - <xsl:if test="$UseTransactionScopes"> + <xsl:call-template name="GenerateOperationContractAttribute"/> + <xsl:if test="$UseTransactionFlow and not($OptimizeOperationalMethods)"> <plx:attribute dataTypeName="TransactionFlow"> <plx:passParam> - <plx:callStatic dataTypeName="TransactionFlowOption" name="Allowed" type="property"/> + <plx:callStatic dataTypeName="TransactionFlowOption" name="Allowed" type="field"/> </plx:passParam> </plx:attribute> </xsl:if> @@ -433,13 +455,11 @@ </plx:function> </xsl:for-each> <plx:function visibility="public" name="{$updateFunctionName}"> - <xsl:call-template name="GenerateOperationContractAttribute"> - <xsl:with-param name="isOneWay" select="true()"/> - </xsl:call-template> - <xsl:if test="$UseTransactionScopes"> + <xsl:call-template name="GenerateOperationContractAttribute"/> + <xsl:if test="$UseTransactionFlow and not($OptimizeOperationalMethods)"> <plx:attribute dataTypeName="TransactionFlow"> <plx:passParam> - <plx:callStatic dataTypeName="TransactionFlowOption" name="Allowed" type="property"/> + <plx:callStatic dataTypeName="TransactionFlowOption" name="Allowed" type="field"/> </plx:passParam> </plx:attribute> </xsl:if> @@ -447,13 +467,11 @@ <plx:param dataTypeName="{$entityName}" name="{$updateFunctionParameterNameOld}"/> </plx:function> <plx:function name="{$deleteFunctionName}" visibility="public"> - <xsl:call-template name="GenerateOperationContractAttribute"> - <xsl:with-param name="isOneWay" select="true()"/> - </xsl:call-template> - <xsl:if test="$UseTransactionScopes"> + <xsl:call-template name="GenerateOperationContractAttribute"/> + <xsl:if test="$UseTransactionFlow and not($OptimizeOperationalMethods)"> <plx:attribute dataTypeName="TransactionFlow"> <plx:passParam> - <plx:callStatic dataTypeName="TransactionFlowOption" name="Allowed" type="property"/> + <plx:callStatic dataTypeName="TransactionFlowOption" name="Allowed" type="field"/> </plx:passParam> </plx:attribute> </xsl:if> @@ -543,7 +561,7 @@ <plx:attribute dataTypeName="OnSerializingAttribute"/> <plx:attribute dataTypeName="EditorBrowsableAttribute"> <plx:passParam> - <plx:callStatic dataTypeName="EditorBrowsableState" name="Never" type="property"/> + <plx:callStatic dataTypeName="EditorBrowsableState" name="Never" type="field"/> </plx:passParam> </plx:attribute> <plx:param dataTypeName="StreamingContext" name="context"/> @@ -560,7 +578,7 @@ <plx:attribute dataTypeName="OnSerializedAttribute"/> <plx:attribute dataTypeName="EditorBrowsableAttribute"> <plx:passParam> - <plx:callStatic dataTypeName="EditorBrowsableState" name="Never" type="property"/> + <plx:callStatic dataTypeName="EditorBrowsableState" name="Never" type="field"/> </plx:passParam> </plx:attribute> <plx:param dataTypeName="StreamingContext" name="context"/> @@ -577,7 +595,7 @@ <plx:attribute dataTypeName="OnDeserializingAttribute"/> <plx:attribute dataTypeName="EditorBrowsableAttribute"> <plx:passParam> - <plx:callStatic dataTypeName="EditorBrowsableState" name="Never" type="property"/> + <plx:callStatic dataTypeName="EditorBrowsableState" name="Never" type="field"/> </plx:passParam> </plx:attribute> <plx:param dataTypeName="StreamingContext" name="context"/> @@ -1791,7 +1809,7 @@ <plx:nameRef name="InstanceContextMode"/> </plx:left> <plx:right> - <plx:callStatic dataTypeName="InstanceContextMode" name="{$InstanceContextMode}" type="property"/> + <plx:callStatic dataTypeName="InstanceContextMode" name="{$InstanceContextMode}" type="field"/> </plx:right> </plx:binaryOperator> </plx:passParam> @@ -2195,7 +2213,7 @@ <plx:nameRef name="InstanceContextMode"/> </plx:left> <plx:right> - <plx:callStatic dataTypeName="InstanceContextMode" name="{$InstanceContextMode}" type="property"/> + <plx:callStatic dataTypeName="InstanceContextMode" name="{$InstanceContextMode}" type="field"/> </plx:right> </plx:binaryOperator> </plx:passParam> Modified: trunk/XML/DCILtoLINQ/LinqToSqlSettings.xml =================================================================== --- trunk/XML/DCILtoLINQ/LinqToSqlSettings.xml 2008-11-18 22:29:11 UTC (rev 1336) +++ trunk/XML/DCILtoLINQ/LinqToSqlSettings.xml 2008-11-19 22:47:15 UTC (rev 1337) @@ -1,17 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> <LinqToSqlSettings xmlns="http://schemas.neumont.edu/ORM/2008-04/LinqToSql/Settings"> <!--These settings affect LinqToSql generators, but modifications here - have no effect until the .ORM file is regenerated. To force regenerationt, right + have no effect until the .ORM file is regenerated. To force regeneration, right click the parent .ORM file in the Solution Explorer and choose 'Run Custom Tool'. The schema file at the end this settings file is designed to help you customize your settings. For any of the settings areas, click immediately after the element - name and click space to see a list of individual attributes.--> + name and press space to see a list of individual attributes.--> <!--Change connection string properties here--> <ConnectionString DataSource="." SettingsProperty="" DatabaseName="" /> <!--Change basic name generation settings--> <NameParts /> - <!--Change WCF name generation settings--> - <ServiceLayer /> + <!--Change WCF service layer generation settings.--> + <ServiceLayer Generate="true" /> <!--Inline settings schema, do not modify--> <xs:schema targetNamespace="http://schemas.neumont.edu/ORM/2008-04/LinqToSql/Settings" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="LinqToSqlSettings"> @@ -43,27 +43,27 @@ <xs:complexType> <xs:attribute name="DataContextClassSuffix" type="NamePartType" default="DataContext"> <xs:annotation> - <xs:documentation>The text appended to the name of the generated class that is derived from System.Data.Linq.DataContext</xs:documentation> + <xs:documentation>The text appended to the name of the generated class that is derived from System.Data.Linq.DataContext. Default='DataContext'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="DataContextTableSuffix" type="NamePartType" default="Table"> <xs:annotation> - <xs:documentation>The text appended to the names of typed table getters in a DataContext class.</xs:documentation> + <xs:documentation>The text appended to the names of typed table getters in a DataContext class. Default='Table'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="CollectionSuffix" type="NamePartType" default="Collection"> <xs:annotation> - <xs:documentation>The text appended to the names of typed EntitySet properties.</xs:documentation> + <xs:documentation>The text appended to the names of typed EntitySet properties. Default='Collection'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="AssociationReferenceSuffix" type="NamePartType" default="Reference"> <xs:annotation> - <xs:documentation>The text appended to the names of typed properties used for association navigation (the source or target of a foreign key).</xs:documentation> + <xs:documentation>The text appended to the names of typed properties used for association navigation (the source or target of a foreign key). Default='Reference'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="PrivateFieldPrefix" type="NamePartType" default="_"> <xs:annotation> - <xs:documentation>The text prepended to private field names.</xs:documentation> + <xs:documentation>The text prepended to private field names. Default='_'</xs:documentation> </xs:annotation> </xs:attribute> </xs:complexType> @@ -72,47 +72,62 @@ <xs:complexType> <xs:attribute name="Generate" type="xs:boolean" default="false"> <xs:annotation> - <xs:documentation>Determines whether or not the generator should include WCF DataContract attributes and ServiceContract calls.</xs:documentation> + <xs:documentation>Determines whether or not the generator should include WCF DataContract attributes and ServiceContract calls. Default=false</xs:documentation> </xs:annotation> </xs:attribute> + <xs:attribute name="UseTransactionScopes" type="xs:boolean" default="true"> + <xs:annotation> + <xs:documentation>Determines whether or not the generator should use Transaction Scopes in the operational methods. Default=true</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="UseTransactionFlow" type="xs:boolean" default="false"> + <xs:annotation> + <xs:documentation>Determines whether or not the generator should support transaction flow from the client in the WCF contract. Default=false</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="OptimizeOperationalMethods" type="xs:boolean" default="false"> + <xs:annotation> + <xs:documentation>Determines whether or not the generator should mark operational methods as one way in the contract. Transaction Flow is not used if set to true. Default=false</xs:documentation> + </xs:annotation> + </xs:attribute> <xs:attribute name="CreateKeyword" type="NamePartType" default="Insert"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'create' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'create' service methods in the WCF service contract. Default='Insert'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="ReadKeyword" type="NamePartType" default="Select"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'read' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'read' service methods in the WCF service contract. Default='Select'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="UpdateKeyword" type="NamePartType" default="Update"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'update' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'update' service methods in the WCF service contract. Default='Update'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="DeleteKeyword" type="NamePartType" default="Delete"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'delete' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'delete' service methods in the WCF service contract. Default='Delete'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="PreferredIdKeyword" type="NamePartType" default="PreferredIdentifier"> <xs:annotation> - <xs:documentation>The text appended to the name of service methods used to select by the preferred identifier.</xs:documentation> + <xs:documentation>The text appended to the name of service methods used to select by the preferred identifier. Default='PreferredIdentifier'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="ServiceNameSuffix" type="NamePartType" default="Service"> <xs:annotation> - <xs:documentation>The text appended to the name of service contract interfaces.</xs:documentation> + <xs:documentation>The text appended to the name of service contract interfaces. Default='Service'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="InitializeFunctionName" type="NamePartType" default="Initialize"> <xs:annotation> - <xs:documentation>If WCF service is generated, this specifes the function name for initializing EntitySet members for serialization.</xs:documentation> + <xs:documentation>If WCF service is generated, this specifes the function name for initializing EntitySet members for serialization. Default='Initialize'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="InstanceContextMode" default="PerCall"> <xs:annotation> - <xs:documentation>Determines the InstanceContextMode used with the ServiceBehavior attribute.</xs:documentation> + <xs:documentation>Determines the InstanceContextMode used with the ServiceBehavior attribute. Default='PerCall'</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:token"> @@ -133,4 +148,4 @@ </xs:restriction> </xs:simpleType> </xs:schema> -</LinqToSqlSettings> \ No newline at end of file +</LinqToSqlSettings> Modified: trunk/XML/DCILtoLINQ/LinqToSqlSettings.xslt =================================================================== --- trunk/XML/DCILtoLINQ/LinqToSqlSettings.xslt 2008-11-18 22:29:11 UTC (rev 1336) +++ trunk/XML/DCILtoLINQ/LinqToSqlSettings.xslt 2008-11-19 22:47:15 UTC (rev 1337) @@ -7,17 +7,17 @@ <xsl:template match="/"> <LinqToSqlSettings xmlns="http://schemas.neumont.edu/ORM/2008-04/LinqToSql/Settings"> <xsl:comment>These settings affect LinqToSql generators, but modifications here - have no effect until the .ORM file is regenerated. To force regenerationt, right - click the parent .ORM file in the Solution Explorer and choose 'Run Custom Tool'. + have no effect until the .ORM file is regenerated. To force regeneration, right + click the parent .ORM file in the Solution Explorer and choose 'Run Custom Tool'. The schema file at the end this settings file is designed to help you customize your settings. For any of the settings areas, click immediately after the element - name and click space to see a list of individual attributes.</xsl:comment> + name and press space to see a list of individual attributes.</xsl:comment> <xsl:comment>Change connection string properties here</xsl:comment> <ConnectionString DataSource="." SettingsProperty="" DatabaseName=""/> <xsl:comment>Change basic name generation settings</xsl:comment> <NameParts/> - <xsl:comment>Change WCF name generation settings</xsl:comment> - <ServiceLayer/> + <xsl:comment>Change WCF service layer generation settings</xsl:comment> + <ServiceLayer Generate="true"/> <xsl:comment>Inline settings schema, do not modify</xsl:comment> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.neumont.edu/ORM/2008-04/LinqToSql/Settings" @@ -51,27 +51,27 @@ <xs:complexType> <xs:attribute name="DataContextClassSuffix" type="NamePartType" default="DataContext"> <xs:annotation> - <xs:documentation>The text appended to the name of the generated class that is derived from System.Data.Linq.DataContext</xs:documentation> + <xs:documentation>The text appended to the name of the generated class that is derived from System.Data.Linq.DataContext. Default='DataContext'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="DataContextTableSuffix" type="NamePartType" default="Table"> <xs:annotation> - <xs:documentation>The text appended to the names of typed table getters in a DataContext class.</xs:documentation> + <xs:documentation>The text appended to the names of typed table getters in a DataContext class. Default='Table'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="CollectionSuffix" type="NamePartType" default="Collection"> <xs:annotation> - <xs:documentation>The text appended to the names of typed EntitySet properties.</xs:documentation> + <xs:documentation>The text appended to the names of typed EntitySet properties. Default='Collection'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="AssociationReferenceSuffix" type="NamePartType" default="Reference"> <xs:annotation> - <xs:documentation>The text appended to the names of typed properties used for association navigation (the source or target of a foreign key).</xs:documentation> + <xs:documentation>The text appended to the names of typed properties used for association navigation (the source or target of a foreign key). Default='Reference'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="PrivateFieldPrefix" type="NamePartType" default="_"> <xs:annotation> - <xs:documentation>The text prepended to private field names.</xs:documentation> + <xs:documentation>The text prepended to private field names. Default='_'</xs:documentation> </xs:annotation> </xs:attribute> </xs:complexType> @@ -80,47 +80,62 @@ <xs:complexType> <xs:attribute name="Generate" type="xs:boolean" default="false"> <xs:annotation> - <xs:documentation>Determines whether or not the generator should include WCF DataContract attributes and ServiceContract calls.</xs:documentation> + <xs:documentation>Determines whether or not the generator should include WCF DataContract attributes and ServiceContract calls. Default=false</xs:documentation> </xs:annotation> </xs:attribute> + <xs:attribute name="UseTransactionScopes" type="xs:boolean" default="true"> + <xs:annotation> + <xs:documentation>Determines whether or not the generator should use Transaction Scopes in the operational methods. Default=true</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="UseTransactionFlow" type="xs:boolean" default="false"> + <xs:annotation> + <xs:documentation>Determines whether or not the generator should support transaction flow from the client in the WCF contract. Default=false</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="OptimizeOperationalMethods" type="xs:boolean" default="false"> + <xs:annotation> + <xs:documentation>Determines whether or not the generator should mark operational methods as one way in the contract. Transaction Flow is not used if set to true. Default=false</xs:documentation> + </xs:annotation> + </xs:attribute> <xs:attribute name="CreateKeyword" type="NamePartType" default="Insert"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'create' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'create' service methods in the WCF service contract. Default='Insert'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="ReadKeyword" type="NamePartType" default="Select"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'read' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'read' service methods in the WCF service contract. Default='Select'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="UpdateKeyword" type="NamePartType" default="Update"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'update' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'update' service methods in the WCF service contract. Default='Update'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="DeleteKeyword" type="NamePartType" default="Delete"> <xs:annotation> - <xs:documentation>The text prepended to the name of 'delete' service methods in the WCF service contract.</xs:documentation> + <xs:documentation>The text prepended to the name of 'delete' service methods in the WCF service contract. Default='Delete'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="PreferredIdKeyword" type="NamePartType" default="PreferredIdentifier"> <xs:annotation> - <xs:documentation>The text appended to the name of service methods used to select by the preferred identifier.</xs:documentation> + <xs:documentation>The text appended to the name of service methods used to select by the preferred identifier. Default='PreferredIdentifier'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="ServiceNameSuffix" type="NamePartType" default="Service"> <xs:annotation> - <xs:documentation>The text appended to the name of service contract interfaces.</xs:documentation> + <xs:documentation>The text appended to the name of service contract interfaces. Default='Service'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="InitializeFunctionName" type="NamePartType" default="Initialize"> <xs:annotation> - <xs:documentation>If WCF service is generated, this specifes the function name for initializing EntitySet members for serialization.</xs:documentation> + <xs:documentation>If WCF service is generated, this specifes the function name for initializing EntitySet members for serialization. Default='Initialize'</xs:documentation> </xs:annotation> </xs:attribute> <xs:attribute name="InstanceContextMode" default="PerCall"> <xs:annotation> - <xs:documentation>Determines the InstanceContextMode used with the ServiceBehavior attribute.</xs:documentation> + <xs:documentation>Determines the InstanceContextMode used with the ServiceBehavior attribute. Default='PerCall'</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:token"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2008-12-11 03:37:19
|
Revision: 1343 http://orm.svn.sourceforge.net/orm/?rev=1343&view=rev Author: mcurland Date: 2008-12-11 03:37:16 +0000 (Thu, 11 Dec 2008) Log Message: ----------- Fix display filter problems with extension error filters (the orm prefix was written regardless of model) and initial creation of TaskItem for filtered errors (errors filtered on load did not appear in the Error List when reenabled). refs #319 Also modified ModelError and NamedElementDictionary deserialization fixup listeners to support multiple invocations from extension models. This allows extension domain models to generate names and validate errors after the ORM core model is fully validated. Modified Paths: -------------- trunk/ORM2CommandLineTest/ORMTaskItem.cs trunk/ORMModel/Framework/DeserializationManager.cs trunk/ORMModel/Framework/NamedElementDictionary.cs trunk/ORMModel/ObjectModel/ModelError.cs trunk/ORMModel/ObjectModel/ModelErrorDisplayFilter.cs trunk/ORMModel/ObjectModel/ORMCore.DeserializationFixupListeners.cs trunk/ORMModel/ObjectModel/ORMModel.cs Modified: trunk/ORM2CommandLineTest/ORMTaskItem.cs =================================================================== --- trunk/ORM2CommandLineTest/ORMTaskItem.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORM2CommandLineTest/ORMTaskItem.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -1,10 +1,9 @@ #region Using directives - using System; using System.Collections.Generic; using System.Text; +using Neumont.Tools.Modeling; using Neumont.Tools.ORM.ObjectModel; - #endregion namespace Neumont.Tools.ORM.SDK.TestEngine Modified: trunk/ORMModel/Framework/DeserializationManager.cs =================================================================== --- trunk/ORMModel/Framework/DeserializationManager.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORMModel/Framework/DeserializationManager.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -207,7 +207,10 @@ TElement typedElement = element as TElement; if (typedElement != null) { - ElementCollection.Add(typedElement); + if (VerifyElementType(element)) + { + ElementCollection.Add(typedElement); + } } } void INotifyElementAdded.ElementAdded(ModelElement element) @@ -260,6 +263,20 @@ protected virtual void PhaseCompleted(Store store) { } + /// <summary> + /// Verify type information about the provided element. This filter is applied + /// after the <paramref name="element"/> is known to be of type <typeparamref name="TElement"/>. + /// Although the <see cref="ModelElement"/> instance is provided, no properties or + /// relationships generally associated with a fully constructed element are available + /// at this point. The only reliable information is available through <see cref="M:ModelElement.GetClassInfo"/> + /// and <see cref="P:ModelElement.Store"/>. + /// </summary> + /// <param name="element">The element to verify</param> + /// <returns><see langword="true"/> to process the element.</returns> + protected virtual bool VerifyElementType(ModelElement element) + { + return true; + } #endregion // DeserializationFixupListener specific } #endregion // DeserializationFixupListener class Modified: trunk/ORMModel/Framework/NamedElementDictionary.cs =================================================================== --- trunk/ORMModel/Framework/NamedElementDictionary.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORMModel/Framework/NamedElementDictionary.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -914,11 +914,12 @@ /// ensures that the name dictionaries are correctly populated /// after a model deserialization is completed. /// </summary> - /// <param name="implicitFixupPhase">A fixup phase for adding implicitly + /// <param name="fixupPhase">A fixup phase for adding implicitly /// created elements and populating the name dictionaries</param> - public static IDeserializationFixupListener GetFixupListener(int implicitFixupPhase) + /// <param name="elementDomainModel">The required domain model type for processed elements</param> + public static IDeserializationFixupListener GetFixupListener(int fixupPhase, DomainModelInfo elementDomainModel) { - return new DeserializationFixupListener(implicitFixupPhase); + return new DeserializationFixupListener(fixupPhase, elementDomainModel); } /// <summary> /// A listener class to validate and/or populate the ModelError @@ -926,14 +927,21 @@ /// </summary> private sealed class DeserializationFixupListener : DeserializationFixupListener<INamedElementDictionaryLink> { + private DomainModelInfo myDomainModelFilter; /// <summary> /// Create a new NamedElementDictionary.DeserializationFixupListener /// </summary> - /// <param name="implicitFixupPhase">A fixup phase for adding implicitly - /// created elements and populating the name dictionaries</param> - public DeserializationFixupListener(int implicitFixupPhase) : base(implicitFixupPhase) + /// <param name="fixupPhase">The phase number for this listener</param> + /// <param name="elementDomainModel">The required domain model type for processed elements</param> + public DeserializationFixupListener(int fixupPhase, DomainModelInfo elementDomainModel) : base(fixupPhase) { + myDomainModelFilter = elementDomainModel; } + protected override bool VerifyElementType(ModelElement element) + { + DomainModelInfo modelFilter = myDomainModelFilter; + return (modelFilter != null) ? element.GetDomainClass().DomainModel == modelFilter : true; + } /// <summary> /// Add this element to the appropriate dictionary, and allow /// IDuplicateNameCollectionManager implementations to validate Modified: trunk/ORMModel/ObjectModel/ModelError.cs =================================================================== --- trunk/ORMModel/ObjectModel/ModelError.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORMModel/ObjectModel/ModelError.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -381,16 +381,15 @@ return; } - IORMToolTaskProvider provider = (error.Store as IORMToolServices).TaskProvider; - IORMToolTaskItem newTask = provider.CreateTask(); - newTask.ElementLocator = error as IRepresentModelElements; - newTask.Text = error.ErrorText; - Debug.Assert(error.TaskData == null); - error.TaskData = newTask; - ModelErrorDisplayFilter filter = error.Model.ModelErrorDisplayFilter; if (filter == null || filter.ShouldDisplay(error)) { + IORMToolTaskProvider provider = (error.Store as IORMToolServices).TaskProvider; + IORMToolTaskItem newTask = provider.CreateTask(); + newTask.ElementLocator = error as IRepresentModelElements; + newTask.Text = error.ErrorText; + Debug.Assert(error.TaskData == null); + error.TaskData = newTask; provider.AddTask(newTask); } } @@ -406,15 +405,15 @@ #endregion // ModelError specific #region Deserialization Fixup /// <summary> - /// Return a deserialization fixup listener. The listener - /// validates all model errors and adds errors to the task provider. + /// Return a deserialization fixup listener. Return an error fixup listener + /// for errors in the specified domain model. The fixup listener validates + /// all model errors and adds errors to the task provider. /// </summary> - public static IDeserializationFixupListener FixupListener + /// <param name="fixupPhase">The phase for this listener</param> + /// <param name="errorDomainModel">The domain model that owns the errors</param> + public static IDeserializationFixupListener GetFixupListener(int fixupPhase, DomainModelInfo errorDomainModel) { - get - { - return new ModelErrorFixupListener(); - } + return new ModelErrorFixupListener(fixupPhase, errorDomainModel); } /// <summary> /// A listener class to validate and/or populate the ModelError @@ -422,12 +421,16 @@ /// </summary> private sealed class ModelErrorFixupListener : DeserializationFixupListener<IModelErrorOwner> { + private DomainModelInfo myDomainModelFilter; /// <summary> /// Create a new ModelErrorFixupListener /// </summary> - public ModelErrorFixupListener() - : base((int)ORMDeserializationFixupPhase.ValidateErrors) + /// <param name="fixupPhase">The phase for this listener</param> + /// <param name="errorDomainModel">The domain model that owns the errors</param> + public ModelErrorFixupListener(int fixupPhase, DomainModelInfo errorDomainModel) + : base(fixupPhase) { + myDomainModelFilter = errorDomainModel; } /// <summary> /// Defer to the IModelErrorOwner.ValidateErrors method @@ -441,19 +444,29 @@ element.ValidateErrors(notifyAdded); } /// <summary> - /// Add all model errors in the specific store to - /// the task list. + /// Verify that the element belongs to the correct domain model /// </summary> - /// <param name="store">The context store</param> + protected override bool VerifyElementType(ModelElement element) + { + DomainModelInfo modelFilter = myDomainModelFilter; + return (modelFilter != null) ? element.GetDomainClass().DomainModel == modelFilter : true; + } + /// <summary> + /// Add all model errors in the specific store that match the specified domain + /// model to the task provider. + /// </summary> protected sealed override void PhaseCompleted(Store store) { + DomainModelInfo modelFilter = myDomainModelFilter; IList<ModelHasError> errorLinks = store.ElementDirectory.FindElements<ModelHasError>(); int linkCount = errorLinks.Count; for (int i = 0; i < linkCount; ++i) { ModelHasError errorLink = errorLinks[i]; ModelError error = errorLink.Error; - if (!errorLink.IsDeleted && !error.IsDeleted) + if (!errorLink.IsDeleted && + !error.IsDeleted && + (modelFilter == null || error.GetDomainClass().DomainModel == modelFilter)) { // Make sure the text is up to date error.GenerateErrorText(); Modified: trunk/ORMModel/ObjectModel/ModelErrorDisplayFilter.cs =================================================================== --- trunk/ORMModel/ObjectModel/ModelErrorDisplayFilter.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORMModel/ObjectModel/ModelErrorDisplayFilter.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -70,6 +70,7 @@ #region ModelErrorDisplayFilter class public partial class ModelErrorDisplayFilter : IXmlSerializable { + #region Xml serialization names private const string XMLCategoriesElement = "Categories"; private const string XMLIncludedErrorsElement = "IncludedErrors"; private const string XMLExcludedErrorsElement = "ExcludedErrors"; @@ -77,7 +78,8 @@ private const string XMLPrefix = "orm"; private const string XMLModelReferenceAttribute = "ref"; private const char ListDelimiter = ' '; - + #endregion // Xml serialization names + #region Member variables private bool myIncludedErrorsChanged = false; private bool myExcludedErrorsChanged = false; private bool myExcludedCategoriesChanged = false; @@ -87,7 +89,8 @@ private Dictionary<Type, Type> myIncludedErrors; private Dictionary<Type, Type> myExcludedErrors; private Dictionary<Type, Type> myExcludedCategories; - + #endregion // Member variables + #region Private Helper Methods private Dictionary<Type, Type> ExcludedCategoriesDictionary { get @@ -95,10 +98,10 @@ if (!myExcludedCategoriesChanged) { myExcludedCategories = ParseList(myExcludedCategoriesList, myExcludedCategories); + } + return myExcludedCategories; } - return myExcludedCategories; } - } private Dictionary<Type, Type> IncludedErrorsDictionary { get @@ -106,10 +109,10 @@ if (!myIncludedErrorsChanged) { myIncludedErrors = ParseList(myIncludedErrorsList, myIncludedErrors); + } + return myIncludedErrors; } - return myIncludedErrors; } - } private Dictionary<Type, Type> ExcludedErrorsDictionary { get @@ -117,10 +120,10 @@ if (!myExcludedErrorsChanged) { myExcludedErrors = ParseList(myExcludedErrorsList, myExcludedErrors); + } + return myExcludedErrors; } - return myExcludedErrors; } - } private Dictionary<Type, Type> ParseList(string list, Dictionary<Type, Type> cache) { if (list.Length != 0) @@ -151,14 +154,14 @@ return myExcludedCategoriesList; } private void SetExcludedCategoriesValue(string newValue) - { + { myExcludedCategoriesList = newValue; Dictionary<Type, Type> cache = ExcludedCategoriesDictionary; if (cache != null) - { + { cache.Clear(); - } } + } private string GetExcludedErrorsValue() { return myExcludedErrorsList; @@ -185,7 +188,41 @@ cache.Clear(); } } + private string GetValue(string myList, ref Dictionary<Type, Type> myCache) + { + string retVal = myList; + Dictionary<Type, Type> cache; + if ((cache = myCache) == null) + { + cache = myCache = new Dictionary<Type, Type>(); + } + //write the cache to a string + retVal = string.Empty; + foreach (Type type in cache.Keys) + { + retVal += type.FullName + ListDelimiter; + } + return retVal; + } + private Type GetCategory(Type error) + { + Type category = null; + object[] atributes = error.GetCustomAttributes(typeof(ModelErrorDisplayFilterAttribute), true); + foreach (object o in atributes) + { + ModelErrorDisplayFilterAttribute attribute = o as ModelErrorDisplayFilterAttribute; + if (attribute != null) + { + category = attribute.Category; + break; + } + } + + return category; + } + #endregion // Private Helper Methods + #region Public accessor methods /// <summary> /// Determines if an error should be displayed or not. /// </summary> @@ -217,20 +254,20 @@ if (exclude) { if (!(dictionary.ContainsKey(category))) - { + { myExcludedCategoriesChanged = true; - dictionary.Add(category, null); + dictionary.Add(category, null); + } } - } else - { + { if ((dictionary.ContainsKey(category))) - { + { myExcludedCategoriesChanged = true; dictionary.Remove(category); - } } } + } /// <summary> /// Toggles an error type to include or exclude. /// </summary> @@ -252,7 +289,7 @@ //flip whether to include or exclude the error in the sub-list exclude = !exclude; - } + } else { dictionary = ExcludedErrorsDictionary; @@ -264,7 +301,7 @@ } if (exclude) - { + { if (!(dictionary.ContainsKey(error))) { dictionary.Add(error, null); @@ -300,12 +337,12 @@ Dictionary<Type, Type> dictionary = IncludedErrorsDictionary; return !(dictionary != null && dictionary.ContainsKey(error)); } - else - { + else + { Dictionary<Type, Type> dictionary = ExcludedErrorsDictionary; return (dictionary != null && dictionary.ContainsKey(error)); - } } + } /// <summary> /// Commit any changes pending from calls to ToggleCategory or ToggleError. /// </summary> @@ -328,49 +365,54 @@ myExcludedErrorsChanged = false; myIncludedErrorsChanged = false; } - private string GetValue(string myList, ref Dictionary<Type, Type> myCache) + /// <summary> + /// returns string.Empty + /// </summary> + /// <returns></returns> + public override string ToString() { - string retVal = myList; - Dictionary<Type, Type> cache; - if ((cache = myCache) == null) + return ResourceStrings.ModelErrorDisplayFilteredText; + } + #endregion // Public accessor methods + #region Deserialization Fixup + /// <summary> + /// Return a deserialization fixup listener. The listener + /// verifies that the settings are not empty. + /// </summary> + public static IDeserializationFixupListener FixupListener + { + get { - cache = myCache = new Dictionary<Type, Type>(); + return new DisplayFilterFixupListener(); } - //write the cache to a string - retVal = string.Empty; - foreach (Type type in cache.Keys) - { - retVal += type.FullName + ListDelimiter; - } - return retVal; } - private Type GetCategory(Type error) + /// <summary> + /// Validate display filter contents + /// </summary> + private sealed class DisplayFilterFixupListener : DeserializationFixupListener<ModelErrorDisplayFilter> { - Type category = null; - - object[] atributes = error.GetCustomAttributes(typeof(ModelErrorDisplayFilterAttribute), true); - foreach (object o in atributes) + /// <summary> + /// DisplayFilterFixupListener constructor + /// </summary> + public DisplayFilterFixupListener() + : base((int)ORMDeserializationFixupPhase.ValidateErrors) { - ModelErrorDisplayFilterAttribute attribute = o as ModelErrorDisplayFilterAttribute; - if (attribute != null) + } + /// <summary> + /// Process objectification elements + /// </summary> + protected sealed override void ProcessElement(ModelErrorDisplayFilter element, Store store, INotifyElementAdded notifyAdded) + { + if (!element.IsDeleted) { - category = attribute.Category; - break; + if (string.IsNullOrEmpty(element.myExcludedCategoriesList) && string.IsNullOrEmpty(element.myExcludedErrorsList) && string.IsNullOrEmpty(element.myIncludedErrorsList)) + { + element.Delete(); + } } } - - return category; } - - /// <summary> - /// returns string.Empty - /// </summary> - /// <returns></returns> - public override string ToString() - { - return ResourceStrings.ModelErrorDisplayFilteredText; - } - + #endregion // Deserialization Fixup #region IXmlSerializable Implementation XmlSchema IXmlSerializable.GetSchema() { @@ -445,7 +487,17 @@ { namespaces = new Dictionary<string, string>(); } - namespaces.Add(serializationInfo.GetCustomElementNamespaces()[0, 1], serializationInfo.GetType().Namespace); + string defaultPrefix = serializationInfo.DefaultElementPrefix; + string[,] namespaceInfo = serializationInfo.GetCustomElementNamespaces(); + int infoCount = namespaceInfo.GetLength(0); + for (int i = 0; i < infoCount; ++i) + { + if (namespaceInfo[i, 0] == defaultPrefix) + { + namespaces.Add(namespaceInfo[i, 1], serializationInfo.GetType().Namespace); + break; + } + } } } if (namespaces != null) @@ -467,40 +519,60 @@ } void IXmlSerializable.WriteXml(XmlWriter writer) { - string XmlNamespace = ORMCoreDomainModel.XmlNamespace; - - writer.WriteStartElement(XMLPrefix, XMLElement, XmlNamespace); + writer.WriteStartElement(XMLPrefix, XMLElement, ORMCoreDomainModel.XmlNamespace); writer.WriteAttributeString("id", "_" + this.Id); writer.WriteAttributeString(XMLModelReferenceAttribute, "_" + Model.Id.ToString("D")); - writer.WriteStartElement(XMLPrefix, XMLCategoriesElement, XmlNamespace); - string[] types = myExcludedCategoriesList.Split(new char[] { ListDelimiter }, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < types.Length; ++i) - { - string type = types[i]; - writer.WriteElementString(XMLPrefix, type.Substring(type.LastIndexOf('.') + 1), XmlNamespace, string.Empty); - } + Dictionary<string, string[]> namespaceMap = null; + WriteTypeElements(writer, XMLCategoriesElement, myExcludedCategoriesList, ref namespaceMap); + WriteTypeElements(writer, XMLIncludedErrorsElement, myIncludedErrorsList, ref namespaceMap); + WriteTypeElements(writer, XMLExcludedErrorsElement, myExcludedErrorsList, ref namespaceMap); writer.WriteEndElement(); - - writer.WriteStartElement(XMLPrefix, XMLIncludedErrorsElement, XmlNamespace); - types = myIncludedErrorsList.Split(new char[] { ListDelimiter }, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < types.Length; ++i) + } + /// <summary> + /// Write the elements for the given container information + /// </summary> + /// <param name="writer">The current writer</param> + /// <param name="containerElementName">The name of the container element to write</param> + /// <param name="typeList">A space-delimited list of type names</param> + /// <param name="xmlNamespaceMap">A map associating CLR namespace names with XML prefix and namespace values</param> + private void WriteTypeElements(XmlWriter writer, string containerElementName, string typeList, ref Dictionary<string, string[]> xmlNamespaceMap) + { + string[] types = typeList.Split(new char[] { ListDelimiter }, StringSplitOptions.RemoveEmptyEntries); + if (types != null && types.Length != 0) { - string type = types[i]; - writer.WriteElementString(XMLPrefix, type.Substring(type.LastIndexOf('.') + 1), XmlNamespace, string.Empty); + writer.WriteStartElement(XMLPrefix, containerElementName, ORMCoreDomainModel.XmlNamespace); + for (int i = 0; i < types.Length; ++i) + { + string typeName = types[i]; + int namespaceDelimiterPosition = typeName.LastIndexOf('.'); + string[] xmlNames = (xmlNamespaceMap ?? (xmlNamespaceMap = BuildXmlNamespaceMap()))[typeName.Substring(0, namespaceDelimiterPosition)]; + writer.WriteElementString(xmlNames[0], typeName.Substring(typeName.LastIndexOf('.') + 1), xmlNames[1], string.Empty); } - writer.WriteEndElement(); - - writer.WriteStartElement(XMLPrefix, XMLExcludedErrorsElement, XmlNamespace); - types = myExcludedErrorsList.Split(new char[] { ListDelimiter }, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < types.Length; ++i) + writer.WriteEndElement(); + } + } + /// <summary> + /// Build a dictionary mapping a type namespace to an XML prefix and namespace + /// </summary> + private Dictionary<string, string[]> BuildXmlNamespaceMap() + { + Dictionary<string, string[]> retVal = new Dictionary<string,string[]>(); + foreach (ICustomSerializedDomainModel serializationInfo in Utility.EnumerateDomainModels<ICustomSerializedDomainModel>(Store.DomainModels)) { - string type = types[i]; - writer.WriteElementString(XMLPrefix, type.Substring(type.LastIndexOf('.') + 1), XmlNamespace, string.Empty); + string defaultPrefix = serializationInfo.DefaultElementPrefix; + string[,] namespaceInfo = serializationInfo.GetCustomElementNamespaces(); + int infoCount = namespaceInfo.GetLength(0); + for (int i = 0; i < infoCount; ++i) + { + if (namespaceInfo[i, 0] == defaultPrefix) + { + retVal.Add(serializationInfo.GetType().Namespace, new string[]{defaultPrefix, namespaceInfo[i, 1]}); + break; + } } - writer.WriteEndElement(); - - writer.WriteEndElement(); + } + return retVal; } #endregion // IXmlSerializable Implementation } Modified: trunk/ORMModel/ObjectModel/ORMCore.DeserializationFixupListeners.cs =================================================================== --- trunk/ORMModel/ObjectModel/ORMCore.DeserializationFixupListeners.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORMModel/ObjectModel/ORMCore.DeserializationFixupListeners.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using Microsoft.VisualStudio.Modeling; using Neumont.Tools.Modeling; namespace Neumont.Tools.ORM.ObjectModel @@ -26,13 +27,14 @@ /// <summary> /// Implements <see cref="IDeserializationFixupListenerProvider.DeserializationFixupListenerCollection"/> /// </summary> - protected static IEnumerable<IDeserializationFixupListener> DeserializationFixupListenerCollection + protected IEnumerable<IDeserializationFixupListener> DeserializationFixupListenerCollection { get { + DomainModelInfo contextDomainModel = DomainModelInfo; yield return SetComparisonConstraint.FixupListener; yield return SetConstraint.FixupListener; - yield return NamedElementDictionary.GetFixupListener((int)ORMDeserializationFixupPhase.ValidateElementNames); + yield return NamedElementDictionary.GetFixupListener((int)ORMDeserializationFixupPhase.ValidateElementNames, contextDomainModel); yield return SubtypeFact.FixupListener; yield return FactType.NameFixupListener; yield return FactType.UnaryFixupListener; @@ -43,9 +45,10 @@ yield return ORMModel.DataTypesFixupListener; yield return ObjectType.IsIndependentFixupListener; yield return ObjectType.PreferredIdentificationPathFixupListener; - yield return ModelError.FixupListener; + yield return ModelError.GetFixupListener((int)ORMDeserializationFixupPhase.ValidateErrors, contextDomainModel); yield return NameAlias.FixupListener; yield return NameGenerator.FixupListener; + yield return ModelErrorDisplayFilter.FixupListener; } } IEnumerable<IDeserializationFixupListener> IDeserializationFixupListenerProvider.DeserializationFixupListenerCollection Modified: trunk/ORMModel/ObjectModel/ORMModel.cs =================================================================== --- trunk/ORMModel/ObjectModel/ORMModel.cs 2008-12-05 04:41:19 UTC (rev 1342) +++ trunk/ORMModel/ObjectModel/ORMModel.cs 2008-12-11 03:37:16 UTC (rev 1343) @@ -1701,7 +1701,7 @@ /// returned elements will all come from a /// generated metarole collections. /// </summary> - protected abstract IList<ORMNamedElement> DuplicateElements { get;} + protected abstract IList<ModelElement> DuplicateElements { get;} /// <summary> /// Get the text to display the duplicate error information. Replacement /// field {0} is replaced by the model name, field {1} is replaced by the @@ -1709,12 +1709,26 @@ /// </summary> protected abstract string ErrorFormatText { get;} /// <summary> + /// Get the name of an element. The default implementation uses + /// the <see cref="DomainClassInfo.NameDomainProperty"/> to determine + /// the name. Derived classes can produce a more efficient implementation + /// if they know the actual element type. + /// </summary> + /// <param name="element"></param> + /// <returns></returns> + protected virtual string GetElementName(ModelElement element) + { + DomainPropertyInfo nameProperty = element.GetDomainClass().NameDomainProperty; + Debug.Assert(nameProperty != null, "Duplicate names should only be checked on elements with names"); + return nameProperty.GetValue(element) as string; + } + /// <summary> /// Verify that all of the duplicate elements attached to /// this error actually have the same name. /// </summary> /// <returns>true if validation succeeded. false is /// returned if testElement does not have a name specified</returns> - public bool ValidateDuplicates(ORMNamedElement testElement) + public bool ValidateDuplicates(ModelElement testElement) { return ValidateDuplicates(testElement, null); } @@ -1727,9 +1741,9 @@ /// <param name="duplicates">Pre-fetched duplicates, or null</param> /// <returns>true if validation succeeded. false is /// returned if testElement does not have a name specified</returns> - private bool ValidateDuplicates(ORMNamedElement testElement, IList<ORMNamedElement> duplicates) + private bool ValidateDuplicates(ModelElement testElement, IList<ModelElement> duplicates) { - string testName = testElement.Name; + string testName = GetElementName(testElement); if (testName.Length > 0) { if (duplicates == null) @@ -1739,8 +1753,8 @@ int duplicatesCount = duplicates.Count; for (int i = 0; i < duplicatesCount; ++i) { - ORMNamedElement compareTo = duplicates[i]; - if (compareTo != testElement && compareTo.Name != testElement.Name) + ModelElement compareTo = duplicates[i]; + if (compareTo != testElement && GetElementName(compareTo) != testName) { return false; } @@ -1756,8 +1770,8 @@ /// </summary> public override void GenerateErrorText() { - IList<ORMNamedElement> elements = DuplicateElements; - string elementName = (elements.Count != 0) ? (elements[0]).Name : string.Empty; + IList<ModelElement> elements = DuplicateElements; + string elementName = (elements.Count != 0) ? GetElementName(elements[0]) : string.Empty; ORMModel model = Model; string modelName = (model != null) ? model.Name : string.Empty; string newText = string.Format(CultureInfo.InvariantCulture, ErrorFormatText, modelName, elementName); @@ -1784,19 +1798,23 @@ /// <summary> /// Implements <see cref="IRepresentModelElements.GetRepresentedElements"/> /// </summary> - protected new ORMNamedElement[] GetRepresentedElements() + protected new ModelElement[] GetRepresentedElements() { // Pick up all roles played directly by this element. This // will get ObjectTypeCollection, FactTypeCollection, etc, but // not the owning model. These are non-aggregating roles. - IList<ORMNamedElement> elements = DuplicateElements; + IList<ModelElement> elements = DuplicateElements; int count = elements.Count; if (count == 0) { return null; } - ORMNamedElement[] retVal = new ORMNamedElement[count]; - elements.CopyTo(retVal, 0); + ModelElement[] retVal = elements as ModelElement[]; + if (retVal == null) + { + retVal = new ModelElement[count]; + elements.CopyTo(retVal, 0); + } return retVal; } ModelElement[] IRepresentModelElements.GetRepresentedElements() @@ -1830,7 +1848,7 @@ { if (!IsDeleted) { - IList<ORMNamedElement> duplicates = DuplicateElements; + IList<ModelElement> duplicates = DuplicateElements; // Note that existing name error links are validated when // the element is loaded via the IDuplicateNameCollectionManager // implementation(s) on the model itself. All remaining duplicate @@ -1868,7 +1886,7 @@ /// Get the duplicate elements represented by this DuplicateNameError /// </summary> /// <returns>ObjectTypeCollection</returns> - protected override IList<ORMNamedElement> DuplicateElements + protected override IList<ModelElement> DuplicateElements { get { @@ -1876,6 +1894,13 @@ } } /// <summary> + /// Provide an efficient name lookup + /// </summary> + protected override string GetElementName(ModelElement element) + { + return ((ORMNamedElement)element).Name; + } + /// <summary> /// Get the text to display the duplicate error information. Replacement /// field {0} is replaced by the model name, field {1} is replaced by the /// element name. @@ -1916,14 +1941,21 @@ /// Get the duplicate elements represented by this DuplicateNameError /// </summary> /// <returns>ConstraintCollection</returns> - protected override IList<ORMNamedElement> DuplicateElements + protected override IList<ModelElement> DuplicateElements { get { - return ConstraintCollection; + return ConstraintCollection as IList<ModelElement>; } } /// <summary> + /// Provide an efficient name lookup + /// </summary> + protected override string GetElementName(ModelElement element) + { + return ((ORMNamedElement)element).Name; + } + /// <summary> /// Get the text to display the duplicate error information. Replacement /// field {0} is replaced by the model name, field {1} is replaced by the /// element name. @@ -2136,11 +2168,18 @@ /// <summary> /// Returns the list of DuplicateElements /// </summary> - protected override IList<ORMNamedElement> DuplicateElements + protected override IList<ModelElement> DuplicateElements { get { return RecognizedPhraseCollection.ToArray(); } } /// <summary> + /// Provide an efficient name lookup + /// </summary> + protected override string GetElementName(ModelElement element) + { + return ((ORMNamedElement)element).Name; + } + /// <summary> /// Text to be displayed when an error is thrown. ///</summary> //TODO: Add this to the ResourceStrings collection This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-01-23 23:22:09
|
Revision: 1353 http://orm.svn.sourceforge.net/orm/?rev=1353&view=rev Author: mcurland Date: 2009-01-23 21:57:35 +0000 (Fri, 23 Jan 2009) Log Message: ----------- Absorption of a FactType needs to be reconsidered by the absorption gateway when an objectification is added/deleted. Adding and removing roles on objectified FactTypes allowed invalid FactTypes through the gateway. This was manifested by an aborted transaction (null reference exception) or more subtle errors of not readding columns for a reduction from a ternary to a functional binary FactType. refs #327 Also did some minor reorder of debinarization of a unary to avoid creating an implied FactType structure that is destroyed almost immediately. refs #367 Modified Paths: -------------- trunk/ORMModel/ObjectModel/Objectification.cs trunk/ORMModel/ObjectModel/UnaryBinarization.cs trunk/ORMModel/Shell/ORMReadingEditor.cs trunk/ORMModel/Shell/ReadingEditor.cs trunk/Oial/ORMOialBridge/ORMElementGateway.cs trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.cs trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.xml Modified: trunk/ORMModel/ObjectModel/Objectification.cs =================================================================== --- trunk/ORMModel/ObjectModel/Objectification.cs 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/ORMModel/ObjectModel/Objectification.cs 2009-01-23 21:57:35 UTC (rev 1353) @@ -742,14 +742,16 @@ ObjectType rolePlayer = link.RolePlayer; FactType factType; Objectification objectification; - // Note if the roleplayer is removed, then the links all go away - // automatically. There is no additional work to do or checks to make. - if (rolePlayer.IsDeleted || rolePlayer.IsDeleting) + if (rolePlayer.IsImplicitBooleanValue) { - if (rolePlayer.IsImplicitBooleanValue && - null != (factType = role.FactType) && + // The standard code to debinarize a FactType detaches the role first + // so that we can distinguish here whether we need to rebuild an implied + // FactType for the role. If the role is deleting before the implied value, + // then assume the implied value will be deleted right after this call as well. + if (null != (factType = role.FactType) && null != (objectification = factType.Objectification)) { + bool removeRolePlayer = role.IsDeleting && !(rolePlayer.IsDeleted || rolePlayer.IsDeleting); foreach (RoleBase otherRoleBase in factType.RoleCollection) { // Find the old unary role and modify its implied FactType @@ -757,7 +759,7 @@ FactType impliedFactType; Role otherRole; if (otherRoleBase != role && - !role.IsDeleting && + !otherRoleBase.IsDeleting && null != (objectifiedUnaryRole = (otherRole = otherRoleBase.Role).ObjectifiedUnaryRole) && !objectifiedUnaryRole.IsDeleting && null != (impliedFactType = objectifiedUnaryRole.FactType)) @@ -775,6 +777,8 @@ } ObjectType nestingType = objectification.NestingType; CreateImpliedFactTypeForRole(model, nestingType, otherRole, objectification, false); + // Note that even if this role is not currently being deleted it will be soon. There + // is no reason to keep these. Anything we create here will simply be deleted if (!role.IsDeleting && role.Proxy == null) { CreateImpliedFactTypeForRole(model, nestingType, role, objectification, false); @@ -782,9 +786,14 @@ break; } } + if (removeRolePlayer) + { + rolePlayer.Delete(); + } } } - else if (null != (factType = role.FactType)) + else if (!(rolePlayer.IsDeleted || rolePlayer.IsDeleting) && + null != (factType = role.FactType)) { SubtypeMetaRole subtypeRole; ObjectifiedUnaryRole objectifiedUnaryRole; Modified: trunk/ORMModel/ObjectModel/UnaryBinarization.cs =================================================================== --- trunk/ORMModel/ObjectModel/UnaryBinarization.cs 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/ORMModel/ObjectModel/UnaryBinarization.cs 2009-01-23 21:57:35 UTC (rev 1353) @@ -237,12 +237,23 @@ ruleManager.DisableRule(typeof(ObjectTypePlaysRoleDeletedRuleClass)); ruleDisabled = true; } - implicitBooleanValueType.Delete(); if (deleteImplicitBooleanRole) { + // We delete the role first so that rules do not + // try to recreate and implied fact type for this rule + // if it is part of an objectified FactType. implicitBooleanRole.Delete(); --roleCount; + if (!implicitBooleanValueType.IsDeleted) + { + // The Objectification.RolePlayerDeletingRule rule will delet this automatically + implicitBooleanValueType.Delete(); + } } + else + { + implicitBooleanValueType.Delete(); + } } finally { @@ -319,7 +330,7 @@ contextInfo.Remove(ORMModel.AllowDuplicateNamesKey); } } - if (!ValidateConstraints(unaryRole, implicitBooleanRole) || !ValidateImplictBooleanValueType(implicitBooleanRole.RolePlayer)) + if (!ValidateConstraints(unaryRole, implicitBooleanRole) || !ValidateImplicitBooleanValueType(implicitBooleanRole.RolePlayer)) { LinkedElementCollection<RoleBase> roles = factType.RoleCollection; DebinarizeUnary(roles, false, notifyAdded); @@ -416,7 +427,7 @@ /// Checks that only one role is played by the value type, that it has a boolean data type, and that /// if it has a value constraint, that value constraint is alethic and only allows the value 'true'. /// </summary> - private static bool ValidateImplictBooleanValueType(ObjectType implicitBooleanValueType) + private static bool ValidateImplicitBooleanValueType(ObjectType implicitBooleanValueType) { if (!implicitBooleanValueType.IsValueType || !implicitBooleanValueType.IsImplicitBooleanValue || implicitBooleanValueType.IsIndependent || implicitBooleanValueType.PlayedRoleCollection.Count != 1 || !(implicitBooleanValueType.DataType is TrueOrFalseLogicalDataType)) Modified: trunk/ORMModel/Shell/ORMReadingEditor.cs =================================================================== --- trunk/ORMModel/Shell/ORMReadingEditor.cs 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/ORMModel/Shell/ORMReadingEditor.cs 2009-01-23 21:57:35 UTC (rev 1353) @@ -193,9 +193,9 @@ FactType secondaryFact = null; if (selectedObjects != null) { - foreach (object o in selectedObjects) + foreach (object element in selectedObjects) { - FactType testFact = ORMEditorUtility.ResolveContextFactType(o); + FactType testFact = ORMEditorUtility.ResolveContextFactType(element); // Handle selection of multiple elements as long as // they all resolve to the same fact if (theFact == null) @@ -203,10 +203,17 @@ theFact = testFact; Role testImpliedRole; RoleProxy proxy; - if (null != (testImpliedRole = o as Role) && - null != (proxy = testImpliedRole.Proxy)) + ObjectifiedUnaryRole objectifiedUnaryRole; + if (null != (testImpliedRole = element as Role)) { - secondaryFact = proxy.FactType; + if (null != (proxy = testImpliedRole.Proxy)) + { + secondaryFact = proxy.FactType; + } + else if (null != (objectifiedUnaryRole = testImpliedRole.ObjectifiedUnaryRole)) + { + secondaryFact = objectifiedUnaryRole.FactType; + } } } else if (testFact != theFact) Modified: trunk/ORMModel/Shell/ReadingEditor.cs =================================================================== --- trunk/ORMModel/Shell/ReadingEditor.cs 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/ORMModel/Shell/ReadingEditor.cs 2009-01-23 21:57:35 UTC (rev 1353) @@ -1101,13 +1101,16 @@ return; } ReadingOrderHasReading link = e.ModelElement as ReadingOrderHasReading; - ReadingOrder readingOrder = link.ReadingOrder; - FactType fact = readingOrder.FactType; - if (fact == myFact || fact == mySecondaryFact) + if (!link.IsDeleted) { - myMainBranch.ReadingAdded(link.Reading); + ReadingOrder readingOrder = link.ReadingOrder; + FactType fact = readingOrder.FactType; + if (fact == myFact || fact == mySecondaryFact) + { + myMainBranch.ReadingAdded(link.Reading); + } + this.UpdateMenuItems(); } - this.UpdateMenuItems(); } private void ReadingLinkRemovedEvent(object sender, ElementDeletedEventArgs e) { @@ -1403,15 +1406,21 @@ /// <param name="reading">the reading to add</param> public void ReadingAdded(Reading reading) { - ReadingOrder order = reading.ReadingOrder; - if (order.FactType == myFact) + ReadingOrder order; + FactType orderFactType; + if (!reading.IsDeleted && + null != (order = reading.ReadingOrder) && + null != (orderFactType = order.FactType)) { - this.OrderBranch.ReadingAdded(reading); + if (orderFactType == myFact) + { + this.OrderBranch.ReadingAdded(reading); + } + else + { + this.ImpliedBranch.ReadingAdded(reading); + } } - else - { - this.ImpliedBranch.ReadingAdded(reading); - } } /// <summary> /// Triggers the events notifying the tree that a Reading in the Readingbranch has been updated. @@ -1920,36 +1929,38 @@ public void ReadingAdded(Reading reading) { ReadingOrder order = reading.ReadingOrder; - int location = this.LocateCollectionItem(order); - - if (location < 0) + if (order != null) { - this.PopulateReadingOrderInfo(order); - if (OnBranchModification != null) - { - int newLoc = this.LocateCollectionItem(order); - OnBranchModification(this, BranchModificationEventArgs.InsertItems(this, newLoc - 1, 1)); - OnBranchModification(this, BranchModificationEventArgs.UpdateCellStyle(this, newLoc, (int)ColumnIndex.ReadingBranch, true)); //may not be needed due to callback on update - //redraw off and back on in the branch if it has no more than 1 reading - } - } + int location = this.LocateCollectionItem(order); - if (location >= 0) - { - myReadingOrderKeyedCollection[location].EnsureBranch().AddReading(reading); - if (OnBranchModification != null) + if (location < 0) { - OnBranchModification(this, BranchModificationEventArgs.UpdateCellStyle(this, location, (int)ColumnIndex.ReadingBranch, true)); - - int actualIndex = myFact.ReadingOrderCollection.IndexOf(order); - if (actualIndex != location) + this.PopulateReadingOrderInfo(order); + if (OnBranchModification != null) { - this.ReadingOrderLocationUpdate(order); + int newLoc = this.LocateCollectionItem(order); + OnBranchModification(this, BranchModificationEventArgs.InsertItems(this, newLoc - 1, 1)); + OnBranchModification(this, BranchModificationEventArgs.UpdateCellStyle(this, newLoc, (int)ColumnIndex.ReadingBranch, true)); //may not be needed due to callback on update + //redraw off and back on in the branch if it has no more than 1 reading } - else + } + else + { + myReadingOrderKeyedCollection[location].EnsureBranch().AddReading(reading); + if (OnBranchModification != null) { - OnBranchModification(this, BranchModificationEventArgs.Redraw(false)); - OnBranchModification(this, BranchModificationEventArgs.Redraw(true)); + OnBranchModification(this, BranchModificationEventArgs.UpdateCellStyle(this, location, (int)ColumnIndex.ReadingBranch, true)); + + int actualIndex = myFact.ReadingOrderCollection.IndexOf(order); + if (actualIndex != location) + { + this.ReadingOrderLocationUpdate(order); + } + else + { + OnBranchModification(this, BranchModificationEventArgs.Redraw(false)); + OnBranchModification(this, BranchModificationEventArgs.Redraw(true)); + } } } } Modified: trunk/Oial/ORMOialBridge/ORMElementGateway.cs =================================================================== --- trunk/Oial/ORMOialBridge/ORMElementGateway.cs 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/Oial/ORMOialBridge/ORMElementGateway.cs 2009-01-23 21:57:35 UTC (rev 1353) @@ -379,7 +379,10 @@ if (forceCreate || null == ExcludedORMModelElement.GetAbstractionModel(factType)) { - new ExcludedORMModelElement(factType, model); + if (null == factType.Objectification || factType.UnaryRole != null) + { + new ExcludedORMModelElement(factType, model); + } if (notifyExcluded != null) { notifyExcluded(factType); @@ -689,6 +692,63 @@ }); } #endregion // Preferred Identifier Tracking Rules + #region Objectification Tracking Rules + /// <summary> + /// AddRule: typeof(Neumont.Tools.ORM.ObjectModel.Objectification) + /// Objectification FactTypes are automatically excluded, so changing + /// the objectification state is the same as adding/removing a blocking + /// error. + /// </summary> + private static void ObjectificationAddedRule(ElementAddedEventArgs e) + { + ProcessFactTypeForObjectificationAdded(((Objectification)e.ModelElement).NestedFactType); + } + private static void ProcessFactTypeForObjectificationAdded(FactType factType) + { + if (factType.UnaryRole == null) + { + ExcludedORMModelElement excludedLink = ExcludedORMModelElement.GetLinkToAbstractionModel(factType); + if (excludedLink != null) + { + // We don't keep the exclusion link on objectified FactTypes, but deleting + // it does not imply any additional processing because we were already not + // considering this FactType + excludedLink.Delete(); + } + else + { + FilterModifiedFactType(factType, false); // false because new implied FactTypes will get notifications on their own + } + } + } + private static void ProcessFactTypeForObjectificationDeleted(FactType factType) + { + if (!factType.IsDeleted && factType.UnaryRole == null) + { + FilterModifiedFactType(factType, false); // false because there are no implied facttypes without an objectification + } + } + /// <summary> + /// DeleteRule: typeof(Neumont.Tools.ORM.ObjectModel.Objectification) + /// </summary> + private static void ObjectificationDeletedRule(ElementDeletedEventArgs e) + { + ProcessFactTypeForObjectificationDeleted(((Objectification)e.ModelElement).NestedFactType); + } + /// <summary> + /// RolePlayerChangeRule: typeof(Neumont.Tools.ORM.ObjectModel.Objectification) + /// </summary> + private static void ObjectificationRolePlayerChangedRule(RolePlayerChangedEventArgs e) + { + Objectification link = (Objectification)e.ElementLink; + FactType factType; + if (e.DomainRole.Id == Objectification.NestedFactTypeDomainRoleId) + { + ProcessFactTypeForObjectificationDeleted((FactType)e.OldRolePlayer); + ProcessFactTypeForObjectificationAdded(link.NestedFactType); + } + } + #endregion // Objectification Tracking Rules #region RolePlayer tracking rules /// <summary> /// AddRule: typeof(Neumont.Tools.ORM.ObjectModel.ObjectTypePlaysRole) Modified: trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.cs =================================================================== --- trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.cs 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.cs 2009-01-23 21:57:35 UTC (rev 1353) @@ -44,6 +44,9 @@ typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("ObjectTypeAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("ObjectTypeErrorAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("ObjectTypeErrorDeletedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), + typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("ObjectificationAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), + typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("ObjectificationDeletedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), + typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("ObjectificationRolePlayerChangedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("PreferredIdentifierAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("RolePlayerAddedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), typeof(AbstractionModelIsForORMModel).GetNestedType("ORMElementGateway", BindingFlags.Public | BindingFlags.NonPublic).GetNestedType("RolePlayerDeletedRuleClass", BindingFlags.Public | BindingFlags.NonPublic), @@ -96,7 +99,7 @@ { Microsoft.VisualStudio.Modeling.RuleManager ruleManager = store.RuleManager; Type[] disabledRuleTypes = ORMToORMAbstractionBridgeDomainModel.CustomDomainModelTypes; - for (int i = 0; i < 29; ++i) + for (int i = 0; i < 32; ++i) { ruleManager.EnableRule(disabledRuleTypes[i]); } @@ -389,6 +392,84 @@ Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleEnd(e.ModelElement.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectTypeErrorDeletedRule"); } } + [Microsoft.VisualStudio.Modeling.RuleOn(typeof(Neumont.Tools.ORM.ObjectModel.Objectification), Priority=Neumont.Tools.Modeling.FrameworkDomainModel.InlineRulePriority)] + private sealed class ObjectificationAddedRuleClass : Microsoft.VisualStudio.Modeling.AddRule + { + [System.Diagnostics.DebuggerStepThrough()] + public ObjectificationAddedRuleClass() + { + base.IsEnabled = false; + } + /// <summary> + /// Provide the following method in class: + /// Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway + /// /// <summary> + /// /// AddRule: typeof(Neumont.Tools.ORM.ObjectModel.Objectification) + /// /// </summary> + /// private static void ObjectificationAddedRule(ElementAddedEventArgs e) + /// { + /// } + /// </summary> + [System.Diagnostics.DebuggerStepThrough()] + public override void ElementAdded(Microsoft.VisualStudio.Modeling.ElementAddedEventArgs e) + { + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleStart(e.ModelElement.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectificationAddedRule"); + ORMElementGateway.ObjectificationAddedRule(e); + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleEnd(e.ModelElement.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectificationAddedRule"); + } + } + [Microsoft.VisualStudio.Modeling.RuleOn(typeof(Neumont.Tools.ORM.ObjectModel.Objectification), Priority=Neumont.Tools.Modeling.FrameworkDomainModel.InlineRulePriority)] + private sealed class ObjectificationDeletedRuleClass : Microsoft.VisualStudio.Modeling.DeleteRule + { + [System.Diagnostics.DebuggerStepThrough()] + public ObjectificationDeletedRuleClass() + { + base.IsEnabled = false; + } + /// <summary> + /// Provide the following method in class: + /// Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway + /// /// <summary> + /// /// DeleteRule: typeof(Neumont.Tools.ORM.ObjectModel.Objectification) + /// /// </summary> + /// private static void ObjectificationDeletedRule(ElementDeletedEventArgs e) + /// { + /// } + /// </summary> + [System.Diagnostics.DebuggerStepThrough()] + public override void ElementDeleted(Microsoft.VisualStudio.Modeling.ElementDeletedEventArgs e) + { + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleStart(e.ModelElement.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectificationDeletedRule"); + ORMElementGateway.ObjectificationDeletedRule(e); + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleEnd(e.ModelElement.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectificationDeletedRule"); + } + } + [Microsoft.VisualStudio.Modeling.RuleOn(typeof(Neumont.Tools.ORM.ObjectModel.Objectification), Priority=Neumont.Tools.Modeling.FrameworkDomainModel.InlineRulePriority)] + private sealed class ObjectificationRolePlayerChangedRuleClass : Microsoft.VisualStudio.Modeling.RolePlayerChangeRule + { + [System.Diagnostics.DebuggerStepThrough()] + public ObjectificationRolePlayerChangedRuleClass() + { + base.IsEnabled = false; + } + /// <summary> + /// Provide the following method in class: + /// Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway + /// /// <summary> + /// /// RolePlayerChangeRule: typeof(Neumont.Tools.ORM.ObjectModel.Objectification) + /// /// </summary> + /// private static void ObjectificationRolePlayerChangedRule(RolePlayerChangedEventArgs e) + /// { + /// } + /// </summary> + [System.Diagnostics.DebuggerStepThrough()] + public override void RolePlayerChanged(Microsoft.VisualStudio.Modeling.RolePlayerChangedEventArgs e) + { + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleStart(e.ElementLink.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectificationRolePlayerChangedRule"); + ORMElementGateway.ObjectificationRolePlayerChangedRule(e); + Neumont.Tools.Modeling.Diagnostics.TraceUtility.TraceRuleEnd(e.ElementLink.Store, "Neumont.Tools.ORMToORMAbstractionBridge.AbstractionModelIsForORMModel.ORMElementGateway.ObjectificationRolePlayerChangedRule"); + } + } [Microsoft.VisualStudio.Modeling.RuleOn(typeof(Neumont.Tools.ORM.ObjectModel.EntityTypeHasPreferredIdentifier), Priority=Neumont.Tools.Modeling.FrameworkDomainModel.InlineRulePriority)] private sealed class PreferredIdentifierAddedRuleClass : Microsoft.VisualStudio.Modeling.AddRule { Modified: trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.xml =================================================================== --- trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.xml 2009-01-15 21:59:26 UTC (rev 1352) +++ trunk/Oial/ORMOialBridge/ORMOialBridge.AttachRules.xml 2009-01-23 21:57:35 UTC (rev 1353) @@ -55,6 +55,15 @@ <arg:RuleOn targetType="ObjectTypeHasPreferredIdentifierRequiresMandatoryError" targetTypeQualifier="Neumont.Tools.ORM.ObjectModel"/> <arg:RuleOn targetType="ValueTypeHasUnspecifiedDataTypeError" targetTypeQualifier="Neumont.Tools.ORM.ObjectModel"/> </arg:DeleteRule> + <arg:AddRule methodName="ObjectificationAddedRule"> + <arg:RuleOn targetType="Objectification" targetTypeQualifier="Neumont.Tools.ORM.ObjectModel"/> + </arg:AddRule> + <arg:DeleteRule methodName="ObjectificationDeletedRule"> + <arg:RuleOn targetType="Objectification" targetTypeQualifier="Neumont.Tools.ORM.ObjectModel"/> + </arg:DeleteRule> + <arg:RolePlayerChangeRule methodName="ObjectificationRolePlayerChangedRule"> + <arg:RuleOn targetType="Objectification" targetTypeQualifier="Neumont.Tools.ORM.ObjectModel"/> + </arg:RolePlayerChangeRule> <arg:AddRule methodName="PreferredIdentifierAddedRule"> <arg:RuleOn targetType="EntityTypeHasPreferredIdentifier" targetTypeQualifier="Neumont.Tools.ORM.ObjectModel"/> </arg:AddRule> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-02-10 03:55:00
|
Revision: 1359 http://orm.svn.sourceforge.net/orm/?rev=1359&view=rev Author: mcurland Date: 2009-02-10 03:54:56 +0000 (Tue, 10 Feb 2009) Log Message: ----------- Pass registry key to constructor of ORMCustomTool generators with type="class". refs #167 Modified Paths: -------------- trunk/ORMModel/Shell/ORMPackage.cs trunk/Setup/Readme.htm trunk/Tools/ORMCustomTool/ORMGenerators.cs Modified: trunk/ORMModel/Shell/ORMPackage.cs =================================================================== --- trunk/ORMModel/Shell/ORMPackage.cs 2009-02-10 03:50:59 UTC (rev 1358) +++ trunk/ORMModel/Shell/ORMPackage.cs 2009-02-10 03:54:56 UTC (rev 1359) @@ -429,14 +429,13 @@ if (hadRevisionsKey && hitCount != valueNames.Length) { refreshRequired = true; - for (int i = 0; i < valueNames.Length; --i) + for (int i = 0; i < valueNames.Length; ++i) { string removeValue = valueNames[i]; if (removeValue != null) { toolboxRevisionsKey.DeleteValue(removeValue, false); } - } } } Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-02-10 03:50:59 UTC (rev 1358) +++ trunk/Setup/Readme.htm 2009-02-10 03:54:56 UTC (rev 1359) @@ -5,7 +5,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> <title>NORMA January 2009 CTP Readme</title> <style type="text/css"> - .new {font-size:x-small; color:Gold; } + .new {font-size:x-small; background-color:Gold; color:Blue; } li {padding-bottom: 3px;} </style> </head> Modified: trunk/Tools/ORMCustomTool/ORMGenerators.cs =================================================================== --- trunk/Tools/ORMCustomTool/ORMGenerators.cs 2009-02-10 03:50:59 UTC (rev 1358) +++ trunk/Tools/ORMCustomTool/ORMGenerators.cs 2009-02-10 03:54:56 UTC (rev 1359) @@ -138,7 +138,7 @@ } assemblyName.CodeBase = codeBase; - return (IORMGenerator)Activator.CreateInstance(Assembly.Load(assemblyName).GetType(typeName, true, false)); + return (IORMGenerator)Activator.CreateInstance(Assembly.Load(assemblyName).GetType(typeName, true, false), generatorKey); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-02-19 05:44:58
|
Revision: 1360 http://orm.svn.sourceforge.net/orm/?rev=1360&view=rev Author: mcurland Date: 2009-02-19 05:44:54 +0000 (Thu, 19 Feb 2009) Log Message: ----------- Change UserData keys placed on the toolbox to be strings instead of simple objects. This should allow us to compare these keys across VS sessions and fix the lingering undraggable ValueType issue. refs #385 Also removed the PublicKeyToken for the wix extension assembly from the setup project. The token changes with different Wix versions. Modified Paths: -------------- trunk/ORMModel/ObjectModel/FactType.cs trunk/ORMModel/ObjectModel/ORMModel.cs trunk/Setup/Setup.wixproj Modified: trunk/ORMModel/ObjectModel/FactType.cs =================================================================== --- trunk/ORMModel/ObjectModel/FactType.cs 2009-02-10 03:54:56 UTC (rev 1359) +++ trunk/ORMModel/ObjectModel/FactType.cs 2009-02-19 05:44:54 UTC (rev 1360) @@ -420,7 +420,7 @@ DomainClassInfo classInfo = Store.DomainDataDirectory.FindDomainClass(rootElement.DomainClassId); if (classInfo.IsDerivedFrom(UniquenessConstraint.DomainClassId)) { - return elementGroupPrototype.UserData == ORMModel.InternalUniquenessConstraintUserDataKey; + return ORMModel.InternalUniquenessConstraintUserDataKey.Equals(elementGroupPrototype.UserData as string); } } return false; Modified: trunk/ORMModel/ObjectModel/ORMModel.cs =================================================================== --- trunk/ORMModel/ObjectModel/ORMModel.cs 2009-02-10 03:54:56 UTC (rev 1359) +++ trunk/ORMModel/ObjectModel/ORMModel.cs 2009-02-19 05:44:54 UTC (rev 1360) @@ -132,7 +132,7 @@ private void MergeRelateObjectType(ModelElement sourceElement, ElementGroup elementGroup) { ObjectType objectType = sourceElement as ObjectType; - if (elementGroup.UserData == ORMModel.ValueTypeUserDataKey) + if (ORMModel.ValueTypeUserDataKey.Equals(elementGroup.UserData as string)) { objectType.DataType = ((ORMModel)this).DefaultDataType; } @@ -150,7 +150,7 @@ } private bool CanMergeSetConstraint(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype) { - return elementGroupPrototype.UserData != ORMModel.InternalUniquenessConstraintUserDataKey; + return !ORMModel.InternalUniquenessConstraintUserDataKey.Equals(elementGroupPrototype.UserData as string); } #endregion // MergeContext functions } @@ -161,12 +161,12 @@ /// Used as the value for <see cref="ElementGroup.UserData"/> to indicate that the /// <see cref="ObjectType"/> should be a ValueType. /// </summary> - public static readonly object ValueTypeUserDataKey = new object(); + public const string ValueTypeUserDataKey = "CreateAsValueType"; /// <summary> /// Used as the value for <see cref="ElementGroup.UserData"/> to indicate that the /// <see cref="UniquenessConstraint"/> is internal. /// </summary> - public static readonly object InternalUniquenessConstraintUserDataKey = new object(); + public const string InternalUniquenessConstraintUserDataKey = "CreateAsInternalUniqueness"; #endregion // ElementGroup.UserData keys #region Entity- and ValueType specific collections /// <summary> Modified: trunk/Setup/Setup.wixproj =================================================================== --- trunk/Setup/Setup.wixproj 2009-02-10 03:54:56 UTC (rev 1359) +++ trunk/Setup/Setup.wixproj 2009-02-19 05:44:54 UTC (rev 1360) @@ -66,7 +66,7 @@ <Compile Include="UI\WelcomeDlg.wxs" /> </ItemGroup> <ItemGroup> - <WixExtension Include="WixVSExtension, Culture=neutral, PublicKeyToken=ce35f76fcda82bad"> + <WixExtension Include="WixVSExtension, Culture=neutral"> <Class>Microsoft.Tools.WindowsInstallerXml.Extensions.VSExtension</Class> <Private>False</Private> </WixExtension> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-03-06 20:55:30
|
Revision: 1366 http://orm.svn.sourceforge.net/orm/?rev=1366&view=rev Author: mcurland Date: 2009-03-06 20:55:19 +0000 (Fri, 06 Mar 2009) Log Message: ----------- ORMSolutions.ORMArchitectContinuation of [1365]. Assembly names need to be changed in VS item templates (file new fails). refs #388 Modified Paths: -------------- trunk/ORMModel/Shell/ProjectItems/VS2005/General.zip trunk/ORMModel/Shell/ProjectItems/VS2008/General.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/CSharp.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/General.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/JSharp.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/VisualBasic.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/VisualC.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/Web/CSharp.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/Web/JSharp.zip trunk/Tools/DatabaseImport/ProjectItems/VS2005/Web/VisualBasic.zip trunk/Tools/DatabaseImport/ProjectItems/VS2008/CSharp.zip trunk/Tools/DatabaseImport/ProjectItems/VS2008/General.zip trunk/Tools/DatabaseImport/ProjectItems/VS2008/VisualBasic.zip trunk/Tools/DatabaseImport/ProjectItems/VS2008/VisualC.zip trunk/Tools/DatabaseImport/ProjectItems/VS2008/Web/CSharp.zip trunk/Tools/DatabaseImport/ProjectItems/VS2008/Web/VisualBasic.zip Modified: trunk/ORMModel/Shell/ProjectItems/VS2005/General.zip =================================================================== (Binary files differ) Modified: trunk/ORMModel/Shell/ProjectItems/VS2008/General.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/CSharp.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/General.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/JSharp.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/VisualBasic.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/VisualC.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/Web/CSharp.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/Web/JSharp.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2005/Web/VisualBasic.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2008/CSharp.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2008/General.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2008/VisualBasic.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2008/VisualC.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2008/Web/CSharp.zip =================================================================== (Binary files differ) Modified: trunk/Tools/DatabaseImport/ProjectItems/VS2008/Web/VisualBasic.zip =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-03-25 17:17:27
|
Revision: 1373 http://orm.svn.sourceforge.net/orm/?rev=1373&view=rev Author: mcurland Date: 2009-03-25 17:17:23 +0000 (Wed, 25 Mar 2009) Log Message: ----------- Relaxed a couple of schema definitions. RoleInstance definition order was too strict, and custom properties would not reload without a property in a group. refs #374 Modified Paths: -------------- trunk/CustomProperties/CustomProperties.xsd trunk/ORMModel/ObjectModel/ORM2Core.xsd Modified: trunk/CustomProperties/CustomProperties.xsd =================================================================== --- trunk/CustomProperties/CustomProperties.xsd 2009-03-20 23:38:59 UTC (rev 1372) +++ trunk/CustomProperties/CustomProperties.xsd 2009-03-25 17:17:23 UTC (rev 1373) @@ -31,7 +31,7 @@ </xs:annotation> <xs:complexType> <xs:sequence> - <xs:element ref="cp:CustomPropertyGroup" maxOccurs="unbounded" minOccurs="1"/> + <xs:element ref="cp:CustomPropertyGroup" maxOccurs="unbounded" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:key name="CustomPropertyGroupKey"> @@ -49,10 +49,10 @@ </xs:annotation> <xs:complexType> <xs:sequence> - <xs:element name="PropertyDefinitions"> + <xs:element name="PropertyDefinitions" minOccurs="0"> <xs:complexType> <xs:sequence> - <xs:element ref="cp:Definition" maxOccurs="unbounded" minOccurs="1"/> + <xs:element ref="cp:Definition" maxOccurs="unbounded" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> @@ -164,7 +164,7 @@ </xs:annotation> <xs:complexType> <xs:sequence> - <xs:element ref="cp:ORMType" maxOccurs="unbounded" minOccurs="1"/> + <xs:element ref="cp:ORMType" maxOccurs="unbounded" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:unique name="ORMTypeUniquessConstraint"> Modified: trunk/ORMModel/ObjectModel/ORM2Core.xsd =================================================================== --- trunk/ORMModel/ObjectModel/ORM2Core.xsd 2009-03-20 23:38:59 UTC (rev 1372) +++ trunk/ORMModel/ObjectModel/ORM2Core.xsd 2009-03-25 17:17:23 UTC (rev 1373) @@ -236,12 +236,12 @@ <xs:complexType name="ValueTypeInstanceRef"> <xs:attribute name="ref" type="xs:IDREF" use="required"/> </xs:complexType> - <xs:complexType name="ObjectTypeRoleInstances"> - <xs:sequence> - <xs:element name="EntityTypeRoleInstance" type="RoleInstance" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="ValueTypeRoleInstance" type="RoleInstance" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="FactTypeRoleInstance" type="RoleInstance" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> + <xs:complexType name="RoleInstanceDefinitions"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="EntityTypeRoleInstance" type="RoleInstance"/> + <xs:element name="ValueTypeRoleInstance" type="RoleInstance"/> + <xs:element name="FactTypeRoleInstance" type="RoleInstance"/> + </xs:choice> </xs:complexType> <xs:complexType name="RoleInstance"> <xs:simpleContent> @@ -589,7 +589,7 @@ <xs:sequence> <xs:element name="RolePlayer" type="ObjectRef" minOccurs="0"/> <xs:element name="ValueRestriction" type="RoleValueRestriction" minOccurs="0"/> - <xs:element name="RoleInstances" type="ObjectTypeRoleInstances" minOccurs="0"/> + <xs:element name="RoleInstances" type="RoleInstanceDefinitions" minOccurs="0"/> </xs:sequence> <xs:attribute name="Name" type="xs:string" use="required"/> <xs:attribute name="id" type="xs:ID" use="required"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-03-28 17:45:45
|
Revision: 1374 http://orm.svn.sourceforge.net/orm/?rev=1374&view=rev Author: mcurland Date: 2009-03-28 17:45:34 +0000 (Sat, 28 Mar 2009) Log Message: ----------- References to separated subtype tables used 'identifier' instead of 'reference' name pattern. refs #338 Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm Modified: trunk/RelationalModel/OialDcilBridge/NameGeneration.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-03-28 17:45:34 UTC (rev 1374) @@ -781,7 +781,7 @@ // Don't add names for reverse path types lastStepConsumedNextNode = false; lastStepUsedExplicitRoleName = false; - treatNextIdentifierAsFirstStep = true; + treatNextIdentifierAsFirstStep = firstPass; if (nextLoopNode == null) { // Unusual, but can happen with a ValueType with its own table Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2009-03-28 17:45:34 UTC (rev 1374) @@ -51,7 +51,7 @@ /// <summary> /// The algorithm version written to the file for the name generation algorithm /// </summary> - public const string CurrentNameAlgorithmVersion = "1.009"; + public const string CurrentNameAlgorithmVersion = "1.010"; #endregion // Algorithm Version Constants #region Fully populate from OIAL Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -11200,7 +11200,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_52A37F5B-1E80-4FCB-802E-AA9FA4315D0D" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_AFA60651-CCAD-47F2-B397-70E5855BF20B" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_CD0EC594-EDEA-44FC-9593-1DE35929D199" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_CD0EC594-EDEA-44FC-9593-1DE35929D199" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_1CA1A0E5-2553-4907-AC75-1850287F4A51" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -285,7 +285,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_216FCBEF-24A6-4138-9F8D-255066420DD2" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_FE3D35D4-8BFA-4604-B769-6F8224F4CC89" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_AB43283A-160B-4A51-9E75-F464582D1F72" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_AB43283A-160B-4A51-9E75-F464582D1F72" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_3F310E69-550D-441F-9F8C-15CBA2CE8CEB" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -291,7 +291,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_1ECF9C7E-EC03-4118-9BF0-78AC98140751" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_4EE0E222-C3E6-4E2F-93BD-2832FD0CA530" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_B469B281-6731-4214-9C2C-6CFDAC31C903" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_B469B281-6731-4214-9C2C-6CFDAC31C903" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_DC73DBF4-111D-49C1-B301-B5F5B89FB4D8" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -748,7 +748,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_93A125B5-363A-454B-A6FC-473B4987BBF7" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B227B9F1-E66D-4885-9EBB-FA6C30E3AC66" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_75FDA8E6-2EB8-493D-A6BF-CB382F439713" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_75FDA8E6-2EB8-493D-A6BF-CB382F439713" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_0C507CBC-61D4-4B2D-ACE1-7BED6CF800A3" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -748,7 +748,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_4CA750F7-00B1-492A-9BC2-CF24B78D16D1" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B227B9F1-E66D-4885-9EBB-FA6C30E3AC66" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_2FD2BA8B-8F38-413C-A5ED-5C43A9F3ED0C" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_2FD2BA8B-8F38-413C-A5ED-5C43A9F3ED0C" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_0C507CBC-61D4-4B2D-ACE1-7BED6CF800A3" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -748,7 +748,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_4F4B5F39-12A2-4488-9BA9-EEF2F2BB5E6D" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_21511FEB-5B88-4FBD-A74C-06B4A3C70480" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_6E61D4EE-E269-4EB5-8CD2-5D643CA8F6AB" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_6E61D4EE-E269-4EB5-8CD2-5D643CA8F6AB" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_318C6F91-A8B5-4657-8FF0-8BC95C2C83B5" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -382,7 +382,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_7C818355-A612-4252-B259-D23C1B8B80CB" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_479BA1D0-80FB-48DE-894E-50E9E8FC0F0B" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_035C2A13-BCD7-4021-B939-C7B0714C8324" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_035C2A13-BCD7-4021-B939-C7B0714C8324" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_C2350E6F-6523-49F4-A2E3-B021A5CE58E6" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -886,7 +886,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_953B9230-0B01-406E-B73F-E99E73B31F8D" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B6DA4F58-8BCF-478E-82AE-C04CD0DD68C9" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_0C331C48-4E21-4197-8186-4A3769048023" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_0C331C48-4E21-4197-8186-4A3769048023" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_77081B66-EB8A-44C5-9D03-DF6573330E4B" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -886,7 +886,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_077B1376-3174-4CAC-9C4A-B8245485F67E" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_C50661E8-E857-43F3-A1D2-9EF787A84EFE" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_CC0244D5-F67A-4DE3-8E18-4B16640FB1F1" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_CC0244D5-F67A-4DE3-8E18-4B16640FB1F1" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_BDE38DCE-8504-4AC9-9156-A927376B73B6" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -925,7 +925,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B774300C-8F49-43EB-AB62-17534D8DBB42" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_EC000843-0D4E-43C1-80E8-527C74F04153" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -925,7 +925,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B774300C-8F49-43EB-AB62-17534D8DBB42" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_EC000843-0D4E-43C1-80E8-527C74F04153" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -328,7 +328,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_D7A0794A-6A4E-4F57-AABD-1EAA875ADCEC" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_82B2C906-24E6-4CF4-ADE5-30AEAE09EC10" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_92EDE6BB-60EE-45AE-8D58-B58A04114F45" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_92EDE6BB-60EE-45AE-8D58-B58A04114F45" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_52DB28BD-3E61-47BD-B0B9-32D2C6CA80B7" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -700,7 +700,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_65638CB4-2653-4514-A38D-9380F676A78C" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_AB78A179-3D57-4D6D-A2C8-A7FD52DCC729" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting CoreAlgorithmVersion="1.004" id="_E6A31A5A-A145-4F45-A0E9-47F04AA49D97" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting CoreAlgorithmVersion="1.004" id="_E6A31A5A-A145-4F45-A0E9-47F04AA49D97" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_A71D70CB-02A4-42A5-8CD4-DDBDE316A25B" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -208,7 +208,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_CA317692-2D5E-4094-9CC9-F7B049F0A505" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_9C9BECFF-37EA-4156-B4BF-55AD6ED21CD2" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_7A16F888-F499-4270-94C6-894CF461C356" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_7A16F888-F499-4270-94C6-894CF461C356" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_58CD2382-A0F9-4C22-806A-7FC12438339C" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm 2009-03-25 17:17:23 UTC (rev 1373) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm 2009-03-28 17:45:34 UTC (rev 1374) @@ -364,7 +364,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_FA93223F-D82D-479F-A103-D8886756E8E2" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_2F7377B5-BC91-4951-B9DC-8D6389C48738" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_833EE616-E4B4-4F9E-9DBC-522A018D54FC" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.009"> + <oialtocdb:SchemaGenerationSetting id="_833EE616-E4B4-4F9E-9DBC-522A018D54FC" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> <oialtocdb:Schema ref="_384966C8-3A43-4591-933B-A4D426CC424D" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-04-01 02:22:33
|
Revision: 1376 http://orm.svn.sourceforge.net/orm/?rev=1376&view=rev Author: mcurland Date: 2009-04-01 01:49:40 +0000 (Wed, 01 Apr 2009) Log Message: ----------- Automatically fix duplicate auto-generated constraint names on load. fixes #389 Also updated extension example to work with current model error fixup. Modified Paths: -------------- trunk/ExtensionExample/CustomExtensionError.cs trunk/ExtensionExample/ExtensionDomainModel.DeserializationFixupListeners.cs trunk/ORMModel/Framework/NamedElementDictionary.cs trunk/ORMModel/ObjectModel/Grouping.cs trunk/ORMModel/ObjectModel/ORMModel.cs Modified: trunk/ExtensionExample/CustomExtensionError.cs =================================================================== --- trunk/ExtensionExample/CustomExtensionError.cs 2009-03-31 19:25:05 UTC (rev 1375) +++ trunk/ExtensionExample/CustomExtensionError.cs 2009-04-01 01:49:40 UTC (rev 1376) @@ -158,7 +158,7 @@ private sealed class ObjectTypeNameFixupListener : DeserializationFixupListener<ObjectType> { public ObjectTypeNameFixupListener() - : base((int)ORMDeserializationFixupPhase.ValidateImplicitStoredElements) + : base((int)ExtensionExampleFixupPhase.ValidateMeaningfulNames) { } protected sealed override void ProcessElement(ObjectType element, Store store, INotifyElementAdded notifyAdded) Modified: trunk/ExtensionExample/ExtensionDomainModel.DeserializationFixupListeners.cs =================================================================== --- trunk/ExtensionExample/ExtensionDomainModel.DeserializationFixupListeners.cs 2009-03-31 19:25:05 UTC (rev 1375) +++ trunk/ExtensionExample/ExtensionDomainModel.DeserializationFixupListeners.cs 2009-04-01 01:49:40 UTC (rev 1376) @@ -6,18 +6,36 @@ namespace ORMSolutions.ORMArchitect.ExtensionExample { + /// <summary> + /// A custom fixup phase for the extension example + /// </summary> + public enum ExtensionExampleFixupPhase + { + /// <summary> + /// Validate meaningful names after the ORM model has completed its name validation. + /// This enables any names that require regeneration to be automatically generated + /// before we determine if the names are meaningful. + /// </summary> + ValidateMeaningfulNames = ORMDeserializationFixupPhase.ValidateElementNames + 1, + } public partial class ExtensionDomainModel : IDeserializationFixupListenerProvider { #region IDeserializationFixupListenerProvider Implementation /// <summary> /// Implements IDeserializationFixupListenerProvider.DeserializationFixupListenerCollection /// </summary> - protected static IEnumerable<IDeserializationFixupListener> DeserializationFixupListenerCollection + protected IEnumerable<IDeserializationFixupListener> DeserializationFixupListenerCollection { get { yield return new MyCustomExtensionElementFixupListener(); yield return ObjectTypeRequiresMeaningfulNameError.ObjectTypeNameErrorFixupListener; + // The errors in this model will be ignore by the ORM error validator because they are + // in the wrong domain model. Register our own handler to deal with these errors. + // Note that this could also be handled by explicitly add/removing validating errors + // from the task provider when we create them, but this general facility is easier to + // use because it does this for us. + yield return ModelError.GetFixupListener((int)ORMDeserializationFixupPhase.ValidateErrors, DomainModelInfo); } } IEnumerable<IDeserializationFixupListener> IDeserializationFixupListenerProvider.DeserializationFixupListenerCollection @@ -35,7 +53,7 @@ { get { - return null; + return typeof(ExtensionExampleFixupPhase); } } Type IDeserializationFixupListenerProvider.DeserializationFixupPhaseType Modified: trunk/ORMModel/Framework/NamedElementDictionary.cs =================================================================== --- trunk/ORMModel/Framework/NamedElementDictionary.cs 2009-03-31 19:25:05 UTC (rev 1375) +++ trunk/ORMModel/Framework/NamedElementDictionary.cs 2009-04-01 01:49:40 UTC (rev 1376) @@ -25,6 +25,7 @@ using System.ComponentModel; using System.Diagnostics; using System.Globalization; +using System.Text.RegularExpressions; using Microsoft.VisualStudio.Modeling; namespace ORMSolutions.ORMArchitect.Framework @@ -584,6 +585,18 @@ return null; } /// <summary> + /// If a duplicate name is caught during load, then determine if the name + /// is an auto-generated name that should be regenerated instead of tracked + /// as a duplicate name error. The default implementation returns <see langword="false"/>. + /// </summary> + /// <param name="element">The element with the duplicate name</param> + /// <param name="elementName">The pre-fetched element name</param> + /// <returns>Return <see langword="true"/> to reset the name.</returns> + protected virtual bool ShouldResetDuplicateName(ModelElement element, string elementName) + { + return false; + } + /// <summary> /// Override to throw a custom exception when /// adding duplicate names is not allowed. /// </summary> @@ -627,6 +640,25 @@ } while(dic.ContainsKey(newKey)); return newKey; } + /// <summary> + /// Test if an <paramref name="elementName"/> is a decorated form of the root name pattern + /// for an <paramref name="element"/>. Provides a stock implementation for derived implementations + /// of the <see cref="ShouldResetDuplicateName"/> method. + /// </summary> + /// <param name="element">The element to retrieve the root name pattern for.</param> + /// <param name="elementName">The pre-fetched element name to compare to.</param> + /// <returns><see langword="true"/> if the name could have been generated from + /// the string returned from <see cref="GetRootNamePattern"/></returns> + protected bool IsDecoratedRootName(ModelElement element, string elementName) + { + string rootName = this.GetRootNamePattern(element); + return Regex.IsMatch( + elementName, + rootName.Contains("{0}") ? + @"\A" + string.Format(CultureInfo.InvariantCulture, rootName, @"\d+") + @"\z" : + @"\A" + rootName + @"\d+\z", + RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + } #endregion // Unique name generation #region INamedElementDictionary Members void INamedElementDictionary.AddElement(ModelElement element, DuplicateNameAction duplicateAction, INotifyElementAdded notifyAdded) @@ -738,6 +770,10 @@ // to not throw an exception return; } + else if (notifyAdded != null && ShouldResetDuplicateName(element, elementName)) + { + AddElement(element, duplicateAction, "", notifyAdded); + } else { ModelElement singleElement = locateData.SingleElement; Modified: trunk/ORMModel/ObjectModel/Grouping.cs =================================================================== --- trunk/ORMModel/ObjectModel/Grouping.cs 2009-03-31 19:25:05 UTC (rev 1375) +++ trunk/ORMModel/ObjectModel/Grouping.cs 2009-04-01 01:49:40 UTC (rev 1376) @@ -1023,6 +1023,7 @@ } #endregion // GroupDuplicateNameError class #region GroupMembershipContradictionError class + [ModelErrorDisplayFilter(typeof(ElementGroupingErrorCategory))] partial class ElementGroupingMembershipContradictionError { /// <summary> @@ -1265,6 +1266,14 @@ return ResourceStrings.ElementGroupingDefaultNamePattern; } /// <summary> + /// Duplicate automatically generated group names should regenerate on load. + /// Caters for common merging scenario. + /// </summary> + protected override bool ShouldResetDuplicateName(ModelElement element, string elementName) + { + return IsDecoratedRootName(element, elementName); + } + /// <summary> /// Raise an exception with text specific to a name in a model /// </summary> /// <param name="element">Element we're attempting to name</param> Modified: trunk/ORMModel/ObjectModel/ORMModel.cs =================================================================== --- trunk/ORMModel/ObjectModel/ORMModel.cs 2009-03-31 19:25:05 UTC (rev 1375) +++ trunk/ORMModel/ObjectModel/ORMModel.cs 2009-04-01 01:49:40 UTC (rev 1376) @@ -1043,6 +1043,14 @@ return base.GetRootNamePattern(element); } /// <summary> + /// Duplicate automatically generated constraint names should regenerate on load. + /// Caters for common merging scenario. + /// </summary> + protected override bool ShouldResetDuplicateName(ModelElement element, string elementName) + { + return IsDecoratedRootName(element, elementName); + } + /// <summary> /// Raise an exception with text specific to a name in a model /// </summary> /// <param name="element">Element we're attempting to name</param> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-04-16 23:38:05
|
Revision: 1379 http://orm.svn.sourceforge.net/orm/?rev=1379&view=rev Author: mcurland Date: 2009-04-16 23:37:54 +0000 (Thu, 16 Apr 2009) Log Message: ----------- Enable multiple designer settings files to simplify external importer specifications. fixes #391 Modified Paths: -------------- trunk/ORMModel/Shell/ORMDesignerSettings.cs trunk/ORMModel/Shell/ORMPackage.cs trunk/Setup/Components.wxs trunk/install.bat Modified: trunk/ORMModel/Shell/ORMDesignerSettings.cs =================================================================== --- trunk/ORMModel/Shell/ORMDesignerSettings.cs 2009-04-16 01:21:20 UTC (rev 1378) +++ trunk/ORMModel/Shell/ORMDesignerSettings.cs 2009-04-16 23:37:54 UTC (rev 1379) @@ -27,6 +27,7 @@ using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio; +using Microsoft.Win32; using ORMSolutions.ORMArchitect.Core.ObjectModel; using System.ComponentModel; @@ -36,6 +37,7 @@ /// A class used to read XmlConverters section of the designer settings file /// and run transforms between registered converter types. /// </summary> + [CLSCompliant(false)] public partial class ORMDesignerSettings { #region Schema definition classes @@ -169,46 +171,32 @@ } #endregion // ORMDesignerNameTable class #endregion // Schema definition classes + #region Constants + private const string REGISTRYKEY_CORESETTINGS = "Core"; + private const string REGISTRYVALUE_SETTINGSFILE = "SettingsFile"; + private const string REGISTRYVALUE_CONVERTERSDIR = "ConvertersDir"; + #endregion // Constraints #region Member Variables - private IServiceProvider myServiceProvider; + private Package myPackage; + private string myRootRegistryKey; // Relative to the package application root private bool myIsLoaded; private Dictionary<XmlElementIdentifier, LinkedList<TransformNode>> myXmlConverters; #endregion // Member Variables #region Static Variables - private static string mySettingsPath; - private static string myXmlConvertersDirectory; private static readonly object LockObject = new object(); #endregion // Static Variables #region Constructors /// <summary> /// Construct new designer settings /// </summary> - /// <param name="serviceProvider">The service provider to use</param> - /// <param name="settingsPath">The full path to the settings file.</param> - /// <param name="xmlConvertersDirectory">The directory where the XML converters are located.</param> - public ORMDesignerSettings(IServiceProvider serviceProvider, string settingsPath, string xmlConvertersDirectory) + /// <param name="package">The context package</param> + /// <param name="rootKey">The root key for designer settings, relative to the package registry root.</param> + public ORMDesignerSettings(Package package, string rootKey) { - myServiceProvider = serviceProvider; - mySettingsPath = settingsPath; - myXmlConvertersDirectory = xmlConvertersDirectory; + myPackage = package; + myRootRegistryKey = rootKey; } #endregion // Constructors - #region SettingsDirectory property - private string SettingsPath - { - get - { - return mySettingsPath; - } - } - private string XmlConvertersDirectory - { - get - { - return myXmlConvertersDirectory; - } - } - #endregion // SettingsDirectory property #region ConvertStream method /// <summary> /// Convert the given stream to a new stream with converted contents. @@ -316,6 +304,103 @@ } #endregion // ConvertStream method #region Global Settings Loader + /// <summary> + /// Structure representing a single settings file + /// </summary> + private struct SettingsLocation + { + /// <summary> + /// The settings file to load + /// </summary> + public readonly string SettingsFile; + /// <summary> + /// The directory for converter transforms + /// </summary> + public readonly string ConvertersDirectory; + private SettingsLocation(string settingsFile, string convertersDirectory) + { + SettingsFile = settingsFile; + ConvertersDirectory = convertersDirectory; + } + /// <summary> + /// Enumerate all registered settings files + /// </summary> + /// <param name="package">The context package, provides a starting key for registry information</param> + /// <param name="registryRoot">The root key relative to the package root</param> + /// <returns>Enumeration of settings files</returns> + public static IEnumerable<SettingsLocation> SettingsLocations(Package package, string registryRoot) + { + RegistryKey applicationRegistryRoot = null; + RegistryKey settingsRegistryRoot = null; + try + { + applicationRegistryRoot = package.ApplicationRegistryRoot; + settingsRegistryRoot = applicationRegistryRoot.OpenSubKey(registryRoot, RegistryKeyPermissionCheck.ReadSubTree); + if (settingsRegistryRoot != null) + { + string[] settingsKeyNames = settingsRegistryRoot.GetSubKeyNames(); + int settingsCount = (settingsKeyNames == null) ? 0 : settingsKeyNames.Length; + if (settingsCount > 1) + { + // Treat the Core key specially to get a default converters directory + int coreIndex = Array.IndexOf<string>(settingsKeyNames, REGISTRYKEY_CORESETTINGS); + if (coreIndex > 0) + { + string swap = settingsKeyNames[0]; + settingsKeyNames[0] = settingsKeyNames[coreIndex]; + settingsKeyNames[coreIndex] = swap; + } + } + if (settingsCount != 0 && settingsKeyNames[0] == REGISTRYKEY_CORESETTINGS) + { + string defaultConvertersDirectory = null; + for (int i = 0; i < settingsCount; ++i) + { + using (RegistryKey settingsKey = settingsRegistryRoot.OpenSubKey(settingsKeyNames[i], RegistryKeyPermissionCheck.ReadSubTree)) + { + string settingsFile = settingsKey.GetValue(REGISTRYVALUE_SETTINGSFILE, "", RegistryValueOptions.None) as string; + if (settingsFile != null && File.Exists(settingsFile)) + { + string convertersDirectory = settingsKey.GetValue(REGISTRYVALUE_CONVERTERSDIR, "", RegistryValueOptions.None) as string; + if (string.IsNullOrEmpty(convertersDirectory)) + { + if (i == 0) + { + break; // Invalid registration, Core information required + } + convertersDirectory = defaultConvertersDirectory; + } + if (Directory.Exists(convertersDirectory)) + { + if (i == 0) + { + defaultConvertersDirectory = convertersDirectory; + } + yield return new SettingsLocation(settingsFile, convertersDirectory); + } + else if (i == 0) + { + break; // Invalid registration, Core information required + } + } + } + } + } + } + } + finally + { + if (applicationRegistryRoot != null) + { + applicationRegistryRoot.Close(); + } + if (settingsRegistryRoot != null) + { + settingsRegistryRoot.Close(); + } + } + } + } private void EnsureGlobalSettingsLoaded() { if (myIsLoaded) @@ -323,11 +408,11 @@ return; } myIsLoaded = true; - string settingsFile = SettingsPath; - if (File.Exists(settingsFile)) + ORMDesignerNameTable names = ORMDesignerSchema.Names; + foreach (SettingsLocation location in SettingsLocation.SettingsLocations(myPackage, myRootRegistryKey)) { - ORMDesignerNameTable names = ORMDesignerSchema.Names; - using (FileStream designerSettingsStream = new FileStream(settingsFile, FileMode.Open, FileAccess.Read)) + string convertersDirectory = location.ConvertersDirectory; + using (FileStream designerSettingsStream = new FileStream(location.SettingsFile, FileMode.Open, FileAccess.Read)) { using (XmlTextReader settingsReader = new XmlTextReader(new StreamReader(designerSettingsStream), names)) { @@ -344,7 +429,7 @@ { if (TestElementName(reader.LocalName, names.XmlConvertersElement)) { - ProcessXmlConverters(reader, names); + ProcessXmlConverters(reader, names, convertersDirectory); } else { @@ -364,7 +449,7 @@ } } } - private void ProcessXmlConverters(XmlReader reader, ORMDesignerNameTable names) + private void ProcessXmlConverters(XmlReader reader, ORMDesignerNameTable names, string convertersDirectory) { if (reader.IsEmptyElement) { @@ -378,7 +463,7 @@ if (TestElementName(reader.LocalName, names.XmlConverterElement) || TestElementName(reader.LocalName, names.XmlExtensionConverterElement)) { - ProcessXmlConverter(reader, names); + ProcessXmlConverter(reader, names, convertersDirectory); } else { @@ -964,7 +1049,7 @@ } #endregion // TransformNode Class #endregion // Helper Classes - private void ProcessXmlConverter(XmlReader reader, ORMDesignerNameTable names) + private void ProcessXmlConverter(XmlReader reader, ORMDesignerNameTable names, string convertersDirectory) { if (myXmlConverters == null) { @@ -1060,7 +1145,7 @@ } } } - TransformNode transformNode = new TransformNode(targetIdentifier, description, Path.Combine(XmlConvertersDirectory, transformFile), arguments, dynamicParameters, runsWithSourceIdentifier); + TransformNode transformNode = new TransformNode(targetIdentifier, description, Path.Combine(convertersDirectory, transformFile), arguments, dynamicParameters, runsWithSourceIdentifier); LinkedList<TransformNode> nodes; if (myXmlConverters.TryGetValue(sourceIdentifier, out nodes)) { Modified: trunk/ORMModel/Shell/ORMPackage.cs =================================================================== --- trunk/ORMModel/Shell/ORMPackage.cs 2009-04-16 01:21:20 UTC (rev 1378) +++ trunk/ORMModel/Shell/ORMPackage.cs 2009-04-16 23:37:54 UTC (rev 1379) @@ -110,8 +110,7 @@ #region Constants private const string REGISTRYROOT_PACKAGE = @"ORM Solutions\Natural ORM Architect"; private const string REGISTRYROOT_EXTENSIONS = REGISTRYROOT_PACKAGE + @"\Extensions\"; - private const string REGISTRYVALUE_SETTINGSPATH = "SettingsPath"; - private const string REGISTRYVALUE_CONVERTERSDIR = "ConvertersDir"; + private const string REGISTRYROOT_DESIGNERSETTINGS = REGISTRYROOT_PACKAGE + @"\DesignerSettings\"; private const string REGISTRYVALUE_VERBALIZATIONDIR = "VerbalizationDir"; private const string REGISTRYVALUE_TOOLBOXREVISION_OBSOLETESINGLEVALUE = "ToolboxRevision"; private const string REGISTRYKEY_TOOLBOXREVISIONS = "ToolboxRevisions"; @@ -197,28 +196,7 @@ ORMDesignerSettings retVal = package.myDesignerSettings; if (retVal == null) { - RegistryKey applicationRegistryRoot = null; - RegistryKey normaRegistryRoot = null; - try - { - applicationRegistryRoot = package.ApplicationRegistryRoot; - normaRegistryRoot = applicationRegistryRoot.OpenSubKey(REGISTRYROOT_PACKAGE, RegistryKeyPermissionCheck.ReadSubTree); - string settingsPath = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_SETTINGSPATH, String.Empty); - string xmlConvertersDir = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_CONVERTERSDIR, String.Empty); - retVal = new ORMDesignerSettings(package, settingsPath, xmlConvertersDir); - package.myDesignerSettings = retVal; - } - finally - { - if (applicationRegistryRoot != null) - { - applicationRegistryRoot.Close(); - } - if (normaRegistryRoot != null) - { - normaRegistryRoot.Close(); - } - } + package.myDesignerSettings = retVal = new ORMDesignerSettings(package, REGISTRYROOT_DESIGNERSETTINGS); } return retVal; } @@ -244,7 +222,6 @@ { applicationRegistryRoot = package.ApplicationRegistryRoot; normaRegistryRoot = applicationRegistryRoot.OpenSubKey(REGISTRYROOT_PACKAGE, RegistryKeyPermissionCheck.ReadSubTree); - string settingsPath = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_SETTINGSPATH, String.Empty); retVal = (string)normaRegistryRoot.GetValue(REGISTRYVALUE_VERBALIZATIONDIR, String.Empty); package.myVerbalizationDirectory = retVal; } Modified: trunk/Setup/Components.wxs =================================================================== --- trunk/Setup/Components.wxs 2009-04-16 01:21:20 UTC (rev 1378) +++ trunk/Setup/Components.wxs 2009-04-16 23:37:54 UTC (rev 1379) @@ -446,7 +446,7 @@ DefaultLanguage="0" CompanionFile="ORMSolutions.ORMArchitect.Core$(var.VSExt).dll"/> <File Id="RemoveOIAL2006_01.xslt" ShortName="ROil0601.xsl" Name="RemoveOIAL2006-01.xslt" Source="..\ORMModel\Shell\Converters\RemoveOIAL2006-01.xslt" DefaultLanguage="0" CompanionFile="ORMSolutions.ORMArchitect.Core$(var.VSExt).dll"/> - <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)" Type="string" Name="ConvertersDir" Value="[Converters]"/> + <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)\DesignerSettings\Core" Type="string" Name="ConvertersDir" Value="[Converters]"/> </Component> </Directory> </Directory> @@ -487,14 +487,12 @@ </Component> </Directory> </Directory> + <Component Id="NORMAVSSettingsComponent" Guid="956063F7-13D9-4083-$(var.VersionGuidSuffix)" DiskId="1" Win64="$(var.Win64)"> + <File Id="ORMDesignerSettings.xml" ShortName="DsgnrStg.xml" Name="ORMDesignerSettings.xml" Source="..\ORMModel\Shell\ORMDesignerSettings.xml" + DefaultLanguage="0" KeyPath="yes"/> + <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)\DesignerSettings\Core" Type="string" Name="SettingsFile" Value="[#ORMDesignerSettings.xml]"/> + </Component> </Directory> - - <Component Id="NORMAVSSettingsComponent" Guid="956063F7-13D9-4083-$(var.VersionGuidSuffix)" DiskId="1" Win64="$(var.Win64)"> - <File Id="ORMDesignerSettings.xml" ShortName="DsgnrStg.xml" Name="ORMDesignerSettings.xml" Source="..\ORMModel\Shell\ORMDesignerSettings.xml" - DefaultLanguage="0" KeyPath="yes"/> - <RegistryValue Root="HKLM" Key="$(var.NORMAVSRegRoot)" Type="string" Name="SettingsPath" Value="[#ORMDesignerSettings.xml]"/> - </Component> - </Directory> </Directory> </Directory> Modified: trunk/install.bat =================================================================== --- trunk/install.bat 2009-04-16 01:21:20 UTC (rev 1378) +++ trunk/install.bat 2009-04-16 23:37:54 UTC (rev 1379) @@ -65,7 +65,8 @@ XCOPY /Y /D /V /Q "%RootDir%\AlternateViews\BarkerERView\BarkerERView.xsd" "%NORMADir%\Xml\Schemas\" XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Framework\Shell\DiagramDisplay.xsd" "%NORMADir%\Xml\Schemas\" XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\catalog.xml" "%NORMADir%\Xml\Schemas\" -XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\ORMDesignerSettings.xml" "%NORMADir%\" +CALL:_CleanupFile "%NORMADir%\ORMDesignerSettings.xml" +XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\ORMDesignerSettings.xml" "%NORMADir%\Xml\" XCOPY /Y /D /V /Q "%RootDir%\ORMModel\Shell\Converters\*.xslt" "%NORMADir%\Xml\Transforms\Converters\" XCOPY /Y /D /V /Q "%RootDir%\ORMModel\ObjectModel\VerbalizationUntypedSnippets.xsd" "%NORMADir%\Xml\Verbalization\" XCOPY /Y /D /V /Q "%RootDir%\ORMModel\ObjectModel\VerbalizationCoreSnippets\*.x??" "%NORMADir%\Xml\Verbalization\Core\" @@ -110,8 +111,12 @@ REG DELETE "HKLM\%VSRegistryRoot%\Projects\{A2FE74E1-B743-11d0-AE1A-00A0C90FFFC3}\AddItemTemplates\TemplateDirs\{EFDDC549-1646-4451-8A51-E5A5E94D647C}" /f 1>NUL 2>&1 REG DELETE "HKLM\%VSRegistryRoot%\Projects\{D1DCDB85-C5E8-11d2-BFCA-00C04F990235}\AddItemTemplates\TemplateDirs\{EFDDC549-1646-4451-8A51-E5A5E94D647C}" /f 1>NUL 2>&1 - REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "SettingsPath" /d "%NORMADir%\ORMDesignerSettings.xml" /f 1>NUL - REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "ConvertersDir" /d "%NORMADir%\Xml\Transforms\Converters\\" /f 1>NUL + :: Get rid of single-settings-file-only values + REG DELETE "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "SettingsPath" /f 1>NUL 2>&1 + REG DELETE "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "ConvertersDir" /f 1>NUL 2>&1 + + REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect\DesignerSettings\Core" /v "SettingsFile" /d "%NORMADir%\Xml\ORMDesignerSettings.xml" /f 1>NUL + REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect\DesignerSettings\Core" /v "ConvertersDir" /d "%NORMADir%\Xml\Transforms\Converters\\" /f 1>NUL REG ADD "HKLM\%VSRegistryRoot%\ORM Solutions\Natural ORM Architect" /v "VerbalizationDir" /d "%NORMADir%\Xml\Verbalization\\" /f 1>NUL REG ADD "HKLM\%VSRegistryRoot%\FontAndColors\Orm Designer" /v "Category" /d "{663DE24F-8E3A-4C0F-A307-53053ED6C59B}" /f 1>NUL REG ADD "HKLM\%VSRegistryRoot%\FontAndColors\Orm Designer" /v "Package" /d "{C5AA80F8-F730-4809-AAB1-8D925E36F9F5}" /f 1>NUL This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-04-21 00:23:26
|
Revision: 1382 http://orm.svn.sourceforge.net/orm/?rev=1382&view=rev Author: mcurland Date: 2009-04-21 00:23:23 +0000 (Tue, 21 Apr 2009) Log Message: ----------- * Deletion of a set comparison constraint role sequence is not revalidating errors, results in errors with no attached constraints and blocks file load. refs #288 * Modified build version and readme for official March 2009 release. refs #193 Modified Paths: -------------- trunk/ORMModel/ObjectModel/Constraint.cs trunk/Setup/Readme.htm trunk/VersionGenerator.exe.config Modified: trunk/ORMModel/ObjectModel/Constraint.cs =================================================================== --- trunk/ORMModel/ObjectModel/Constraint.cs 2009-04-20 23:14:48 UTC (rev 1381) +++ trunk/ORMModel/ObjectModel/Constraint.cs 2009-04-21 00:23:23 UTC (rev 1382) @@ -814,7 +814,7 @@ { FrameworkDomainModel.DelayValidateElement(this, DelayValidateCompatibleRolePlayerTypeError); FrameworkDomainModel.DelayValidateElement(this, DelayValidateRoleSequenceCountErrors); - FrameworkDomainModel.DelayValidateElement(this, DelayValidateConstraintPatternError); + DelayValidateConstraintPatternError(this); } void IModelErrorOwner.DelayValidateErrors() { @@ -2556,11 +2556,7 @@ VerifyRoleSequenceCountForRule(notifyAdded); // VerifyRoleSequenceArityForRule(notifyAdded); // This is called by VeryRoleSequenceCountForRule // VerifyCompatibleRolePlayerTypeForRule(notifyAdded); // This is called by VerifyRoleSequenqeArityForRule - foreach (SetComparisonConstraintRoleSequence sequence in RoleSequenceCollection) - { - sequence.ValidateIntersectingConstraints(notifyAdded); - break; - } + SetComparisonConstraintRoleSequence.ValidateIntersectingConstraints(this, notifyAdded); } void IModelErrorOwner.ValidateErrors(INotifyElementAdded notifyAdded) { @@ -2843,7 +2839,7 @@ ConstraintRoleSequence sequence = link.ConstraintRoleSequence; if (!sequence.IsDeleted) { - FrameworkDomainModel.DelayValidateElement(sequence, DelayValidateConstraintPatternError); + sequence.DelayValidatePatternError(); } SetComparisonConstraintRoleSequence setComparisonSequence = link.ConstraintRoleSequence as SetComparisonConstraintRoleSequence; if (setComparisonSequence != null) @@ -2995,18 +2991,50 @@ if (!sequence.IsDeleted) { - FrameworkDomainModel.DelayValidateElement(sequence, DelayValidateConstraintPatternError); + sequence.DelayValidatePatternError(); } } #endregion // Rules #region Validation /// <summary> + /// Register pattern validation for this sequencye + /// </summary> + protected void DelayValidatePatternError() + { + ModelElement constraint = Constraint as ModelElement; + if (constraint != null) + { + FrameworkDomainModel.DelayValidateElement(constraint, DelayValidatePatternErrorForConstraint); + } + else + { + FrameworkDomainModel.DelayValidateElement(this, DelayValidatePatternErrorForSequence); + } + } + /// <summary> + /// A pass through validator used to map a role sequence that may not + /// have been added to a constraint when the constraint was added to + /// validation on the constrant itself. Most pattern validation should + /// go directly to the constraint, not the sequence, because for set comparison + /// constraint cases, the sequence can be detached before validation, making it + /// impossible to determine the constraint to validate. + /// </summary> + [DelayValidatePriority(-1)] + private static void DelayValidatePatternErrorForSequence(ModelElement element) + { + ModelElement constraint = ((ConstraintRoleSequence)element).Constraint as ModelElement; + if (constraint != null) + { + FrameworkDomainModel.DelayValidateElement(constraint, DelayValidatePatternErrorForConstraint); + } + } + /// <summary> /// Validator callback for MandatoryImpliedByMandatoryError /// and UniquenessImpliedByUniquenessError /// </summary> - protected static void DelayValidateConstraintPatternError(ModelElement element) + private static void DelayValidatePatternErrorForConstraint(ModelElement element) { - (element as ConstraintRoleSequence).ValidateConstraintPatternError(null); + ValidateConstraintPatternError(element as IConstraint, null); } /// <summary> /// A helper function to delay validate pattern errors on an <see cref="IConstraint"/> @@ -3014,28 +3042,10 @@ protected static void DelayValidateConstraintPatternError(IConstraint constraint) { // Delay validate. Note that DelayValidateElement will automatically filter out duplicates - switch (constraint.ConstraintStorageStyle) + ModelElement element = (ModelElement)constraint; + if (!element.IsDeleted && !element.IsDeleting) { - case ConstraintStorageStyle.SetConstraint: - SetConstraint setConstraint = (SetConstraint)constraint; - if (!setConstraint.IsDeleted && !setConstraint.IsDeleting) - { - FrameworkDomainModel.DelayValidateElement((ModelElement)setConstraint, DelayValidateConstraintPatternError); - } - break; - case ConstraintStorageStyle.SetComparisonConstraint: - SetComparisonConstraint setComparisonConstraint = (SetComparisonConstraint)constraint; - if (!setComparisonConstraint.IsDeleted && !setComparisonConstraint.IsDeleting) - { - //The validation code will just need to pull the .Constraint property - //off of this object, so it does not matter what sequence to send - LinkedElementCollection<SetComparisonConstraintRoleSequence> sequences = setComparisonConstraint.RoleSequenceCollection; - if (sequences.Count != 0) - { - FrameworkDomainModel.DelayValidateElement(sequences[0], DelayValidateConstraintPatternError); - } - } - break; + FrameworkDomainModel.DelayValidateElement(element, DelayValidatePatternErrorForConstraint); } } @@ -3043,16 +3053,14 @@ /// Validates a subset of predefined constraint patterns (cases where SetConstraints conflict /// with SetComparison constraints) /// </summary> - /// <param name="notifyAdded"></param> - protected void ValidateConstraintPatternError(INotifyElementAdded notifyAdded) + protected static void ValidateConstraintPatternError(IConstraint constraint, INotifyElementAdded notifyAdded) { - IConstraint constraint = this.Constraint; if (constraint != null) { ValidateConstraintPatternErrorWithKnownConstraint(notifyAdded, constraint, IntersectingConstraintPattern.None, null); } } - private void ValidateConstraintPatternErrorWithKnownConstraint(INotifyElementAdded notifyAdded, IConstraint currentConstraint, IntersectingConstraintPattern pattern, List<IConstraint> constraintsAlreadyValidated) + private static void ValidateConstraintPatternErrorWithKnownConstraint(INotifyElementAdded notifyAdded, IConstraint currentConstraint, IntersectingConstraintPattern pattern, List<IConstraint> constraintsAlreadyValidated) { #region Declare and Assign necessary variables if (constraintsAlreadyValidated != null) @@ -3072,16 +3080,19 @@ SetConstraint currentSetConstraint = null; LinkedElementCollection<Role> setConstraintRoles = null; ConstraintModality currentModality; + Store store; if (null != (currentSetConstraint = currentConstraint as SetConstraint)) { currentModality = currentSetConstraint.Modality; setConstraintRoles = currentSetConstraint.RoleCollection; + store = currentSetConstraint.Store; } else { currentSetComparisonConstraint = (SetComparisonConstraint)currentConstraint; currentModality = currentSetComparisonConstraint.Modality; sequences = currentSetComparisonConstraint.RoleSequenceCollection; + store = currentSetComparisonConstraint.Store; } #endregion @@ -3150,7 +3161,6 @@ } //Get these GUIDs from data - Store store = Store; DomainRoleInfo towardsErrorRoleInfo = null; ModelError error = null; Guid? domainRoleErrorId = validationInfo.DomainRoleToError; @@ -3265,10 +3275,9 @@ if (error != null) { //Validate other constraints on this error - List<IConstraint> list = GetAllConstraintsOnError(error); int validatedCount = 0; - foreach (IConstraint constr in list) + foreach (IConstraint constr in GetAllConstraintsOnError(error)) { if (constr != currentSetComparisonConstraint) { @@ -3365,7 +3374,7 @@ if (hasError) { - HandleError(true, ref error, domainRoleErrorId.Value, notifyAdded, currentConstraint); + HandleError(store, true, ref error, domainRoleErrorId.Value, notifyAdded, currentConstraint); } else if (error != null) { @@ -3429,8 +3438,8 @@ - HandleError(false, ref error, domainRoleErrorId.Value, notifyAdded, currentConstraint); - HandleError(true, ref error, mandatoryDomainRoleId, null, contradictingMandatory); + HandleError(store, false, ref error, domainRoleErrorId.Value, notifyAdded, currentConstraint); + HandleError(store, true, ref error, mandatoryDomainRoleId, null, contradictingMandatory); } else if (error != null) { @@ -3468,22 +3477,17 @@ } } - private List<IConstraint> GetAllConstraintsOnError(ModelError error) + private static IEnumerable<IConstraint> GetAllConstraintsOnError(ModelError error) { - List<IConstraint> constraintsAttached = new List<IConstraint>(); - ReadOnlyCollection<ElementLink> links = DomainRoleInfo.GetAllElementLinks(error); - - foreach (ElementLink link in links) + foreach (ElementLink link in DomainRoleInfo.GetAllElementLinks(error)) { IConstraint cur = DomainRoleInfo.GetSourceRolePlayer(link) as IConstraint; if (cur != null) { - constraintsAttached.Add(cur); + yield return cur; } } - - return constraintsAttached; } /// <summary> @@ -3524,7 +3528,7 @@ } } - private bool CheckIfHasOneColumn(LinkedElementCollection<SetComparisonConstraintRoleSequence> sequences) + private static bool CheckIfHasOneColumn(LinkedElementCollection<SetComparisonConstraintRoleSequence> sequences) { bool hasOneColumn = true; @@ -3549,7 +3553,7 @@ /// <param name="allConstraintsThatNeedToBeAttached_And_TheirRoleIds"> /// The key is Iconstraint and the value is a Guis of the role this constraint plays in the relationship with this error /// </param> - private void UpdateErrorObject(ref ModelError error, Hashtable allConstraintsThatNeedToBeAttached_And_TheirRoleIds) + private static void UpdateErrorObject(ref ModelError error, Hashtable allConstraintsThatNeedToBeAttached_And_TheirRoleIds) { if (error == null) { @@ -3575,54 +3579,59 @@ } } } - /// <summary> - /// Takes care of attaching the constraint to the error and updating error text if requested + /// Takes care of attaching the constraints to the error and updating error text if requested /// </summary> - /// <param name="generateText"></param> - /// <param name="error"></param> - /// <param name="domainRoleErrorId"></param> - /// <param name="notifyAdded"></param> - /// <param name="constraintToAttachErrorTo"> - /// Constraint to attach the error to - /// </param> - private void HandleError(bool generateText, ref ModelError error, - Guid domainRoleErrorId, INotifyElementAdded notifyAdded, - IConstraint constraintToAttachErrorTo) + /// <param name="store">Context <see cref="Store"/></param> + /// <param name="generateText">True to generated text for the error</param> + /// <param name="error">The error being created or modified</param> + /// <param name="domainRoleErrorId">The role on the error object that is opposite the error to create</param> + /// <param name="notifyAdded"><see cref="INotifyElementAdded"/> callback, set during deserialization</param> + /// <param name="conflictingConstraints">All constraints that need to be added to the error</param> + private static void HandleError( + Store store, + bool generateText, + ref ModelError error, + Guid domainRoleErrorId, + INotifyElementAdded notifyAdded, + params IConstraint[] conflictingConstraints) { - HandleError(generateText, ref error, domainRoleErrorId, notifyAdded, new IConstraint[]{constraintToAttachErrorTo}); + HandleError(store, generateText, ref error, domainRoleErrorId, notifyAdded, (IList<IConstraint>)conflictingConstraints); } - /// <summary> /// Takes care of attaching the constraints to the error and updating error text if requested /// </summary> - /// <param name="generateText"></param> - /// <param name="error"></param> - /// <param name="domainRoleErrorId"></param> - /// <param name="notifyAdded"></param> - /// <param name="allConstraintsConflicting"> - /// All constraints that need to be added to the error, better to send all of - /// them at once - /// </param> - private void HandleError(bool generateText, ref ModelError error, - Guid domainRoleErrorId, INotifyElementAdded notifyAdded, - IList<IConstraint> allConstraintsConflicting) + /// <param name="store">Context <see cref="Store"/></param> + /// <param name="generateText">True to generated text for the error</param> + /// <param name="error">The error being created or modified</param> + /// <param name="domainRoleErrorId">The role on the error object that is opposite the error to create</param> + /// <param name="notifyAdded"><see cref="INotifyElementAdded"/> callback, set during deserialization</param> + /// <param name="conflictingConstraints">All constraints that need to be added to the error</param> + private static void HandleError( + Store store, + bool generateText, + ref ModelError error, + Guid domainRoleErrorId, + INotifyElementAdded notifyAdded, + IList<IConstraint> conflictingConstraints) { - if (allConstraintsConflicting == null) + int constraintCount; + if (conflictingConstraints == null || + 0 == (constraintCount = conflictingConstraints.Count)) { return; } if (error == null) { //Create it - error = (ModelError)Store.ElementFactory.CreateElement( - Store.DomainDataDirectory.FindDomainRole(domainRoleErrorId).OppositeDomainRole.RolePlayer); + error = (ModelError)store.ElementFactory.CreateElement(store.DomainDataDirectory.FindDomainRole(domainRoleErrorId).OppositeDomainRole.RolePlayer); } ModelElement errorLinked; - foreach (IConstraint curConstraint in allConstraintsConflicting) + for (int i = 0; i < constraintCount; ++i) { + IConstraint curConstraint = conflictingConstraints[i]; errorLinked = DomainRoleInfo.GetLinkedElement((ModelElement)curConstraint, domainRoleErrorId); if (errorLinked != error || errorLinked == null) @@ -3642,10 +3651,7 @@ if (generateText) { - if (allConstraintsConflicting.Count > 0) - { - error.Model = allConstraintsConflicting[0].Model; - } + error.Model = conflictingConstraints[0].Model; error.GenerateErrorText(); } @@ -3669,7 +3675,7 @@ /// <param name="curConstraint"></param> /// <param name="hasErrorDefault"></param> /// <returns></returns> - private bool HandleExclusionOrEqualityAndMandatory( + private static bool HandleExclusionOrEqualityAndMandatory( LinkedElementCollection<SetComparisonConstraintRoleSequence> sequences, bool shouldExecuteValidationCode, bool isExclusion, int minNumViolatingConstraints, @@ -3687,12 +3693,12 @@ Guid domainRoleErrorId = optionalDomainRoleErrorId.Value; IList<IConstraint> constrFound = null; bool hasError = hasErrorDefault; + Store store = ((ModelElement)curConstraint).Store; if (shouldExecuteValidationCode && (0 < minNumViolatingConstraints || 0 < (minNumViolatingConstraints = (sequences != null) ? sequences.Count : 0))) { - Store store = Store; int numOfViolatingConstraints = 0; //For these patterns: there can be an error only if there are more than one sequences on @@ -3756,14 +3762,14 @@ //!isExclusion means that if it is not exclusion constraint - no more error handling will //occur, so error text needs to be generated now - HandleError(!isExclusion, ref error, domainRoleErrorId, notifyAdded, curConstraint); - HandleError(true, ref error, mandatoriesDomainRoleId, null, constrFound); + HandleError(store, !isExclusion, ref error, domainRoleErrorId, notifyAdded, curConstraint); + HandleError(store, true, ref error, mandatoriesDomainRoleId, null, constrFound); } else { //!isExclusion means that if it is not exclusion constraint - no more error handling will //occur, so error text needs to be generated now - HandleError(!isExclusion, ref error, domainRoleErrorId, notifyAdded, curConstraint); + HandleError(store, !isExclusion, ref error, domainRoleErrorId, notifyAdded, curConstraint); } } else if (error != null) @@ -3782,7 +3788,7 @@ /// <param name="notifyAdded"></param> /// <param name="validationInfo">Validation information of the current constraint</param> /// <param name="constraintSequences">Sequences linked to the constraint</param> - private void ValidateSetComparisonConstraintSubsetPattern( + private static void ValidateSetComparisonConstraintSubsetPattern( SetComparisonConstraint setComparsionConstraint, INotifyElementAdded notifyAdded, IntersectingConstraintValidation validationInfo, @@ -3902,7 +3908,7 @@ #region Handling the error int constraintsInErrorCount = (constraintsInError == null) ? 0 : constraintsInError.Count; Guid domainRoleErrorId = validationInfo.DomainRoleToError.Value; - Store store = Store; + Store store = setComparsionConstraint.Store; DomainRoleInfo constraintRoleInfo = store.DomainDataDirectory.FindDomainRole(domainRoleErrorId); DomainRoleInfo errorRoleInfo = constraintRoleInfo.OppositeDomainRole; @@ -3935,8 +3941,8 @@ //Need to attach the error to all: the current constraint and all constraints, which were found to conflict with it - HandleError(false, ref error, domainRoleErrorId, notifyAdded, setComparsionConstraint); - HandleError(true, ref error, domainRoleErrorId, notifyAdded, constraintsInError); + HandleError(store, false, ref error, domainRoleErrorId, notifyAdded, setComparsionConstraint); + HandleError(store, true, ref error, domainRoleErrorId, notifyAdded, constraintsInError); } } else if (error != null) @@ -3968,7 +3974,7 @@ if (constraintSequenceCount > 1) { //Attach the error only to the current constraint - HandleError(true, ref error, domainRoleErrorId, notifyAdded, curConstraint); + HandleError(store, true, ref error, domainRoleErrorId, notifyAdded, curConstraint); } } else if (error != null) //there was an error but not anymore @@ -4097,12 +4103,11 @@ #region Error validation /// <summary> /// Called during initial validation of a <see cref="SetComparisonConstraint"/> to - /// verify intersecting constraints. This methods needs to be called for one sequence - /// on a constraint only. + /// verify intersecting constraints. /// </summary> - public void ValidateIntersectingConstraints(INotifyElementAdded notifyAdded) + public static void ValidateIntersectingConstraints(IConstraint constraint, INotifyElementAdded notifyAdded) { - base.ValidateConstraintPatternError(notifyAdded); + ValidateConstraintPatternError(constraint, notifyAdded); } #endregion // Error validation } Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-04-20 23:14:48 UTC (rev 1381) +++ trunk/Setup/Readme.htm 2009-04-21 00:23:23 UTC (rev 1382) @@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> -<title>NORMA February 2009 CTP Readme</title> +<title>NORMA March 2009 CTP Readme</title> <style type="text/css"> .new {font-size:x-small; background-color:Gold; color:Blue; } li {padding-bottom: 3px;} @@ -12,9 +12,9 @@ <body> -<p><b><a id="The Top" style="font-family:Verdana;font-size:medium">NORMA February 2009 CTP Readme</a> </b></p> +<p><b><a id="The Top" style="font-family:Verdana;font-size:medium">NORMA March 2009 CTP Readme</a> </b></p> <p>This file supersedes the previous readme.txt and older readme.htm files. This readme has parallel indexing mechanisms: by topic, and by release date (starting with the October 2008 (2008-10) release, I won't be adding historical dates). The file will be extended for future product releases.<br/><br/> -The February 2009 drop adds grouping support and a number of stability improvements in the tool. +The March 2009 release is a stabilization release with targeted fixes. <br/><br/></p> <h2>Contents</h2> <ul> @@ -40,9 +40,25 @@ <li><a href="#TOPIC DAILY">TOPIC DESCRIPTION</a> (Changeset ####)</li> </ul>--> <hr/> -<h2>February 2009 CTP Changes</h2> -<div>The February 2009 CTP drop includes all modifications through changeset 1370. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<h2>March 2009 CTP Changes</h2> +<div>The Math 2009 CTP release includes all modifications through changeset 1382. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> +<li>Notable Changes: +<ol> +<li>Column name generation in separate or partitioned tables was incorrectly the 'identifier' naming pattern instead of the 'reference' naming pattern, resulting in overly simplified names for referenced elements.</li> +<li>Any duplicate constraint names that match the automatically generated name are automatically resolved when the file loads. This makes it much easier to merge multiple versions of the same model file.</li> +<li>Opening the Fact Editor with an existing selection would not populate for that selection. Selection had to be changed with the editor visible.</li> +<li><em>Notes</em> and <em>Informal Descriptions</em> are now available for all constraints and for groups.</li> +<li>The readme file has been moved to the <em>Documentation</em> directory, which also contains an html form of the core schema file with full comments. The schema comments should also improve the experience of looking at an .orm file in the Visual Studio Xml editor.</li> +<li>Added support for external developers to register their own Xml file importers. Additional settings files can be added to the <em>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\ORM Solutions\Natural ORM Architect\DesignerSettings</em> key using the pattern shown in the 'Core' subkey. Note that the <em>ConvertersDir</em> specified for the core settings file will be used if another directory is not specified. Use <em>9.0</em> instead of <em>8.0</em> for Visual Studio 2008.</li> +<li>Added support for generating multiple database schemas. Mechanisms for leveraging this support with custom properties are discussed in the forums at <a href="http://www.ormfoundation.org">orm foundation</a>.</li> +<li>Fixed an issue with contradition errors not clearly when a role sequence was deleted from a set comparison constraint. This could leave the .orm file in an invalid state.</li> +</ol> +</li> +</ul> +<hr/> +<div>The February 2009 CTP release includes all modifications through changeset 1370.</div> +<ul> <li><a href="#Element Grouping 2009-02">Element Grouping</a> </li> <li>Other Changes: <ol> @@ -59,7 +75,7 @@ </ul> <hr/> <h2>January 2009 CTP Changes</h2> -<div>The January 2009 CTP drop includes all modifications through changeset 1356.</div> +<div>The January 2009 CTP release includes all modifications through changeset 1356.</div> <ul> <li><a href="#FactEditor Inverse Readings 2009-01">Fact Editor inverse readings</a> </li> <li>Other Changes: @@ -73,7 +89,7 @@ </li> </ul><hr/> <h2>December 2008 CTP Changes</h2> -<div>The December 2008 CTP (a) drop includes all modifications through changeset 1350.</div> +<div>The December 2008 CTP (a) release includes all modifications through changeset 1350.</div> <ul> <li><a href="#Diagram Management 2008-12">Diagram order and position caching</a> </li> <li><a href="#Model Browser Links 2008-12">Model Browser link nodes</a> </li> @@ -85,8 +101,8 @@ </li> </ul><hr/> <h2>October 2008 CTP Changes</h2> -<div>The October 2008 CTP drop includes all modifications through changeset 1340.<br/><br/> -The October 2008 drop includes two major functionality additions plus a number of smaller pieces. The major changes relate to sample population (you can now fully populate a model, including objectified FactTypes and Subtypes) and model navigation using the Verbalization Browser and the new 'ORM Diagram Spy' tool window. +<div>The October 2008 CTP release includes all modifications through changeset 1340.<br/><br/> +The October 2008 release includes two major functionality additions plus a number of smaller pieces. The major changes relate to sample population (you can now fully populate a model, including objectified FactTypes and Subtypes) and model navigation using the Verbalization Browser and the new 'ORM Diagram Spy' tool window. </div> <ul> <li><a href="#Setup 2008-10">SetupVista.bat elevates install permissions on Vista</a></li> @@ -116,7 +132,7 @@ <li>First extract the files from the .zip file first unless you open them with the standard 'Compressed (zipped) Folders' viewer, in which case you can usually run Setup.bat without pre-expanding the zip file. Vista is likely to recommend expansion even with the standard viewer.</li> <li><a id="#Setup 2008-10" class="new" title="October 2008 CTP: SetupVista.bat elevates install permissions on Vista">2008-10</a> The setup process must be run with admistrative permissions on Vista. You can either right-click the Setup.bat file and choose 'Run as Administrator', or you can run SetupVista.bat instead of Setup.bat and agree to the Vista security warnings.</li> -<li>(Visual Studio 2005 Install Only) The DSLToolsRedist.msi included with this drop will not automatically upgrade if you have an older DSL installation on your machine. If you were an early user of NORMA or other DSL products and have not previously upgraded, or have experience designer issues on Windows Vista, then you may want to explicit uninstall the 'Microsoft DSL Tools Redistributable' product before running NORMA setup.</li> +<li>(Visual Studio 2005 Install Only) The DSLToolsRedist.msi included with this release will not automatically upgrade if you have an older DSL installation on your machine. If you were an early user of NORMA or other DSL products and have not previously upgraded, or have experience designer issues on Windows Vista, then you may want to explicit uninstall the 'Microsoft DSL Tools Redistributable' product before running NORMA setup.</li> </ol> <a href="#The Top">Return to top</a> <hr/> Modified: trunk/VersionGenerator.exe.config =================================================================== --- trunk/VersionGenerator.exe.config 2009-04-20 23:14:48 UTC (rev 1381) +++ trunk/VersionGenerator.exe.config 2009-04-21 00:23:23 UTC (rev 1382) @@ -2,7 +2,7 @@ <configuration> <appSettings> <add key="RevisionStartYearMonth" value="2006-01"/> - <add key="ReleaseYearMonth" value="2009-02"/> + <add key="ReleaseYearMonth" value="2009-03"/> <!-- ReleaseType: "CTP" or "RTM" --> <add key="ReleaseType" value="CTP"/> <!-- Changes to the major and/or minor version numbers have extreme effects across every part of the product. --> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-04-23 09:35:34
|
Revision: 1383 http://orm.svn.sourceforge.net/orm/?rev=1383&view=rev Author: mcurland Date: 2009-04-23 09:35:17 +0000 (Thu, 23 Apr 2009) Log Message: ----------- The framework is retrieving delete closures during undo/redo operations. Make sure that MultiShapeUtility does not attempt to do reconfigure if a transaction is not active. Fixed a crashing scenario of a delete/undo/redo sequence on a subtype with two subtype shapes and one supertype shape on the same diagram. refs #316 Modified Paths: -------------- trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs trunk/ORMModel/ShapeModel/SubtypeLink.cs trunk/Setup/Readme.htm Modified: trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs =================================================================== --- trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs 2009-04-21 00:23:23 UTC (rev 1382) +++ trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs 2009-04-23 09:35:17 UTC (rev 1383) @@ -555,7 +555,12 @@ { throw new ArgumentNullException("link"); } - Dictionary<object, object> contextInfo = link.Store.TransactionManager.CurrentTransaction.TopLevelTransaction.Context.ContextInfo; + Store store = link.Store; + if (store.InUndoRedoOrRollback) + { + return; + } + Dictionary<object, object> contextInfo = store.TransactionManager.CurrentTransaction.TopLevelTransaction.Context.ContextInfo; if (IsSecondaryLinkReconfigureBlocked(contextInfo, link)) { return; Modified: trunk/ORMModel/ShapeModel/SubtypeLink.cs =================================================================== --- trunk/ORMModel/ShapeModel/SubtypeLink.cs 2009-04-21 00:23:23 UTC (rev 1382) +++ trunk/ORMModel/ShapeModel/SubtypeLink.cs 2009-04-23 09:35:17 UTC (rev 1383) @@ -437,11 +437,14 @@ SubtypeFact subtypeFact = AssociatedSubtypeFact; ObjectType subType = subtypeFact.Subtype; ObjectType superType = subtypeFact.Supertype; - FactType nestedSubFact = subType.NestedFactType; - FactType nestedSuperFact = superType.NestedFactType; + if (subType != null && superType != null) + { + FactType nestedSubFact = subType.NestedFactType; + FactType nestedSuperFact = superType.NestedFactType; - MultiShapeUtility.ReconfigureLink(this, (nestedSubFact == null) ? subType as ModelElement : nestedSubFact as ModelElement, - (nestedSuperFact == null) ? superType as ModelElement : nestedSuperFact as ModelElement, discludedShape); + MultiShapeUtility.ReconfigureLink(this, (nestedSubFact == null) ? subType as ModelElement : nestedSubFact as ModelElement, + (nestedSuperFact == null) ? superType as ModelElement : nestedSuperFact as ModelElement, discludedShape); + } } void IReconfigureableLink.Reconfigure(ShapeElement discludedShape) { Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-04-21 00:23:23 UTC (rev 1382) +++ trunk/Setup/Readme.htm 2009-04-23 09:35:17 UTC (rev 1383) @@ -41,7 +41,7 @@ </ul>--> <hr/> <h2>March 2009 CTP Changes</h2> -<div>The Math 2009 CTP release includes all modifications through changeset 1382. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The March 2009 CTP release includes all modifications through changeset 1383. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li>Notable Changes: <ol> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-05-25 05:59:53
|
Revision: 1389 http://orm.svn.sourceforge.net/orm/?rev=1389&view=rev Author: mcurland Date: 2009-05-25 05:59:43 +0000 (Mon, 25 May 2009) Log Message: ----------- Verbalization 'Derivation Rule' text and rename 'Definition' to 'Informal Description'. refs #346 Modified Paths: -------------- trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xml trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xsd trunk/ORMModel/ObjectModel/VerbalizationCoreSnippetsDocumentation.html trunk/ORMModel/ObjectModel/VerbalizationGenerator.cs trunk/ORMModel/ObjectModel/VerbalizationGenerator.xml trunk/ORMModel/ObjectModel/VerbalizationGenerator.xsd trunk/ORMModel/ObjectModel/VerbalizationGenerator.xslt trunk/Setup/Readme.htm Modified: trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xml =================================================================== --- trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xml 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xml 2009-05-25 05:59:43 UTC (rev 1389) @@ -25,7 +25,8 @@ <Snippet type="ValueTypeVerbalization"><![CDATA[{0} <span class="quantifier">is a value type</span>]]></Snippet> <Snippet type="ModelVerbalization"><![CDATA[<span class="quantifier">Object-Role Model:</span> {0}]]></Snippet> <Snippet type="NotesVerbalization"><![CDATA[<span class="quantifier">Notes:</span> <span class="note">{0}</span>]]></Snippet> - <Snippet type="DefinitionVerbalization"><![CDATA[<span class="quantifier">Definition:</span> <span class="definition">{0}</span>]]></Snippet> + <Snippet type="DescriptionVerbalization"><![CDATA[<span class="quantifier">Informal Description:</span> <span class="definition">{0}</span>]]></Snippet> + <Snippet type="DerivationRuleVerbalization"><![CDATA[<span class="quantifier">Derivation Rule:</span> <span class="definition">{0}</span>]]></Snippet> <Snippet type="ConstraintProvidesPreferredIdentifier"><![CDATA[<span class="smallIndent"><span class="quantifier">this association with</span> {0} <span class="quantifier">provides the preferred identification scheme for</span> {1}</span>]]></Snippet> <!-- All object type names are wrapped with this style automatically. Modified: trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xsd =================================================================== --- trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xsd 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/ORMModel/ObjectModel/VerbalizationCoreSnippets/VerbalizationCoreSnippets.xsd 2009-05-25 05:59:43 UTC (rev 1389) @@ -25,11 +25,16 @@ <xs:redefine schemaLocation="../VerbalizationUntypedSnippets.xsd"> <xs:simpleType name="SnippetTypeEnum"> <xs:restriction base="SnippetTypeEnum"> - <xs:enumeration value="DefinitionVerbalization"> + <xs:enumeration value="DescriptionVerbalization"> <xs:annotation> - <xs:documentation>Description: Verbalizes the text specified for a n element definition. Format: Definition: {0}</xs:documentation> + <xs:documentation>Description: Verbalizes the text specified for an element description. Format: Informal Description: {0}</xs:documentation> </xs:annotation> </xs:enumeration> + <xs:enumeration value="DerivationRuleVerbalization"> + <xs:annotation> + <xs:documentation>Description: Verbalizes the text specified for an element derivation rule. Format: Derivation Rule: {0}</xs:documentation> + </xs:annotation> + </xs:enumeration> <xs:enumeration value="NotesVerbalization"> <xs:annotation> <xs:documentation>Description: Verbalizes the text specified for a model note. Format: Notes: {0}</xs:documentation> Modified: trunk/ORMModel/ObjectModel/VerbalizationCoreSnippetsDocumentation.html =================================================================== --- trunk/ORMModel/ObjectModel/VerbalizationCoreSnippetsDocumentation.html 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/ORMModel/ObjectModel/VerbalizationCoreSnippetsDocumentation.html 2009-05-25 05:59:43 UTC (rev 1389) @@ -340,9 +340,12 @@ <a href="#DefiniteArticle">DefiniteArticle</a> </li> <li> - <a href="#DefinitionVerbalization">DefinitionVerbalization</a> + <a href="#DerivationRuleVerbalization">DerivationRuleVerbalization</a> </li> <li> + <a href="#DescriptionVerbalization">DescriptionVerbalization</a> + </li> + <li> <a href="#EachInstanceQuantifier">EachInstanceQuantifier</a> </li> <li> @@ -1596,22 +1599,38 @@ </p> </div> </div> - <div id="DefinitionVerbalization" class="snippet"> + <div id="DerivationRuleVerbalization" class="snippet"> <span class="snippetHeader"> - <a name="DefinitionVerbalization" id="DefinitionVerbalization">DefinitionVerbalization</a> + <a name="DerivationRuleVerbalization" id="DerivationRuleVerbalization">DerivationRuleVerbalization</a> </span> <div class="snippetStatement"> - <strong>Description: </strong> Verbalizes the text specified for a n element definition. <br /> - <strong>Format: </strong> Definition: {0}</div> + <strong>Description: </strong> Verbalizes the text specified for an element derivation rule. <br /> + <strong>Format: </strong> Derivation Rule: {0}</div> <div class="snippetReplacementFieldCount"> <span class="reportItem">Number of replacement fields: </span>1</div> <div class="snippetUnformattedText"> <span class="reportItem">Unformatted version: </span> <div class="unformattedSnippet"> - <pre class="unformattedSnippetDecorator">Definition: {0}</pre> + <pre class="unformattedSnippetDecorator">Derivation Rule: {0}</pre> </div> </div> </div> + <div id="DescriptionVerbalization" class="snippet"> + <span class="snippetHeader"> + <a name="DescriptionVerbalization" id="DescriptionVerbalization">DescriptionVerbalization</a> + </span> + <div class="snippetStatement"> + <strong>Description: </strong> Verbalizes the text specified for an element description. <br /> + <strong>Format: </strong> Informal Description: {0}</div> + <div class="snippetReplacementFieldCount"> + <span class="reportItem">Number of replacement fields: </span>1</div> + <div class="snippetUnformattedText"> + <span class="reportItem">Unformatted version: </span> + <div class="unformattedSnippet"> + <pre class="unformattedSnippetDecorator">Informal Description: {0}</pre> + </div> + </div> + </div> <div id="EachInstanceQuantifier" class="snippet"> <span class="snippetHeader"> <a name="EachInstanceQuantifier" id="EachInstanceQuantifier">EachInstanceQuantifier</a> Modified: trunk/ORMModel/ObjectModel/VerbalizationGenerator.cs =================================================================== --- trunk/ORMModel/ObjectModel/VerbalizationGenerator.cs 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/ORMModel/ObjectModel/VerbalizationGenerator.cs 2009-05-25 05:59:43 UTC (rev 1389) @@ -75,8 +75,10 @@ ContextScopeReference, /// <summary>The 'DefiniteArticle' format string snippet. Contains 1 replacement field.</summary> DefiniteArticle, - /// <summary>The 'DefinitionVerbalization' format string snippet. Contains 1 replacement field.</summary> - DefinitionVerbalization, + /// <summary>The 'DerivationRuleVerbalization' format string snippet. Contains 1 replacement field.</summary> + DerivationRuleVerbalization, + /// <summary>The 'DescriptionVerbalization' format string snippet. Contains 1 replacement field.</summary> + DescriptionVerbalization, /// <summary>The 'EachInstanceQuantifier' format string snippet. Contains 1 replacement field.</summary> EachInstanceQuantifier, /// <summary>The 'EntityTypeVerbalization' format string snippet. Contains 1 replacement field.</summary> @@ -403,7 +405,8 @@ @"<span class=""quantifier"">context: </span>{0}", @"<span class=""quantifier"">in this context,</span> {0}", @"<span class=""quantifier"">that</span> {0}", - @"<span class=""quantifier"">Definition:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Derivation Rule:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Informal Description:</span> <span class=""definition"">{0}</span>", @"<span class=""quantifier"">each instance of</span> {0} <span class=""quantifier"">occurs only once</span>", @"{0} <span class=""quantifier"">is an entity type</span>", @"{0}<span class=""quantifier""> if and only if </span>{1}", @@ -599,7 +602,8 @@ @"<span class=""quantifier"">context: </span>{0}", @"<span class=""quantifier"">in this context,</span> {0}", @"<span class=""quantifier"">that</span> {0}", - @"<span class=""quantifier"">Definition:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Derivation Rule:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Informal Description:</span> <span class=""definition"">{0}</span>", @"<span class=""quantifier"">each instance of</span> {0} <span class=""quantifier"">occurs only once</span>", @"{0} <span class=""quantifier"">is an entity type</span>", @"{0}<span class=""quantifier""> if and only if </span>{1}", @@ -795,7 +799,8 @@ @"<span class=""quantifier"">context: </span>{0}", @"<span class=""quantifier"">in this context,</span> {0}", @"<span class=""quantifier"">that</span> {0}", - @"<span class=""quantifier"">Definition:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Derivation Rule:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Informal Description:</span> <span class=""definition"">{0}</span>", @"<span class=""quantifier"">each instance of</span> {0} <span class=""quantifier"">occurs only once</span>", @"{0} <span class=""quantifier"">is an entity type</span>", @"{0}<span class=""quantifier""> if and only if </span>{1}", @@ -991,7 +996,8 @@ @"<span class=""quantifier"">context: </span>{0}", @"<span class=""quantifier"">in this context,</span> {0}", @"<span class=""quantifier"">that</span> {0}", - @"<span class=""quantifier"">Definition:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Derivation Rule:</span> <span class=""definition"">{0}</span>", + @"<span class=""quantifier"">Informal Description:</span> <span class=""definition"">{0}</span>", @"<span class=""quantifier"">each instance of</span> {0} <span class=""quantifier"">occurs only once</span>", @"{0} <span class=""quantifier"">is an entity type</span>", @"{0}<span class=""quantifier""> if and only if </span>{1}", @@ -1979,7 +1985,7 @@ #endregion // Preliminary #region Pattern Matches verbalizationContext.BeginVerbalization(VerbalizationContent.Normal); - string snippetFormat1 = snippets.GetSnippet(CoreVerbalizationSnippetType.DefinitionVerbalization, isDeontic, isNegative); + string snippetFormat1 = snippets.GetSnippet(CoreVerbalizationSnippetType.DescriptionVerbalization, isDeontic, isNegative); string snippet1Replace1 = null; snippet1Replace1 = this.Text; FactType.WriteVerbalizerSentence(writer, string.Format(writer.FormatProvider, snippetFormat1, snippet1Replace1), snippets.GetSnippet(CoreVerbalizationSnippetType.CloseVerbalizationSentence, isDeontic, isNegative)); @@ -2127,6 +2133,223 @@ } } #endregion // Note verbalization + #region FactTypeDerivationExpression verbalization + public partial class FactTypeDerivationExpression : IVerbalize + { + /// <summary><see cref="IVerbalize.GetVerbalization"/> implementation</summary> + protected bool GetVerbalization(TextWriter writer, IDictionary<Type, IVerbalizationSets> snippetsDictionary, IVerbalizationContext verbalizationContext, VerbalizationSign sign) + { + #region Preliminary + bool isNegative = 0 != (sign & VerbalizationSign.Negative); + IVerbalizationSets<CoreVerbalizationSnippetType> snippets = (IVerbalizationSets<CoreVerbalizationSnippetType>)snippetsDictionary[typeof(CoreVerbalizationSnippetType)]; + #region Prerequisite error check + IModelErrorOwner errorOwner = this as IModelErrorOwner; + bool firstErrorPending; + if (errorOwner != null) + { + firstErrorPending = true; + foreach (ModelError error in errorOwner.GetErrorCollection(ModelErrorUses.BlockVerbalization)) + { + if (firstErrorPending) + { + firstErrorPending = false; + verbalizationContext.BeginVerbalization(VerbalizationContent.ErrorReport); + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorOpenPrimaryReport, false, false)); + } + else + { + writer.WriteLine(); + } + writer.Write(string.Format(writer.FormatProvider, snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorPrimary, false, false), error.ErrorText, error.Id.ToString("D"))); + } + if (!firstErrorPending) + { + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorClosePrimaryReport, false, false)); + firstErrorPending = true; + foreach (ModelError error in errorOwner.GetErrorCollection(ModelErrorUses.Verbalize)) + { + ModelErrorDisplayFilter errorDisplayFilter = error.Model.ModelErrorDisplayFilter; + if (errorDisplayFilter != null && !errorDisplayFilter.ShouldDisplay(error)) + { + continue; + } + if (firstErrorPending) + { + firstErrorPending = false; + writer.WriteLine(); + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorOpenSecondaryReport, false, false)); + } + else + { + writer.WriteLine(); + } + writer.Write(string.Format(writer.FormatProvider, snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorSecondary, false, false), error.ErrorText, error.Id.ToString("D"))); + } + if (!firstErrorPending) + { + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorCloseSecondaryReport, false, false)); + } + return true; + } + } + #endregion // Prerequisite error check + const bool isDeontic = false; + #endregion // Preliminary + #region Pattern Matches + verbalizationContext.BeginVerbalization(VerbalizationContent.Normal); + string snippetFormat1 = snippets.GetSnippet(CoreVerbalizationSnippetType.DerivationRuleVerbalization, isDeontic, isNegative); + string snippet1Replace1 = null; + snippet1Replace1 = this.Body; + FactType.WriteVerbalizerSentence(writer, string.Format(writer.FormatProvider, snippetFormat1, snippet1Replace1), snippets.GetSnippet(CoreVerbalizationSnippetType.CloseVerbalizationSentence, isDeontic, isNegative)); + #endregion // Pattern Matches + #region Error report + if (errorOwner != null) + { + firstErrorPending = true; + foreach (ModelError error in errorOwner.GetErrorCollection(ModelErrorUses.Verbalize)) + { + ModelErrorDisplayFilter errorDisplayFilter = error.Model.ModelErrorDisplayFilter; + if (errorDisplayFilter != null && !errorDisplayFilter.ShouldDisplay(error)) + { + continue; + } + if (firstErrorPending) + { + firstErrorPending = false; + writer.WriteLine(); + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorOpenSecondaryReport, false, false)); + } + else + { + writer.WriteLine(); + } + writer.Write(string.Format(writer.FormatProvider, snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorSecondary, false, false), error.ErrorText, error.Id.ToString("D"))); + } + if (!firstErrorPending) + { + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorCloseSecondaryReport, false, false)); + } + } + #endregion // Error report + return true; + } + bool IVerbalize.GetVerbalization(TextWriter writer, IDictionary<Type, IVerbalizationSets> snippetsDictionary, IVerbalizationContext verbalizationContext, VerbalizationSign sign) + { + return this.GetVerbalization(writer, snippetsDictionary, verbalizationContext, sign); + } + } + #endregion // FactTypeDerivationExpression verbalization + #region SubtypeDerivationExpression verbalization + public partial class SubtypeDerivationExpression : IVerbalize + { + /// <summary><see cref="IVerbalize.GetVerbalization"/> implementation</summary> + protected bool GetVerbalization(TextWriter writer, IDictionary<Type, IVerbalizationSets> snippetsDictionary, IVerbalizationContext verbalizationContext, VerbalizationSign sign) + { + #region Preliminary + if (!this.Subtype.IsSubtype) + { + // A subtype derivation rule is maintained (but not saved) if the element was formerly a subtype. + return false; + } + bool isNegative = 0 != (sign & VerbalizationSign.Negative); + IVerbalizationSets<CoreVerbalizationSnippetType> snippets = (IVerbalizationSets<CoreVerbalizationSnippetType>)snippetsDictionary[typeof(CoreVerbalizationSnippetType)]; + #region Prerequisite error check + IModelErrorOwner errorOwner = this as IModelErrorOwner; + bool firstErrorPending; + if (errorOwner != null) + { + firstErrorPending = true; + foreach (ModelError error in errorOwner.GetErrorCollection(ModelErrorUses.BlockVerbalization)) + { + if (firstErrorPending) + { + firstErrorPending = false; + verbalizationContext.BeginVerbalization(VerbalizationContent.ErrorReport); + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorOpenPrimaryReport, false, false)); + } + else + { + writer.WriteLine(); + } + writer.Write(string.Format(writer.FormatProvider, snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorPrimary, false, false), error.ErrorText, error.Id.ToString("D"))); + } + if (!firstErrorPending) + { + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorClosePrimaryReport, false, false)); + firstErrorPending = true; + foreach (ModelError error in errorOwner.GetErrorCollection(ModelErrorUses.Verbalize)) + { + ModelErrorDisplayFilter errorDisplayFilter = error.Model.ModelErrorDisplayFilter; + if (errorDisplayFilter != null && !errorDisplayFilter.ShouldDisplay(error)) + { + continue; + } + if (firstErrorPending) + { + firstErrorPending = false; + writer.WriteLine(); + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorOpenSecondaryReport, false, false)); + } + else + { + writer.WriteLine(); + } + writer.Write(string.Format(writer.FormatProvider, snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorSecondary, false, false), error.ErrorText, error.Id.ToString("D"))); + } + if (!firstErrorPending) + { + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorCloseSecondaryReport, false, false)); + } + return true; + } + } + #endregion // Prerequisite error check + const bool isDeontic = false; + #endregion // Preliminary + #region Pattern Matches + verbalizationContext.BeginVerbalization(VerbalizationContent.Normal); + string snippetFormat1 = snippets.GetSnippet(CoreVerbalizationSnippetType.DerivationRuleVerbalization, isDeontic, isNegative); + string snippet1Replace1 = null; + snippet1Replace1 = this.Body; + FactType.WriteVerbalizerSentence(writer, string.Format(writer.FormatProvider, snippetFormat1, snippet1Replace1), snippets.GetSnippet(CoreVerbalizationSnippetType.CloseVerbalizationSentence, isDeontic, isNegative)); + #endregion // Pattern Matches + #region Error report + if (errorOwner != null) + { + firstErrorPending = true; + foreach (ModelError error in errorOwner.GetErrorCollection(ModelErrorUses.Verbalize)) + { + ModelErrorDisplayFilter errorDisplayFilter = error.Model.ModelErrorDisplayFilter; + if (errorDisplayFilter != null && !errorDisplayFilter.ShouldDisplay(error)) + { + continue; + } + if (firstErrorPending) + { + firstErrorPending = false; + writer.WriteLine(); + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorOpenSecondaryReport, false, false)); + } + else + { + writer.WriteLine(); + } + writer.Write(string.Format(writer.FormatProvider, snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorSecondary, false, false), error.ErrorText, error.Id.ToString("D"))); + } + if (!firstErrorPending) + { + writer.Write(snippets.GetSnippet(CoreVerbalizationSnippetType.ErrorCloseSecondaryReport, false, false)); + } + } + #endregion // Error report + return true; + } + bool IVerbalize.GetVerbalization(TextWriter writer, IDictionary<Type, IVerbalizationSets> snippetsDictionary, IVerbalizationContext verbalizationContext, VerbalizationSign sign) + { + return this.GetVerbalization(writer, snippetsDictionary, verbalizationContext, sign); + } + } + #endregion // SubtypeDerivationExpression verbalization #region SubsetConstraint verbalization public partial class SubsetConstraint : IVerbalize { Modified: trunk/ORMModel/ObjectModel/VerbalizationGenerator.xml =================================================================== --- trunk/ORMModel/ObjectModel/VerbalizationGenerator.xml 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/ORMModel/ObjectModel/VerbalizationGenerator.xml 2009-05-25 05:59:43 UTC (rev 1389) @@ -88,7 +88,7 @@ </Snippet> </ObjectType> <Definition> - <Snippet ref="DefinitionVerbalization"> + <Snippet ref="DescriptionVerbalization"> <NoteText/> </Snippet> </Definition> @@ -97,6 +97,16 @@ <NoteText/> </Snippet> </Note> + <FactTypeDerivationExpression> + <Snippet ref="DerivationRuleVerbalization"> + <ExpressionBody/> + </Snippet> + </FactTypeDerivationExpression> + <SubtypeDerivationExpression> + <Snippet ref="DerivationRuleVerbalization"> + <ExpressionBody/> + </Snippet> + </SubtypeDerivationExpression> <!-- Generate constraint verbalizations --> <Constraints> <Constraint type="SubsetConstraint" patternGroup="SetComparisonConstraint"> Modified: trunk/ORMModel/ObjectModel/VerbalizationGenerator.xsd =================================================================== --- trunk/ORMModel/ObjectModel/VerbalizationGenerator.xsd 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/ORMModel/ObjectModel/VerbalizationGenerator.xsd 2009-05-25 05:59:43 UTC (rev 1389) @@ -610,6 +610,7 @@ <xs:element name="ContextName" type="ContextNameType"/> <xs:element name="ObjectifyingInstanceIdentifierName" type="ObjectifyingInstanceIdentifierNameType"/> <xs:element name="ContextId" type="ElementIdType"/> + <xs:element name="ExpressionBody" type="ExpressionBodyType"/> <xs:element name="NoteText" type="NoteTextType"/> <xs:element name="ReferenceMode" type="ReferenceModeType"/> <xs:element name="PortableDataType" type="PortableDataTypeType"/> @@ -932,6 +933,13 @@ </xs:documentation> </xs:annotation> </xs:complexType> + <xs:complexType name="ExpressionBodyType"> + <xs:annotation> + <xs:documentation> + Returns the body of a derivation expression. + </xs:documentation> + </xs:annotation> + </xs:complexType> <xs:complexType name="NoteTextType"> <xs:annotation> <xs:documentation> @@ -1044,34 +1052,45 @@ <xs:complexType name="FactConstructType"> <!-- Nothing here yet, this is for the top-level verbalization of a Fact --> </xs:complexType> + <xs:complexType name="SnippetContainerType" abstract="true"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="Snippet" type="SnippetTypeWithConditionalMatch" /> + <xs:element name="ConditionalSnippet" type="ConditionalSnippetType" /> + </xs:choice> + </xs:complexType> <xs:complexType name="SubtypeConstructType"> <xs:annotation> <xs:documentation> Returns the full verbalization for a subtype fact, i.e, Man is a subtype of Person. </xs:documentation> </xs:annotation> - <xs:choice maxOccurs="unbounded"> - <xs:element name="Snippet" type="SnippetTypeWithConditionalMatch" /> - <xs:element name="ConditionalSnippet" type="ConditionalSnippetType" /> - </xs:choice> + <xs:complexContent> + <xs:extension base="SnippetContainerType"/> + </xs:complexContent> </xs:complexType> <xs:complexType name="NoteConstructType"> <xs:annotation> <xs:documentation>Returns the verbalization for the notes associated with an objectType.</xs:documentation> </xs:annotation> - <xs:choice maxOccurs="unbounded"> - <xs:element name="Snippet" type="SnippetTypeWithConditionalMatch" /> - <xs:element name="ConditionalSnippet" type="ConditionalSnippetType" /> - </xs:choice> + <xs:complexContent> + <xs:extension base="SnippetContainerType"/> + </xs:complexContent> </xs:complexType> + <xs:complexType name="DerivationExpressionConstructType"> + <xs:annotation> + <xs:documentation>Returns the verbalization for a derivation expression.</xs:documentation> + </xs:annotation> + <xs:complexContent> + <xs:extension base="SnippetContainerType"/> + </xs:complexContent> + </xs:complexType> <xs:complexType name="ModelConstructType"> <xs:annotation> <xs:documentation>Returns the verbalization for the ORMModel.</xs:documentation> </xs:annotation> - <xs:choice maxOccurs="unbounded"> - <xs:element name="Snippet" type="SnippetTypeWithConditionalMatch" /> - <xs:element name="ConditionalSnippet" type="ConditionalSnippetType" /> - </xs:choice> + <xs:complexContent> + <xs:extension base="SnippetContainerType"/> + </xs:complexContent> </xs:complexType> <xs:complexType name="ObjectConstructType"> <xs:annotation> @@ -1440,6 +1459,8 @@ <xs:element name="ObjectType" type="ObjectConstructType" /> <xs:element name="Definition" type="NoteConstructType" /> <xs:element name="Note" type="NoteConstructType" /> + <xs:element name="SubtypeDerivationExpression" type="DerivationExpressionConstructType"/> + <xs:element name="FactTypeDerivationExpression" type="DerivationExpressionConstructType"/> <xs:element name="ORMModel" type="ModelConstructType" /> </xs:all> </xs:complexType> Modified: trunk/ORMModel/ObjectModel/VerbalizationGenerator.xslt =================================================================== (Binary files differ) Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-05-23 21:06:13 UTC (rev 1388) +++ trunk/Setup/Readme.htm 2009-05-25 05:59:43 UTC (rev 1389) @@ -41,7 +41,7 @@ </ul>--> <hr/> <h2>May 2009 CTP Changes</h2> -<div>The May 2009 CTP release includes all modifications through changeset 1388. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The May 2009 CTP release includes all modifications through changeset 1389. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Display Related Types 2009-05">Controlling display of subtype lines</a> </li> <li><a href="#Role name highlighting 2009-05">Role name highlighting</a> </li> @@ -55,6 +55,7 @@ <li>The user action of objectifying and unobjectifying a fact type that has multiple shape representations may result in multiple additional shapes.</li> <li>Validation errors for frequency constraints on the same roles as a uniqueness constraint are validated live instead of at file load time only.</li> <li>Connection lines to intransitive ring constraints attach to the edge instead of the center of the shape.</li> +<li>Verbalize Derivation Rule expressions for FactType and Subtype derivation rules.</li> </ol> </li> </ul> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-05-25 09:30:49
|
Revision: 1390 http://orm.svn.sourceforge.net/orm/?rev=1390&view=rev Author: mcurland Date: 2009-05-25 09:30:41 +0000 (Mon, 25 May 2009) Log Message: ----------- Fixed bad English in constraint role connector instructions. refs #348 Modified Paths: -------------- trunk/ORMModel/ShapeModel/ORMDiagram.resx trunk/Setup/Readme.htm Modified: trunk/ORMModel/ShapeModel/ORMDiagram.resx =================================================================== --- trunk/ORMModel/ShapeModel/ORMDiagram.resx 2009-05-25 05:59:43 UTC (rev 1389) +++ trunk/ORMModel/ShapeModel/ORMDiagram.resx 2009-05-25 09:30:41 UTC (rev 1390) @@ -299,8 +299,8 @@ <value xml:space="preserve">To select role sequences to populate the constraint: -Click a role to add it to the active role sequence -Control-Click a role to remove it from the active role sequence --Double-Click a role to commit the active role sequence and open a new role sequence --Click the diagram background or press Escape when you're finish connecting roles</value> +-Double-Click a role to commit the active role sequence and begin a new role sequence +-Click the diagram background or press Escape to finish</value> <comment xml:space="preserve">The text shown to explain how to hook up an external constraint to its associated roles.</comment> </data> <data name="ExternalConstraintConnectAction.SetConstraint.Instructions"> @@ -308,7 +308,7 @@ -Click a role to add it to the constraint -Control-Click a role to remove it from the constaint -Double-Click a role to commit --Click the diagram background or press Escape when you're finish connecting roles</value> +-Click the diagram background or press Escape to finish</value> <comment xml:space="preserve">The text shown to explain how to hook up an external constraint to its associated roles.</comment> </data> <data name="ExternalConstraintConnectAction.TransactionName"> Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-05-25 05:59:43 UTC (rev 1389) +++ trunk/Setup/Readme.htm 2009-05-25 09:30:41 UTC (rev 1390) @@ -41,7 +41,7 @@ </ul>--> <hr/> <h2>May 2009 CTP Changes</h2> -<div>The May 2009 CTP release includes all modifications through changeset 1389. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The May 2009 CTP release includes all modifications through changeset 1390. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Display Related Types 2009-05">Controlling display of subtype lines</a> </li> <li><a href="#Role name highlighting 2009-05">Role name highlighting</a> </li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-06-11 02:53:09
|
Revision: 1392 http://orm.svn.sourceforge.net/orm/?rev=1392&view=rev Author: mcurland Date: 2009-06-11 01:31:05 +0000 (Thu, 11 Jun 2009) Log Message: ----------- * Fix for phantom shape bug on other diagrams with objectify command. Also, objectifying to an existing entity folds an ObjectType shape into a close FactTypeShape instead of replacing the ObjectTypeShape. Modifications of [1385] refs #321 * DisplayRelatedTypes property showing on a shape for an unobjectified FactType, and hiding subtype lines connected to more than one constraint or note caused 'subscript out of range' error. refs #392 * Delete Page/Undo would put the page back in a different position if the 'Diagram Management' extension was turned off. * Relational name generator needs to save settings if the default values when the name generator is recreated differ from the current settings (forum issue). * SetComparisonConstraint editor modified to always begin a new role sequence on commit if the constraint does not have enough sequences. Modified Paths: -------------- trunk/ORM2CommandLineTest/ORMDocServices.cs trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs trunk/ORMModel/ObjectModel/NameGenerator.cs trunk/ORMModel/ShapeModel/Design/FactTypeShapeTypeDescriptor.cs trunk/ORMModel/ShapeModel/ExternalConstraintConnectAction.cs trunk/ORMModel/ShapeModel/FactTypeShape.cs trunk/ORMModel/ShapeModel/ViewFixupRules.cs trunk/RelationalModel/OialDcilBridge/NameGeneration.cs Modified: trunk/ORM2CommandLineTest/ORMDocServices.cs =================================================================== --- trunk/ORM2CommandLineTest/ORMDocServices.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORM2CommandLineTest/ORMDocServices.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -196,11 +196,11 @@ } #endregion // IORMFontAndColorService Implementation #region IPropertyProviderService Implementation - void IPropertyProviderService.GetProvidedProperties(ModelElement extendableElement, System.ComponentModel.PropertyDescriptorCollection properties) + void IPropertyProviderService.GetProvidedProperties(object extendableElement, System.ComponentModel.PropertyDescriptorCollection properties) { // This is implemented on a per-store basis, we don't implement it on the testing document } - void IPropertyProviderService.AddOrRemovePropertyProvider<TExtendableElement>(PropertyProvider propertyProvider, bool includeSubtypes, EventHandlerAction action) + void IPropertyProviderService.AddOrRemovePropertyProvider(Type extendableElementType, PropertyProvider propertyProvider, bool includeSubtypes, EventHandlerAction action) { // This is implemented on a per-store basis, we don't implement it on the testing document } Modified: trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs =================================================================== --- trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/Framework/Diagrams/MultiShapeUtility.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -271,16 +271,12 @@ /// <returns><see cref="IEnumerable{LinkShapeType}"/></returns> public static IEnumerable<LinkShapeType> GetEffectiveAttachedLinkShapes<LinkShapeType>(ShapeElement shape) where LinkShapeType : LinkShape { - LinkedElementCollection<LinkShape> links; - int linkCount; NodeShape nodeShape = shape as NodeShape; if (nodeShape != null) { - links = LinkConnectsToNode.GetLink(nodeShape); - linkCount = links.Count; - for (int i = 0; i < linkCount; ++i) + foreach (LinkShape link in LinkConnectsToNode.GetLink(nodeShape)) { - LinkShapeType linkShape = links[i] as LinkShapeType; + LinkShapeType linkShape = link as LinkShapeType; if (linkShape != null) { yield return linkShape; @@ -289,21 +285,17 @@ } if (shape is IProvideConnectorShape) { - LinkedElementCollection<ShapeElement> childShapes = shape.RelativeChildShapes; - int childCount = childShapes.Count; - for (int j = 0; j < childCount; ++j) + foreach (ShapeElement child in shape.RelativeChildShapes) { - NodeShape child; + NodeShape childShape; IProxyConnectorShape proxy; - if (null != (child = childShapes[j] as NodeShape) && - null != (proxy = child as IProxyConnectorShape)) + if (null != (childShape = child as NodeShape) && + null != (proxy = childShape as IProxyConnectorShape)) { Debug.Assert(proxy.ProxyConnectorShapeFor == shape); - links = LinkConnectsToNode.GetLink(child); - linkCount = links.Count; - for (int i = 0; i < linkCount; ++i) + foreach (LinkShape link in LinkConnectsToNode.GetLink(childShape)) { - LinkShapeType linkShape = links[i] as LinkShapeType; + LinkShapeType linkShape = link as LinkShapeType; if (linkShape != null) { yield return linkShape; @@ -314,6 +306,19 @@ } } /// <summary> + /// Get all link shapes of a given type attached to the specified <paramref name="shape"/> + /// or to any relative child shapes that implement <see cref="IProxyConnectorShape"/>. + /// </summary> + /// <typeparam name="LinkShapeType">A link shape type derived from <see cref="LinkShape"/></typeparam> + /// <param name="shape">The shape to retrieve links for</param> + /// <param name="snapshot">The caller may change the resulting set, return a snapshot copy of the current data. Default false.</param> + /// <returns><see cref="IEnumerable{LinkShapeType}"/></returns> + public static IEnumerable<LinkShapeType> GetEffectiveAttachedLinkShapes<LinkShapeType>(ShapeElement shape, bool snapshot) where LinkShapeType : LinkShape + { + IEnumerable<LinkShapeType> retVal = GetEffectiveAttachedLinkShapes<LinkShapeType>(shape); + return snapshot ? new List<LinkShapeType>(retVal) : retVal; + } + /// <summary> /// Get all <see cref="BinaryLinkShape">binary link shapes</see> of a given type originating from /// the specified <paramref name="shape"/> or to any relative child shapes that implement <see cref="IProxyConnectorShape"/>. /// </summary> @@ -322,16 +327,12 @@ /// <returns><see cref="IEnumerable{LinkShapeType}"/></returns> public static IEnumerable<LinkShapeType> GetEffectiveAttachedLinkShapesFrom<LinkShapeType>(ShapeElement shape) where LinkShapeType : BinaryLinkShape { - LinkedElementCollection<LinkShape> links; - int linkCount; NodeShape nodeShape = shape as NodeShape; if (nodeShape != null) { - links = LinkConnectsToNode.GetLink(nodeShape); - linkCount = links.Count; - for (int i = 0; i < linkCount; ++i) + foreach (LinkShape link in LinkConnectsToNode.GetLink(nodeShape)) { - LinkShapeType linkShape = links[i] as LinkShapeType; + LinkShapeType linkShape = link as LinkShapeType; if (linkShape != null && linkShape.FromShape == shape) { yield return linkShape; @@ -340,22 +341,18 @@ } if (shape is IProvideConnectorShape) { - LinkedElementCollection<ShapeElement> childShapes = shape.RelativeChildShapes; - int childCount = childShapes.Count; - for (int j = 0; j < childCount; ++j) + foreach (ShapeElement child in shape.RelativeChildShapes) { - NodeShape child; + NodeShape childShape; IProxyConnectorShape proxy; - if (null != (child = childShapes[j] as NodeShape) && - null != (proxy = child as IProxyConnectorShape)) + if (null != (childShape = child as NodeShape) && + null != (proxy = childShape as IProxyConnectorShape)) { Debug.Assert(proxy.ProxyConnectorShapeFor == shape); - links = LinkConnectsToNode.GetLink(child); - linkCount = links.Count; - for (int i = 0; i < linkCount; ++i) + foreach (LinkShape link in LinkConnectsToNode.GetLink(childShape)) { - LinkShapeType linkShape = links[i] as LinkShapeType; - if (linkShape != null && linkShape.FromShape == child) + LinkShapeType linkShape = link as LinkShapeType; + if (linkShape != null && linkShape.FromShape == childShape) { yield return linkShape; } @@ -365,6 +362,19 @@ } } /// <summary> + /// Get all <see cref="BinaryLinkShape">binary link shapes</see> of a given type originating from + /// the specified <paramref name="shape"/> or to any relative child shapes that implement <see cref="IProxyConnectorShape"/>. + /// </summary> + /// <typeparam name="LinkShapeType">A link shape type derived from <see cref="LinkShape"/></typeparam> + /// <param name="shape">The shape to retrieve links for</param> + /// <param name="snapshot">The caller may change the resulting set, return a snapshot copy of the current data. Default false.</param> + /// <returns><see cref="IEnumerable{LinkShapeType}"/></returns> + public static IEnumerable<LinkShapeType> GetEffectiveAttachedLinkShapesFrom<LinkShapeType>(ShapeElement shape, bool snapshot) where LinkShapeType : BinaryLinkShape + { + IEnumerable<LinkShapeType> retVal = GetEffectiveAttachedLinkShapesFrom<LinkShapeType>(shape); + return snapshot ? new List<LinkShapeType>(retVal) : retVal; + } + /// <summary> /// Get all <see cref="BinaryLinkShape">binary link shapes</see> of a given type going to /// the specified <paramref name="shape"/> or to any relative child shapes that implement <see cref="IProxyConnectorShape"/>. /// </summary> @@ -373,16 +383,12 @@ /// <returns><see cref="IEnumerable{LinkShapeType}"/></returns> public static IEnumerable<LinkShapeType> GetEffectiveAttachedLinkShapesTo<LinkShapeType>(ShapeElement shape) where LinkShapeType : BinaryLinkShape { - LinkedElementCollection<LinkShape> links; - int linkCount; NodeShape nodeShape = shape as NodeShape; if (nodeShape != null) { - links = LinkConnectsToNode.GetLink(nodeShape); - linkCount = links.Count; - for (int i = 0; i < linkCount; ++i) + foreach (LinkShape link in LinkConnectsToNode.GetLink(nodeShape)) { - LinkShapeType linkShape = links[i] as LinkShapeType; + LinkShapeType linkShape = link as LinkShapeType; if (linkShape != null && linkShape.ToShape == shape) { yield return linkShape; @@ -391,22 +397,18 @@ } if (shape is IProvideConnectorShape) { - LinkedElementCollection<ShapeElement> childShapes = shape.RelativeChildShapes; - int childCount = childShapes.Count; - for (int j = 0; j < childCount; ++j) + foreach (ShapeElement child in shape.RelativeChildShapes) { - NodeShape child; + NodeShape childShape; IProxyConnectorShape proxy; - if (null != (child = childShapes[j] as NodeShape) && - null != (proxy = child as IProxyConnectorShape)) + if (null != (childShape = child as NodeShape) && + null != (proxy = childShape as IProxyConnectorShape)) { Debug.Assert(proxy.ProxyConnectorShapeFor == shape); - links = LinkConnectsToNode.GetLink(child); - linkCount = links.Count; - for (int i = 0; i < linkCount; ++i) + foreach (LinkShape link in LinkConnectsToNode.GetLink(childShape)) { - LinkShapeType linkShape = links[i] as LinkShapeType; - if (linkShape != null && linkShape.ToShape == child) + LinkShapeType linkShape = link as LinkShapeType; + if (linkShape != null && linkShape.ToShape == childShape) { yield return linkShape; } @@ -415,6 +417,19 @@ } } } + /// <summary> + /// Get all <see cref="BinaryLinkShape">binary link shapes</see> of a given type going to + /// the specified <paramref name="shape"/> or to any relative child shapes that implement <see cref="IProxyConnectorShape"/>. + /// </summary> + /// <typeparam name="LinkShapeType">A link shape type derived from <see cref="BinaryLinkShape"/></typeparam> + /// <param name="shape">The shape to retrieve links for</param> + /// <param name="snapshot">The caller may change the resulting set, return a snapshot copy of the current data. Default false.</param> + /// <returns><see cref="IEnumerable{LinkShapeType}"/></returns> + public static IEnumerable<LinkShapeType> GetEffectiveAttachedLinkShapesTo<LinkShapeType>(ShapeElement shape, bool snapshot) where LinkShapeType : BinaryLinkShape + { + IEnumerable<LinkShapeType> retVal = GetEffectiveAttachedLinkShapesTo<LinkShapeType>(shape); + return snapshot ? new List<LinkShapeType>(retVal) : retVal; + } #endregion // GetEffectiveAttachedLinkShapes variants #region Link Configuration /// <summary> @@ -497,11 +512,11 @@ foreach (ShapeElement shape in FindAllShapesForElement<ShapeElement>(diagram, originalShape.ModelElement)) { bool shapeIsOriginal = (shape == originalShape); - foreach (BinaryLinkShape toLinkShape in GetExistingLinks(shape, true, false)) + foreach (BinaryLinkShape toLinkShape in GetExistingLinks(shape, true, false, null, true)) { CheckLink(toLinkShape, shapeIsOriginal, BinaryLinkAnchor.ToShape, discludedShape); } - foreach (BinaryLinkShape fromLinkShape in GetExistingLinks(shape, false, true)) + foreach (BinaryLinkShape fromLinkShape in GetExistingLinks(shape, false, true, null, true)) { CheckLink(fromLinkShape, shapeIsOriginal, BinaryLinkAnchor.FromShape, discludedShape); } @@ -510,7 +525,7 @@ Dictionary<ModelElement, IReconfigureableLink> reconfigureableLinks = null; foreach (ShapeElement shape in FindAllShapesForElement<ShapeElement>(diagram, element)) { - foreach (BinaryLinkShape linkShape in GetExistingLinks(shape, true, true, null)) + foreach (BinaryLinkShape linkShape in GetExistingLinks(shape, true, true, null, true)) { if (linkShape is IProvideConnectorShape) { @@ -1100,7 +1115,7 @@ // A link could be attached to this link. Make sure the // link is moved to a new location or cleanly deleted before // the link itself is deleted. - foreach (BinaryLinkShape recursiveLink in GetExistingLinks(pendingDeleteLinkShape, true, true, null)) + foreach (BinaryLinkShape recursiveLink in GetExistingLinks(pendingDeleteLinkShape, true, true, null, true)) { IReconfigureableLink recurseReconfigureLink = recursiveLink as IReconfigureableLink; if (recurseReconfigureLink != null) @@ -1218,7 +1233,7 @@ private static bool AlreadyConnectedTo(ShapeElement currentShape, ModelElement oppositeElement, bool isFromShape, BinaryLinkShape currentLink) { //check each link to see if it connects to the opposite element - foreach (BinaryLinkShape linkShape in GetExistingLinks(currentShape, !isFromShape, isFromShape, currentLink.ModelElement)) + foreach (BinaryLinkShape linkShape in GetExistingLinks(currentShape, !isFromShape, isFromShape, currentLink.ModelElement, false)) { //if the link is the one currently being configured, count it as not connected if (linkShape == currentLink) @@ -1257,17 +1272,18 @@ /// <param name="getToLinks">True to collect all to role links</param> /// <param name="getFromLinks">True to collect all from role links</param> /// <param name="linkBackingElement">Only return links that have this element as the <see cref="PresentationElement.ModelElement">ModelElement</see>.</param> + /// <param name="snapshot">The caller may change the resulting set, return a snapshot copy of the current data.</param> /// <returns>The attached link shapes</returns> - private static IEnumerable<BinaryLinkShape> GetExistingLinks(ShapeElement shape, bool getToLinks, bool getFromLinks, ModelElement linkBackingElement) + private static IEnumerable<BinaryLinkShape> GetExistingLinks(ShapeElement shape, bool getToLinks, bool getFromLinks, ModelElement linkBackingElement, bool snapshot) { Debug.Assert(getToLinks || getFromLinks, "Either getToLinks or fromFromLinks needs to be true"); foreach (BinaryLinkShape linkShape in (getToLinks && getFromLinks) ? - MultiShapeUtility.GetEffectiveAttachedLinkShapes<BinaryLinkShape>(shape) : + MultiShapeUtility.GetEffectiveAttachedLinkShapes<BinaryLinkShape>(shape, snapshot) : (getToLinks ? - MultiShapeUtility.GetEffectiveAttachedLinkShapesTo<BinaryLinkShape>(shape) : - MultiShapeUtility.GetEffectiveAttachedLinkShapesFrom<BinaryLinkShape>(shape))) + MultiShapeUtility.GetEffectiveAttachedLinkShapesTo<BinaryLinkShape>(shape, snapshot) : + MultiShapeUtility.GetEffectiveAttachedLinkShapesFrom<BinaryLinkShape>(shape, snapshot))) { if (linkBackingElement == null || linkShape.ModelElement == linkBackingElement) { Modified: trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs =================================================================== --- trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -428,6 +428,7 @@ { throw new ArgumentNullException("designer"); } + myVerifyPageOrder = true; MultiDiagramDocViewControl docViewControl = DocViewControl; int tabCount = docViewControl.TabCount; DiagramTabPage tabPage = new DiagramTabPage(docViewControl, designer); @@ -653,10 +654,14 @@ eventManager.AddOrRemoveHandler(classInfo, new EventHandler<ElementDeletedEventArgs>(VerifyPageOrderEvent), action); eventManager.AddOrRemoveHandler(classInfo, new EventHandler<RolePlayerOrderChangedEventArgs>(VerifyPageOrderEvent), action); eventManager.AddOrRemoveHandler(classInfo, new EventHandler<RolePlayerChangedEventArgs>(VerifyPageOrderEvent), action); - eventManager.AddOrRemoveHandler(new EventHandler<ElementEventsEndedEventArgs>(ElementEventsEndedEvent), action); } } } + else if (0 != (reasons & EventSubscriberReasons.UserInterfaceEvents)) + { + eventManager.AddOrRemoveHandler(new EventHandler<ElementEventsBegunEventArgs>(ElementEventsBegunEvent), action); + eventManager.AddOrRemoveHandler(new EventHandler<ElementEventsEndedEventArgs>(ElementEventsEndedEvent), action); + } } } void IModelingEventSubscriber.ManageModelingEventHandlers(ModelingEventManager eventManager, EventSubscriberReasons reasons, EventHandlerAction action) @@ -670,6 +675,10 @@ { myVerifyPageOrder = true; } + private void ElementEventsBegunEvent(object sender, ElementEventsBegunEventArgs e) + { + myVerifyPageOrder = false; + } /// <summary> /// Verify tab order when events have complete /// </summary> @@ -680,12 +689,25 @@ myVerifyPageOrder = false; MultiDiagramDocViewControl control; Store store; - IList<DiagramDisplay> containers; if (null != (control = myDocViewControl) && - null != (store = this.Store) && - 0 != (containers = store.ElementDirectory.FindElements<DiagramDisplay>(false)).Count) + null != (store = this.Store)) { - control.VerifyDiagramOrder(containers[0].OrderedDiagramCollection); + if (null != store.FindDomainModel(DiagramDisplayDomainModel.DomainModelId)) + { + IList<DiagramDisplay> containers; + if (0 != (containers = store.ElementDirectory.FindElements<DiagramDisplay>(false)).Count) + { + control.VerifyDiagramOrder(containers[0].OrderedDiagramCollection); + } + } + else + { + IList<Diagram> diagrams; + if (0 != (diagrams = store.DefaultPartition.ElementDirectory.FindElements<Diagram>(true)).Count) + { + control.VerifyDiagramOrder(diagrams); + } + } } } } Modified: trunk/ORMModel/ObjectModel/NameGenerator.cs =================================================================== --- trunk/ORMModel/ObjectModel/NameGenerator.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/ObjectModel/NameGenerator.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -72,20 +72,18 @@ /// </summary> protected bool RequiresSerialization() { - NameGenerator refinesGenerator = RefinesGenerator; - bool retVal = (refinesGenerator != null) ? - (refinesGenerator.CasingOption != CasingOption || - refinesGenerator.SpacingFormat != SpacingFormat || - refinesGenerator.SpacingReplacement != SpacingReplacement || - refinesGenerator.AutomaticallyShortenNames != AutomaticallyShortenNames || - refinesGenerator.UserDefinedMaximum != UserDefinedMaximum || - refinesGenerator.UseTargetDefaultMaximum != UseTargetDefaultMaximum) : - (CasingOption != NameGeneratorCasingOption.None || - SpacingFormat != NameGeneratorSpacingFormat.Retain || - SpacingReplacement.Length != 0 || - !AutomaticallyShortenNames || - UserDefinedMaximum != 128 || - !UseTargetDefaultMaximum); + bool retVal = !HasDefaultAttributeValues(null); + NameGenerator refinesGenerator; + if (!retVal && + null != (refinesGenerator = RefinesGenerator)) + { + retVal = refinesGenerator.CasingOption != CasingOption || + refinesGenerator.SpacingFormat != SpacingFormat || + refinesGenerator.SpacingReplacement != SpacingReplacement || + refinesGenerator.AutomaticallyShortenNames != AutomaticallyShortenNames || + refinesGenerator.UserDefinedMaximum != UserDefinedMaximum || + refinesGenerator.UseTargetDefaultMaximum != UseTargetDefaultMaximum; + } if (!retVal) { foreach (NameGenerator refinement in RefinedByGeneratorCollection) @@ -99,6 +97,30 @@ } return retVal; } + /// <summary> + /// Verify if this instance has fully default values + /// </summary> + /// <param name="ignorePropertyIds">Domain property identifiers that should not be checked. Designed + /// to be called by a derived class that overrides specific properties.</param> + /// <returns><see langword="true"/> if all values are default</returns> + protected virtual bool HasDefaultAttributeValues(Guid[] ignorePropertyIds) + { + if (ignorePropertyIds == null || ignorePropertyIds.Length == 0) + { + return CasingOption == NameGeneratorCasingOption.None && + SpacingFormat == NameGeneratorSpacingFormat.Retain && + SpacingReplacement.Length == 0 && + AutomaticallyShortenNames && + UserDefinedMaximum == 128 && + UseTargetDefaultMaximum; + } + return (CasingOption == NameGeneratorCasingOption.None || Array.IndexOf<Guid>(ignorePropertyIds, CasingOptionDomainPropertyId) != -1) && + (SpacingFormat == NameGeneratorSpacingFormat.Retain || Array.IndexOf<Guid>(ignorePropertyIds, SpacingFormatDomainPropertyId) != -1) && + (SpacingReplacement.Length == 0 || Array.IndexOf<Guid>(ignorePropertyIds, SpacingReplacementDomainPropertyId) != -1) && + (AutomaticallyShortenNames || Array.IndexOf<Guid>(ignorePropertyIds, AutomaticallyShortenNamesDomainPropertyId) != -1) && + (UserDefinedMaximum == 128 || Array.IndexOf<Guid>(ignorePropertyIds, UserDefinedMaximumDomainPropertyId) != -1) && + (UseTargetDefaultMaximum || Array.IndexOf<Guid>(ignorePropertyIds, UseTargetDefaultMaximumDomainPropertyId) != -1); + } partial class SynchronizedRefinementsPropertyChangedRuleClass { private bool myIsDisabled; Modified: trunk/ORMModel/ShapeModel/Design/FactTypeShapeTypeDescriptor.cs =================================================================== --- trunk/ORMModel/ShapeModel/Design/FactTypeShapeTypeDescriptor.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/ShapeModel/Design/FactTypeShapeTypeDescriptor.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -64,6 +64,18 @@ return base.IsPropertyDescriptorReadOnly(propertyDescriptor); } + /// <summary> + /// Block display of the DisplayRelatedTypes property on an unobjectified FactType + /// </summary> + protected override bool ShouldCreatePropertyDescriptor(ModelElement requestor, DomainPropertyInfo domainProperty) + { + if (domainProperty.Id == FactTypeShape.DisplayRelatedTypesDomainPropertyId) + { + return false; + } + return base.ShouldCreatePropertyDescriptor(requestor, domainProperty); + } + private static readonly object LockObject = new object(); private static volatile bool myCustomPropertyAttributesInitialized; private static Attribute[] ConstraintDisplayPositionDomainPropertyAttributes; Modified: trunk/ORMModel/ShapeModel/ExternalConstraintConnectAction.cs =================================================================== --- trunk/ORMModel/ShapeModel/ExternalConstraintConnectAction.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/ShapeModel/ExternalConstraintConnectAction.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -622,7 +622,8 @@ // The ChainMouseAction call can reactivate this connect action, // so make sure we snapshot the state we need and do all requisite // cleanup before a potential reactivation. - ExternalConstraintShape chainOnShape = (myPendingOnClickedAction == OnClickedAction.Complete && !(myInitialSelectedRoles != null && myInitialSelectedRoles.Count != 0)) ? mySourceShape : null; + ExternalConstraintShape chainOnShape = (myPendingOnClickedAction == OnClickedAction.Complete) ? mySourceShape : null; + bool chainOnlyIfIncomplete = chainOnShape != null && myInitialSelectedRoles != null && myInitialSelectedRoles.Count != 0; bool editingSubtypeFact = mySubtypeConnection; Reset(); if (chainOnShape != null) @@ -640,8 +641,11 @@ if (!editingSubtypeFact) { IConstraint editConstraint = chainOnShape.AssociatedConstraint; - int maximum = ConstraintUtility.RoleSequenceCountMaximum(editConstraint); - if (maximum < 0 || ((SetComparisonConstraint)editConstraint).RoleSequenceCollection.Count < maximum) + int maximum; + SetComparisonConstraint comparisonConstraint = (SetComparisonConstraint)editConstraint; + if (chainOnlyIfIncomplete ? + comparisonConstraint.TooFewRoleSequencesError != null : + (maximum = ConstraintUtility.RoleSequenceCountMaximum(editConstraint)) < 0 || comparisonConstraint.RoleSequenceCollection.Count < maximum) { ChainMouseAction(chainOnShape, e.DiagramClientView); } Modified: trunk/ORMModel/ShapeModel/FactTypeShape.cs =================================================================== --- trunk/ORMModel/ShapeModel/FactTypeShape.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/ShapeModel/FactTypeShape.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -5098,33 +5098,57 @@ if (objectShape != null) { ORMDiagram currentDiagram = (ORMDiagram)objectShape.Diagram; - currentDiagram.PlaceORMElementOnDiagram( - null, - nestedFactType, - objectShape.Location, - ORMPlacementOption.AllowMultipleShapes, - delegate(ModelElement fixupElement, ShapeElement newShape) + + // Search the current diagram and see if we have a shape for the FactType + // in the general vicinity. If we do, then we just delete the object shape + // and let role players bind directly to the FactType. + bool createNewShape = true; + RectangleD objectShapeVicinity = objectShape.AbsoluteBoundingBox; + objectShapeVicinity.Inflate(objectShapeVicinity.Height * 1.5, objectShapeVicinity.Width); + foreach (FactTypeShape factShape in MultiShapeUtility.FindAllShapesForElement<FactTypeShape>(currentDiagram, nestedFactType, true)) + { + if (factShape.AbsoluteBoundingBox.IntersectsWith(objectShapeVicinity)) { - FactTypeShape factShape = (FactTypeShape)newShape; + createNewShape = false; + break; + } + } + + if (createNewShape) + { + currentDiagram.PlaceORMElementOnDiagram( + null, + nestedFactType, + objectShape.Location, + ORMPlacementOption.AllowMultipleShapes, + delegate(ModelElement fixupElement, ShapeElement newShape) + { + FactTypeShape factShape = (FactTypeShape)newShape; #if TRACKNEWSHAPES - (newShapes ?? (newShapes = new List<FactTypeShape>())).Add(factShape); + (newShapes ?? (newShapes = new List<FactTypeShape>())).Add(factShape); #endif // TRACKNEWSHAPES - factShape.DisplayRelatedTypes = objectShape.DisplayRelatedTypes; - }, - delegate(ModelElement fixupElement, ShapeElement newShape) - { - foreach (PresentationElement relativePel in newShape.RelativeChildShapes) + factShape.DisplayRelatedTypes = objectShape.DisplayRelatedTypes; + }, + delegate(ModelElement fixupElement, ShapeElement newShape) { - ObjectifiedFactTypeNameShape nameShape = relativePel as ObjectifiedFactTypeNameShape; - if (nameShape != null) + foreach (PresentationElement relativePel in newShape.RelativeChildShapes) { - nameShape.ExpandRefMode = objectShape.ExpandRefMode; - break; + ObjectifiedFactTypeNameShape nameShape = relativePel as ObjectifiedFactTypeNameShape; + if (nameShape != null) + { + nameShape.ExpandRefMode = objectShape.ExpandRefMode; + break; + } } - } - MultiShapeUtility.DetachLinks(objectShape); - objectShape.Delete(); - }); + MultiShapeUtility.DetachLinks(objectShape); + objectShape.Delete(); + }); + } + else + { + MultiShapeUtility.DetachLinks(objectShape); + objectShape.Delete(); + } } } #if TRACKNEWSHAPES @@ -5255,9 +5279,8 @@ // See if any links coming in apply to the ObjectType bool needObjectShape = false; bool needFactShape = false; - // The contents of the enumerator change over the course of this function, - // cache the list. - List<BinaryLinkShape> factShapeAttachedLinkShapes = new List<BinaryLinkShape>(MultiShapeUtility.GetEffectiveAttachedLinkShapes<BinaryLinkShape>(factShape)); + // The contents of the enumerator change over the course of this function, get a snapshot enumerator + IEnumerable<BinaryLinkShape> factShapeAttachedLinkShapes = MultiShapeUtility.GetEffectiveAttachedLinkShapes<BinaryLinkShape>(factShape, true); foreach (BinaryLinkShape linkShape in factShapeAttachedLinkShapes) { RolePlayerLink rolePlayerLink; Modified: trunk/ORMModel/ShapeModel/ViewFixupRules.cs =================================================================== --- trunk/ORMModel/ShapeModel/ViewFixupRules.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/ORMModel/ShapeModel/ViewFixupRules.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -594,6 +594,7 @@ ORMModel model; if (!link.IsDeleted && null != (associatedFact = link.PlayedRole.FactType) && + null == associatedFact.ImpliedByObjectification && null != (model = (rolePlayer = link.RolePlayer).Model)) { FactType nestedFact; Modified: trunk/RelationalModel/OialDcilBridge/NameGeneration.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-06-02 09:04:54 UTC (rev 1391) +++ trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-06-11 01:31:05 UTC (rev 1392) @@ -2261,10 +2261,8 @@ } /// <summary> - /// + /// Override default values used to create the initial state of the object. /// </summary> - /// <param name="propertyAssignments"></param> - /// <returns></returns> private static PropertyAssignment[] GenerateDefaultValues(params PropertyAssignment[] propertyAssignments) { PropertyAssignment[] properties = propertyAssignments; @@ -2308,6 +2306,62 @@ } return properties; } + /// <summary> + /// Track default property values that differ from the default values on the base. + /// </summary> + protected override bool HasDefaultAttributeValues(Guid[] ignorePropertyIds) + { + bool retVal = true; + string nameUsage = NameUsage; + Guid ignoreNewPropertyId = Guid.Empty; + if (string.IsNullOrEmpty(nameUsage)) + { + // The default spacing format is modified + if (ignorePropertyIds == null || Array.IndexOf<Guid>(ignorePropertyIds, SpacingFormatDomainPropertyId) == -1) + { + retVal = SpacingFormat == NameGeneratorSpacingFormat.Remove; + ignoreNewPropertyId = SpacingFormatDomainPropertyId; + } + } + else if (nameUsage == "RelationalColumn") + { + // The default casing option is modified + if (ignorePropertyIds == null || Array.IndexOf<Guid>(ignorePropertyIds, CasingOptionDomainPropertyId) == -1) + { + retVal = CasingOption == NameGeneratorCasingOption.Camel; + ignoreNewPropertyId = CasingOptionDomainPropertyId; + } + } + else if (nameUsage == "RelationalTable") + { + // The default casing option is modified + if (ignorePropertyIds == null || Array.IndexOf<Guid>(ignorePropertyIds, CasingOptionDomainPropertyId) == -1) + { + retVal = CasingOption == NameGeneratorCasingOption.Pascal; + ignoreNewPropertyId = CasingOptionDomainPropertyId; + } + } + if (retVal) + { + Guid[] forwardIgnorePropertyIds; + if (ignoreNewPropertyId == Guid.Empty) + { + forwardIgnorePropertyIds = ignorePropertyIds; + } + else if (ignorePropertyIds != null) + { + forwardIgnorePropertyIds = new Guid[ignorePropertyIds.Length + 1]; + ignorePropertyIds.CopyTo(forwardIgnorePropertyIds, 0); + forwardIgnorePropertyIds[forwardIgnorePropertyIds.Length - 1] = ignoreNewPropertyId; + } + else + { + forwardIgnorePropertyIds = new Guid[] { ignoreNewPropertyId }; + } + return base.HasDefaultAttributeValues(forwardIgnorePropertyIds); + } + return false; + } } #endregion // ORMAbstractionToConceptualDatabaseBridgeDomainModel.RelationalNameGenerator Class } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-06-19 02:16:00
|
Revision: 1394 http://orm.svn.sourceforge.net/orm/?rev=1394&view=rev Author: mcurland Date: 2009-06-19 01:37:26 +0000 (Fri, 19 Jun 2009) Log Message: ----------- * Added additional validation to check single-instance use before allow remote edits of a sample population value. refs #374 * Modified ValueTypes that are not explicitly independent and play no roles to be treated the same as EntityTypes in the same situation. * Verbalize validation errors from the mandatory part of an exclusive-or constraint with the exclusion part. * Update version in preparation for the June 2009 CTP drop. refs #193 Modified Paths: -------------- trunk/ORMModel/ObjectModel/Constraint.cs trunk/ORMModel/ObjectModel/ObjectType.cs trunk/ORMModel/Shell/SamplePopulationEditor.cs trunk/Setup/Readme.htm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Load.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.cs trunk/VersionGenerator.exe.config Modified: trunk/ORMModel/ObjectModel/Constraint.cs =================================================================== --- trunk/ORMModel/ObjectModel/Constraint.cs 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/ORMModel/ObjectModel/Constraint.cs 2009-06-19 01:37:26 UTC (rev 1394) @@ -7683,6 +7683,14 @@ yield return exclusionContradictsMandatory; } } + MandatoryConstraint coupledMandatory = ExclusiveOrMandatoryConstraint; + if (coupledMandatory != null) + { + foreach (ModelErrorUsage usage in ((IModelErrorOwner)coupledMandatory).GetErrorCollection(filter)) + { + yield return usage; + } + } } IEnumerable<ModelErrorUsage> IModelErrorOwner.GetErrorCollection(ModelErrorUses filter) { Modified: trunk/ORMModel/ObjectModel/ObjectType.cs =================================================================== --- trunk/ORMModel/ObjectModel/ObjectType.cs 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/ORMModel/ObjectModel/ObjectType.cs 2009-06-19 01:37:26 UTC (rev 1394) @@ -2158,7 +2158,7 @@ { get { - return this.IsIndependent || (!this.IsValueType && this.ImpliedMandatoryConstraint == null && this.AllowIsIndependent(false)); + return IsIndependent || (ImpliedMandatoryConstraint == null && AllowIsIndependent(false)); } } /// <summary> Modified: trunk/ORMModel/Shell/SamplePopulationEditor.cs =================================================================== --- trunk/ORMModel/Shell/SamplePopulationEditor.cs 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/ORMModel/Shell/SamplePopulationEditor.cs 2009-06-19 01:37:26 UTC (rev 1394) @@ -3399,7 +3399,7 @@ factInstance.ObjectifyingInstance = identifierInstance; } } - protected static ObjectTypeInstance RecurseValueTypeInstance(ObjectTypeInstance objectTypeInstance, ObjectType parentType, string newText, ref ValueTypeInstance rootInstance, bool create) + protected static ObjectTypeInstance RecurseValueTypeInstance(ObjectTypeInstance objectTypeInstance, ObjectType parentType, string newText, ref ValueTypeInstance rootInstance, bool create, bool allowValueEdit) { if (parentType.IsValueType) { @@ -3433,7 +3433,7 @@ ValueTypeInstance editValueTypeInstance = objectTypeInstance as ValueTypeInstance; if (editValueTypeInstance != null) { - if (RoleInstance.GetLinksToRoleCollection(editValueTypeInstance).Count <= 1) + if (allowValueEdit && RoleInstance.GetLinksToRoleCollection(editValueTypeInstance).Count <= 1) { editValueTypeInstance.Value = newText; } @@ -3458,16 +3458,38 @@ // Note that we don't offer direct text editing of subtype instances, so is either a ValueTypeInstance // of an EntityTypeInstance. EntityTypeRoleInstance editingRoleInstance = null; + bool recurseAllowValueEdit = create; if (editEntityInstance != null) { editingRoleInstance = editEntityInstance.FindRoleInstance(identifierRole); + if (recurseAllowValueEdit) + { + // Before recursing and potentially allowing an edit to the underlying value instance, + // we first need to check this parent instance is itself used multiple times. + // The scenario we want to protect against is: + // Person(.name) has Gender(.code) + // 1) Enter F in two gender fields with the 'Person has Gender' FactType selected + // 2) Editing the second F to be an M needs to create a new instance, not edit the single existing instance + int maxLeft = editEntityInstance.ObjectifiedInstance == null ? 0 : 1; + int setCount = RoleInstance.GetLinksToRoleCollection(editEntityInstance).Count; + if (setCount > maxLeft) + { + recurseAllowValueEdit = false; + } + else + { + maxLeft -= setCount; + recurseAllowValueEdit = editEntityInstance.EntityTypeSubtypeInstanceCollection.Count <= maxLeft; + } + } } ObjectTypeInstance objectInstance = RecurseValueTypeInstance( (editingRoleInstance != null) ? editingRoleInstance.ObjectTypeInstance : null, identifierRole.RolePlayer, newText, ref rootInstance, - create); + create, + recurseAllowValueEdit); LinkedElementCollection<EntityTypeInstance> instances = parentType.EntityTypeInstanceCollection; int instanceCount = instances.Count; for(int i = 0; i < instanceCount; ++i) @@ -4025,7 +4047,7 @@ using (Transaction t = store.TransactionManager.BeginTransaction(string.Format(ResourceStrings.ModelSamplePopulationEditorEditInstanceTransactionText, editRolePlayer.Name, objectInstance.Name))) { ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(objectInstance, editRolePlayer, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(objectInstance, editRolePlayer, newText, ref instance, true, true); ConnectInstance(myEntityType, myEntityTypeSubtype, ref editInstance, ref editSubtypeInstance, result, identifierRole); t.Commit(); } @@ -4038,7 +4060,7 @@ using (Transaction t = store.TransactionManager.BeginTransaction(string.Format(ResourceStrings.ModelSamplePopulationEditorNewInstanceTransactionText, selectedEntityType.Name))) { ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(null, identifierRole.RolePlayer, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(null, identifierRole.RolePlayer, newText, ref instance, true, true); ConnectInstance(myEntityType, myEntityTypeSubtype, ref editInstance, ref editSubtypeInstance, result, identifierRole); t.Commit(); } @@ -4052,7 +4074,7 @@ { Role identifierRole = selectedEntityType.PreferredIdentifier.RoleCollection[column - 1]; ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(null, identifierRole.RolePlayer, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(null, identifierRole.RolePlayer, newText, ref instance, true, true); EntityTypeInstance parentInstance = null; EntityTypeSubtypeInstance parentSubtypeInstance = null; ConnectInstance(selectedEntityType, selectedEntityTypeSubtype, ref parentInstance, ref parentSubtypeInstance, result, identifierRole); @@ -4756,7 +4778,7 @@ ObjectType editRolePlayer = editRoleInstance.Role.RolePlayer; using (Transaction t = store.TransactionManager.BeginTransaction(string.Format(ResourceStrings.ModelSamplePopulationEditorEditInstanceTransactionText, editRolePlayer.Name, attachedInstance.Name))) { - ObjectTypeInstance result = RecurseValueTypeInstance(attachedInstance, editRolePlayer, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(attachedInstance, editRolePlayer, newText, ref instance, true, true); ConnectInstance(ref editInstance, result, factRole, null); if (t.HasPendingChanges) { @@ -4772,7 +4794,7 @@ using (Transaction t = store.TransactionManager.BeginTransaction(string.Format(ResourceStrings.ModelSamplePopulationEditorNewInstanceTransactionText, selectedFactType.Name))) { ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(null, factRole.RolePlayer, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(null, factRole.RolePlayer, newText, ref instance, true, true); editInstance.EnsureRoleInstance(factRole, result); t.Commit(); } @@ -4826,7 +4848,7 @@ ValueTypeInstance instance = null; using (Transaction t = store.TransactionManager.BeginTransaction(string.Format(ResourceStrings.ModelSamplePopulationEditorEditInstanceTransactionText, objectifyingType.Name, objectifyingInstance.Name))) { - ObjectTypeInstance result = RecurseValueTypeInstance(objectifyingInstance, objectifyingType, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(objectifyingInstance, objectifyingType, newText, ref instance, true, true); if (result != objectifyingInstance) { ConnectInstance(ref editInstance, result, null, objectifyingType); @@ -4844,7 +4866,7 @@ using (Transaction t = store.TransactionManager.BeginTransaction(string.Format(ResourceStrings.ModelSamplePopulationEditorNewInstanceTransactionText, selectedFactType.Name))) { ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(null, objectifyingType, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(null, objectifyingType, newText, ref instance, true, true); FactTypeInstance existingResultInstance; if (null != (existingResultInstance = result.ObjectifiedInstance) && existingResultInstance.RoleInstanceCollection.Count != 0) @@ -4875,7 +4897,7 @@ newInstance.FactType = selectedFactType; Role factRole = selectedFactType.OrderedRoleCollection[column + myUnaryColumn].Role; ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(null, factRole.RolePlayer, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(null, factRole.RolePlayer, newText, ref instance, true, true); instance.Value = newText; new FactTypeRoleInstance(factRole, result).FactTypeInstance = newInstance; t.Commit(); @@ -4888,7 +4910,7 @@ FactTypeInstance newInstance = new FactTypeInstance(store); newInstance.FactType = myFactType; ValueTypeInstance instance = null; - ObjectTypeInstance result = RecurseValueTypeInstance(null, objectifyingType, newText, ref instance, true); + ObjectTypeInstance result = RecurseValueTypeInstance(null, objectifyingType, newText, ref instance, true, true); instance.Value = newText; newInstance.ObjectifyingInstance = result; t.Commit(); @@ -6043,6 +6065,7 @@ rowType, newText, ref instance, + true, true); instance.Value = newText; ConnectInstance(result, rowRole, null, null); @@ -6085,6 +6108,7 @@ rowType, newText, ref instance, + true, true); instance.Value = newText; ConnectInstance(result, rowRole, null, null); @@ -6138,6 +6162,7 @@ supertypeRole.RolePlayer, newText, ref instance, + true, true); instance.Value = newText; ConnectInstance(result, supertypeRole, null, null); @@ -6190,6 +6215,7 @@ rowType, newText, ref instance, + true, true); instance.Value = newText; ConnectInstance(result, null, rowType, null); Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/Setup/Readme.htm 2009-06-19 01:37:26 UTC (rev 1394) @@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> -<title>NORMA May 2009 CTP Readme</title> +<title>NORMA June 2009 CTP Readme</title> <style type="text/css"> .new {font-size:x-small; background-color:Gold; color:Blue; } li {padding-bottom: 3px;} @@ -12,9 +12,9 @@ <body> -<p><b><a id="The Top" style="font-family:Verdana;font-size:medium">NORMA May 2009 CTP Readme</a> </b></p> +<p><b><a id="The Top" style="font-family:Verdana;font-size:medium">NORMA June 2009 CTP Readme</a> </b></p> <p>This file supersedes the previous readme.txt and older readme.htm files. This readme has parallel indexing mechanisms: by topic, and by release date (starting with the October 2008 (2008-10) release). The file will be extended for future product releases.<br/><br/> -The May 2009 release adds verbalization of ring constraints and other targeted fixes. +The June 2009 release is a stabilization release with minor feature changes. See detailed change notes below for specifics. <br/><br/></p> <h2>Contents</h2> <ul> @@ -40,8 +40,31 @@ <li><a href="#TOPIC DAILY">TOPIC DESCRIPTION</a> (Build ####)</li> </ul>--> <hr/> +<h2>June 2009 CTP Changes</h2> +<div>The June 2009 CTP release includes all modifications through changeset 1394. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<ul> +<li><a href="#Sample population mandatory error activation 2009-06">Sample population mandatory error activation</a> </li> +<li>Other Features: +<ol> +<li>Added verbalization of default values for custom properties. This setting can be configured on a per-property basis.</li> +<li>Do not ignore a ValueType that is not explicitly independent and plays no roles when generating of other views on the model (relational, etc). We now make no distinction between an unattached ValueType and and EntityType that plays no roles outside of its identifying FactTypes.<em> This may expose long-abandonded ValueTypes in existing models, which will get tables instead of simply being ignored.</em></li> +</ol> +</li> +<li>Bug Fixes: +<ol> +<li>Phantom partially constructed shapes appearing in corner of diagram(s) during 'Objectify' command.</li> +<li>Symmetric ring constraints verbalizing the same as Intransitive (SymmetricAndIntransitive verbalizes correctly).</li> +<li>DisplayRelatedTypes property showing on all FactType shapes instead of being limited to objectified fact types with subtypes and/or supertypes.</li> +<li>Delete Page/Undo not restoring the page to the same position if the <em>Diagram Management</em> extension is not enabled.</li> +<li>Name generation settings that exactly matched the parent node settings need to be saved if they differ from the default values; settings revert on load.</li> +<li>Validation errors for mandatory constraint associated with the collapsed 'exactly one' verbalization are not verbalized. Similar issue with validation errors on mandatory portion of the combined exclusive-or constraint.</li> +<li>Some validation errors appearing twice within the verbalization of a single top-level element.</li> +</ol> +</li> +</ul> +<hr/> <h2>May 2009 CTP Changes</h2> -<div>The May 2009 CTP release includes all modifications through changeset 1390. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The May 2009 CTP release includes all modifications through changeset 1390.</div> <ul> <li><a href="#Display Related Types 2009-05">Controlling display of subtype lines</a> </li> <li><a href="#Role name highlighting 2009-05">Role name highlighting</a> </li> @@ -274,6 +297,8 @@ Most models have a number of FactType populations that are fully implied by one of the role players. The most common of these cases is the standard reference mode pattern, where the population of a one-to-one FactType is implied by the identified EntityType. Other FactType patterns that are implied are SubtypeFacts where the subtype uses a supertype identifier and the binary FactTypes implied by an objectification pattern. Implied FactTypes appear read-only in the sample population editor.</li> <li><a id="Sample population deletion 2009-05" class="new" title="May 2009 CTP: Sample population deletion">2009-05</a> The delete key can be used at any time to delete a cell with a value in it. Deleting the last value-containing cell deletes the instance for that row. To delete a row instance directly without deleting its parts, place the selection in the first column (with the numbers) before pressing delete.</li> +<li><a id="Sample population mandatory error activation 2009-06" class="new" title="June 2009 CTP: Sample population mandatory error activation">2009-06</a> +Automatic activation of sample population errors has been extended to support disjunctive mandatory constraints. Activating a 'population mandatory' error through a specific role by selecting the item in the 'Validation Errors' context submenu or double-clicking the role adds a new fact instance for the context FactType with that role prepopulated. If you want to add the other value to another fact instance, simply escape any active editors and undo the last action. Activating a disjunctive mandatory error through the error list will populate the first role player mentioned in the error text.</li> </ol> <a href="#The Top">Return to top</a> <hr /> @@ -377,7 +402,7 @@ <li>We have had cases where the Custom Properties extension does not work correctly on Vista. The 'PropertiesEditor' property is available on the model, but the custom properties do not appear on the target elements. This does not happen on all machines, but when it does, the workaround is to launch VS2008 as an administrator instead of as a normal user.</li> <li>The FactEditor has refused to load properly immediate after installation on Visual Studio 2008. Restarting Visual Studio fixed the problem.</li> <li>Occasionally when closing Visual Studio, a message appears stating that a modal dialog is open, and VS must be forcibly terminated with the task manager.</li> -<li>Reloading a model can reveal duplicate name errors on generated names for UniquenessConstraint and ImpliedMandatoryConstraint. The UniquenessConstraint errors are easily fixed because they can be selected in the model browser (double click the error, delete the name to regenerate one of the names), but the implied mandatory constraints cannot be selected. The are two ways to fix these: open the .orm file with an xml editor (Open With in Visual Studio, notepad also works) and delete one of the offending name occurrences then reload in NORMA, or use the Store Viewer (a debug common on the context menu) to determine an Object Type associated with the offending constraint. In the Store Viewer, select and recursively expand the ORMStore/Partition/Links/ObjectTypeImpliesMandatoryConstraint node (recursive expansion is done with the * key on the number pad), then scan for the offending constraint name, note the ObjectType name above it, and close the dialog. Find that ObjectType in the model and toggle (twice) either the IsIndependent property on the ObjectType or the IsMandatory property on an optional attached role. The naming error will go away. My apologies for the hassle, I just haven't managed to reproduce the scenario that causes this problem, and the issue is not visible until the file is reloaded.</li> +<li>Reloading a model can reveal duplicate name errors on generated names for UniquenessConstraint and ImpliedMandatoryConstraint. The UniquenessConstraint errors are easily fixed because they can be selected in the model browser (double click the error, delete the name to regenerate one of the names), but the implied mandatory constraints cannot be selected. The are two ways to fix these: open the .orm file with an xml editor (Open With in Visual Studio, notepad also works) and delete one of the offending name occurrences then reload in NORMA, or use the Store Viewer (a debug command on the context menu) to determine an Object Type associated with the offending constraint. In the Store Viewer, select and recursively expand the ORMStore/Partition/Links/ObjectTypeImpliesMandatoryConstraint node (recursive expansion is done with the * key on the number pad), then scan for the offending constraint name, note the ObjectType name above it, and close the dialog. Find that ObjectType in the model and toggle (twice) either the IsIndependent property on the ObjectType or the IsMandatory property on an optional attached role. The naming error will go away. My apologies for the hassle, I just haven't managed to reproduce the scenario that causes this problem, and the issue is not visible until the file is reloaded. <em>Update on this issue:</em> The underlying problem has not been fixed, but duplicate generated names are automatically regenerated on reload. The intent of this change was to make it easier to merge models under source control, but it also has the side-effect of making this bug even more obscure. The error will now be visible only as duplicate names in generated code, not in the designer. Reload the model and explicitly save to clean the file.</li> </ol> </body> </html> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2009-06-19 01:37:26 UTC (rev 1394) @@ -68,9 +68,6 @@ <orm:SubtypeMetaRole ref="_E61B61CE-258C-49D1-8831-C59CE50B4A10" /> </orm:PlayedRoles> </orm:EntityType> - <orm:ValueType Name="Party_id" id="_FC5194B8-D9E0-489B-9BC6-06F40986E43E"> - <orm:ConceptualDataType Length="0" Scale="0" id="_C3C1B46D-C442-41D1-944F-D83C034DDBB2" ref="_56A81310-588E-4CCE-9E1E-418FFBF41C19" /> - </orm:ValueType> <orm:ValueType Name="PartyName" id="_9F872F80-D8B0-43C7-AAAF-4AB8221BDEAF"> <orm:PlayedRoles> <orm:Role ref="_0F7274B6-21EE-49AB-A95B-2017D9CCFA3A" /> @@ -1035,7 +1032,6 @@ <oial:informationTypeFormats> <odt:dataType id="_E66BF8A6-3774-41D3-AAFC-BA1CC65CF2FC" name="ymd" /> <odt:dataType id="_A026FE17-097D-4366-A26C-751479E931AD" name="Person died" /> - <odt:dataType id="_1BE4081C-0A79-48D5-9A0A-91002317D85D" name="Party_id" /> <odt:dataType id="_E417828C-CE7F-4D3D-8349-6508D7D9C651" name="PartyName" /> <odt:dataType id="_0FC8D5EB-5A0E-4D79-83D1-DC98F30D5458" name="Accuracy_level" /> <odt:dataType id="_199095C5-1FF2-4B9F-BAC2-08237CDE99D5" name="Thing_id" /> @@ -1210,7 +1206,6 @@ <ormtooial:ConceptTypeChildHasPathFactType ConceptTypeChild="_70D88A9B-4F49-47DE-AFE2-4196022A0A1A" PathFactType="_A9CAFF58-E876-4A28-AC63-70D9149517F2" id="_60A3A6F3-A100-4F27-BA9C-655F0EC705DC" /> <ormtooial:InformationTypeFormatIsForValueType InformationTypeFormat="_0FC8D5EB-5A0E-4D79-83D1-DC98F30D5458" ValueType="_BC073DDC-1A02-4FA1-8873-BE0C03E5EB85" id="_9372CA33-C7A6-4981-AE2C-D9278A73743C" /> <ormtooial:InformationTypeFormatIsForValueType InformationTypeFormat="_E417828C-CE7F-4D3D-8349-6508D7D9C651" ValueType="_9F872F80-D8B0-43C7-AAAF-4AB8221BDEAF" id="_F44E71BA-25A1-4053-99F4-595C2F038336" /> - <ormtooial:InformationTypeFormatIsForValueType InformationTypeFormat="_1BE4081C-0A79-48D5-9A0A-91002317D85D" ValueType="_FC5194B8-D9E0-489B-9BC6-06F40986E43E" id="_E91807BC-B6B2-4B95-AB73-806EE854F858" /> <ormtooial:InformationTypeFormatIsForValueType InformationTypeFormat="_A026FE17-097D-4366-A26C-751479E931AD" ValueType="_62971E4F-AB50-4FE5-964D-D7CE728B9E0D" id="_8B46616B-3C7D-4358-A227-B3457A7A5279" /> <ormtooial:InformationTypeFormatIsForValueType InformationTypeFormat="_199095C5-1FF2-4B9F-BAC2-08237CDE99D5" ValueType="_B9D663E7-D13D-4AF8-AF51-47F4FCB2D88C" id="_D5E1EA1F-9342-4241-B209-619B89C0C9D5" /> <ormtooial:InformationTypeFormatIsForValueType InformationTypeFormat="_E66BF8A6-3774-41D3-AAFC-BA1CC65CF2FC" ValueType="_B967A5DE-3F06-4347-95E5-7B2ED5AB8118" id="_AC3FED93-9BA7-46AF-87EE-1B813BBEE76C" /> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) @@ -68,9 +68,6 @@ <orm:SubtypeMetaRole ref="_E61B61CE-258C-49D1-8831-C59CE50B4A10" /> </orm:PlayedRoles> </orm:EntityType> - <orm:ValueType id="_FC5194B8-D9E0-489B-9BC6-06F40986E43E" Name="Party_id"> - <orm:ConceptualDataType id="_C3C1B46D-C442-41D1-944F-D83C034DDBB2" ref="_56A81310-588E-4CCE-9E1E-418FFBF41C19" Scale="0" Length="0" /> - </orm:ValueType> <orm:ValueType id="_9F872F80-D8B0-43C7-AAAF-4AB8221BDEAF" Name="PartyName"> <orm:PlayedRoles> <orm:Role ref="_0F7274B6-21EE-49AB-A95B-2017D9CCFA3A" /> @@ -1035,7 +1032,6 @@ <oial:informationTypeFormats> <odt:dataType id="_E66BF8A6-3774-41D3-AAFC-BA1CC65CF2FC" name="ymd" /> <odt:dataType id="_A026FE17-097D-4366-A26C-751479E931AD" name="Person died" /> - <odt:dataType id="_1BE4081C-0A79-48D5-9A0A-91002317D85D" name="Party_id" /> <odt:dataType id="_E417828C-CE7F-4D3D-8349-6508D7D9C651" name="PartyName" /> <odt:dataType id="_0FC8D5EB-5A0E-4D79-83D1-DC98F30D5458" name="Accuracy_level" /> <odt:dataType id="_199095C5-1FF2-4B9F-BAC2-08237CDE99D5" name="Thing_id" /> @@ -1191,7 +1187,6 @@ <ormtooial:ConceptTypeChildHasPathFactType id="_60A3A6F3-A100-4F27-BA9C-655F0EC705DC" ConceptTypeChild="_70D88A9B-4F49-47DE-AFE2-4196022A0A1A" PathFactType="_A9CAFF58-E876-4A28-AC63-70D9149517F2" /> <ormtooial:InformationTypeFormatIsForValueType id="_9372CA33-C7A6-4981-AE2C-D9278A73743C" InformationTypeFormat="_0FC8D5EB-5A0E-4D79-83D1-DC98F30D5458" ValueType="_BC073DDC-1A02-4FA1-8873-BE0C03E5EB85" /> <ormtooial:InformationTypeFormatIsForValueType id="_F44E71BA-25A1-4053-99F4-595C2F038336" InformationTypeFormat="_E417828C-CE7F-4D3D-8349-6508D7D9C651" ValueType="_9F872F80-D8B0-43C7-AAAF-4AB8221BDEAF" /> - <ormtooial:InformationTypeFormatIsForValueType id="_E91807BC-B6B2-4B95-AB73-806EE854F858" InformationTypeFormat="_1BE4081C-0A79-48D5-9A0A-91002317D85D" ValueType="_FC5194B8-D9E0-489B-9BC6-06F40986E43E" /> <ormtooial:InformationTypeFormatIsForValueType id="_8B46616B-3C7D-4358-A227-B3457A7A5279" InformationTypeFormat="_A026FE17-097D-4366-A26C-751479E931AD" ValueType="_62971E4F-AB50-4FE5-964D-D7CE728B9E0D" /> <ormtooial:InformationTypeFormatIsForValueType id="_D5E1EA1F-9342-4241-B209-619B89C0C9D5" InformationTypeFormat="_199095C5-1FF2-4B9F-BAC2-08237CDE99D5" ValueType="_B9D663E7-D13D-4AF8-AF51-47F4FCB2D88C" /> <ormtooial:InformationTypeFormatIsForValueType id="_AC3FED93-9BA7-46AF-87EE-1B813BBEE76C" InformationTypeFormat="_E66BF8A6-3774-41D3-AAFC-BA1CC65CF2FC" ValueType="_B967A5DE-3F06-4347-95E5-7B2ED5AB8118" /> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) @@ -8,9 +8,6 @@ </orm:PlayedRoles> <orm:PreferredIdentifier ref="_9E113A63-0DB1-49D9-97EB-F5DE1EE6455E" /> </orm:EntityType> - <orm:ValueType id="_C9C0B814-05EB-4152-8E92-164793853AA5" Name="Foo_id"> - <orm:ConceptualDataType id="_AEF6F505-F8C8-49D9-90D0-6489FFF0388A" ref="_C263C032-CA5E-4A58-8381-C49BF1B65751" Scale="0" Length="0" /> - </orm:ValueType> <orm:EntityType id="_F6FCFBBF-4BBA-4030-B728-CA6B7A2D2105" Name="Bar" _ReferenceMode="id"> <orm:PlayedRoles> <orm:Role ref="_FBE13C84-0F4A-48F6-B7B9-E1474E19A241" /> @@ -244,7 +241,6 @@ </ormDiagram:ORMDiagram> <oial:model id="_9C9BECFF-37EA-4156-B4BF-55AD6ED21CD2" name="SeparateAssimilationPreferredForParent"> <oial:informationTypeFormats> - <odt:dataType id="_442974BD-764D-498D-AE3D-517765A147B5" name="Foo_id" /> <odt:dataType id="_B9494645-975A-4881-B2E0-3D7370A98DA1" name="Bar_id" /> </oial:informationTypeFormats> <oial:conceptTypes> @@ -315,7 +311,6 @@ <ormtooial:ConceptTypeChildHasPathFactType id="_75221445-45A8-46F0-AEC0-D3BB68E02BD1" PathFactType="_A8F5A104-F52C-4331-8515-606253CBC003" ConceptTypeChild="_12806CA7-0786-4D86-8F66-282EC3A17AA8" /> <ormtooial:ConceptTypeChildHasPathFactType id="_E5813942-476A-42DF-8A55-F9CB68056B4D" PathFactType="_60FE3D5D-7AFA-4EDA-B338-23F1F355A9F2" ConceptTypeChild="_D343720E-85B3-418B-9705-4A55A3EBD1E6" /> <ormtooial:InformationTypeFormatIsForValueType id="_7C6103E2-7011-4907-83F2-A0E1F11C236E" InformationTypeFormat="_B9494645-975A-4881-B2E0-3D7370A98DA1" ValueType="_CFF6500D-0D4B-450F-B821-45446D1209EF" /> - <ormtooial:InformationTypeFormatIsForValueType id="_E879738D-BCED-4A3F-9DCC-A5CF7FF6D00E" InformationTypeFormat="_442974BD-764D-498D-AE3D-517765A147B5" ValueType="_C9C0B814-05EB-4152-8E92-164793853AA5" /> <ormtooial:UniquenessIsForUniquenessConstraint id="_74933EFF-73D3-4EB7-A259-8CEA8092D481" AbstractionUniquenessConstraint="_4C845723-45EA-4DEB-8A08-3B970904ADC0" ORMUniquenessConstraint="_CBCD88D1-23A9-48D4-812A-DA14E199836B" /> </ormtooial:Bridge> <oialtocdb:Bridge> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Load.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Load.orm 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Load.orm 2009-06-19 01:37:26 UTC (rev 1394) @@ -8,9 +8,6 @@ </orm:PlayedRoles> <orm:PreferredIdentifier ref="_9E113A63-0DB1-49D9-97EB-F5DE1EE6455E" /> </orm:EntityType> - <orm:ValueType id="_C9C0B814-05EB-4152-8E92-164793853AA5" Name="Foo_id"> - <orm:ConceptualDataType id="_AEF6F505-F8C8-49D9-90D0-6489FFF0388A" ref="_C263C032-CA5E-4A58-8381-C49BF1B65751" Scale="0" Length="0" /> - </orm:ValueType> <orm:EntityType id="_F6FCFBBF-4BBA-4030-B728-CA6B7A2D2105" Name="Bar" _ReferenceMode="id"> <orm:PlayedRoles> <orm:Role ref="_FBE13C84-0F4A-48F6-B7B9-E1474E19A241" /> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.cs =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.cs 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.cs 2009-06-19 01:37:26 UTC (rev 1394) @@ -177,7 +177,7 @@ AssimilationMapping partyIsThingAssimilationMapping; using (Transaction t = store.TransactionManager.BeginTransaction("Longer assimilation chain")) { - partyObjectType.ReferenceModeString = ""; + partyObjectType.ReferenceModeDisplay = ""; // Using ReferenceModeDisplay instead of ReferenceModeString to automatically kill Party_id ObjectType thingObjectType = new ObjectType(store, new PropertyAssignment(ObjectType.NameDomainPropertyId, "Thing"), new PropertyAssignment(ObjectType.IsIndependentDomainPropertyId, true)); thingObjectType.Model = model; thingObjectType.ReferenceModeString = "id"; Modified: trunk/VersionGenerator.exe.config =================================================================== --- trunk/VersionGenerator.exe.config 2009-06-11 01:50:08 UTC (rev 1393) +++ trunk/VersionGenerator.exe.config 2009-06-19 01:37:26 UTC (rev 1394) @@ -2,7 +2,7 @@ <configuration> <appSettings> <add key="RevisionStartYearMonth" value="2006-01"/> - <add key="ReleaseYearMonth" value="2009-05"/> + <add key="ReleaseYearMonth" value="2009-06"/> <!-- ReleaseType: "CTP" or "RTM" --> <add key="ReleaseType" value="CTP"/> <!-- Changes to the major and/or minor version numbers have extreme effects across every part of the product. --> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-06-20 23:48:33
|
Revision: 1395 http://orm.svn.sourceforge.net/orm/?rev=1395&view=rev Author: mcurland Date: 2009-06-20 23:48:17 +0000 (Sat, 20 Jun 2009) Log Message: ----------- * Recognize MultiPart conceptual names in relational name generator and eliminate partial word collapsing. refs #338 * Fix column header update issue for entity identifiers in population editor Modified Paths: -------------- trunk/ORMModel/Shell/SamplePopulationEditor.cs trunk/RelationalModel/OialDcilBridge/NameGeneration.cs trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs trunk/Setup/Readme.htm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm Modified: trunk/ORMModel/Shell/SamplePopulationEditor.cs =================================================================== --- trunk/ORMModel/Shell/SamplePopulationEditor.cs 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/ORMModel/Shell/SamplePopulationEditor.cs 2009-06-20 23:48:17 UTC (rev 1395) @@ -4329,7 +4329,7 @@ private void RoleNameChangedEvent(object sender, ElementPropertyChangedEventArgs e) { Role role = (Role)e.ModelElement; - if (!role.IsDeleted && IsPartOfDisplayedIdentifier(myEntityTypeSubtype ?? myEntityTypeSubtype, role)) + if (!role.IsDeleted && IsPartOfDisplayedIdentifier(myEntityTypeSubtype ?? myEntityType, role)) { UpdateColumnHeaders(); } Modified: trunk/RelationalModel/OialDcilBridge/NameGeneration.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-06-20 23:48:17 UTC (rev 1395) @@ -674,26 +674,77 @@ } #endregion // Accessor properties #region Regex patterns - private static Regex myReplaceFieldsPattern; - private Regex ReplaceFieldsPattern + private static Regex myEmbeddedCapsRegex; + /// <summary> + /// The regular expression used to determine if a string contains + /// an embedded capital + /// </summary> + private Regex EmbeddedCapsRegex { get { - Regex retVal = myReplaceFieldsPattern; + Regex retVal = myEmbeddedCapsRegex; if (retVal == null) { System.Threading.Interlocked.CompareExchange<Regex>( - ref myReplaceFieldsPattern, + ref myEmbeddedCapsRegex, new Regex( - @"{\d+}", + @"(\s|.)+\p{Lu}", RegexOptions.Compiled), null); - retVal = myReplaceFieldsPattern; + retVal = myEmbeddedCapsRegex; } return retVal; } } + private static Regex myAdjacentCapsRegex; + /// <summary> + /// The regular expression used to determine if a string contains + /// two adjacent upper case characters. + /// </summary> + private static Regex AdjacentCapsRegex + { + get + { + Regex retVal = myAdjacentCapsRegex; + if (retVal == null) + { + System.Threading.Interlocked.CompareExchange<Regex>( + ref myAdjacentCapsRegex, + new Regex( + @"\p{Lu}(?=\p{Lu})", + RegexOptions.Compiled), + null); + retVal = myAdjacentCapsRegex; + } + return retVal; + } + } #endregion // Regex patterns + private static Regex mySplitOnUpperRegex; + /// <summary> + /// The regular expression used to split a camel or + /// pascal cased string into pieces. Assumes spaces + /// are previously stripped. + /// </summary> + private static Regex SplitOnUpperRegex + { + get + { + Regex retVal = mySplitOnUpperRegex; + if (retVal == null) + { + System.Threading.Interlocked.CompareExchange<Regex>( + ref mySplitOnUpperRegex, + new Regex( + @"(?n)\G(?<name>((^(\s|.))|\p{Lu})\P{Lu}*)", + RegexOptions.Compiled), + null); + retVal = mySplitOnUpperRegex; + } + return retVal; + } + } #region Name generation methods private string GenerateTableName(Table table, int phase) { @@ -843,7 +894,10 @@ { string readingText = string.Format(CultureInfo.CurrentCulture, reading.Text, isUnary ? "\x1" : "", "\x1"); int splitPosition = readingText.LastIndexOf('\x1'); - addPart(readingText.Substring(0, splitPosition), null); + if (splitPosition > 0) + { + addPart(readingText.Substring(0, splitPosition), null); + } if (!isUnary) { if (nextNode != null) @@ -1073,7 +1127,6 @@ string newName = newNamePart; newName = newName.Trim(); NamePartOptions options = newNamePart.Options; - Debug.Assert(newName != null); if (newName.IndexOfAny(NameDelimiterArray) != -1) { string[] individualEntries = newName.Split(NameDelimiterArray, StringSplitOptions.RemoveEmptyEntries); @@ -1085,6 +1138,22 @@ return; } + // Test for multi-part names + if (0 == (options & NamePartOptions.ExplicitCasing) && + EmbeddedCapsRegex.IsMatch(newName) && + !AdjacentCapsRegex.IsMatch(newName)) + { + Match match = SplitOnUpperRegex.Match(newName); + int matchIndex = 0; + while (match.Success) + { + AddToNameCollection(ref singleName, ref nameCollection, match.Value, index == -1 ? -1 : index + matchIndex); + ++matchIndex; + match = match.NextMatch(); + } + return; + } + if (singleName.IsEmpty) { //we only have one name so far, so just use the string @@ -1113,8 +1182,8 @@ } //remove duplicate information int nextIndex; - if ((index > 0 && ((string)nameCollection[index - 1]).EndsWith(newName, StringComparison.CurrentCultureIgnoreCase)) - || ((nextIndex = index + 1) < count && ((string)nameCollection[nextIndex]).StartsWith(newName, StringComparison.CurrentCultureIgnoreCase))) + if ((index > 0 && ((string)nameCollection[index - 1]).Equals(newName, StringComparison.CurrentCultureIgnoreCase)) + || ((nextIndex = index + 1) < count && ((string)nameCollection[nextIndex]).Equals(newName, StringComparison.CurrentCultureIgnoreCase))) { //we don't need the name that was just added // UNDONE: Possiblye kill this check? Name scrubbing should be handled by the current algorithm @@ -1125,7 +1194,7 @@ //check if we need the following name while (nextIndex < count) { - if (newName.EndsWith(nameCollection[nextIndex], StringComparison.CurrentCultureIgnoreCase)) + if (newName.Equals(nameCollection[nextIndex], StringComparison.CurrentCultureIgnoreCase)) { nameCollection.RemoveAt(nextIndex); --count; @@ -1139,7 +1208,7 @@ nextIndex = index - 1; while (nextIndex > -1) { - if (newName.StartsWith(nameCollection[nextIndex], StringComparison.CurrentCultureIgnoreCase)) + if (newName.Equals(nameCollection[nextIndex], StringComparison.CurrentCultureIgnoreCase)) { nameCollection.RemoveAt(nextIndex--); } @@ -1545,6 +1614,10 @@ private string DoFirstLetterCase(NamePart name, bool upper, TextInfo textInfo) { string nameValue = name; + if (string.IsNullOrEmpty(nameValue)) + { + return nameValue; + } char c = nameValue[0]; if (upper) { Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2009-06-20 23:48:17 UTC (rev 1395) @@ -51,7 +51,7 @@ /// <summary> /// The algorithm version written to the file for the name generation algorithm /// </summary> - public const string CurrentNameAlgorithmVersion = "1.010"; + public const string CurrentNameAlgorithmVersion = "1.011"; #endregion // Algorithm Version Constants #region Fully populate from OIAL Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/Setup/Readme.htm 2009-06-20 23:48:17 UTC (rev 1395) @@ -41,9 +41,10 @@ </ul>--> <hr/> <h2>June 2009 CTP Changes</h2> -<div>The June 2009 CTP release includes all modifications through changeset 1394. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The June 2009 CTP release includes all modifications through changeset 1395. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Sample population mandatory error activation 2009-06">Sample population mandatory error activation</a> </li> +<li><a href="#Relational compound name interpretation 2009-06">Relational compound name interpretation</a> </li> <li>Other Features: <ol> <li>Added verbalization of default values for custom properties. This setting can be configured on a per-property basis.</li> @@ -361,6 +362,8 @@ <li>We now have two parallel generation algorithms examining the ORM model. The current algorithm is only used when generating DDL and for the LinqToSqlAttributeMapping generator (Visual Studio 2008 only). The older code generation pieces (Plix Implementation in the generator settings dialog) are not yet using the new information. If you have an existing project with old DDL generation, it is likely you are not picking up the new generator. To fix this problem, select the .ORM file in the Solution Explorer, open the 'ORMGeneratorSettings' dialog, and expand the 'Intermediate and Secondary Files' and 'DCIL' nodes. The DCIL node should contain the 'ConceptualDB to DCIL' and 'OIAL to DCIL' generation choices. Make sure the first one is selected. This will also automatically load the required extensions when you 'Save Changes' in the 'ORM Generator Selection' dialog. In the future, all generation will use the same absorption source.</li> <li>Column name generation has an extensive set of options. Names should now be shorter and less repetitive with other names. The main point of control for name generation is specifying how popular, unit-based, and general reference mode patterns are used when referencing EntityTypes or specifying identifying columns. The default settings for these are available on the model itself (under the 'Relational Mapping' categories) and are repeated under the 'Name Generation Settings' branch (specifically the Column Specific refinement of the 'Relational Names' branch). Overrides for individual EntityTypes are available by selecting that EntityType.</li> <li>Additional abbreviation of individual ObjectType names as well as specific phrases are available in the 'Abbreviations' dialog for any of the Name Generation Settings nodes. Phrase abbreviations can include multiple words and can map to empty strings, which will omit the phrase. Phrases are treated case insensitively for replacement. Note that each child node in the Name Generation Settings branch is a refinement of the parent node and affects the scope where the abbreviation is supplied and all children. For example, changes made with the <em>Relational Names</em> node selected apply to both column and table names.</li> +<li><a id="Relational compound name interpretation 2009-06" class="new" title="June 2009 CTP: Relational compound name interpretation">2009-06</a> +Name collapsing (showing only one of two equivalent adjacent names) is performed on a whole-word basis to avoid overaggressive collapsing of partial words. For example, in previous releases, <em>BidId</em> would reduce to <em>Bid</em> and <em>FemaleMale</em> to <em>Female</em>, which was clearly incorrect. To balance this fix, the notion of a whole word has been enhanced by recognizing each part of a multi-part word in the conceptual model as a whole word. Any word with embedded capitalization that does not also have two adjacent capitals is automatically treated as a multi-part word (<em>ObjectType</em>, etc). Recognition of these word patterns also enables easier word replacement. For example, replacing the phrase <em>Employee</em> with <em>Emp</em> will affect both <em>Employee</em> and <em>ContractEmployee</em>.</li> </ol> <a href="#The Top">Return to top</a> <hr/> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -11200,7 +11200,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_52A37F5B-1E80-4FCB-802E-AA9FA4315D0D" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_AFA60651-CCAD-47F2-B397-70E5855BF20B" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_CD0EC594-EDEA-44FC-9593-1DE35929D199" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_CD0EC594-EDEA-44FC-9593-1DE35929D199" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_1CA1A0E5-2553-4907-AC75-1850287F4A51" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -285,7 +285,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_216FCBEF-24A6-4138-9F8D-255066420DD2" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_FE3D35D4-8BFA-4604-B769-6F8224F4CC89" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_AB43283A-160B-4A51-9E75-F464582D1F72" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_AB43283A-160B-4A51-9E75-F464582D1F72" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_3F310E69-550D-441F-9F8C-15CBA2CE8CEB" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -291,7 +291,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_1ECF9C7E-EC03-4118-9BF0-78AC98140751" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_4EE0E222-C3E6-4E2F-93BD-2832FD0CA530" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_B469B281-6731-4214-9C2C-6CFDAC31C903" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_B469B281-6731-4214-9C2C-6CFDAC31C903" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_DC73DBF4-111D-49C1-B301-B5F5B89FB4D8" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -748,7 +748,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_93A125B5-363A-454B-A6FC-473B4987BBF7" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B227B9F1-E66D-4885-9EBB-FA6C30E3AC66" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_75FDA8E6-2EB8-493D-A6BF-CB382F439713" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_75FDA8E6-2EB8-493D-A6BF-CB382F439713" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_0C507CBC-61D4-4B2D-ACE1-7BED6CF800A3" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> @@ -971,7 +971,7 @@ </rcd:Table> <rcd:Table Name="I" id="_93C19EC9-9262-4EAF-B622-D7132E0AF44D"> <rcd:Columns> - <rcd:Column id="_585E8BEC-81A5-4DD5-943D-50485EC0E57F" Name="id" /> + <rcd:Column id="_585E8BEC-81A5-4DD5-943D-50485EC0E57F" Name="iId" /> <rcd:Column id="_D09DBE03-DC80-46B0-B58F-20EE31A06E0C" Name="f" /> <rcd:Column id="_F9F8A022-DD10-44FA-BE1F-88E240320DBD" Name="bId" /> <rcd:Column id="_8DDC2665-340B-407F-98BB-232E02D6EFCF" Name="c" /> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -748,7 +748,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_4CA750F7-00B1-492A-9BC2-CF24B78D16D1" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B227B9F1-E66D-4885-9EBB-FA6C30E3AC66" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_2FD2BA8B-8F38-413C-A5ED-5C43A9F3ED0C" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_2FD2BA8B-8F38-413C-A5ED-5C43A9F3ED0C" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_0C507CBC-61D4-4B2D-ACE1-7BED6CF800A3" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> @@ -971,7 +971,7 @@ </rcd:Table> <rcd:Table Name="I" id="_93C19EC9-9262-4EAF-B622-D7132E0AF44D"> <rcd:Columns> - <rcd:Column id="_585E8BEC-81A5-4DD5-943D-50485EC0E57F" Name="id" /> + <rcd:Column id="_585E8BEC-81A5-4DD5-943D-50485EC0E57F" Name="iId" /> <rcd:Column id="_D09DBE03-DC80-46B0-B58F-20EE31A06E0C" Name="f" /> <rcd:Column id="_F9F8A022-DD10-44FA-BE1F-88E240320DBD" Name="bId" /> <rcd:Column id="_8DDC2665-340B-407F-98BB-232E02D6EFCF" Name="c" /> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -748,7 +748,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_4F4B5F39-12A2-4488-9BA9-EEF2F2BB5E6D" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_21511FEB-5B88-4FBD-A74C-06B4A3C70480" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_6E61D4EE-E269-4EB5-8CD2-5D643CA8F6AB" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_6E61D4EE-E269-4EB5-8CD2-5D643CA8F6AB" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_318C6F91-A8B5-4657-8FF0-8BC95C2C83B5" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> @@ -971,7 +971,7 @@ </rcd:Table> <rcd:Table Name="I" id="_01DCCA5F-E5CE-4753-8CED-179AD8135A06"> <rcd:Columns> - <rcd:Column id="_7591C84C-A78E-484E-887D-628AD1BF5AC4" Name="id" /> + <rcd:Column id="_7591C84C-A78E-484E-887D-628AD1BF5AC4" Name="iId" /> <rcd:Column id="_A642E016-33BC-402F-8723-A4759EDBA71A" Name="c" /> <rcd:Column id="_7C6D1CB3-BFD7-45C7-B74C-8D91EA55E515" Name="bId" /> <rcd:Column id="_F56A54F0-F93A-4346-974F-C792A13595B6" Name="f" /> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -382,7 +382,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_7C818355-A612-4252-B259-D23C1B8B80CB" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_479BA1D0-80FB-48DE-894E-50E9E8FC0F0B" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_035C2A13-BCD7-4021-B939-C7B0714C8324" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_035C2A13-BCD7-4021-B939-C7B0714C8324" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_C2350E6F-6523-49F4-A2E3-B021A5CE58E6" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -886,7 +886,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_953B9230-0B01-406E-B73F-E99E73B31F8D" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B6DA4F58-8BCF-478E-82AE-C04CD0DD68C9" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_0C331C48-4E21-4197-8186-4A3769048023" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_0C331C48-4E21-4197-8186-4A3769048023" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_77081B66-EB8A-44C5-9D03-DF6573330E4B" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -886,7 +886,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_077B1376-3174-4CAC-9C4A-B8245485F67E" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_C50661E8-E857-43F3-A1D2-9EF787A84EFE" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_CC0244D5-F67A-4DE3-8E18-4B16640FB1F1" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_CC0244D5-F67A-4DE3-8E18-4B16640FB1F1" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_BDE38DCE-8504-4AC9-9156-A927376B73B6" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -922,7 +922,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B774300C-8F49-43EB-AB62-17534D8DBB42" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_EC000843-0D4E-43C1-80E8-527C74F04153" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -922,7 +922,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_B774300C-8F49-43EB-AB62-17534D8DBB42" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_EC000843-0D4E-43C1-80E8-527C74F04153" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -328,7 +328,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_D7A0794A-6A4E-4F57-AABD-1EAA875ADCEC" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_82B2C906-24E6-4CF4-ADE5-30AEAE09EC10" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_92EDE6BB-60EE-45AE-8D58-B58A04114F45" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_92EDE6BB-60EE-45AE-8D58-B58A04114F45" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_52DB28BD-3E61-47BD-B0B9-32D2C6CA80B7" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -700,7 +700,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_65638CB4-2653-4514-A38D-9380F676A78C" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_AB78A179-3D57-4D6D-A2C8-A7FD52DCC729" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting CoreAlgorithmVersion="1.004" id="_E6A31A5A-A145-4F45-A0E9-47F04AA49D97" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting CoreAlgorithmVersion="1.004" id="_E6A31A5A-A145-4F45-A0E9-47F04AA49D97" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_A71D70CB-02A4-42A5-8CD4-DDBDE316A25B" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -205,7 +205,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_CA317692-2D5E-4094-9CC9-F7B049F0A505" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_9C9BECFF-37EA-4156-B4BF-55AD6ED21CD2" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_7A16F888-F499-4270-94C6-894CF461C356" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_7A16F888-F499-4270-94C6-894CF461C356" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_58CD2382-A0F9-4C22-806A-7FC12438339C" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm 2009-06-19 01:37:26 UTC (rev 1394) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm 2009-06-20 23:48:17 UTC (rev 1395) @@ -364,7 +364,7 @@ <ormtooial:AbstractionModelGenerationSetting id="_FA93223F-D82D-479F-A103-D8886756E8E2" AlgorithmVersion="1.005"> <ormtooial:AbstractionModel ref="_2F7377B5-BC91-4951-B9DC-8D6389C48738" /> </ormtooial:AbstractionModelGenerationSetting> - <oialtocdb:SchemaGenerationSetting id="_833EE616-E4B4-4F9E-9DBC-522A018D54FC" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.010"> + <oialtocdb:SchemaGenerationSetting id="_833EE616-E4B4-4F9E-9DBC-522A018D54FC" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> <oialtocdb:Schema ref="_384966C8-3A43-4591-933B-A4D426CC424D" /> </oialtocdb:SchemaGenerationSetting> </orm:GenerationSettings> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-06-23 01:12:26
|
Revision: 1396 http://orm.svn.sourceforge.net/orm/?rev=1396&view=rev Author: mcurland Date: 2009-06-23 01:12:22 +0000 (Tue, 23 Jun 2009) Log Message: ----------- Diagram reordering events inadvertently turned off in [1392]. refs #379 Modified Paths: -------------- trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs trunk/Setup/Readme.htm Modified: trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs =================================================================== --- trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs 2009-06-20 23:48:17 UTC (rev 1395) +++ trunk/ORMModel/Framework/Shell/MultiDiagramDocView.cs 2009-06-23 01:12:22 UTC (rev 1396) @@ -657,7 +657,7 @@ } } } - else if (0 != (reasons & EventSubscriberReasons.UserInterfaceEvents)) + if (0 != (reasons & EventSubscriberReasons.UserInterfaceEvents)) { eventManager.AddOrRemoveHandler(new EventHandler<ElementEventsBegunEventArgs>(ElementEventsBegunEvent), action); eventManager.AddOrRemoveHandler(new EventHandler<ElementEventsEndedEventArgs>(ElementEventsEndedEvent), action); Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-06-20 23:48:17 UTC (rev 1395) +++ trunk/Setup/Readme.htm 2009-06-23 01:12:22 UTC (rev 1396) @@ -41,7 +41,7 @@ </ul>--> <hr/> <h2>June 2009 CTP Changes</h2> -<div>The June 2009 CTP release includes all modifications through changeset 1395. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The June 2009 CTP release includes all modifications through changeset 1396. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Sample population mandatory error activation 2009-06">Sample population mandatory error activation</a> </li> <li><a href="#Relational compound name interpretation 2009-06">Relational compound name interpretation</a> </li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-07-01 16:57:14
|
Revision: 1397 http://orm.svn.sourceforge.net/orm/?rev=1397&view=rev Author: mcurland Date: 2009-07-01 16:57:02 +0000 (Wed, 01 Jul 2009) Log Message: ----------- Improve generated name for alternative identifier columns representing partially separated subtypes. This occurs when a subtype with multiple supertypes has some absorbed supertypes and some separated. A future fix will completely eliminate these columns in almost all cases. refs #338 Modified Paths: -------------- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs trunk/Setup/Readme.htm Modified: trunk/RelationalModel/OialDcilBridge/NameGeneration.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-06-23 01:12:22 UTC (rev 1396) +++ trunk/RelationalModel/OialDcilBridge/NameGeneration.cs 2009-07-01 16:57:02 UTC (rev 1397) @@ -1952,6 +1952,7 @@ ConceptTypeChild child = childPath[iChild]; ConceptTypeAssimilatesConceptType assimilation = child as ConceptTypeAssimilatesConceptType; bool reverseAssimilation = false; + bool forwardToReverseTransition = false; bool towardsSubtype = false; if (assimilation != null) { @@ -1976,6 +1977,12 @@ if (0 != (stepFlags & ColumnPathStepFlags.ForwardAssimilation)) { // Keep going forward + if (0 != (stepFlags & ColumnPathStepFlags.AssimilationIsSubtype) && + AssimilationMapping.GetAbsorptionChoiceFromAssimilation(assimilation) != AssimilationAbsorptionChoice.Absorb && + comingFromConceptType == (0 == (stepFlags & ColumnPathStepFlags.AssimilationTowardsSubtype) ? assimilation.AssimilatedConceptType : assimilation.AssimilatorConceptType)) + { + forwardToReverseTransition = true; + } } else if (0 != (stepFlags & ColumnPathStepFlags.ReverseAssimilation)) { @@ -2038,13 +2045,22 @@ bool tailIsSubtype = 0 != (tailFlags & ColumnPathStepFlags.AssimilationIsSubtype); if (tailIsSubtype && assimilationIsSubtype) { - if (secondarySubtype && 0 == (tailFlags & ColumnPathStepFlags.NonPreferredSubtype)) + if (forwardToReverseTransition) { - tailNode.Value = new ColumnPathStep(pathStep.FromRole, pathStep.ObjectType, pathStep.AlternateObjectType, tailFlags | ColumnPathStepFlags.NonPreferredSubtype); + flags |= ColumnPathStepFlags.DeclinedAssimilation; + targetRole = towardsSubtype ? targetRole.OppositeRoleAlwaysResolveProxy.Role : nonAssimilationTargetRole; + processAsFactType = true; } - // If this is a subtype chain, then keep going, using the first - // subtype in the chain as a node used in the final name. - continue; + else + { + if (secondarySubtype && 0 == (tailFlags & ColumnPathStepFlags.NonPreferredSubtype)) + { + tailNode.Value = new ColumnPathStep(pathStep.FromRole, pathStep.ObjectType, pathStep.AlternateObjectType, tailFlags | ColumnPathStepFlags.NonPreferredSubtype); + } + // If this is a subtype chain, then keep going, using the first + // subtype in the chain as a node used in the final name. + continue; + } } else if (assimilationObjectification != null) { Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2009-06-23 01:12:22 UTC (rev 1396) +++ trunk/Setup/Readme.htm 2009-07-01 16:57:02 UTC (rev 1397) @@ -41,7 +41,7 @@ </ul>--> <hr/> <h2>June 2009 CTP Changes</h2> -<div>The June 2009 CTP release includes all modifications through changeset 1396. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The June 2009 CTP release includes all modifications through changeset 1397. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Sample population mandatory error activation 2009-06">Sample population mandatory error activation</a> </li> <li><a href="#Relational compound name interpretation 2009-06">Relational compound name interpretation</a> </li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-11-17 23:44:54
|
Revision: 1417 http://orm.svn.sourceforge.net/orm/?rev=1417&view=rev Author: mcurland Date: 2009-11-17 23:44:42 +0000 (Tue, 17 Nov 2009) Log Message: ----------- * Fixed relational bridge issue with alternate assimilation paths failing to resolve. refs #328 * Fixed question provider generation with glyph offsets on the root element * Matched file case in some build files Modified Paths: -------------- trunk/CustomProperties/CustomProperties.csproj trunk/ORMModel/Transforms/SurveyQuestionProvider.xslt trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs trunk/Tools/NUBuildVS/NUBuildVS.csproj Modified: trunk/CustomProperties/CustomProperties.csproj =================================================================== --- trunk/CustomProperties/CustomProperties.csproj 2009-11-02 20:18:02 UTC (rev 1416) +++ trunk/CustomProperties/CustomProperties.csproj 2009-11-17 23:44:42 UTC (rev 1417) @@ -54,7 +54,7 @@ <Compile Include="CustomPropertiesManager.cs"> <SubType>Form</SubType> </Compile> - <Compile Include="CustomPropertiesManager.designer.cs"> + <Compile Include="CustomPropertiesManager.Designer.cs"> <DependentUpon>CustomPropertiesManager.cs</DependentUpon> </Compile> <Compile Include="CustomProperty.SerializationExtensions.cs"> @@ -66,13 +66,13 @@ <Compile Include="DefinitionEditor.cs"> <SubType>UserControl</SubType> </Compile> - <Compile Include="DefinitionEditor.designer.cs"> + <Compile Include="DefinitionEditor.Designer.cs"> <DependentUpon>DefinitionEditor.cs</DependentUpon> </Compile> <Compile Include="EditCustomEnumOrDescription.cs"> <SubType>Form</SubType> </Compile> - <Compile Include="EditCustomEnumOrDescription.designer.cs"> + <Compile Include="EditCustomEnumOrDescription.Designer.cs"> <DependentUpon>EditCustomEnumOrDescription.cs</DependentUpon> </Compile> <Compile Include="GeneratedCode\DomainClasses.cs"> @@ -93,7 +93,7 @@ <Compile Include="GroupEditor.cs"> <SubType>UserControl</SubType> </Compile> - <Compile Include="GroupEditor.designer.cs"> + <Compile Include="GroupEditor.Designer.cs"> <DependentUpon>GroupEditor.cs</DependentUpon> </Compile> <Compile Include="NameChangedEventArgs.cs" /> Modified: trunk/ORMModel/Transforms/SurveyQuestionProvider.xslt =================================================================== --- trunk/ORMModel/Transforms/SurveyQuestionProvider.xslt 2009-11-02 20:18:02 UTC (rev 1416) +++ trunk/ORMModel/Transforms/SurveyQuestionProvider.xslt 2009-11-17 23:44:42 UTC (rev 1417) @@ -900,13 +900,15 @@ <xsl:when test="$offset"> <xsl:variable name="afterQuestion" select="string($offset/@afterSurveyQuestion)"/> <xsl:choose> - <xsl:when test="$afterQuestion"> + <xsl:when test="$afterQuestion or ($lastAnswer and $ApplyLastAnswer)"> <xsl:variable name="referencedOffsetFragment"> - <xsl:call-template name="ResolveOffset"> - <xsl:with-param name="ImageMap" select="$AllQuestions[@questionType=$afterQuestion]/qp:*[self::qp:sequentialImageMap | self::qp:explicitImageMap]"/> - <xsl:with-param name="AllQuestions" select="$AllQuestions"/> - <xsl:with-param name="ApplyLastAnswer" select="true()"/> - </xsl:call-template> + <xsl:if test="$afterQuestion"> + <xsl:call-template name="ResolveOffset"> + <xsl:with-param name="ImageMap" select="$AllQuestions[@questionType=$afterQuestion]/qp:*[self::qp:sequentialImageMap | self::qp:explicitImageMap]"/> + <xsl:with-param name="AllQuestions" select="$AllQuestions"/> + <xsl:with-param name="ApplyLastAnswer" select="true()"/> + </xsl:call-template> + </xsl:if> </xsl:variable> <xsl:variable name="referencedOffset" select="exsl:node-set($referencedOffsetFragment)/child::*"/> <xsl:variable name="localOffsetFragment"> Modified: trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs =================================================================== --- trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2009-11-02 20:18:02 UTC (rev 1416) +++ trunk/RelationalModel/OialDcilBridge/OialDcilBridge.DeserializationFixupListeners.cs 2009-11-17 23:44:42 UTC (rev 1417) @@ -816,8 +816,13 @@ /// </param> private static void GenerateReferenceConstraint(Table sourceTable, ConceptType targetConceptType, string referenceConstraintName, PathStack<ConceptTypeChild> sourceTableStartingPath) { - Table targetTable = GetTargetTableForReferenceConstraint(targetConceptType); - if (targetTable == null) + Table targetTable; + List<Column> sourceColumns; + if (null == (targetTable = GetTargetTableForReferenceConstraint(targetConceptType)) || + // Find the columns in the source table that start with the correct path. These will already be in the correct + // order, since we create them based off the order in the preferred identifier of the target concept type. This + // can be empty for secondary assimilation paths. + null == (sourceColumns = GetColumnsForStartingPath(sourceTable, sourceTableStartingPath))) { return; } @@ -828,10 +833,6 @@ referenceConstraint.SourceTable = sourceTable; referenceConstraint.TargetTable = targetTable; - // Find the columns in the source table that start with the correct path. These will already be in the correct - // order, since we create them based off the order in the preferred identifier of the target concept type. - List<Column> sourceColumns = GetColumnsForStartingPath(sourceTable, sourceTableStartingPath); - Debug.Assert(sourceColumns.Count > 0); Column[] targetColumns = new Column[sourceColumns.Count]; // Find the target column for each source column. @@ -1032,12 +1033,12 @@ /// </summary> private static List<Column> GetColumnsForStartingPath(Table table, PathStack<ConceptTypeChild> startingPath) { - List<Column> columns = new List<Column>(); + List<Column> columns = null; foreach (Column column in table.ColumnCollection) { if (ColumnConceptTypeChildPathStartsWith(column, startingPath)) { - columns.Add(column); + (columns ?? (columns = new List<Column>())).Add(column); } } return columns; Modified: trunk/Tools/NUBuildVS/NUBuildVS.csproj =================================================================== --- trunk/Tools/NUBuildVS/NUBuildVS.csproj 2009-11-02 20:18:02 UTC (rev 1416) +++ trunk/Tools/NUBuildVS/NUBuildVS.csproj 2009-11-17 23:44:42 UTC (rev 1417) @@ -50,7 +50,7 @@ <None Include="Neumont.Build.VisualStudio.Multitargeting.targets" /> <None Include="Install.bat" /> <None Include="Neumont.Build.VisualStudio.targets" /> - <Compile Include="Tasks\VsSdkLocator.cs" /> + <Compile Include="Tasks\VsSDKLocator.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildExtensionsPath)\Neumont\Neumont.Build.targets" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2009-12-04 20:19:17
|
Revision: 1421 http://orm.svn.sourceforge.net/orm/?rev=1421&view=rev Author: mcurland Date: 2009-12-04 20:19:09 +0000 (Fri, 04 Dec 2009) Log Message: ----------- * Added custom property support to ORMModel element, opened up ORMModel verbalization to verbalization extension elements off the model. refs #289 * Domain model for custom properties fails on standalone load, don't assume ExtensionVerbalizerService is available. Addition to [1420]. refs #401 Modified Paths: -------------- trunk/CustomProperties/CustomProperties.dsl trunk/CustomProperties/CustomProperties.xsd trunk/CustomProperties/CustomPropertiesManager.cs trunk/CustomProperties/CustomPropertyProviders.cs trunk/CustomProperties/DefinitionEditor.cs trunk/CustomProperties/GeneratedCode/DomainModel.cs trunk/CustomProperties/GeneratedCode/DomainModelResx.resx trunk/ORMModel/ObjectModel/ORMModel.cs Modified: trunk/CustomProperties/CustomProperties.dsl =================================================================== --- trunk/CustomProperties/CustomProperties.dsl 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/CustomProperties.dsl 2009-12-04 20:19:09 UTC (rev 1421) @@ -183,7 +183,9 @@ <EnumerationLiteral Name="ExclusionConstraint" Value="1024"/> <EnumerationLiteral Name="SubsetConstraint" Value="2048"/> <EnumerationLiteral Name="ValueConstraint" Value="4096"/> - <EnumerationLiteral Name="AllConstraints" Value="7904"/> + <EnumerationLiteral Name="AllConstraints" Value="8160"/> + + <EnumerationLiteral Name="Model" Value="8192"/> </Literals> <Attributes> <ClrAttribute Name="global::System.ComponentModel.TypeConverter"> Modified: trunk/CustomProperties/CustomProperties.xsd =================================================================== --- trunk/CustomProperties/CustomProperties.xsd 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/CustomProperties.xsd 2009-12-04 20:19:09 UTC (rev 1421) @@ -190,6 +190,7 @@ <xs:documentation>An enumeration of ORM model types that supports custom properties</xs:documentation> </xs:annotation> <xs:restriction base="xs:token"> + <xs:enumeration value="Model"/> <xs:enumeration value="EntityType"/> <xs:enumeration value="ValueType"/> <xs:enumeration value="FactType"/> Modified: trunk/CustomProperties/CustomPropertiesManager.cs =================================================================== --- trunk/CustomProperties/CustomPropertiesManager.cs 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/CustomPropertiesManager.cs 2009-12-04 20:19:09 UTC (rev 1421) @@ -417,6 +417,7 @@ //Probably a better way to do this but since the newDef.ORMTypes property is a bit field //we need to find out each enumeration that has been specified for the object and add it to the xml. AddORMTypeToGroupIfNeeded(newDef.ORMTypes, ORMTypes.AllConstraints, newOrmTypes); + AddORMTypeToGroupIfNeeded(newDef.ORMTypes, ORMTypes.Model, newOrmTypes); AddORMTypeToGroupIfNeeded(newDef.ORMTypes, ORMTypes.EntityType, newOrmTypes); AddORMTypeToGroupIfNeeded(newDef.ORMTypes, ORMTypes.EqualityConstraint, newOrmTypes); AddORMTypeToGroupIfNeeded(newDef.ORMTypes, ORMTypes.ExclusionConstraint, newOrmTypes); Modified: trunk/CustomProperties/CustomPropertyProviders.cs =================================================================== --- trunk/CustomProperties/CustomPropertyProviders.cs 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/CustomPropertyProviders.cs 2009-12-04 20:19:09 UTC (rev 1421) @@ -48,6 +48,10 @@ } } + public static readonly PropertyProvider Model = delegate(object extendableElement, PropertyDescriptorCollection properties) + { + GetProvidedProperties(ORMTypes.Model, extendableElement, properties); + }; public static readonly PropertyProvider ObjectType = delegate(object extendableElement, PropertyDescriptorCollection properties) { GetProvidedProperties(((ObjectType)extendableElement).IsValueType ? ORMTypes.ValueType : ORMTypes.EntityType, extendableElement, properties); @@ -236,6 +240,10 @@ } #endregion // DefaultCustomPropertyVerbalizer class #region Specific verbalizers for each element type + public static readonly IVerbalizeExtensionChildren Model = new DefaultCustomPropertyVerbalizer(delegate(IORMExtendableElement propertyOwner, CustomPropertyDefinition propertyDefinition) + { + return 0 != (propertyDefinition.ORMTypes & ORMTypes.Model); + }); public static readonly IVerbalizeExtensionChildren ObjectType = new DefaultCustomPropertyVerbalizer(delegate(IORMExtendableElement propertyOwner, CustomPropertyDefinition propertyDefinition) { return 0 != (propertyDefinition.ORMTypes & (((ObjectType)propertyOwner).IsValueType ? ORMTypes.ValueType : ORMTypes.EntityType)); @@ -296,6 +304,7 @@ IPropertyProviderService propertyService = ((IFrameworkServices)store).PropertyProviderService; IExtensionVerbalizerService verbalizerService = ((IORMToolServices)store).ExtensionVerbalizerService; propertyService.AddOrRemovePropertyProvider(typeof(ORMModel), CustomPropertyProviders.CustomPropertiesEditor, true, action); + propertyService.AddOrRemovePropertyProvider(typeof(ORMModel), CustomPropertyProviders.Model, false, action); propertyService.AddOrRemovePropertyProvider(typeof(ObjectType), CustomPropertyProviders.ObjectType, true, action); propertyService.AddOrRemovePropertyProvider(typeof(SubtypeFact), CustomPropertyProviders.SubtypeFact, true, action); propertyService.AddOrRemovePropertyProvider(typeof(FactType), CustomPropertyProviders.FactType, false, action); @@ -308,18 +317,22 @@ propertyService.AddOrRemovePropertyProvider(typeof(ExclusionConstraint), CustomPropertyProviders.ExclusionConstraint, true, action); propertyService.AddOrRemovePropertyProvider(typeof(SubsetConstraint), CustomPropertyProviders.SubsetConstraint, true, action); propertyService.AddOrRemovePropertyProvider(typeof(ValueConstraint), CustomPropertyProviders.ValueConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ObjectType), DefaultVerbalizationProviders.ObjectType, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(SubtypeFact), DefaultVerbalizationProviders.SubtypeFact, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(FactType), DefaultVerbalizationProviders.FactType, false, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(Role), DefaultVerbalizationProviders.Role, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(FrequencyConstraint), DefaultVerbalizationProviders.FrequencyConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(MandatoryConstraint), DefaultVerbalizationProviders.MandatoryConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(RingConstraint), DefaultVerbalizationProviders.RingConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(UniquenessConstraint), DefaultVerbalizationProviders.UniquenessConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(EqualityConstraint), DefaultVerbalizationProviders.EqualityConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ExclusionConstraint), DefaultVerbalizationProviders.ExclusionConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(SubsetConstraint), DefaultVerbalizationProviders.SubsetConstraint, true, action); - verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ValueConstraint), DefaultVerbalizationProviders.ValueConstraint, true, action); + if (verbalizerService != null) + { + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ORMModel), DefaultVerbalizationProviders.Model, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ObjectType), DefaultVerbalizationProviders.ObjectType, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(SubtypeFact), DefaultVerbalizationProviders.SubtypeFact, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(FactType), DefaultVerbalizationProviders.FactType, false, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(Role), DefaultVerbalizationProviders.Role, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(FrequencyConstraint), DefaultVerbalizationProviders.FrequencyConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(MandatoryConstraint), DefaultVerbalizationProviders.MandatoryConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(RingConstraint), DefaultVerbalizationProviders.RingConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(UniquenessConstraint), DefaultVerbalizationProviders.UniquenessConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(EqualityConstraint), DefaultVerbalizationProviders.EqualityConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ExclusionConstraint), DefaultVerbalizationProviders.ExclusionConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(SubsetConstraint), DefaultVerbalizationProviders.SubsetConstraint, true, action); + verbalizerService.AddOrRemoveExtensionVerbalizer(typeof(ValueConstraint), DefaultVerbalizationProviders.ValueConstraint, true, action); + } } } #endregion // IModelingEventSubscriber Implementation Modified: trunk/CustomProperties/DefinitionEditor.cs =================================================================== --- trunk/CustomProperties/DefinitionEditor.cs 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/DefinitionEditor.cs 2009-12-04 20:19:09 UTC (rev 1421) @@ -297,6 +297,7 @@ chkVerbalizeDefaultValue.Checked = _definitionObject.VerbalizeDefaultValue; chkVerbalizeDefaultValue.Enabled = defaultText.Length != 0; ClearCheckedItems(tvModelElements.Nodes); + CheckTypeIfNeeded(ORMTypes.Model); CheckTypeIfNeeded(ORMTypes.EntityType); CheckTypeIfNeeded(ORMTypes.FactType); CheckTypeIfNeeded(ORMTypes.Role); @@ -319,6 +320,7 @@ { tvModelElements.Nodes.Clear(); + tvModelElements.Nodes.Add(CreateTreeNode("ORM Model", "Model")); tvModelElements.Nodes.Add(CreateTreeNode("Entity Type", "EntityType")); tvModelElements.Nodes.Add(CreateTreeNode("Value Type", "ValueType")); tvModelElements.Nodes.Add(CreateTreeNode("Fact Type", "FactType")); Modified: trunk/CustomProperties/GeneratedCode/DomainModel.cs =================================================================== --- trunk/CustomProperties/GeneratedCode/DomainModel.cs 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/GeneratedCode/DomainModel.cs 2009-12-04 20:19:09 UTC (rev 1421) @@ -538,7 +538,13 @@ /// ORMSolutions.ORMArchitect.CustomProperties.ORMTypes.AllConstraints /// </summary> [DslDesign::DescriptionResource("ORMSolutions.ORMArchitect.CustomProperties.ORMTypes/AllConstraints.Description", typeof(global::ORMSolutions.ORMArchitect.CustomProperties.CustomPropertiesDomainModel), "ORMSolutions.ORMArchitect.CustomProperties.GeneratedCode.DomainModelResx")] - AllConstraints = 7904, + AllConstraints = 8160, + /// <summary> + /// Model + /// Description for ORMSolutions.ORMArchitect.CustomProperties.ORMTypes.Model + /// </summary> + [DslDesign::DescriptionResource("ORMSolutions.ORMArchitect.CustomProperties.ORMTypes/Model.Description", typeof(global::ORMSolutions.ORMArchitect.CustomProperties.CustomPropertiesDomainModel), "ORMSolutions.ORMArchitect.CustomProperties.GeneratedCode.DomainModelResx")] + Model = 8192, } } namespace ORMSolutions.ORMArchitect.CustomProperties Modified: trunk/CustomProperties/GeneratedCode/DomainModelResx.resx =================================================================== --- trunk/CustomProperties/GeneratedCode/DomainModelResx.resx 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/CustomProperties/GeneratedCode/DomainModelResx.resx 2009-12-04 20:19:09 UTC (rev 1421) @@ -429,6 +429,14 @@ <value>Description for ORMSolutions.ORMArchitect.CustomProperties.ORMTypes.AllConstraints</value> <comment>Description for EnumerationLiteral 'AllConstraints' on DomainEnumeration 'ORMTypes'</comment> </data> + <data name="ORMSolutions.ORMArchitect.CustomProperties.ORMTypes/Model.DisplayName" xml:space="preserve"> + <value>Model</value> + <comment>Display name for EnumerationLiteral 'Model' on DomainEnumeration 'ORMTypes'</comment> + </data> + <data name="ORMSolutions.ORMArchitect.CustomProperties.ORMTypes/Model.Description" xml:space="preserve"> + <value>Description for ORMSolutions.ORMArchitect.CustomProperties.ORMTypes.Model</value> + <comment>Description for EnumerationLiteral 'Model' on DomainEnumeration 'ORMTypes'</comment> + </data> <data name="ORMSolutions.ORMArchitect.CustomProperties.CustomPropertyDataType/String.DisplayName" xml:space="preserve"> <value>String</value> <comment>Display name for EnumerationLiteral 'String' on DomainEnumeration 'CustomPropertyDataType'</comment> Modified: trunk/ORMModel/ObjectModel/ORMModel.cs =================================================================== --- trunk/ORMModel/ObjectModel/ORMModel.cs 2009-12-04 07:05:01 UTC (rev 1420) +++ trunk/ORMModel/ObjectModel/ORMModel.cs 2009-12-04 20:19:09 UTC (rev 1421) @@ -238,7 +238,7 @@ #region IVerbalizeCustomChildren Implementation /// <summary> /// Implements <see cref="IVerbalizeCustomChildren.GetCustomChildVerbalizations"/>. - /// Explicitly verbalizes the definitions and notes fields + /// Explicitly verbalizes the definitions, notes, and extension elements /// </summary> protected IEnumerable<CustomChildVerbalizer> GetCustomChildVerbalizations(IVerbalizeFilterChildren filter, VerbalizationSign sign) { @@ -254,6 +254,14 @@ { yield return CustomChildVerbalizer.VerbalizeInstance(note); } + foreach (ModelElement extensionElement in ExtensionCollection) + { + IVerbalize verbalizeExtension = extensionElement as IVerbalize; + if (verbalizeExtension != null) + { + yield return CustomChildVerbalizer.VerbalizeInstance(verbalizeExtension); + } + } } IEnumerable<CustomChildVerbalizer> IVerbalizeCustomChildren.GetCustomChildVerbalizations(IVerbalizeFilterChildren filter, VerbalizationSign sign) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2010-02-08 21:40:38
|
Revision: 1427 http://orm.svn.sourceforge.net/orm/?rev=1427&view=rev Author: mcurland Date: 2010-02-08 21:40:32 +0000 (Mon, 08 Feb 2010) Log Message: ----------- * Fix a couple of crashes in role path verbalization introduced in [1426] refs #395 * Display role numbers with duplicate replacement fields in reading shapes. * Fixed issue with disabled context menu items for diagram tabs on secondary monitors to the left of or above the primary monitor. Modified Paths: -------------- trunk/ORMModel/Framework/Shell/MultiDiagramDocViewControl.cs trunk/ORMModel/ObjectModel/Verbalization.cs trunk/ORMModel/Resources/ResourceStringsGenerator.cs trunk/ORMModel/Resources/ResourceStringsGenerator.xml trunk/ORMModel/ShapeModel/ORMDiagram.resx trunk/ORMModel/ShapeModel/ReadingShape.cs trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1a.Compare.orm trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1b.Compare.orm trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1c.Compare.orm trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2a.Compare.orm trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2b.Compare.orm Modified: trunk/ORMModel/Framework/Shell/MultiDiagramDocViewControl.cs =================================================================== --- trunk/ORMModel/Framework/Shell/MultiDiagramDocViewControl.cs 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/ORMModel/Framework/Shell/MultiDiagramDocViewControl.cs 2010-02-08 21:40:32 UTC (rev 1427) @@ -333,8 +333,10 @@ if (contextMenuMessage = (m.Msg == WM_CONTEXTMENU)) { uint lParam = (uint)m.LParam; - int x = (int)(lParam & 0xFFFF); - int y = (int)((lParam >> 16) & 0xFFFF); + // Convert to short instead of int to get the sign correct + // for multi-monitor systems with negative mouse positions. + int x = (short)(lParam & 0xFFFF); + int y = (short)((lParam >> 16) & 0xFFFF); DiagramTabPage diagramTabPage = (x == -1 && y == -1) ? SelectedDiagramTab : GetTabAtPoint(base.PointToClient(new Point(x, y))); myTrustDesignerForContextMenu = true; myDesignerForContextMenu = (diagramTabPage != null) ? diagramTabPage.Designer : null; Modified: trunk/ORMModel/ObjectModel/Verbalization.cs =================================================================== --- trunk/ORMModel/ObjectModel/Verbalization.cs 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/ORMModel/ObjectModel/Verbalization.cs 2010-02-08 21:40:32 UTC (rev 1427) @@ -1597,15 +1597,20 @@ formatText, formatProvider, predicatePartDecorator, - delegate(int fieldIndex) - { - // The default order passed in here is assumed to be the same one - // passed to the constructor. If the format is modified, then the - // replacement fields have been reordered in the format string to - // correspond to this order, so there is no translation needed here. - string useFormat = formatFields[fieldIndex]; - return (useFormat == null) ? replacementProvider(defaultOrder[fieldIndex]) : string.Format(formatProvider, useFormat, replacementProvider(defaultOrder[fieldIndex])); - }); + (formatFields == null) ? + (ReadingTextFieldReplace)delegate(int fieldIndex) + { + return replacementProvider(defaultOrder[fieldIndex]); + } : + delegate(int fieldIndex) + { + // The default order passed in here is assumed to be the same one + // passed to the constructor. If the format is modified, then the + // replacement fields have been reordered in the format string to + // correspond to this order, so there is no translation needed here. + string useFormat = formatFields[fieldIndex]; + return (useFormat == null) ? replacementProvider(defaultOrder[fieldIndex]) : string.Format(formatProvider, useFormat, replacementProvider(defaultOrder[fieldIndex])); + }); } } #endregion // Member Functions @@ -3705,7 +3710,7 @@ public RelatedRolePlayerVariables(RolePlayerVariable rolePlayerVariable, bool usedFullyExistentially) { myHeadNode = rolePlayerVariable != null ? new LinkedNode<RolePlayerVariable>(rolePlayerVariable) : null; - myUsedFullyExistentially = false; + myUsedFullyExistentially = usedFullyExistentially; } /// <summary> /// The head <see cref="ObjectType"/> node. This @@ -5044,12 +5049,13 @@ // UNDONE: RolePathCombination verbalization } } - RolePlayerVariable contextLeadVariable = null; - RolePlayerVariable contextTrailingVariable = null; - ResolveReadings(myRootPlanNode, null, false, ref contextLeadVariable, ref contextTrailingVariable); VerbalizationPlanNode newRootNode = myRootPlanNode; if (newRootNode != null) { + RolePlayerVariable contextLeadVariable = null; + RolePlayerVariable contextTrailingVariable = null; + ResolveReadings(newRootNode, null, false, ref contextLeadVariable, ref contextTrailingVariable); + Dictionary<RolePathOwner, VerbalizationPlanNode> planMap = myPathOwnerToVerbalizationPlanMap; if (planMap != null) { Modified: trunk/ORMModel/Resources/ResourceStringsGenerator.cs =================================================================== --- trunk/ORMModel/Resources/ResourceStringsGenerator.cs 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/ORMModel/Resources/ResourceStringsGenerator.cs 2010-02-08 21:40:32 UTC (rev 1427) @@ -2580,6 +2580,14 @@ return ResourceStrings.GetString(ResourceManagers.Diagram, "ReadingShape.AttachedRoleDisplay"); } } + /// <summary>The string used to display a reading with a non-primary order when the role is attached and the role player is duplicated in the reading. Replacement fields: {0}=role player name, {1}=displayed role index.</summary> + public static string ReadingShapeAttachedDuplicateRoleDisplay + { + get + { + return ResourceStrings.GetString(ResourceManagers.Diagram, "ReadingShape.AttachedDuplicateRoleDisplay"); + } + } /// <summary>The string used to display a reading with a non-primary order when the role is not attached.</summary> public static string ReadingShapeUnattachedRoleDisplay { Modified: trunk/ORMModel/Resources/ResourceStringsGenerator.xml =================================================================== --- trunk/ORMModel/Resources/ResourceStringsGenerator.xml 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/ORMModel/Resources/ResourceStringsGenerator.xml 2010-02-08 21:40:32 UTC (rev 1427) @@ -372,6 +372,7 @@ <ResourceString name="ReadingShapeReadingSeparator" model="Diagram" resourceName="ReadingShape.ReadingSeparator"/> <ResourceString name="ReadingShapeEllipsis" model="Diagram" resourceName="ReadingShape.Ellipsis"/> <ResourceString name="ReadingShapeAttachedRoleDisplay" model="Diagram" resourceName="ReadingShape.AttachedRoleDisplay"/> + <ResourceString name="ReadingShapeAttachedDuplicateRoleDisplay" model="Diagram" resourceName="ReadingShape.AttachedDuplicateRoleDisplay"/> <ResourceString name="ReadingShapeUnattachedRoleDisplay" model="Diagram" resourceName="ReadingShape.UnattachedRoleDisplay"/> <ResourceString name="NMinusOneRuleInternalSpan" model="Model" resourceName="ModelError.FactType.NMinusOneRule.Text"/> <ResourceString name="ModelErrorConstraintRoleSequenceJoinPathRequiredError" model="Model" resourceName="ModelError.ConstraintRoleSequence.JoinPathRequiredError.Text"/> Modified: trunk/ORMModel/ShapeModel/ORMDiagram.resx =================================================================== --- trunk/ORMModel/ShapeModel/ORMDiagram.resx 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/ORMModel/ShapeModel/ORMDiagram.resx 2010-02-08 21:40:32 UTC (rev 1427) @@ -867,7 +867,11 @@ <value xml:space="preserve">[{0}]</value> <comment xml:space="preserve">The string used to display a reading with a non-primary order when the role is attached.</comment> </data> - <data name="ReadingShape.Ellipsis"> + <data name="ReadingShape.AttachedDuplicateRoleDisplay"> + <value xml:space="preserve">[{0}{1:d}]</value> + <comment xml:space="preserve">The string used to display a reading with a non-primary order when the role is attached and the role player is duplicated in the reading. Replacement fields: {0}=role player name, {1}=displayed role index.</comment> + </data> + <data name="ReadingShape.Ellipsis"> <value xml:space="preserve">…</value> <comment xml:space="preserve">The character to use as the object placeholder in a ReadingShape.</comment> </data> @@ -876,8 +880,8 @@ <comment xml:space="preserve">The string used to divide multiple readings shown in a ReadingShape.</comment> </data> <data name="ReadingShape.UnattachedRoleDisplay"> - <value xml:space="preserve">[Missing{0}]</value> - <comment xml:space="preserve">The string used to display a reading with a non-primary order when the role is not attached.</comment> + <value xml:space="preserve">[Missing{0:d}]</value> + <comment xml:space="preserve">The string used to display a reading with a non-primary order when the role is not attached. Replement fields: {0}=displayed role index</comment> </data> <data name="RelatedTypesDisplay.AttachAllTypes"> <value xml:space="preserve">Subtypes and Supertypes</value> Modified: trunk/ORMModel/ShapeModel/ReadingShape.cs =================================================================== --- trunk/ORMModel/ShapeModel/ReadingShape.cs 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/ORMModel/ShapeModel/ReadingShape.cs 2010-02-08 21:40:32 UTC (rev 1427) @@ -3,6 +3,7 @@ * Natural Object-Role Modeling Architect for Visual Studio * * * * Copyright © Neumont University. All rights reserved. * +* Copyright © ORM Solutions, LLC. All rights reserved. * * * * The use and distribution terms for this software are covered by the * * Common Public License 1.0 (http://opensource.org/licenses/cpl) which * @@ -595,7 +596,6 @@ } else { - // UNDONE: Unary binarization is likely to hit this assert Debug.Assert(roleCount == 2, "A unary fact should not have more than one reading order."); ReadingOrder firstOrder; ReadingOrder secondOrder; @@ -620,24 +620,55 @@ { LinkedElementCollection<RoleBase> factRoles = factShape.DisplayedRoleOrder; string[] roleTranslator = new string[roleCount]; - for (int readRoleNum = 0; readRoleNum < roleCount; ++readRoleNum) + bool reverseNumbering = factShape.DisplayOrientation == DisplayOrientation.VerticalRotatedLeft; // Number top down, not bottom up + BitTracker fullyProcessed = new BitTracker(roleCount); + for (int readingRoleIndex = 0; readingRoleIndex < roleCount; ++readingRoleIndex) { - RoleBase currentRole = orderedRoles[readRoleNum]; + RoleBase currentRole = orderedRoles[readingRoleIndex]; ObjectType rolePlayer = currentRole.Role.RolePlayer; - string formatString; - string replacementField; if (rolePlayer == null) { - replacementField = (factRoles.IndexOf(currentRole) + 1).ToString(CultureInfo.InvariantCulture); - formatString = ResourceStrings.ReadingShapeUnattachedRoleDisplay; + roleTranslator[readingRoleIndex] = string.Format(CultureInfo.InvariantCulture, ResourceStrings.ReadingShapeUnattachedRoleDisplay, reverseNumbering ? roleCount - factRoles.IndexOf(currentRole) : factRoles.IndexOf(currentRole) + 1); + fullyProcessed[readingRoleIndex] = true; } else { - replacementField = rolePlayer.Name; - formatString = ResourceStrings.ReadingShapeAttachedRoleDisplay; + roleTranslator[readingRoleIndex] = rolePlayer.Name; + // Decorate later when we can look for duplicated names and + // add additional diplayed role index information. } - roleTranslator[readRoleNum] = string.Format(CultureInfo.InvariantCulture, formatString, replacementField); } + + // Second pass, look for duplicates + for (int readingRoleIndex = 0; readingRoleIndex < roleCount; ++readingRoleIndex) + { + if (!fullyProcessed[readingRoleIndex]) + { + string rolePlayerName = roleTranslator[readingRoleIndex]; + bool haveDuplicate = false; + for (int duplicateIndex = readingRoleIndex + 1; duplicateIndex < roleCount; ++duplicateIndex) + { + if (!fullyProcessed[duplicateIndex]) + { + if (roleTranslator[duplicateIndex] == rolePlayerName) + { + roleTranslator[duplicateIndex] = string.Format(CultureInfo.InvariantCulture, ResourceStrings.ReadingShapeAttachedDuplicateRoleDisplay, rolePlayerName, reverseNumbering ? roleCount - factRoles.IndexOf(orderedRoles[duplicateIndex]) : factRoles.IndexOf(orderedRoles[duplicateIndex]) + 1); + fullyProcessed[duplicateIndex] = true; + haveDuplicate = true; + } + } + } + if (haveDuplicate) + { + roleTranslator[readingRoleIndex] = string.Format(CultureInfo.InvariantCulture, ResourceStrings.ReadingShapeAttachedDuplicateRoleDisplay, rolePlayerName, reverseNumbering ? roleCount - factRoles.IndexOf(orderedRoles[readingRoleIndex]) : factRoles.IndexOf(orderedRoles[readingRoleIndex]) + 1); + } + else + { + roleTranslator[readingRoleIndex] = string.Format(CultureInfo.InvariantCulture, ResourceStrings.ReadingShapeAttachedRoleDisplay, rolePlayerName); + } + fullyProcessed[readingRoleIndex] = true; + } + } retVal = string.Format(CultureInfo.InvariantCulture, (readingFormatString == null) ? defaultOrder.ReadingText : readingFormatString, roleTranslator); } if (derivationDecorator != null) @@ -1328,19 +1359,24 @@ { } /// <summary> - /// Update the shape size if the derivation status is set. Fixes an earlier - /// problem where the shape was not correctly sized, and accounts for decorator - /// markings being modified over time and/or localized. + /// Update the shape size to correspond to current drawing standards and + /// to account for modified and/or localized derivation decorator display. /// </summary> protected sealed override void ProcessElement(ReadingShape element, Store store, INotifyElementAdded notifyAdded) { ReadingOrder order; FactType factType; - FactTypeDerivationExpression derivationExpression; if (!element.IsDeleted && null != (order = (ReadingOrder)element.ModelElement) && null != (factType = order.FactType) && - null != (derivationExpression = factType.DerivationExpression)) + (null != factType.DerivationRule || + null != factType.DerivationExpression || + // We did not used to index duplicate role player names, + // now we do, making the shape require more space. It isn't + // worth the search for duplicates here, but the role count + // should narrow this down quite a bit as most models use + // predominantly binary fact types. + 2 < factType.RoleCollection.Count)) { element.AutoResize(); } Modified: trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1a.Compare.orm =================================================================== --- trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1a.Compare.orm 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1a.Compare.orm 2010-02-08 21:40:32 UTC (rev 1427) @@ -467,7 +467,7 @@ </ormDiagram:ObjectTypeShape> <ormDiagram:FactTypeShape id="_CE23A438-DDA2-4D12-9523-06C5060C599E" IsExpanded="true" AbsoluteBounds="2.1875, 1.7875, 0.5438888889923692, 0.24388888899236916"> <ormDiagram:RelativeShapes> - <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.8125, 0.125"> + <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.81412529945373535, 0.12950302660465241"> <ormDiagram:Subject ref="_F950097E-AE89-41FB-A35F-290CA84963B8" /> </ormDiagram:ReadingShape> </ormDiagram:RelativeShapes> Modified: trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1b.Compare.orm =================================================================== --- trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1b.Compare.orm 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1b.Compare.orm 2010-02-08 21:40:32 UTC (rev 1427) @@ -467,7 +467,7 @@ </ormDiagram:ObjectTypeShape> <ormDiagram:FactTypeShape id="_CE23A438-DDA2-4D12-9523-06C5060C599E" IsExpanded="true" AbsoluteBounds="2.1875, 1.7875, 0.5438888889923692, 0.24388888899236916"> <ormDiagram:RelativeShapes> - <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.8125, 0.125"> + <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.81412529945373535, 0.12950302660465241"> <ormDiagram:Subject ref="_F950097E-AE89-41FB-A35F-290CA84963B8" /> </ormDiagram:ReadingShape> </ormDiagram:RelativeShapes> Modified: trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1c.Compare.orm =================================================================== --- trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1c.Compare.orm 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test1c.Compare.orm 2010-02-08 21:40:32 UTC (rev 1427) @@ -464,7 +464,7 @@ </ormDiagram:ObjectTypeShape> <ormDiagram:FactTypeShape id="_CE23A438-DDA2-4D12-9523-06C5060C599E" IsExpanded="true" AbsoluteBounds="2.1875, 1.7875, 0.5438888889923692, 0.24388888899236916"> <ormDiagram:RelativeShapes> - <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.8125, 0.125"> + <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.81412529945373535, 0.12950302660465241"> <ormDiagram:Subject ref="_F950097E-AE89-41FB-A35F-290CA84963B8" /> </ormDiagram:ReadingShape> </ormDiagram:RelativeShapes> Modified: trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2a.Compare.orm =================================================================== --- trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2a.Compare.orm 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2a.Compare.orm 2010-02-08 21:40:32 UTC (rev 1427) @@ -467,7 +467,7 @@ </ormDiagram:ObjectTypeShape> <ormDiagram:FactTypeShape AbsoluteBounds="2.1875, 1.7875, 0.5438888889923692, 0.24388888899236916" IsExpanded="true" id="_CE23A438-DDA2-4D12-9523-06C5060C599E"> <ormDiagram:RelativeShapes> - <ormDiagram:ReadingShape IsExpanded="true" id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" AbsoluteBounds="2.1875, 2.0500000000000003, 0.8125, 0.125"> + <ormDiagram:ReadingShape IsExpanded="true" id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" AbsoluteBounds="2.1875, 2.0500000000000003, 0.81412529945373535, 0.12950302660465241"> <ormDiagram:Subject ref="_F950097E-AE89-41FB-A35F-290CA84963B8" /> </ormDiagram:ReadingShape> </ormDiagram:RelativeShapes> Modified: trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2b.Compare.orm =================================================================== --- trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2b.Compare.orm 2010-02-06 10:22:08 UTC (rev 1426) +++ trunk/TestSuites/TestSample/NMinus1Tests/NMinus1Tests.NMinus1Test2b.Compare.orm 2010-02-08 21:40:32 UTC (rev 1427) @@ -464,7 +464,7 @@ </ormDiagram:ObjectTypeShape> <ormDiagram:FactTypeShape id="_CE23A438-DDA2-4D12-9523-06C5060C599E" IsExpanded="true" AbsoluteBounds="2.1875, 1.7875, 0.5438888889923692, 0.24388888899236916"> <ormDiagram:RelativeShapes> - <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.8125, 0.125"> + <ormDiagram:ReadingShape id="_D7FE3C29-C834-4E34-9AFD-9D0DA9070D99" IsExpanded="true" AbsoluteBounds="2.1875, 2.0500000000000003, 0.81412529945373535, 0.12950302660465241"> <ormDiagram:Subject ref="_F950097E-AE89-41FB-A35F-290CA84963B8" /> </ormDiagram:ReadingShape> </ormDiagram:RelativeShapes> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2010-02-25 19:26:17
|
Revision: 1429 http://orm.svn.sourceforge.net/orm/?rev=1429&view=rev Author: mcurland Date: 2010-02-25 19:26:10 +0000 (Thu, 25 Feb 2010) Log Message: ----------- Fix absorption issue with 1-1 (both roles non-mandatory) binary fact types always absorbing towards the second role. Fixes bug introduced in [1361] refs #386 Modified Paths: -------------- trunk/Oial/ORMOialBridge/OialModelIsForORMModel.cs trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm Modified: trunk/Oial/ORMOialBridge/OialModelIsForORMModel.cs =================================================================== --- trunk/Oial/ORMOialBridge/OialModelIsForORMModel.cs 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/Oial/ORMOialBridge/OialModelIsForORMModel.cs 2010-02-25 19:26:10 UTC (rev 1429) @@ -35,7 +35,7 @@ /// <summary> /// The algorithm version written to the file /// </summary> - public const string CurrentAlgorithmVersion = "1.005"; + public const string CurrentAlgorithmVersion = "1.006"; #endregion // CurrentAlgorithmVersion constant #region ValidationPriority enum /// <summary> @@ -408,7 +408,7 @@ if (!secondRoleIsUniqueAndPreferred) { // Shallow map toward secondRolePlayer. - possibilityBits = FIRST_SECOND_SHALLOW; + possibilityBits |= FIRST_SECOND_SHALLOW; } } else if (firstRoleIsMandatory && !secondRoleIsMandatory) // ...only firstRole is mandatory... Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test1.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -11263,7 +11263,7 @@ </orm:NameGenerator> <orm:GenerationState id="_8E0783DA-E25D-4F51-BB04-6E2AC65759C4"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_52A37F5B-1E80-4FCB-802E-AA9FA4315D0D" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_52A37F5B-1E80-4FCB-802E-AA9FA4315D0D" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_AFA60651-CCAD-47F2-B397-70E5855BF20B" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_CD0EC594-EDEA-44FC-9593-1DE35929D199" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.WithIndependent.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -282,7 +282,7 @@ </orm:NameGenerator> <orm:GenerationState id="_54101972-8FEE-4228-AD12-FC8C396A2A2C"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_216FCBEF-24A6-4138-9F8D-255066420DD2" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_216FCBEF-24A6-4138-9F8D-255066420DD2" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_FE3D35D4-8BFA-4604-B769-6F8224F4CC89" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_AB43283A-160B-4A51-9E75-F464582D1F72" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test2.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -288,7 +288,7 @@ </orm:NameGenerator> <orm:GenerationState id="_CE6A5C67-194C-4538-B61D-09DC277235CA"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_1ECF9C7E-EC03-4118-9BF0-78AC98140751" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_1ECF9C7E-EC03-4118-9BF0-78AC98140751" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_4EE0E222-C3E6-4E2F-93BD-2832FD0CA530" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_B469B281-6731-4214-9C2C-6CFDAC31C903" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.AfterReorder.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -745,7 +745,7 @@ </orm:NameGenerator> <orm:GenerationState id="_3A3C7338-9795-4DF8-85A8-D7F91EBD4E8B"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_93A125B5-363A-454B-A6FC-473B4987BBF7" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_93A125B5-363A-454B-A6FC-473B4987BBF7" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_B227B9F1-E66D-4885-9EBB-FA6C30E3AC66" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_75FDA8E6-2EB8-493D-A6BF-CB382F439713" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.OriginalOrder.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -745,7 +745,7 @@ </orm:NameGenerator> <orm:GenerationState id="_FF27DDAF-62F8-41E6-AB38-0D295BDBB29E"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_4CA750F7-00B1-492A-9BC2-CF24B78D16D1" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_4CA750F7-00B1-492A-9BC2-CF24B78D16D1" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_B227B9F1-E66D-4885-9EBB-FA6C30E3AC66" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_2FD2BA8B-8F38-413C-A5ED-5C43A9F3ED0C" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test3.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -745,7 +745,7 @@ </orm:NameGenerator> <orm:GenerationState id="_B5DD8E65-E6E9-4E8C-8B4D-FF5958987841"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_4F4B5F39-12A2-4488-9BA9-EEF2F2BB5E6D" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_4F4B5F39-12A2-4488-9BA9-EEF2F2BB5E6D" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_21511FEB-5B88-4FBD-A74C-06B4A3C70480" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_6E61D4EE-E269-4EB5-8CD2-5D643CA8F6AB" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test4.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -379,7 +379,7 @@ </orm:NameGenerator> <orm:GenerationState id="_867D2D7E-B67D-4BFD-8F04-F5FBEAA5D1B9"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_7C818355-A612-4252-B259-D23C1B8B80CB" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_7C818355-A612-4252-B259-D23C1B8B80CB" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_479BA1D0-80FB-48DE-894E-50E9E8FC0F0B" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_035C2A13-BCD7-4021-B939-C7B0714C8324" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.FullyAbsorbed.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -883,7 +883,7 @@ </orm:NameGenerator> <orm:GenerationState id="_3013089A-3E52-4FFC-B4C9-C0D50877459E"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_953B9230-0B01-406E-B73F-E99E73B31F8D" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_953B9230-0B01-406E-B73F-E99E73B31F8D" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_B6DA4F58-8BCF-478E-82AE-C04CD0DD68C9" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_0C331C48-4E21-4197-8186-4A3769048023" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateObjectification.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -883,7 +883,7 @@ </orm:NameGenerator> <orm:GenerationState id="_131855A5-E2F4-4B93-859A-3BF1DCE156A4"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_077B1376-3174-4CAC-9C4A-B8245485F67E" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_077B1376-3174-4CAC-9C4A-B8245485F67E" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_C50661E8-E857-43F3-A1D2-9EF787A84EFE" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_CC0244D5-F67A-4DE3-8E18-4B16640FB1F1" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.SeparateRemoteSupertype.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -919,7 +919,7 @@ </orm:NameGenerator> <orm:GenerationState id="_A9552E0E-47F2-4584-A070-747217388A07"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_B774300C-8F49-43EB-AB62-17534D8DBB42" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test5.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -919,7 +919,7 @@ </orm:NameGenerator> <orm:GenerationState id="_A9552E0E-47F2-4584-A070-747217388A07"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_F689860F-F598-413B-B7D2-0DD7D4CACE41" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_B774300C-8F49-43EB-AB62-17534D8DBB42" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_0F8EAA5B-2586-41D4-9523-EDE35695503A" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test6.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -325,7 +325,7 @@ </orm:NameGenerator> <orm:GenerationState id="_942823FC-FB64-4C91-8D0E-805B5D2DFE0A"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_D7A0794A-6A4E-4F57-AABD-1EAA875ADCEC" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_D7A0794A-6A4E-4F57-AABD-1EAA875ADCEC" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_82B2C906-24E6-4CF4-ADE5-30AEAE09EC10" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_92EDE6BB-60EE-45AE-8D58-B58A04114F45" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test7.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -697,7 +697,7 @@ </orm:NameGenerator> <orm:GenerationState id="_80CC0747-9D3C-4ED5-8A82-11720C90EBAD"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_65638CB4-2653-4514-A38D-9380F676A78C" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_65638CB4-2653-4514-A38D-9380F676A78C" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_AB78A179-3D57-4D6D-A2C8-A7FD52DCC729" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting CoreAlgorithmVersion="1.004" id="_E6A31A5A-A145-4F45-A0E9-47F04AA49D97" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test8.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -202,7 +202,7 @@ </orm:NameGenerator> <orm:GenerationState id="_3FB952A5-A1B8-4A7B-9C17-10B2D5D9B95D"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_CA317692-2D5E-4094-9CC9-F7B049F0A505" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_CA317692-2D5E-4094-9CC9-F7B049F0A505" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_9C9BECFF-37EA-4156-B4BF-55AD6ED21CD2" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_7A16F888-F499-4270-94C6-894CF461C356" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> Modified: trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm =================================================================== --- trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm 2010-02-25 06:07:12 UTC (rev 1428) +++ trunk/TestSuites/RelationalTests/FullRegeneration/Tests.Test9.Compare.orm 2010-02-25 19:26:10 UTC (rev 1429) @@ -361,7 +361,7 @@ </orm:NameGenerator> <orm:GenerationState id="_60A97CA1-7A34-40BD-A48A-DE043570D047"> <orm:GenerationSettings> - <ormtooial:AbstractionModelGenerationSetting id="_FA93223F-D82D-479F-A103-D8886756E8E2" AlgorithmVersion="1.005"> + <ormtooial:AbstractionModelGenerationSetting id="_FA93223F-D82D-479F-A103-D8886756E8E2" AlgorithmVersion="1.006"> <ormtooial:AbstractionModel ref="_2F7377B5-BC91-4951-B9DC-8D6389C48738" /> </ormtooial:AbstractionModelGenerationSetting> <oialtocdb:SchemaGenerationSetting id="_833EE616-E4B4-4F9E-9DBC-522A018D54FC" CoreAlgorithmVersion="1.004" NameAlgorithmVersion="1.011"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2010-03-11 22:26:09
|
Revision: 1432 http://orm.svn.sourceforge.net/orm/?rev=1432&view=rev Author: mcurland Date: 2010-03-11 22:26:03 +0000 (Thu, 11 Mar 2010) Log Message: ----------- Fix a bad issue with the new internationalization support for value constraints. Unfortunately this requires a repost of the February 2010 release after a minimal number of downloads. * Fix for serialization issue in [1431] (a range upper bound needs to be set for the culture-invariant form of the lower bound to serialize). refs #402 * Role path verbalization negation lost if forward reading from the negated role is not available. refs #395 Modified Paths: -------------- trunk/ORMModel/ObjectModel/DataType.cs trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.cs trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.xml trunk/ORMModel/ObjectModel/Verbalization.cs trunk/Setup/Readme.htm Modified: trunk/ORMModel/ObjectModel/DataType.cs =================================================================== --- trunk/ORMModel/ObjectModel/DataType.cs 2010-03-09 08:33:53 UTC (rev 1431) +++ trunk/ORMModel/ObjectModel/DataType.cs 2010-03-11 22:26:03 UTC (rev 1432) @@ -3,6 +3,7 @@ * Natural Object-Role Modeling Architect for Visual Studio * * * * Copyright © Neumont University. All rights reserved. * +* Copyright © ORM Solutions, LLD. All rights reserved. * * * * The use and distribution terms for this software are covered by the * * Common Public License 1.0 (http://opensource.org/licenses/cpl) which * Modified: trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.cs =================================================================== --- trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.cs 2010-03-09 08:33:53 UTC (rev 1431) +++ trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.cs 2010-03-11 22:26:03 UTC (rev 1432) @@ -3304,7 +3304,7 @@ } if (domainPropertyInfo.Id == ValueRange.InvariantMinValueDomainPropertyId) { - if (string.IsNullOrEmpty(this.InvariantMaxValue)) + if (string.IsNullOrEmpty(this.InvariantMinValue)) { return new CustomSerializedPropertyInfo(null, null, null, false, CustomSerializedAttributeWriteStyle.NotWritten, null); } Modified: trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.xml =================================================================== --- trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.xml 2010-03-09 08:33:53 UTC (rev 1431) +++ trunk/ORMModel/ObjectModel/ORMCore.SerializationExtensions.xml 2010-03-11 22:26:03 UTC (rev 1432) @@ -517,7 +517,7 @@ <se:Condition WriteStyle="NotWritten"> <plx:callStatic name="IsNullOrEmpty" dataTypeName=".string"> <plx:passParam> - <plx:callThis name="InvariantMaxValue" type="property"/> + <plx:callThis name="InvariantMinValue" type="property"/> </plx:passParam> </plx:callStatic> </se:Condition> Modified: trunk/ORMModel/ObjectModel/Verbalization.cs =================================================================== --- trunk/ORMModel/ObjectModel/Verbalization.cs 2010-03-09 08:33:53 UTC (rev 1431) +++ trunk/ORMModel/ObjectModel/Verbalization.cs 2010-03-11 22:26:03 UTC (rev 1432) @@ -6064,6 +6064,7 @@ VerbalizationPlanNode parentNode; bool checkOppositeNegation = roleCount == 2 && + roles[0] == factTypeEntry.Role && verbalizationNodeLink != null && verbalizationNodeLink.Previous == null && null != (parentNode = verbalizationNode.ParentNode) && @@ -7518,7 +7519,9 @@ { // The dynamic flag if there is a trailing pathed role in the same role path ReadOnlyCollection<PathedRole> childPathedRoles = myRolePathCache.PathedRoleCollection(entryPathedRole.RolePath); - if (GetRolePlayerVariableUse(childPathedRoles[childPathedRoles.IndexOf(entryPathedRole) + 1]).Value.PrimaryRolePlayerVariable.HasBeenUsed(CurrentQuantificationUsePhase, true)) + int testChildIndex = childPathedRoles.IndexOf(entryPathedRole) + 1; + if (testChildIndex < childPathedRoles.Count && + GetRolePlayerVariableUse(childPathedRoles[testChildIndex]).Value.PrimaryRolePlayerVariable.HasBeenUsed(CurrentQuantificationUsePhase, true)) { readingOptions |= VerbalizationPlanReadingOptions.NegatedExitRole; childNode.ReadingOptions = readingOptions; Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2010-03-09 08:33:53 UTC (rev 1431) +++ trunk/Setup/Readme.htm 2010-03-11 22:26:03 UTC (rev 1432) @@ -42,7 +42,7 @@ <hr/> <h2>February 2010 CTP Changes</h2> -<div>The February 2010 CTP release includes all modifications through changeset 1431. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The February 2010 CTP release includes all modifications through changeset 1432. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Localized Value Constraints 2010-02">Localized value constraints</a> </li> <li><a href="#Value Constraint Special String Characters 2010-02">Value constraint special string characters</a> </li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mcu...@us...> - 2010-06-03 22:10:55
|
Revision: 1445 http://orm.svn.sourceforge.net/orm/?rev=1445&view=rev Author: mcurland Date: 2010-06-03 22:10:49 +0000 (Thu, 03 Jun 2010) Log Message: ----------- Miscellaneous bug fixes for [1444]. refs #395 Modified Paths: -------------- trunk/ORMModel/ObjectModel/RolePath.cs trunk/ORMModel/ObjectModel/Verbalization.cs trunk/Setup/Readme.htm Modified: trunk/ORMModel/ObjectModel/RolePath.cs =================================================================== --- trunk/ORMModel/ObjectModel/RolePath.cs 2010-06-03 05:50:56 UTC (rev 1444) +++ trunk/ORMModel/ObjectModel/RolePath.cs 2010-06-03 22:10:49 UTC (rev 1445) @@ -1878,17 +1878,15 @@ /// </summary> private static void PathedRoleUnificationDeletedRule(ElementDeletedEventArgs e) { - PathObjectUnifierUnifiesPathedRole link = (PathObjectUnifierUnifiesPathedRole)e.ModelElement; - PathObjectUnifier objectUnifier; - LeadRolePath rolePath; - if (!link.IsDeleted && - null != (rolePath = (objectUnifier = link.ObjectUnifier).LeadRolePath)) + PathObjectUnifier objectUnifier = ((PathObjectUnifierUnifiesPathedRole)e.ModelElement).ObjectUnifier; + if (!objectUnifier.IsDeleted) { + LeadRolePath rolePath; if (1 >= (objectUnifier.PathedRoleCollection.Count + objectUnifier.PathRootCollection.Count)) { objectUnifier.Delete(); } - else + else if (null != (rolePath = objectUnifier.LeadRolePath)) { AddDelayedPathValidation(rolePath); } @@ -1942,17 +1940,15 @@ /// </summary> private static void RolePathRootUnificationDeletedRule(ElementDeletedEventArgs e) { - PathObjectUnifierUnifiesRolePathRoot link = (PathObjectUnifierUnifiesRolePathRoot)e.ModelElement; - PathObjectUnifier objectUnifier; - LeadRolePath rolePath; - if (!link.IsDeleted && - null != (rolePath = (objectUnifier = link.ObjectUnifier).LeadRolePath)) + PathObjectUnifier objectUnifier = ((PathObjectUnifierUnifiesRolePathRoot)e.ModelElement).ObjectUnifier; + if (!objectUnifier.IsDeleted) { + LeadRolePath rolePath; if (1 >= (objectUnifier.PathedRoleCollection.Count + objectUnifier.PathRootCollection.Count)) { objectUnifier.Delete(); } - else + else if (null != (rolePath = objectUnifier.LeadRolePath)) { AddDelayedPathValidation(rolePath); } @@ -5105,7 +5101,7 @@ /// </summary> private static void FunctionAddedRule(ElementAddedEventArgs e) { - FrameworkDomainModel.DelayValidateElement(e.ModelElement, DelayValidateFunction); + FrameworkDomainModel.DelayValidateElement(((ModelDefinesFunction)e.ModelElement).Function, DelayValidateFunction); } private static void DelayValidateFunction(ModelElement element) { Modified: trunk/ORMModel/ObjectModel/Verbalization.cs =================================================================== --- trunk/ORMModel/ObjectModel/Verbalization.cs 2010-06-03 05:50:56 UTC (rev 1444) +++ trunk/ORMModel/ObjectModel/Verbalization.cs 2010-06-03 22:10:49 UTC (rev 1445) @@ -7904,7 +7904,7 @@ case VerbalizationPlanNodeType.Branch: int restoreBuilder = builder.Length; VerbalizationPlanBranchType branchType = node.BranchType; - VerbalizationPlanBranchRenderingStyle renderingStyle = VerbalizationPlanBranchRenderingStyle.OperatorSeparated; + VerbalizationPlanBranchRenderingStyle renderingStyle = node.BranchRenderingStyle; childNodeLink = node.FirstChildNode; bool first = true; bool isNestedBranch = false; @@ -7918,19 +7918,22 @@ { snippet = (RolePathVerbalizerSnippetType)(-1); childNode = childNodeLink.Value; + switch (renderingStyle) + { + case VerbalizationPlanBranchRenderingStyle.HeaderList: + if (!first) + { + PopPairingUsePhase(); + } + PushPairingUsePhase(); + break; + case VerbalizationPlanBranchRenderingStyle.IsolatedList: + BeginQuantificationUsePhase(); + break; + } if (first) { first = false; - renderingStyle = GetRenderingStyleFromBranchType(branchType); - switch (renderingStyle) - { - case VerbalizationPlanBranchRenderingStyle.HeaderList: - PushPairingUsePhase(); - break; - case VerbalizationPlanBranchRenderingStyle.IsolatedList: - BeginQuantificationUsePhase(); - break; - } VerbalizationPlanNode parentNode = node.ParentNode; if (parentNode != null) { Modified: trunk/Setup/Readme.htm =================================================================== --- trunk/Setup/Readme.htm 2010-06-03 05:50:56 UTC (rev 1444) +++ trunk/Setup/Readme.htm 2010-06-03 22:10:49 UTC (rev 1445) @@ -42,7 +42,7 @@ <hr/> <h2>May 2010 CTP Changes</h2> -<div>The May 2010 CTP release includes all modifications through changeset 1444. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> +<div>The May 2010 CTP release includes all modifications through changeset 1445. Full changeset descriptions can be found at the <a href="http://orm.svn.sourceforge.net/viewvc/orm/trunk/?view=log">sourceforge code repository</a> (be patient with this link, the page contains a full changeset history).</div> <ul> <li><a href="#Uniqueness Frequency Join Path Verbalization 2010-05">Uniqueness and frequency constraint join path verbalization</a> </li> <li><a href="#One-to-one Relational Mapping 2010-05">One-to-one Relational Mapping Refinement</a> </li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |