public TargetClass TryLoadTargetClass(CSClass csClass)
        {
            TargetClass returnValue           = null;
            var         uiClientPageAttribute = csClass.AttributeList.SingleOrDefault(i => i.TypeFullName == typeof(UIClientPageAttribute).FullName);

            if (uiClientPageAttribute != null)
            {
                returnValue = new TargetClass
                {
                    SourceClassFullName = Convert.ToString(uiClientPageAttribute.GetAttributeParameter(0, "sourceClassFullName", true)),
                    TargetClassFullName = csClass.ClassFullName,
                    //ExpectedUrl = Convert.ToString(uiClientPageAttribute.GetAttributeParameter(1, "ExpectedUrl", false))
                };

                //If there is only one file, that is the user and designer file.
                //If there are two or more files and one ends with ".designer.cs", that is the designer file and the the first of the others is the user file
                //If there are two or more files and none ends with ".designer.cs", then the first one is the designer and user file
                if (csClass.FileRelativePathList.Count == 1)
                {
                    returnValue.DesignerFileRelativePath = csClass.FileRelativePathList[0];
                    returnValue.UserFileRelativePath     = csClass.FileRelativePathList[0];
                }
                else if (csClass.FileRelativePathList.Count > 1)
                {
                    returnValue.DesignerFileRelativePath = csClass.FileRelativePathList.FirstOrDefault(i => i.EndsWith(".designer.cs", StringComparison.CurrentCultureIgnoreCase));
                    if (string.IsNullOrEmpty(returnValue.DesignerFileRelativePath))
                    {
                        returnValue.DesignerFileRelativePath = csClass.FileRelativePathList[0];
                        returnValue.UserFileRelativePath     = csClass.FileRelativePathList[0];
                    }
                    else
                    {
                        returnValue.UserFileRelativePath = csClass.FileRelativePathList.FirstOrDefault(i => i != returnValue.DesignerFileRelativePath);
                    }
                }

                foreach (var csProperty in csClass.PropertyList)
                {
                    var targetField = TryLoadField(csProperty);
                    if (targetField != null)
                    {
                        returnValue.TargetFieldList.Add(targetField);
                    }
                }
            }
            return(returnValue);
        }
		public TargetClass TryLoadTargetClass(CSClass csClass)
		{
			TargetClass returnValue = null;
			var uiClientPageAttribute = csClass.AttributeList.SingleOrDefault(i => i.TypeFullName == typeof(UIClientPageAttribute).FullName);
			if (uiClientPageAttribute != null)
			{
				returnValue = new TargetClass
				{
					SourceClassFullName = Convert.ToString(uiClientPageAttribute.GetAttributeParameter(0, "sourceClassFullName", true)),
					TargetClassFullName = csClass.ClassFullName,
					//ExpectedUrl = Convert.ToString(uiClientPageAttribute.GetAttributeParameter(1, "ExpectedUrl", false))
				};
				
				//If there is only one file, that is the user and designer file.
				//If there are two or more files and one ends with ".designer.cs", that is the designer file and the the first of the others is the user file
				//If there are two or more files and none ends with ".designer.cs", then the first one is the designer and user file
				if (csClass.FileRelativePathList.Count == 1)
				{
					returnValue.DesignerFileRelativePath = csClass.FileRelativePathList[0];
					returnValue.UserFileRelativePath = csClass.FileRelativePathList[0];
				}
				else if (csClass.FileRelativePathList.Count > 1)
				{
					returnValue.DesignerFileRelativePath = csClass.FileRelativePathList.FirstOrDefault(i => i.EndsWith(".designer.cs", StringComparison.CurrentCultureIgnoreCase));
					if (string.IsNullOrEmpty(returnValue.DesignerFileRelativePath))
					{
						returnValue.DesignerFileRelativePath = csClass.FileRelativePathList[0];
						returnValue.UserFileRelativePath = csClass.FileRelativePathList[0];
					}
					else
					{
						returnValue.UserFileRelativePath = csClass.FileRelativePathList.FirstOrDefault(i => i != returnValue.DesignerFileRelativePath);
					}
				}

				foreach (var csProperty in csClass.PropertyList)
				{
					var targetField = TryLoadField(csProperty);
					if (targetField != null)
					{
						returnValue.TargetFieldList.Add(targetField);
					}
				}
			}
			return returnValue;
		}
		public static TargetClassComparisonResult Compare(SourceWebPage webPage, TargetClass targetClass)
		{
			TargetClassComparisonResult comparison = new TargetClassComparisonResult();
			foreach(var control in webPage.Controls)
			{
				var targetField = targetClass.TargetFieldList.FirstOrDefault(i=>i.SourceFieldName == control.FieldName
																		&& i.SourceClassFullName == control.ClassFullName);
				if(targetField == null)
				{
					targetField = new TargetField()
					{
						SourceFieldName = control.FieldName,
						SourceClassFullName = control.ClassFullName
					};
					comparison.FieldsToAdd.Add(targetField);
				}
			}
			return comparison;
		}
        public static TargetClassComparisonResult Compare(SourceWebPage webPage, TargetClass targetClass)
        {
            TargetClassComparisonResult comparison = new TargetClassComparisonResult();

            foreach (var control in webPage.Controls)
            {
                var targetField = targetClass.TargetFieldList.FirstOrDefault(i => i.SourceFieldName == control.FieldName &&
                                                                             i.SourceClassFullName == control.ClassFullName);
                if (targetField == null)
                {
                    targetField = new TargetField()
                    {
                        SourceFieldName     = control.FieldName,
                        SourceClassFullName = control.ClassFullName
                    };
                    comparison.FieldsToAdd.Add(targetField);
                }
            }
            return(comparison);
        }
Example #5
0
 public TargetClass UpdateClass(SourceWebPage sourceWebPage, TargetClass targetClass)
 {
     foreach (var sourceControl in sourceWebPage.Controls)
     {
         var targetField = targetClass.TargetFieldList.SingleOrDefault(i => i.SourceFieldName == sourceControl.FieldName);
         if (targetField == null)
         {
             targetField = new TargetField
             {
                 IsDirty             = true,
                 SourceNamespaceName = sourceControl.NamespaceName,
                 SourceClassName     = sourceControl.ClassName,
                 SourceFieldName     = sourceControl.FieldName,
                 TargetFieldName     = sourceControl.FieldName
             };
             EnumTargetControlType targetControlType;
             targetControlType             = GetTargetControlType(sourceControl);
             targetField.TargetControlType = targetControlType;
             targetClass.TargetFieldList.Add(targetField);
         }
         else
         {
             if (targetField.SourceClassFullName != sourceControl.ClassFullName)
             {
                 targetField.SourceClassName     = sourceControl.ClassName;
                 targetField.SourceNamespaceName = sourceControl.NamespaceName;
                 targetField.IsDirty             = true;
             }
             var targetControlType = GetTargetControlType(sourceControl);
             if (targetField.TargetControlType != targetControlType)
             {
                 targetField.TargetControlType = targetControlType;
                 targetField.IsDirty           = true;
             }
         }
     }
     return(targetClass);
 }
Example #6
0
		//internal static TargetClass TryLoad(CSClass csClass)
		//{
		//    TargetClass returnValue = null;
		//    var uiClientPageAttribute = csClass.AttributeList.SingleOrDefault(i => i.TypeName == typeof(UIClientPageAttribute).Name && i.TypeNamespace == typeof(UIClientPageAttribute).Namespace);
		//    if(uiClientPageAttribute != null)
		//    {
		//        returnValue = new TargetClass
		//        {
		//            SourceClassFullName = Convert.ToString(uiClientPageAttribute.GetAttributeParameter(0, "SourceClassFullName", true)),
		//            TargetClassFullName = csClass.ClassFullName
		//        };

		//        //If there is only one field, that is the user and designer file.
		//        //If there are two or more files and one ends with ".designer.cs", that is the designer file and the the first of the others is the user file
		//        //If there are two or more files and none ends with ".designer.cs", then the first one is the designer and user file
		//        if(csClass.FilePathList.Count == 1)
		//        {
		//            returnValue.DesignerFilePath = csClass.FilePathList[0];
		//            returnValue.UserFilePath = csClass.FilePathList[0];
		//        }
		//        else if (csClass.FilePathList.Count > 1)
		//        {
		//            returnValue.DesignerFilePath = csClass.FilePathList.FirstOrDefault(i=>i.EndsWith(".designer.cs", StringComparison.CurrentCultureIgnoreCase));
		//            if(string.IsNullOrEmpty(returnValue.DesignerFilePath))
		//            {
		//                returnValue.DesignerFilePath = csClass.FilePathList[0];
		//                returnValue.UserFilePath = csClass.FilePathList[0];
		//            }
		//            else 
		//            {
		//                returnValue.UserFilePath = csClass.FilePathList.FirstOrDefault(i=>i != returnValue.DesignerFilePath);
		//            }
		//        }

		//        foreach(var csProperty in csClass.PropertyList)
		//        {
		//            var targetField = TargetField.TryLoad(csProperty);
		//            if(targetField != null)
		//            {
		//                returnValue.TargetFieldList.Add(targetField);
		//            }
		//        }
		//    }
		//    return returnValue;
		//}

		public static TargetClass Create(TargetProject targetProject, SourceWebProject sourceProject, SourceWebPage sourcePage)
		{
			string sourceTypeName;
			string sourceTypeNamespace;
			DotNetParserHelper.SplitType(sourcePage.ClassFullName, out sourceTypeName, out sourceTypeNamespace);

			string relativeSourceNamespace;
			if(sourceTypeNamespace == sourceProject.RootNamespace)
			{
				relativeSourceNamespace = string.Empty;
			}
			else if(sourceTypeNamespace.StartsWith(sourceProject.RootNamespace))
			{
				relativeSourceNamespace = sourceTypeNamespace.Substring(sourceProject.RootNamespace.Length + 1);
			}
			else 
			{
				relativeSourceNamespace = sourceTypeNamespace;
			}
			string targetClassName = sourceTypeName + "PageClient";
			string targetNamespace = targetProject.RootNamespace + ".Client.Pages." + relativeSourceNamespace;
			TargetClass returnValue = new TargetClass()
			{
				SourceClassFullName = sourcePage.ClassFullName,
				TargetClassFullName = targetNamespace + "." + targetClassName,
				DesignerFileRelativePath = Path.Combine(targetNamespace.Replace('.', '\\'), targetClassName + ".designer.cs"),
				UserFileRelativePath = Path.Combine(targetNamespace.Replace('.', '\\'), targetClassName + ".cs"),
			};
			return returnValue;
		}
			public void ExistingClassChangedTargetFieldType_ShouldUpdateTargetFieldType()
			{
				SourceWebPage sourceWebPage = new SourceWebPage
				{
					ClassFullName = "Test1.TestSourceClass",
					PageUrl = "TestSourceClass.aspx",
					Controls = new List<SourceWebControl>()
				    {
				        new SourceWebControl
				        {
				            ClassFullName = typeof(System.Web.UI.WebControls.HyperLink).FullName,
				            FieldName = "TestTargetField"
				        }
				    }
				};
				var targetClass = new TargetClass()
				{
					TargetFieldList = new List<TargetField>() 
					{
						new TargetField
						{
							IsDirty = false,
							SourceClassFullName = typeof(System.Web.UI.WebControls.HyperLink).FullName,
							SourceFieldName = "TestTargetField",
							TargetControlType = EnumTargetControlType.TextBox,
							TargetFieldName = "TestTargetField"
						}
					}
				};
				var targetModelGenerator = new TargetModelGenerator();
				targetClass = targetModelGenerator.UpdateClass(sourceWebPage, targetClass);
				Assert.AreEqual(1, targetClass.TargetFieldList.Count);
				TestValidators.ValidateTargetField(targetClass.TargetFieldList[0],
											isDirty: true,
											sourceClassFullName: typeof(System.Web.UI.WebControls.HyperLink).FullName,
											sourceFieldName: "TestTargetField",
											targetControlType: EnumTargetControlType.Link,
											targetFieldName: "TestTargetField");
			}
			public void ExistingClassExistingIrrelevantFields() 
			{
				SourceWebPage sourceWebPage = new SourceWebPage
				{
					ClassFullName = "Test1.TestSourceClass",
					PageUrl = "TestSourceClass.aspx",
					Controls = new List<SourceWebControl>()
				    {
				        new SourceWebControl
				        {
				            ClassFullName = "System.Web.UI.WebControls.HyperLink",
				            FieldName = "NewTargetField"
				        }
				    }
				};
				var targetClass = new TargetClass()
				{
					TargetFieldList = new List<TargetField>() 
					{
						new TargetField
						{
							IsDirty = false,
							SourceClassFullName = "TestSourcenamespace.TestSourceClass",
							SourceFieldName = "ExistingTargetField",
							TargetControlType = EnumTargetControlType.Unknown,
							TargetFieldName = "ExistingTargetFieldName"
						}
					}
				};
				var targetModelGenerator = new TargetModelGenerator();
				targetClass = targetModelGenerator.UpdateClass(sourceWebPage, targetClass);
				Assert.AreEqual(2, targetClass.TargetFieldList.Count);

				TestValidators.ValidateTargetField(targetClass.TargetFieldList[0],
											isDirty:false,
											sourceClassFullName: "TestSourcenamespace.TestSourceClass",
											sourceFieldName: "ExistingTargetField",
											targetControlType: EnumTargetControlType.Unknown,
											targetFieldName: "ExistingTargetFieldName");

				TestValidators.ValidateTargetField(targetClass.TargetFieldList[1],
											isDirty:true,
											sourceClassFullName: "System.Web.UI.WebControls.HyperLink",
											sourceFieldName: "NewTargetField", 
											targetControlType: EnumTargetControlType.Link, 
											targetFieldName: "NewTargetField");
			}
			public void NewTargetClassWithLabel_ShouldCreateNewTargetClassWithLabel()
			{
				SourceWebPage sourceWebPage = new SourceWebPage
				{
					ClassFullName = "Test1.TestSourceClass",
					PageUrl = "TestSourceClass.aspx",
					Controls = new List<SourceWebControl>()
				    {
						new SourceWebControl
						{
				            ClassFullName = "System.Web.UI.WebControls.Label",
				            FieldName = "TestTargetField"
						}
				    }
				};
				TargetClass targetClass = new TargetClass();
				var targetModelGenerator = new TargetModelGenerator();
				targetClass = targetModelGenerator.UpdateClass(sourceWebPage, targetClass);
				Assert.AreEqual(1, targetClass.TargetFieldList.Count);
				TestValidators.ValidateTargetField(targetClass.TargetFieldList[0],
											isDirty:true,
											sourceClassFullName:"System.Web.UI.WebControls.Label",
											sourceFieldName:"TestTargetField",
											targetControlType: EnumTargetControlType.Label,
											targetFieldName:"TestTargetField");
			}
		public TargetClass UpdateClass(SourceWebPage sourceWebPage, TargetClass targetClass)
		{
			foreach(var sourceControl in sourceWebPage.Controls)
			{
				var targetField = targetClass.TargetFieldList.SingleOrDefault(i=>i.SourceFieldName == sourceControl.FieldName);
				if(targetField == null)
				{
					targetField = new TargetField
					{
						IsDirty = true,
						SourceNamespaceName = sourceControl.NamespaceName,
						SourceClassName = sourceControl.ClassName,
						SourceFieldName = sourceControl.FieldName,
						TargetFieldName = sourceControl.FieldName
					};
					EnumTargetControlType targetControlType;
					targetControlType = GetTargetControlType(sourceControl);
					targetField.TargetControlType = targetControlType;
					targetClass.TargetFieldList.Add(targetField);
				}
				else 
				{
					if(targetField.SourceClassFullName != sourceControl.ClassFullName)
					{
						targetField.SourceClassName = sourceControl.ClassName;
						targetField.SourceNamespaceName = sourceControl.NamespaceName;
						targetField.IsDirty = true;
					}
					var targetControlType = GetTargetControlType(sourceControl);
					if(targetField.TargetControlType != targetControlType)
					{
						targetField.TargetControlType = targetControlType;
						targetField.IsDirty = true;
					}
				}
			}
			return targetClass;
		}
		//public TargetProject UpdateProject(TargetProject targetProject, SourceWebProject sourceProject)
		//{
		//    //List<TargetClass> classesToAddToProject = new List<TargetClass>();
		//    //foreach (var masterPage in sourceProject.MasterPageList)
		//    //{
		//    //    //Find existing object
		//    //    var targetClass = targetProject.TargetClassList.SingleOrDefault(i => i.SourceClassFullName == masterPage.ClassFullName);
		//    //    if (targetClass == null)
		//    //    {
		//    //        //If does not exist, create it
		//    //        targetClass = TargetClass.Create(targetProject, sourceProject, masterPage);
		//    //        classesToAddToProject.Add(targetClass);
		//    //    }
		//    //    targetClass.ExpectedUrl = masterPage.PageUrl;
		//    //    targetClass.TargetObjectType = EnumTargetObjectType.MasterPage;
		//    //    //For each missing field, add it
		//    //    var comparison = TargetClassComparisonResult.Compare(masterPage, targetClass);
		//    //    targetClass.EnsureFiles(targetProjectPath);
		//    //    targetClass.AddFieldsToFile(targetProjectPath, targetClass.DesignerFilePath, comparison.FieldsToAdd);
		//    //}
		//    foreach (var sourcePage in sourceProject.WebPageList)
		//    {
		//        var targetClass = targetProject.TargetClassList.FirstOrDefault(i=>i.SourceClassFullName == sourcePage.ClassFullName);
		//        if(targetClass == null)
		//        {
		//            string relativeSourceNamespace;
		//            if(sourcePage.NamespaceName == sourceProject.RootNamespace)
		//            {
		//                relativeSourceNamespace = string.Empty;
		//            }
		//            else if(sourcePage.NamespaceName.StartsWith(sourceProject.RootNamespace))
		//            {
		//                relativeSourceNamespace = sourcePage.NamespaceName.Substring(sourceProject.RootNamespace.Length + 1);
		//            }
		//            else 
		//            {
		//                relativeSourceNamespace = sourcePage.NamespaceName;
		//            }
		//            string targetClassName = sourcePage.ClassName + "PageClient";
		//            string targetDirectory = @"Client\Pages\" + relativeSourceNamespace.Replace(".","\\");;
		//            string targetNamespace = targetProject.RootNamespace + ".Client.Pages." + relativeSourceNamespace;
		//            targetClass = new TargetClass
		//            {
		//                SourceClassFullName = sourcePage.ClassFullName,
		//                TargetClassFullName = targetNamespace + "." + targetClassName,
		//                DesignerFilePath = Path.Combine(targetDirectory, targetClassName + ".designer.cs"),
		//                UserFilePath = Path.Combine(targetDirectory, targetClassName + ".cs"),
		//                TargetObjectType = EnumTargetObjectType.WebPage,
		//                ExpectedUrl = sourcePage.PageUrl
		//            };
		//            targetProject.TargetClassList.Add(targetClass);
		//        }
		//    }
		//    return targetProject;
		//}

		public TargetClassComparisonResult CompareClass(SourceWebProject sourceProject, SourceWebPage sourceClass, TargetProject targetProject, TargetClass targetClass)
		{
			TargetClassComparisonResult result;
			if(targetClass == null)
			{
				string relativeSourceNamespace;
				if (sourceClass.NamespaceName == sourceProject.RootNamespace)
				{
					relativeSourceNamespace = string.Empty;
				}
				else if (sourceClass.NamespaceName.StartsWith(sourceProject.RootNamespace))
				{
					relativeSourceNamespace = sourceClass.NamespaceName.Substring(sourceProject.RootNamespace.Length + 1);
				}
				else
				{
					relativeSourceNamespace = sourceClass.NamespaceName;
				}
				string targetClassName = sourceClass.ClassName + "PageClient";
				string targetDirectory = @"Client\Pages";
				string targetNamespace = targetProject.RootNamespace + ".Client.Pages";
				if(!string.IsNullOrEmpty(relativeSourceNamespace))
				{
					targetDirectory += "\\" + relativeSourceNamespace.Replace(".", "\\");
					targetNamespace += "." + relativeSourceNamespace;
				}
				result = new TargetClassComparisonResult
				{
					SourceClassFullName = sourceClass.ClassFullName,
					TargetClassName = targetClassName,
					TargetNamespaceName = targetNamespace,
					DesignerFileRelativePath = Path.Combine(targetDirectory, targetClassName + ".designer.cs"),
					UserFileRelativePath = Path.Combine(targetDirectory, targetClassName + ".cs"),
					SourceObjectType = EnumSourceObjectType.WebPage,
					ExpectedUrl = sourceClass.PageUrl,
					IsDirty = true
				};
			}
			else 
			{
				result = new TargetClassComparisonResult
				{
					SourceClassFullName = targetClass.SourceClassFullName,
					TargetClassFullName = targetClass.TargetClassFullName,
					DesignerFileRelativePath = targetClass.DesignerFileRelativePath,
					UserFileRelativePath = targetClass.UserFileRelativePath,
					SourceObjectType = targetClass.SourceObjectType,
					ExpectedUrl = targetClass.ExpectedUrl
				};
				if(targetClass.ExpectedUrl != sourceClass.PageUrl)
				{
					result.ExpectedUrl = sourceClass.PageUrl;
					result.IsDirty = true;
				}
				if(targetClass.SourceObjectType != sourceClass.SourceObjectType)
				{
					result.SourceObjectType = sourceClass.SourceObjectType;
					result.IsDirty = true;
				}
			}
			foreach(var sourceControl in sourceClass.Controls)
			{
				TargetField targetControl = null;
				if(targetClass != null)
				{
					targetControl = targetClass.TargetFieldList.SingleOrDefault(i => i.SourceFieldName == sourceControl.FieldName);
				}
				if(targetControl == null)
				{
				    targetControl = new TargetField
				    {
				        SourceClassFullName = sourceControl.ClassFullName,
				        SourceFieldName = sourceControl.FieldName,
						TargetControlType = this.TargetClassManager.GetTargetControlType(sourceControl.ClassFullName),
				        IsDirty = true,
						TargetFieldName = sourceControl.FieldName
				    };
				    result.FieldsToAdd.Add(targetControl);
					result.IsDirty = true;
				}
				else if(targetControl.SourceClassFullName != sourceControl.ClassFullName)
				{
				    targetControl.SourceClassFullName = sourceControl.ClassFullName;
					result.FieldsToUpdate.Add(targetControl);
				    targetControl.IsDirty = true;
					result.IsDirty = true;
				}
			}
			return result;
		}
Example #12
0
        //public TargetProject UpdateProject(TargetProject targetProject, SourceWebProject sourceProject)
        //{
        //    //List<TargetClass> classesToAddToProject = new List<TargetClass>();
        //    //foreach (var masterPage in sourceProject.MasterPageList)
        //    //{
        //    //    //Find existing object
        //    //    var targetClass = targetProject.TargetClassList.SingleOrDefault(i => i.SourceClassFullName == masterPage.ClassFullName);
        //    //    if (targetClass == null)
        //    //    {
        //    //        //If does not exist, create it
        //    //        targetClass = TargetClass.Create(targetProject, sourceProject, masterPage);
        //    //        classesToAddToProject.Add(targetClass);
        //    //    }
        //    //    targetClass.ExpectedUrl = masterPage.PageUrl;
        //    //    targetClass.TargetObjectType = EnumTargetObjectType.MasterPage;
        //    //    //For each missing field, add it
        //    //    var comparison = TargetClassComparisonResult.Compare(masterPage, targetClass);
        //    //    targetClass.EnsureFiles(targetProjectPath);
        //    //    targetClass.AddFieldsToFile(targetProjectPath, targetClass.DesignerFilePath, comparison.FieldsToAdd);
        //    //}
        //    foreach (var sourcePage in sourceProject.WebPageList)
        //    {
        //        var targetClass = targetProject.TargetClassList.FirstOrDefault(i=>i.SourceClassFullName == sourcePage.ClassFullName);
        //        if(targetClass == null)
        //        {
        //            string relativeSourceNamespace;
        //            if(sourcePage.NamespaceName == sourceProject.RootNamespace)
        //            {
        //                relativeSourceNamespace = string.Empty;
        //            }
        //            else if(sourcePage.NamespaceName.StartsWith(sourceProject.RootNamespace))
        //            {
        //                relativeSourceNamespace = sourcePage.NamespaceName.Substring(sourceProject.RootNamespace.Length + 1);
        //            }
        //            else
        //            {
        //                relativeSourceNamespace = sourcePage.NamespaceName;
        //            }
        //            string targetClassName = sourcePage.ClassName + "PageClient";
        //            string targetDirectory = @"Client\Pages\" + relativeSourceNamespace.Replace(".","\\");;
        //            string targetNamespace = targetProject.RootNamespace + ".Client.Pages." + relativeSourceNamespace;
        //            targetClass = new TargetClass
        //            {
        //                SourceClassFullName = sourcePage.ClassFullName,
        //                TargetClassFullName = targetNamespace + "." + targetClassName,
        //                DesignerFilePath = Path.Combine(targetDirectory, targetClassName + ".designer.cs"),
        //                UserFilePath = Path.Combine(targetDirectory, targetClassName + ".cs"),
        //                TargetObjectType = EnumTargetObjectType.WebPage,
        //                ExpectedUrl = sourcePage.PageUrl
        //            };
        //            targetProject.TargetClassList.Add(targetClass);
        //        }
        //    }
        //    return targetProject;
        //}

        public TargetClassComparisonResult CompareClass(SourceWebProject sourceProject, SourceWebPage sourceClass, TargetProject targetProject, TargetClass targetClass)
        {
            TargetClassComparisonResult result;

            if (targetClass == null)
            {
                string relativeSourceNamespace;
                if (sourceClass.NamespaceName == sourceProject.RootNamespace)
                {
                    relativeSourceNamespace = string.Empty;
                }
                else if (sourceClass.NamespaceName.StartsWith(sourceProject.RootNamespace))
                {
                    relativeSourceNamespace = sourceClass.NamespaceName.Substring(sourceProject.RootNamespace.Length + 1);
                }
                else
                {
                    relativeSourceNamespace = sourceClass.NamespaceName;
                }
                string targetClassName = sourceClass.ClassName + "PageClient";
                string targetDirectory = @"Client\Pages";
                string targetNamespace = targetProject.RootNamespace + ".Client.Pages";
                if (!string.IsNullOrEmpty(relativeSourceNamespace))
                {
                    targetDirectory += "\\" + relativeSourceNamespace.Replace(".", "\\");
                    targetNamespace += "." + relativeSourceNamespace;
                }
                result = new TargetClassComparisonResult
                {
                    SourceClassFullName      = sourceClass.ClassFullName,
                    TargetClassName          = targetClassName,
                    TargetNamespaceName      = targetNamespace,
                    DesignerFileRelativePath = Path.Combine(targetDirectory, targetClassName + ".designer.cs"),
                    UserFileRelativePath     = Path.Combine(targetDirectory, targetClassName + ".cs"),
                    SourceObjectType         = EnumSourceObjectType.WebPage,
                    ExpectedUrl = sourceClass.PageUrl,
                    IsDirty     = true
                };
            }
            else
            {
                result = new TargetClassComparisonResult
                {
                    SourceClassFullName      = targetClass.SourceClassFullName,
                    TargetClassFullName      = targetClass.TargetClassFullName,
                    DesignerFileRelativePath = targetClass.DesignerFileRelativePath,
                    UserFileRelativePath     = targetClass.UserFileRelativePath,
                    SourceObjectType         = targetClass.SourceObjectType,
                    ExpectedUrl = targetClass.ExpectedUrl
                };
                if (targetClass.ExpectedUrl != sourceClass.PageUrl)
                {
                    result.ExpectedUrl = sourceClass.PageUrl;
                    result.IsDirty     = true;
                }
                if (targetClass.SourceObjectType != sourceClass.SourceObjectType)
                {
                    result.SourceObjectType = sourceClass.SourceObjectType;
                    result.IsDirty          = true;
                }
            }
            foreach (var sourceControl in sourceClass.Controls)
            {
                TargetField targetControl = null;
                if (targetClass != null)
                {
                    targetControl = targetClass.TargetFieldList.SingleOrDefault(i => i.SourceFieldName == sourceControl.FieldName);
                }
                if (targetControl == null)
                {
                    targetControl = new TargetField
                    {
                        SourceClassFullName = sourceControl.ClassFullName,
                        SourceFieldName     = sourceControl.FieldName,
                        TargetControlType   = this.TargetClassManager.GetTargetControlType(sourceControl.ClassFullName),
                        IsDirty             = true,
                        TargetFieldName     = sourceControl.FieldName
                    };
                    result.FieldsToAdd.Add(targetControl);
                    result.IsDirty = true;
                }
                else if (targetControl.SourceClassFullName != sourceControl.ClassFullName)
                {
                    targetControl.SourceClassFullName = sourceControl.ClassFullName;
                    result.FieldsToUpdate.Add(targetControl);
                    targetControl.IsDirty = true;
                    result.IsDirty        = true;
                }
            }
            return(result);
        }