/// <summary>
 /// Generate constraint description for a composite primary key
 /// </summary>
 /// <param name="compositePK"></param>
 /// <returns></returns>
 public static string SchemaConstraintsPK(CompositePK compositePK)
 {
     string line = "";
     foreach (SinglePK pk in compositePK.PKList)
     {
         line += SchemaConstraintsPK(pk) + "<br/>- ";
     }
     return line.Substring(0, line.Length - 7);
 }
        /// <summary>
        /// Only handle (2-2) composite PK
        /// Given the mapping file's id Element
        /// return POJO class/table primary key
        /// </summary>
        /// <param name="idEle"></param>
        /// <param name="classFullName"></param>
        /// <param name="tableName"></param>
        /// <param name="pkgName"></param>
        /// <returns>CompositePK</returns>
        private CompositePK _GetMappingFilePrimaryKey_CompositePK(XElement idEle, string classFullName, string tableName, string pkgName)
        {
            string classPK_C = "";
            string classPKType = "";
            XAttribute classPK_NameAttr = idEle.Attributes("name").SingleOrDefault();
            XAttribute classPK_ClassAttr = idEle.Attributes("class").SingleOrDefault();
            if (classPK_NameAttr != null && classPK_ClassAttr != null)
            {
                classPK_C = classFullName + "." + classPK_NameAttr.Value;
                classPKType = classPK_ClassAttr.Value;
                if (pkgName != "")
                {
                    classPKType = pkgName + "." + classPKType;
                }
            }

            List<string> tablePK_C = new List<string>();
            List<SinglePK> pkList = new List<SinglePK>();
            foreach (XElement subEle in idEle.Elements())
            {
                if (subEle.Name.ToString().Contains("key-"))
                {
                    string classPkL = subEle.Attributes("name").SingleOrDefault().Value;

                    string tablePkL = classPkL;
                    string constraintInfoL = "";
                    XAttribute colAttr = subEle.Attributes("column").SingleOrDefault();
                    if (colAttr != null)
                    {
                        tablePkL = colAttr.Value;
                        constraintInfoL = DBConstraintExtractorXML.GetConstraintInfo(subEle);
                    }
                    else
                    {
                        //tablePk = subEle.Descendants("column").SingleOrDefault().Attributes("name").SingleOrDefault().Value;
                        XElement colEleL = subEle.Descendants("column").SingleOrDefault();
                        if (colEleL != null)
                        {
                            XAttribute tablePkAttr = colEleL.Attributes("name").SingleOrDefault();
                            if (tablePkAttr != null)
                            {
                                tablePkL = tablePkAttr.Value;
                            }
                            constraintInfoL = DBConstraintExtractorXML.GetConstraintInfo(colEleL);
                        }
                    }

                    string pkTypeL = "";
                    XAttribute typeAttr = subEle.Attributes("type").SingleOrDefault();
                    if (typeAttr != null)
                    {
                        pkTypeL = typeAttr.Value;
                    }

                    if (classPKType != "" && classPkL != "")
                    {
                        classPkL = classPKType + "." + classPkL;
                    }

                    if (classPKType == "" && classPkL != "")
                    {
                        classPkL = classFullName + "." + classPkL;
                    }

                    pkList.Add(new SinglePK(classPkL, tableName + "." + tablePkL, pkTypeL, constraintInfoL, ""));
                    tablePK_C.Add(tableName + "." + tablePkL);
                }
            }

            CompositePK pk = new CompositePK(classPK_C, tablePK_C, classPKType, pkList);
            return pk;
        }