Example #1
0
 private string GetClassDeclaration(IClassMap classMap, ICodeMap codeMap)
 {
     if (codeMap.CodeLanguage == CodeLanguage.CSharp)
     {
         return("public class " + classMap.GetName());
     }
     if (codeMap.CodeLanguage == CodeLanguage.VB)
     {
         return("Public Class " + classMap.GetName());
     }
     throw new IAmOpenSourcePleaseImplementMeException("");
 }
Example #2
0
        public static void GenerateRepositoryGetAllObjectsMethod(IClassMap classMap, CodeTypeDeclaration classDecl)
        {
            CodeMemberMethod methodMember = new CodeMemberMethod();

            methodMember.Name = GetRepositoryGetAllObjectsMethodName(classMap);

            CodeTypeReference typeReference     = new CodeTypeReference(classMap.GetName());
            CodeTypeReference listTypeReference = new CodeTypeReference(typeof(IList));

            methodMember.ReturnType = listTypeReference;

            methodMember.Attributes = MemberAttributes.Public;

            CodeThisReferenceExpression  thisExp    = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeTypeOfExpression typeOfExp = new CodeTypeOfExpression(typeReference);

            CodeMethodInvokeExpression listInit = new CodeMethodInvokeExpression(contextVar, "GetObjects", new CodeExpression[] { typeOfExp });

            CodeVariableDeclarationStatement listVarDecl = new CodeVariableDeclarationStatement(typeof(IList), "list", listInit);
            CodeVariableReferenceExpression  listVar     = new CodeVariableReferenceExpression("list");

            methodMember.Statements.Add(listVarDecl);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(listVar);

            methodMember.Statements.Add(returnStmt);

            classDecl.Members.Add(methodMember);
        }
Example #3
0
        public static void GenerateRepositoryDeleteObjectMethod(IClassMap classMap, CodeTypeDeclaration classDecl)
        {
            CodeMemberMethod methodMember = new CodeMemberMethod();

            methodMember.Name = GetRepositoryDeleteObjectMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());

            methodMember.Attributes = MemberAttributes.Public;

            CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(typeReference, MakeCamelCase(classMap.GetName()));

            methodMember.Parameters.Add(parameter);

            CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(classMap.GetName()));

            CodeThisReferenceExpression  thisExp    = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeMethodInvokeExpression deleteCall = new CodeMethodInvokeExpression(contextVar, "DeleteObject", new CodeExpression[] { argExp });

            methodMember.Statements.Add(deleteCall);

            CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {});

            methodMember.Statements.Add(commitCtx);

            classDecl.Members.Add(methodMember);
        }
        public virtual MarshalQuery FromQuery(IQuery query)
        {
            MarshalQuery mq = new MarshalQuery();

            if (query is NPathQuery)
            {
                mq.QueryType = "NPathQuery";
            }
            if (query is SqlQuery)
            {
                mq.QueryType = "SqlQuery";
            }
            IClassMap classMap = Context.DomainMap.MustGetClassMap(query.PrimaryType);

            mq.PrimitiveType = classMap.GetName();
            mq.QueryString   = query.Query.ToString();
            foreach (IQueryParameter p in query.Parameters)
            {
                MarshalParameter mp = new MarshalParameter();
                mp.DbType = p.DbType;
                mp.Name   = p.Name;
                mp.Value  = FromParameterValue(p);
                mq.Parameters.Add(mp);
            }
            return(mq);
        }
        //Should have no refresh issues
        public override void LoadObject(ref object obj)
        {
            if (this.url.Length < 1)
            {
                throw new NPersistException("You must specify an url to your NPersist Web Service in your WebServiceRemotingEngine!");
            }
            RemotingService rs       = new RemotingService(this.Context, url);
            IClassMap       classMap = Context.DomainMap.MustGetClassMap(obj.GetType());
            string          id       = Context.ObjectManager.GetObjectIdentity(obj);

            bool doUseCompression = this.useCompression;

            if (this.compressor == null)
            {
                doUseCompression = false;
            }

            string result = rs.LoadObject(classMap.GetName(), id, this.domainKey, doUseCompression);

            if (useCompression && this.compressor != null)
            {
                result = this.compressor.Decompress(result);
            }

            MarshalObject          mo          = (MarshalObject)Formatter.Deserialize(result, typeof(MarshalObject));
            IMarshalingTransformer transformer = new MarshalingTransformer(Context);

            Context.IdentityMap.RegisterLoadedObject(obj);
            transformer.ToObject(mo, ref obj);
        }
        public virtual MarshalReference FromObjectAsReference(object sourceObject)
        {
            IClassMap        classMap = Context.DomainMap.MustGetClassMap(sourceObject.GetType());
            MarshalReference mr       = new MarshalReference();

            mr.Type = classMap.GetName();
            foreach (IPropertyMap propertyMap in classMap.GetIdentityPropertyMaps())
            {
                if (propertyMap.ReferenceType == ReferenceType.None)
                {
                    if (propertyMap.IsCollection)
                    {
                    }
                    else
                    {
                        mr.Value.ReferenceProperties.Add(FromProperty(sourceObject, propertyMap));
                    }
                }
                else
                {
                    if (propertyMap.IsCollection)
                    {
                    }
                    else
                    {
                        mr.Value.ReferenceProperties.Add(FromReference(sourceObject, propertyMap));
                    }
                }
            }

            return(mr);
        }
Example #7
0
        public override string GetTypeNameFromType(Type type)
        {
            IClassMap classMap = this.context.DomainMap.GetClassMap(type);

            if (classMap != null)
            {
                return(classMap.GetName());
            }
            return(type.Name);
        }
        public virtual MarshalObject FromObject(object sourceObject, bool upForCreation)
        {
            IClassMap     classMap = Context.DomainMap.MustGetClassMap(sourceObject.GetType());
            MarshalObject mo       = new MarshalObject();

            mo.Type = classMap.GetName();
            if (upForCreation)
            {
                if (classMap.HasIdAssignedBySource())
                {
                    mo.TempId = Context.ObjectManager.GetObjectIdentity(sourceObject);
                }
            }
            PropertyStatus propStatus;

            foreach (IPropertyMap propertyMap in classMap.GetAllPropertyMaps())
            {
                propStatus = Context.GetPropertyStatus(sourceObject, propertyMap.Name);
                if (propStatus != PropertyStatus.NotLoaded || upForCreation)
                {
                    if (propertyMap.ReferenceType == ReferenceType.None)
                    {
                        if (propertyMap.IsCollection)
                        {
                        }
                        else
                        {
                            if (upForCreation && propertyMap.GetIsAssignedBySource())
                            {
                            }
                            else
                            {
                                mo.Properties.Add(FromProperty(sourceObject, propertyMap));
                            }
                        }
                    }
                    else
                    {
                        if (propertyMap.IsCollection)
                        {
                            //mo.ReferenceLists.Add(FromReferenceList(sourceObject, propertyMap));
                        }
                        else
                        {
                            mo.References.Add(FromReference(sourceObject, propertyMap));
                        }
                    }
                }
            }

            return(mo);
        }
        public static CodeMemberMethod GenerateFactoryMethod(IClassMap classMap, IList propertyMaps)
        {
            CodeMemberMethod methodMember = new CodeMemberMethod();

            methodMember.Name = GetFactoryMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());

            methodMember.ReturnType = typeReference;

            methodMember.Attributes = MemberAttributes.Public;

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
                methodMember.Parameters.Add(parameter);
            }

            CodeVariableDeclarationStatement contextVarDecl = new CodeVariableDeclarationStatement("IContext", "context", null);
            CodeVariableReferenceExpression  contextVar     = new CodeVariableReferenceExpression("context");

            methodMember.Statements.Add(contextVarDecl);

            CodeTypeOfExpression       typeOfExp     = new CodeTypeOfExpression(typeReference);
            CodeMethodInvokeExpression newObjectInit = new CodeMethodInvokeExpression(contextVar, "CreateObject", new CodeExpression[] { typeOfExp });

            CodeCastExpression castExp = new CodeCastExpression(typeReference, newObjectInit);

            CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), castExp);
            CodeVariableReferenceExpression  newObjectVar     = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));

            methodMember.Statements.Add(newObjectVarDecl);

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                CodeArgumentReferenceExpression argExp          = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
                CodeVariableReferenceExpression propExp         = new CodeVariableReferenceExpression(MakeCamelCase(classMap.Name) + "." + propertyMap.Name);
                CodeAssignStatement             assignStatement = new CodeAssignStatement(propExp, argExp);
                methodMember.Statements.Add(assignStatement);
            }

            CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {});

            methodMember.Statements.Add(commitCtx);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar);

            methodMember.Statements.Add(returnStmt);

            return(methodMember);
        }
        private MarshalReference FromReference(object sourceObject, IPropertyMap propertyMap)
        {
            MarshalReference mr = new MarshalReference();

            mr.Name = propertyMap.Name;
            object value = Context.ObjectManager.GetPropertyValue(sourceObject, propertyMap.Name);

            if (value != null)
            {
                IClassMap classMap = Context.DomainMap.MustGetClassMap(value.GetType());
                mr.Type   = classMap.GetName();
                mr.IsNull = false;
            }
            else
            {
                IClassMap refClassMap = propertyMap.MustGetReferencedClassMap();
                if (refClassMap != null)
                {
                    mr.Type = refClassMap.GetName();
                }
                mr.IsNull = true;
            }
            mr.Value = FromPropertyReference(sourceObject, value, propertyMap);
            if (Context.ObjectManager.HasOriginalValues(sourceObject, propertyMap.Name))
            {
                object orgValue = Context.ObjectManager.GetOriginalPropertyValue(sourceObject, propertyMap.Name);
                mr.OriginalValue = FromPropertyReference(sourceObject, orgValue, propertyMap);
                mr.HasOriginal   = true;
                if (orgValue != null)
                {
                    IClassMap orgClassMap = Context.DomainMap.MustGetClassMap(orgValue.GetType());
                    mr.OriginalType = orgClassMap.GetName();
                    mr.WasNull      = false;
                }
                else
                {
                    IClassMap refClassMap = propertyMap.MustGetReferencedClassMap();
                    if (refClassMap != null)
                    {
                        mr.OriginalType = refClassMap.GetName();
                    }
                    mr.WasNull = true;
                }
            }
            else
            {
                //mr.OriginalValue = FromPropertyReference(sourceObject, null, propertyMap);
                mr.HasOriginal = false;
            }
            return(mr);
        }
        public static CodeMemberMethod GenerateFactoryMethod(IClassMap classMap, IList propertyMaps)
        {
            CodeMemberMethod methodMember = new CodeMemberMethod() ;
            methodMember.Name = GetFactoryMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());
            methodMember.ReturnType = typeReference;

            methodMember.Attributes = MemberAttributes.Public;

            foreach(IPropertyMap propertyMap in propertyMaps)
            {
                CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
                methodMember.Parameters.Add(parameter);
            }

            CodeThisReferenceExpression thisExp = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeTypeOfExpression typeOfExp = new CodeTypeOfExpression(typeReference) ;
            CodeMethodInvokeExpression newObjectInit = new CodeMethodInvokeExpression(contextVar, "CreateObject", new CodeExpression[] { typeOfExp } ) ;

            CodeCastExpression castExp = new CodeCastExpression(typeReference, newObjectInit) ;

            CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), castExp) ;
            CodeVariableReferenceExpression newObjectVar = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));

            methodMember.Statements.Add(newObjectVarDecl);

            foreach(IPropertyMap propertyMap in propertyMaps)
            {
                CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
                CodeVariableReferenceExpression propExp = new CodeVariableReferenceExpression(MakeCamelCase(classMap.Name) + "." + propertyMap.Name);
                CodeAssignStatement assignStatement = new CodeAssignStatement(propExp, argExp);
                methodMember.Statements.Add(assignStatement);
            }

            CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {} ) ;

            methodMember.Statements.Add(commitCtx);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar) ;

            methodMember.Statements.Add(returnStmt);

            return methodMember;
        }
Example #12
0
        private CodeNamespace ClassMapToCodeNamespace(IClassMap classMap)
        {
            CodeNamespace       domainNamespace = new CodeNamespace(classMap.GetFullNamespace());
            CodeTypeDeclaration classDecl       = new CodeTypeDeclaration(classMap.GetName());

            if (classMap.ClassType == ClassType.Default || classMap.ClassType == ClassType.Class)
            {
                classDecl.IsClass = true;

                IClassMap super = classMap.GetInheritedClassMap();

                if (super != null)
                {
                    CodeTypeReference superDecl = new CodeTypeReference(super.GetFullName());
                    classDecl.BaseTypes.Add(superDecl);
                }

                foreach (IPropertyMap propertyMap in classMap.PropertyMaps)
                {
                    classDecl.Members.Add(PropertyMapToCodeMemberField(propertyMap));
                    classDecl.Members.Add(PropertyMapToCodeMemberProperty(propertyMap));
                }
            }
            else if (classMap.ClassType == ClassType.Enum)
            {
                classDecl.IsEnum = true;

                foreach (IEnumValueMap enumValueMap in classMap.GetEnumValueMaps())
                {
                    classDecl.Members.Add(EnumValueMapToCodeMemberField(enumValueMap));
                }
            }

            domainNamespace.Types.Add(classDecl);

            return(domainNamespace);
        }
		public static string GetFactoryClassName(IClassMap classMap)
		{		
			string name = classMap.GetName() + "Factory" ;

			return name;
		}
        public static string GetDLinqClassName(IClassMap classMap)
        {
            string name = classMap.GetName() ;

            return name;
        }
Example #15
0
        public static string GetFactoryMethodName(IClassMap classMap)
        {
            string name = "Create" + classMap.GetName();

            return(name);
        }
        public static void GenerateRepositoryDeleteObjectMethod(IClassMap classMap, CodeTypeDeclaration classDecl)
        {
            CodeMemberMethod methodMember = new CodeMemberMethod() ;
            methodMember.Name = GetRepositoryDeleteObjectMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());

            methodMember.Attributes = MemberAttributes.Public;

            CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(typeReference, MakeCamelCase(classMap.GetName()));
            methodMember.Parameters.Add(parameter);

            CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(classMap.GetName()));

            CodeThisReferenceExpression thisExp = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeMethodInvokeExpression deleteCall = new CodeMethodInvokeExpression(contextVar, "DeleteObject", new CodeExpression[] { argExp } ) ;

            methodMember.Statements.Add(deleteCall);

            CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {} ) ;

            methodMember.Statements.Add(commitCtx);

            classDecl.Members.Add(methodMember);
        }
Example #17
0
        public static string GetFactoryClassName(IClassMap classMap)
        {
            string name = classMap.GetName() + "Factory";

            return(name);
        }
        public static void GenerateRepositoryGetAllObjectsMethod(IClassMap classMap, CodeTypeDeclaration classDecl)
        {
            CodeMemberMethod methodMember = new CodeMemberMethod() ;
            methodMember.Name = GetRepositoryGetAllObjectsMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());
            CodeTypeReference listTypeReference = new CodeTypeReference(typeof(IList));
            methodMember.ReturnType = listTypeReference;

            methodMember.Attributes = MemberAttributes.Public;

            CodeThisReferenceExpression thisExp = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeTypeOfExpression typeOfExp = new CodeTypeOfExpression(typeReference) ;

            CodeMethodInvokeExpression listInit = new CodeMethodInvokeExpression(contextVar, "GetObjects", new CodeExpression[] { typeOfExp } ) ;

            CodeVariableDeclarationStatement listVarDecl = new CodeVariableDeclarationStatement(typeof(IList), "list", listInit) ;
            CodeVariableReferenceExpression listVar = new CodeVariableReferenceExpression("list");

            methodMember.Statements.Add(listVarDecl);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(listVar) ;

            methodMember.Statements.Add(returnStmt);

            classDecl.Members.Add(methodMember);
        }
Example #19
0
        public static void GenerateRepositoryUpdateObjectMethod(IClassMap classMap, CodeTypeDeclaration classDecl)
        {
            IList propertyMaps   = classMap.GetAllPropertyMaps();
            IList idPropertyMaps = classMap.GetIdentityPropertyMaps();

            CodeMemberMethod methodMember = new CodeMemberMethod();

            methodMember.Name = GetRepositoryUpdateObjectMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());

            methodMember.ReturnType = typeReference;

            methodMember.Attributes = MemberAttributes.Public;

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                if (!propertyMap.IsCollection)
                {
                    CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
                    methodMember.Parameters.Add(parameter);
                }
            }

            CodeThisReferenceExpression  thisExp    = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeExpression[] createParams = new CodeExpression[idPropertyMaps.Count];

            int i = 0;

            foreach (IPropertyMap idPropertyMap in idPropertyMaps)
            {
                CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(idPropertyMap.Name));
                createParams[i] = argExp;
                i++;
            }

            CodeMethodInvokeExpression newObjectInit = new CodeMethodInvokeExpression(thisExp, GetRepositoryGetByIdentityMethodName(classMap), createParams);

            CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), newObjectInit);
            CodeVariableReferenceExpression  newObjectVar     = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));

            methodMember.Statements.Add(newObjectVarDecl);

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                if (!propertyMap.IsIdentity)
                {
                    if (!propertyMap.IsCollection)
                    {
                        CodeArgumentReferenceExpression argExp          = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
                        CodeVariableReferenceExpression propExp         = new CodeVariableReferenceExpression(MakeCamelCase(classMap.Name) + "." + propertyMap.Name);
                        CodeAssignStatement             assignStatement = new CodeAssignStatement(propExp, argExp);
                        methodMember.Statements.Add(assignStatement);
                    }
                }
            }

            CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {});

            methodMember.Statements.Add(commitCtx);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar);

            methodMember.Statements.Add(returnStmt);

            classDecl.Members.Add(methodMember);
        }
Example #20
0
        public static void GenerateRepositoryGetByIdentityMethod(IClassMap classMap, CodeTypeDeclaration classDecl, bool tryMethod)
        {
            IList propertyMaps = classMap.GetIdentityPropertyMaps();

            CodeMemberMethod methodMember = new CodeMemberMethod();

            if (tryMethod)
            {
                methodMember.Name = GetRepositoryGetByIdentityMethodName(classMap);
            }
            else
            {
                methodMember.Name = GetRepositoryTryGetByIdentityMethodName(classMap);
            }

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());

            methodMember.ReturnType = typeReference;

            methodMember.Attributes = MemberAttributes.Public;

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
                methodMember.Parameters.Add(parameter);
            }

            CodeThisReferenceExpression  thisExp    = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeVariableDeclarationStatement dummyObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), "identityObject");
            CodeVariableReferenceExpression  dummyObjectVar     = new CodeVariableReferenceExpression("identityObject");

            CodeObjectCreateExpression dummyObjectCreateExpr = new CodeObjectCreateExpression(typeReference, new CodeExpression[] {});

            CodeAssignStatement assignDummyStatement = new CodeAssignStatement(dummyObjectVar, dummyObjectCreateExpr);

            methodMember.Statements.Add(dummyObjectVarDecl);
            methodMember.Statements.Add(assignDummyStatement);

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                CodeArgumentReferenceExpression argExp          = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
                CodeVariableReferenceExpression propExp         = new CodeVariableReferenceExpression("identityObject" + "." + propertyMap.Name);
                CodeAssignStatement             assignStatement = new CodeAssignStatement(propExp, argExp);
                methodMember.Statements.Add(assignStatement);
            }

            CodeTypeOfExpression       typeOfExp     = new CodeTypeOfExpression(typeReference);
            CodeMethodInvokeExpression newObjectInit = null;

            if (tryMethod)
            {
                newObjectInit = new CodeMethodInvokeExpression(contextVar, "GetObjectById", new CodeExpression[] { dummyObjectVar, typeOfExp });
            }
            else
            {
                newObjectInit = new CodeMethodInvokeExpression(contextVar, "TryGetObjectById", new CodeExpression[] { dummyObjectVar, typeOfExp });
            }

            CodeCastExpression castExp = new CodeCastExpression(typeReference, newObjectInit);

            CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), castExp);
            CodeVariableReferenceExpression  newObjectVar     = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));

            methodMember.Statements.Add(newObjectVarDecl);


            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar);

            methodMember.Statements.Add(returnStmt);

            classDecl.Members.Add(methodMember);
        }
		public static string GetFactoryMethodName(IClassMap classMap)
		{		
			string name = "Create" + classMap.GetName() ;

			return name;
		}
 private string GetClassDeclaration(IClassMap classMap, ICodeMap codeMap)
 {
     if (codeMap.CodeLanguage == CodeLanguage.CSharp)
         return "public class " + classMap.GetName();
     if (codeMap.CodeLanguage == CodeLanguage.VB)
         return "Public Class " + classMap.GetName();
     throw new IAmOpenSourcePleaseImplementMeException("");
 }
        public static void GenerateRepositoryGetByIdentityMethod(IClassMap classMap, CodeTypeDeclaration classDecl, bool tryMethod)
        {
            IList propertyMaps = classMap.GetIdentityPropertyMaps();

            CodeMemberMethod methodMember = new CodeMemberMethod() ;
            if (tryMethod)
                methodMember.Name = GetRepositoryGetByIdentityMethodName(classMap);
            else
                methodMember.Name = GetRepositoryTryGetByIdentityMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());
            methodMember.ReturnType = typeReference;

            methodMember.Attributes = MemberAttributes.Public;

            foreach(IPropertyMap propertyMap in propertyMaps)
            {
                CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
                methodMember.Parameters.Add(parameter);
            }

            CodeThisReferenceExpression thisExp = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeVariableDeclarationStatement dummyObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), "identityObject") ;
            CodeVariableReferenceExpression dummyObjectVar = new CodeVariableReferenceExpression("identityObject");

            CodeObjectCreateExpression dummyObjectCreateExpr = new CodeObjectCreateExpression(typeReference, new CodeExpression[] {} );

            CodeAssignStatement assignDummyStatement = new CodeAssignStatement(dummyObjectVar, dummyObjectCreateExpr);

            methodMember.Statements.Add(dummyObjectVarDecl);
            methodMember.Statements.Add(assignDummyStatement);

            foreach(IPropertyMap propertyMap in propertyMaps)
            {
                CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
                CodeVariableReferenceExpression propExp = new CodeVariableReferenceExpression("identityObject" + "." + propertyMap.Name);
                CodeAssignStatement assignStatement = new CodeAssignStatement(propExp, argExp);
                methodMember.Statements.Add(assignStatement);
            }

            CodeTypeOfExpression typeOfExp = new CodeTypeOfExpression(typeReference) ;
            CodeMethodInvokeExpression newObjectInit = null;
            if (tryMethod)
                newObjectInit = new CodeMethodInvokeExpression(contextVar, "GetObjectById", new CodeExpression[] { dummyObjectVar, typeOfExp } ) ;
            else
                newObjectInit = new CodeMethodInvokeExpression(contextVar, "TryGetObjectById", new CodeExpression[] { dummyObjectVar, typeOfExp } ) ;

            CodeCastExpression castExp = new CodeCastExpression(typeReference, newObjectInit) ;

            CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), castExp) ;
            CodeVariableReferenceExpression newObjectVar = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));

            methodMember.Statements.Add(newObjectVarDecl);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar) ;

            methodMember.Statements.Add(returnStmt);

            classDecl.Members.Add(methodMember);
        }
        public static void GenerateRepositoryUpdateObjectMethod(IClassMap classMap, CodeTypeDeclaration classDecl)
        {
            IList propertyMaps = classMap.GetAllPropertyMaps();
            IList idPropertyMaps = classMap.GetIdentityPropertyMaps();

            CodeMemberMethod methodMember = new CodeMemberMethod() ;
            methodMember.Name = GetRepositoryUpdateObjectMethodName(classMap);

            CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());
            methodMember.ReturnType = typeReference;

            methodMember.Attributes = MemberAttributes.Public;

            foreach(IPropertyMap propertyMap in propertyMaps)
            {
                if (!propertyMap.IsCollection)
                {
                    CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
                    methodMember.Parameters.Add(parameter);
                }
            }

            CodeThisReferenceExpression thisExp = new CodeThisReferenceExpression();
            CodeFieldReferenceExpression contextVar = new CodeFieldReferenceExpression(thisExp, "context");

            CodeExpression[] createParams = new CodeExpression[idPropertyMaps.Count];

            int i = 0;
            foreach(IPropertyMap idPropertyMap in idPropertyMaps)
            {
                CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(idPropertyMap.Name));
                createParams[i] = argExp;
                i++;
            }

            CodeMethodInvokeExpression newObjectInit = new CodeMethodInvokeExpression(thisExp, GetRepositoryGetByIdentityMethodName(classMap), createParams ) ;

            CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), newObjectInit) ;
            CodeVariableReferenceExpression newObjectVar = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));

            methodMember.Statements.Add(newObjectVarDecl);

            foreach(IPropertyMap propertyMap in propertyMaps)
            {
                if (!propertyMap.IsIdentity)
                {
                    if (!propertyMap.IsCollection)
                    {
                        CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
                        CodeVariableReferenceExpression propExp = new CodeVariableReferenceExpression(MakeCamelCase(classMap.Name) + "." + propertyMap.Name);
                        CodeAssignStatement assignStatement = new CodeAssignStatement(propExp, argExp);
                        methodMember.Statements.Add(assignStatement);
                    }
                }
            }

            CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {} ) ;

            methodMember.Statements.Add(commitCtx);

            CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar) ;

            methodMember.Statements.Add(returnStmt);

            classDecl.Members.Add(methodMember);
        }
//		public static void GenerateFactoryMethods(IClassMap classMap, CodeTypeDeclaration classDecl)
//		{
//			IList propertyMaps = GetRequiredPropertyMaps(classMap);
//			classDecl.Members.Add(GenerateFactoryMethod(classMap, propertyMaps));
//
//			IList optionalPropertyMaps = GetOptionalPropertyMaps(classMap);
//			if (optionalPropertyMaps.Count > 0)
//			{
//				foreach (IPropertyMap propertyMap in optionalPropertyMaps)
//					propertyMaps.Add(propertyMap);
//
//				classDecl.Members.Add(GenerateFactoryMethod(classMap, propertyMaps));
//			}
//		}


//		public static CodeMemberMethod GenerateFactoryMethod(IClassMap classMap, IList propertyMaps)
//		{
//
//			CodeMemberMethod methodMember = new CodeMemberMethod() ;
//			methodMember.Name = GetFactoryMethodName(classMap);
//
//			CodeTypeReference typeReference = new CodeTypeReference(classMap.GetName());
//			methodMember.ReturnType = typeReference;
//
//			methodMember.Attributes = MemberAttributes.Public;
//
//			foreach(IPropertyMap propertyMap in propertyMaps)
//			{
//				CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(new CodeTypeReference(propertyMap.DataType), MakeCamelCase(propertyMap.Name));
//				methodMember.Parameters.Add(parameter);
//			}
//
//			CodeVariableDeclarationStatement contextVarDecl = new CodeVariableDeclarationStatement("IContext", "context", null) ;
//			CodeVariableReferenceExpression contextVar = new CodeVariableReferenceExpression("context");
//
//			methodMember.Statements.Add(contextVarDecl);
//
//			CodeTypeOfExpression typeOfExp = new CodeTypeOfExpression(typeReference) ;
//			CodeMethodInvokeExpression newObjectInit = new CodeMethodInvokeExpression(contextVar, "CreateObject", new CodeExpression[] { typeOfExp } ) ;
//
//			CodeCastExpression castExp = new CodeCastExpression(typeReference, newObjectInit) ;
//
//			CodeVariableDeclarationStatement newObjectVarDecl = new CodeVariableDeclarationStatement(classMap.GetName(), MakeCamelCase(classMap.GetName()), castExp) ;
//			CodeVariableReferenceExpression newObjectVar = new CodeVariableReferenceExpression(MakeCamelCase(classMap.GetName()));
//
//			methodMember.Statements.Add(newObjectVarDecl);
//
//			foreach(IPropertyMap propertyMap in propertyMaps)
//			{
//				CodeArgumentReferenceExpression argExp = new CodeArgumentReferenceExpression(MakeCamelCase(propertyMap.Name));
//				CodeVariableReferenceExpression propExp = new CodeVariableReferenceExpression(MakeCamelCase(classMap.Name) + "." + propertyMap.Name);
//				CodeAssignStatement assignStatement = new CodeAssignStatement(propExp, argExp);
//				methodMember.Statements.Add(assignStatement);
//			}
//
//			CodeMethodInvokeExpression commitCtx = new CodeMethodInvokeExpression(contextVar, "Commit", new CodeExpression[] {} ) ;
//
//			methodMember.Statements.Add(commitCtx);
//
//			CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(newObjectVar) ;
//
//			methodMember.Statements.Add(returnStmt);
//
//			return methodMember;
//
//		}

        #endregion


        #region Template

        public static string GetDLinqClassName(IClassMap classMap)
        {
            string name = classMap.GetName();

            return(name);
        }
        private CodeNamespace ClassMapToCodeNamespace(IClassMap classMap)
        {
            CodeNamespace domainNamespace = new CodeNamespace(classMap.GetFullNamespace()) ;
            CodeTypeDeclaration classDecl = new CodeTypeDeclaration(classMap.GetName()) ;

            if (classMap.ClassType == ClassType.Default || classMap.ClassType == ClassType.Class)
            {
                classDecl.IsClass = true;

                IClassMap super = classMap.GetInheritedClassMap();

                if (super != null)
                {
                    CodeTypeReference superDecl = new CodeTypeReference(super.GetFullName()) ;
                    classDecl.BaseTypes.Add(superDecl);
                }

                foreach (IPropertyMap propertyMap in classMap.PropertyMaps)
                {
                    classDecl.Members.Add(PropertyMapToCodeMemberField(propertyMap));
                    classDecl.Members.Add(PropertyMapToCodeMemberProperty(propertyMap));
                }

            }
            else if (classMap.ClassType == ClassType.Enum)
            {
                classDecl.IsEnum = true;

                foreach (IEnumValueMap enumValueMap in classMap.GetEnumValueMaps())
                {
                    classDecl.Members.Add(EnumValueMapToCodeMemberField(enumValueMap));
                }
            }

            domainNamespace.Types.Add(classDecl);

            return domainNamespace;
        }