]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java
1. Refresh applicable library instances after one illegal library instance is removed.
[mirror_edk2.git] / Tools / Java / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdFileContents.java
index fdf5fb55e77f2dff6f78ae3638588040ad104541..4bca7fe22d047d22937b183565d3129d466028f9 100644 (file)
@@ -58,10 +58,12 @@ import org.tianocore.PlatformHeaderDocument;
 import org.tianocore.SkuInfoDocument;\r
 import org.tianocore.UserDefinedAntTasksDocument;\r
 import org.tianocore.UserExtensionsDocument;\r
+import org.tianocore.LibrariesDocument.Libraries.Instance;\r
 import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile;\r
 import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery;\r
 import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;\r
 import org.tianocore.frameworkwizard.packaging.PackageIdentification;\r
+import org.tianocore.frameworkwizard.workspace.Workspace;\r
 \r
 /**\r
  This class processes fpd file contents such as add remove xml elements. \r
@@ -383,7 +385,7 @@ public class FpdFileContents {
         cursor.dispose();\r
     }\r
     \r
-    public boolean adjustPcd (int seqModuleSa) throws Exception {\r
+    public boolean adjustPcd (String seqModuleSa, Vector<String> vExceptions) throws Exception {\r
         boolean dataModified = false;\r
         ModuleSADocument.ModuleSA moduleSa = getModuleSA(seqModuleSa);\r
         int pcdCount = getPcdDataCount(seqModuleSa);\r
@@ -402,6 +404,10 @@ public class FpdFileContents {
         String[][] saaLib = new String[libCount][5];\r
         getLibraryInstances(moduleKey, saaLib);\r
         ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey);\r
+        if (mi == null) {\r
+            vExceptions.add("Module " + mg + " does NOT exist in workspace.");\r
+            throw new Exception ("Module does NOT exist in workspace.");\r
+        }\r
         Vector<ModuleIdentification> vMi = new Vector<ModuleIdentification>();\r
         //\r
         // create vector for module & library instance MIs.\r
@@ -410,14 +416,19 @@ public class FpdFileContents {
         for (int j = 0; j < saaLib.length; ++j) {\r
             String libKey = saaLib[j][1] + " " + saaLib[j][2] + " " + saaLib[j][3] + " " + saaLib[j][4];\r
             ModuleIdentification libMi = WorkspaceProfile.getModuleId(libKey);\r
-            vMi.add(libMi);\r
+            if (libMi != null) {\r
+                vMi.add(libMi);\r
+            }\r
         }\r
         \r
     nextPcd:for (int i = 0; i < saaModuleSaPcd.length; ++i) {\r
 \r
                 for (int j = 0; j < vMi.size(); ++j) {\r
                     ModuleIdentification nextMi = vMi.get(j);\r
-                    if (WorkspaceProfile.pcdInMsa(saaModuleSaPcd[i][0], saaModuleSaPcd[i][1], nextMi)) {\r
+                    if (nextMi == null) {\r
+                        continue;\r
+                    }\r
+                    if (WorkspaceProfile.pcdInMsa(saaModuleSaPcd[i][0], saaModuleSaPcd[i][1], arch, nextMi)) {\r
                         continue nextPcd;\r
                     }\r
                 }\r
@@ -445,6 +456,13 @@ public class FpdFileContents {
                             }\r
                         }\r
                     }\r
+                    // Check sup arch conformance for the new PCD\r
+                    if (msaPcd.getSupArchList() != null) {\r
+                       String newPcdArch = msaPcd.getSupArchList().toString();\r
+                       if (!newPcdArch.toLowerCase().contains(arch.toLowerCase())) {\r
+                               continue;\r
+                       }\r
+                    }\r
                     \r
                     PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, vMi.get(i));\r
                     PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
@@ -452,8 +470,13 @@ public class FpdFileContents {
                         //\r
                         // ToDo Error \r
                         //\r
-                        throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd.getCName() + " in Module "\r
-                                                  + mi.getName());\r
+                        String errorMessage = "No Declaration for PCD Entry " + msaPcd.getCName() + " in Module "\r
+                        + mi.getName();\r
+                        if (i != 0) {\r
+                            errorMessage += " Library Instance " + vMi.get(i).getName(); \r
+                        }\r
+                        vExceptions.add(errorMessage);\r
+                        throw new PcdDeclNotFound(errorMessage);\r
                     }\r
                     //\r
                     // AddItem to ModuleSA PcdBuildDefinitions\r
@@ -501,8 +524,8 @@ public class FpdFileContents {
     //\r
     // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer Arch"\r
     //\r
-    public int getPcdDataCount (int i){\r
-        ModuleSADocument.ModuleSA msa = getModuleSA(i);\r
+    public int getPcdDataCount (String key){\r
+        ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
         \r
         if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){\r
             return 0;\r
@@ -511,8 +534,8 @@ public class FpdFileContents {
         \r
     }\r
     \r
-    public void getPcdData (int i, String[][] saa) {\r
-        ModuleSADocument.ModuleSA msa = getModuleSA(i);\r
+    public void getPcdData (String key, String[][] saa) {\r
+        ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
         \r
         if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){\r
             return;\r
@@ -531,8 +554,8 @@ public class FpdFileContents {
         }\r
     }\r
     \r
-    public void removePcdData (int seqModuleSa, String cName, String tsGuid) {\r
-        ModuleSADocument.ModuleSA moduleSa = getModuleSA(seqModuleSa);\r
+    public void removePcdData (String key, String cName, String tsGuid) {\r
+        ModuleSADocument.ModuleSA moduleSa = getModuleSA(key);\r
         if (moduleSa == null || moduleSa.getPcdBuildDefinition() == null){\r
             return;\r
         }\r
@@ -551,7 +574,7 @@ public class FpdFileContents {
                 PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
                 if (pcdData.getCName().equals(cName) && pcdData.getTokenSpaceGuidCName().equals(tsGuid)) {\r
                     maintainDynPcdMap(cName + " " + tsGuid, moduleKey);\r
-                    if (getPcdDataCount(seqModuleSa) == 1) {\r
+                    if (getPcdDataCount(key) == 1) {\r
                         cursor.toParent();\r
                     }\r
                     cursor.removeXml();\r
@@ -671,7 +694,7 @@ public class FpdFileContents {
         \r
         int pcdSourceCount = 0;\r
         for (int i = 0; i < vMi.size(); ++i) {\r
-            if (WorkspaceProfile.pcdInMsa(cName, tsGuidCName, vMi.get(i))) {\r
+            if (WorkspaceProfile.pcdInMsa(cName, tsGuidCName, null, vMi.get(i))) {\r
                 pcdSourceCount++;\r
             }\r
         }\r
@@ -758,17 +781,50 @@ public class FpdFileContents {
         }\r
     }\r
     \r
-    public void removeLibraryInstance(String key, int i) {\r
+    public boolean instanceExistsInModuleSA (String key, String mg, String mv, String pg, String pv) {\r
+        int count = 0;\r
+        if ((count = getLibraryInstancesCount(key)) > 0) {\r
+            String[][] saa = new String[count][5];\r
+            getLibraryInstances (key, saa);\r
+            for (int i = 0; i < count; ++i) {\r
+                if (mg.equalsIgnoreCase(saa[i][1]) && pg.equalsIgnoreCase(saa[i][3])) {\r
+                    boolean modVerMatch = false;\r
+                    boolean pkgVerMatch = false;\r
+                    if ((mv.equals("null") || saa[i][2] == null)) {\r
+                        modVerMatch = true;\r
+                    }\r
+                    if (pv.equals("null") || saa[i][4] == null) {\r
+                        pkgVerMatch = true;\r
+                    }\r
+                    if (modVerMatch && pkgVerMatch) {\r
+                    return true;\r
+                }\r
+                    else {\r
+                        if (mv.equals(saa[i][2]) && pv.equals(saa[i][4])) {\r
+                            return true;\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+    \r
+    public void removeLibraryInstance(String key, String instanceKey) {\r
         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
         if (msa == null || msa.getLibraries() == null){\r
             return ;\r
         }\r
         \r
+        String[] instanceInfo = instanceKey.split(" ");\r
         XmlCursor cursor = msa.getLibraries().newCursor();\r
         if (cursor.toFirstChild()) {\r
-            for (int j = 0; j < i; ++j) {\r
-                cursor.toNextSibling();\r
+            do {\r
+                Instance libIns = (Instance)cursor.getObject();\r
+                if (libIns.getModuleGuid().equalsIgnoreCase(instanceInfo[0]) && libIns.getPackageGuid().equalsIgnoreCase(instanceInfo[2])) {\r
+                    break;\r
             }\r
+            }while (cursor.toNextSibling());\r
             cursor.push();\r
             while (cursor.hasPrevToken()) {\r
                 cursor.toPrevToken();\r
@@ -815,7 +871,7 @@ public class FpdFileContents {
         XmlCursor cursor = instance.newCursor();\r
         try{\r
             String comment = "Pkg: " + pn + " Mod: " + mn \r
-                + " Path: " + libMi.getPath().substring(System.getenv("WORKSPACE").length() + 1);\r
+                + " Path: " + libMi.getPath().substring(Workspace.getCurrentWorkspace().length() + 1);\r
             cursor.insertComment(comment);\r
         }\r
         catch (Exception e){\r
@@ -1164,13 +1220,18 @@ public class FpdFileContents {
         ListIterator li = l.listIterator();\r
         while (li.hasNext()) {\r
             PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry) li.next();\r
+            if (msaPcd.getSupArchList() != null) {\r
+               if (!msaPcd.getSupArchList().toString().toLowerCase().contains(arch.toLowerCase())) {\r
+                       continue;\r
+               }\r
+            }\r
             PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
             if (spdPcd == null) {\r
                 //\r
                 // ToDo Error \r
                 //\r
-                throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd.getCName() + " in Module "\r
-                                          + mi.getName());\r
+                throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd.getCName() + "\n used by Module "\r
+                                          + mi.getName() + " or its Library Instances.");\r
             }\r
             //\r
             // AddItem to ModuleSA PcdBuildDefinitions\r
@@ -1218,7 +1279,7 @@ public class FpdFileContents {
         XmlCursor cursor = msa.newCursor();\r
         try{\r
             String comment = "Mod: " + mi.getName() + " Type: " + SurfaceAreaQuery.getModuleType(mi) + " Path: "\r
-                            + mi.getPath().substring(System.getenv("WORKSPACE").length() + 1);\r
+                            + mi.getPath().substring(Workspace.getCurrentWorkspace().length() + 1);\r
             cursor.insertComment(comment);\r
         }\r
         catch(Exception e){\r
@@ -1331,7 +1392,7 @@ public class FpdFileContents {
         fpdPcd.setDatumType(PcdDataTypes.Enum.forString(dataType));\r
         fpdPcd.setItemType(PcdItemTypes.Enum.forString(itemType));\r
         \r
-        if (defaultVal != null){\r
+        if (defaultVal != null && defaultVal.length() > 0){\r
             fpdPcd.setValue(defaultVal);\r
         }\r
         else {\r
@@ -1342,7 +1403,7 @@ public class FpdFileContents {
                 fpdPcd.setValue("FALSE");\r
             }\r
             if (dataType.equals("VOID*")) {\r
-                fpdPcd.setValue("");\r
+                fpdPcd.setValue("L\"\"");\r
             }\r
         }\r
         //\r
@@ -1493,7 +1554,7 @@ public class FpdFileContents {
             saa[i][1] = dynPcd.getToken().toString();\r
             saa[i][2] = dynPcd.getTokenSpaceGuidCName();\r
             saa[i][3] = dynPcd.getMaxDatumSize()+"";\r
-            saa[i][4] = dynPcd.getDatumType().toString();\r
+            saa[i][4] = dynPcd.getDatumType()+"";\r
             \r
             ++i;\r
         }\r
@@ -1718,9 +1779,10 @@ public class FpdFileContents {
                 return;\r
             }\r
             else {\r
-                QName qSkuInfo = new QName(xmlNs, "SkuInfo");\r
-                cursor.toChild(qSkuInfo);\r
-                cursor.removeXml();\r
+               pcdData.getSkuInfoList().clear();\r
+//                QName qSkuInfo = new QName(xmlNs, "SkuInfo");\r
+//                cursor.toChild(qSkuInfo);\r
+//                cursor.removeXml();\r
             }\r
         }\r
         cursor.dispose();\r
@@ -1808,7 +1870,7 @@ public class FpdFileContents {
         \r
         UserExtensionsDocument.UserExtensions userExts = getfpdBuildOpts().addNewUserExtensions();\r
         userExts.setUserID(userId);\r
-        userExts.setIdentifier(new BigInteger(id));\r
+        userExts.setIdentifier(id);\r
         XmlCursor cursor = userExts.newCursor();\r
         cursor.toEndToken();\r
         \r
@@ -1839,7 +1901,7 @@ public class FpdFileContents {
         cursor.dispose();\r
     }\r
     \r
-    public int getUserExtsIncModCount (String fvName, String userId, int id) {\r
+    public int getUserExtsIncModCount (String fvName, String userId, String id) {\r
         if (getfpdBuildOpts().getUserExtensionsList() == null) {\r
             return -1;\r
         }\r
@@ -1851,7 +1913,7 @@ public class FpdFileContents {
             if (!ues.getUserID().equals(userId)) {\r
                 continue;\r
             }\r
-            if (ues.getIdentifier() == null || ues.getIdentifier().intValue() != id) {\r
+            if (ues.getIdentifier() == null || !ues.getIdentifier().equals(id)) {\r
                 continue;\r
             }\r
             XmlCursor cursor = ues.newCursor();\r
@@ -1873,7 +1935,7 @@ public class FpdFileContents {
         return -1;\r
     }\r
     \r
-    public void getUserExtsIncMods(String fvName, String userId, int id, String[][] saa) {\r
+    public void getUserExtsIncMods(String fvName, String userId, String id, String[][] saa) {\r
         if (getfpdBuildOpts().getUserExtensionsList() == null) {\r
             return;\r
         }\r
@@ -1893,7 +1955,7 @@ public class FpdFileContents {
         if (cursor.toChild(elementUserExts)) {\r
             do {\r
                 cursor.push();\r
-                if (cursor.getAttributeText(attribUserId).equals(userId) && cursor.getAttributeText(attribId).equals(id+"")) {\r
+                if (cursor.getAttributeText(attribUserId).equals(userId) && cursor.getAttributeText(attribId).equals(id)) {\r
                     cursor.toChild(elementFvName);\r
                     String elementName = cursor.getTextValue();\r
                     if (elementName.equals(fvName)) {\r
@@ -1940,7 +2002,7 @@ public class FpdFileContents {
         \r
     }\r
     \r
-    public void removeBuildOptionsUserExtensions (String fvName, String userId, int id) {\r
+    public void removeBuildOptionsUserExtensions (String fvName, String userId, String id) {\r
         if (getfpdBuildOpts().getUserExtensionsList() == null) {\r
             return;\r
         }\r
@@ -1951,7 +2013,7 @@ public class FpdFileContents {
             if (!ues.getUserID().equals(userId)) {\r
                 continue;\r
             }\r
-            if (ues.getIdentifier()== null || ues.getIdentifier().intValue() != id) {\r
+            if (ues.getIdentifier()== null || !ues.getIdentifier().equals(id)) {\r
                 continue;\r
             }\r
             XmlCursor cursor = ues.newCursor();\r
@@ -1982,7 +2044,7 @@ public class FpdFileContents {
         return false;\r
     }\r
     \r
-    public boolean moduleInBuildOptionsUserExtensions (String fvName, String userId, int id, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) {\r
+    public boolean moduleInBuildOptionsUserExtensions (String fvName, String userId, String id, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) {\r
         boolean inList = false;\r
         if (getUserExtsIncModCount(fvName, userId, id) > 0) {\r
             XmlCursor cursor = getfpdBuildOpts().newCursor();\r
@@ -2000,7 +2062,7 @@ public class FpdFileContents {
             if (cursor.toChild(elementUserExts)) {\r
                 do {\r
                     cursor.push();\r
-                    if (cursor.getAttributeText(attribUserId).equals(userId) && cursor.getAttributeText(attribId).equals(id+"")) {\r
+                    if (cursor.getAttributeText(attribUserId).equals(userId) && cursor.getAttributeText(attribId).equals(id)) {\r
                         cursor.toChild(elementFvName);\r
                         String elementName = cursor.getTextValue();\r
                         if (elementName.equals(fvName)) {\r
@@ -2043,7 +2105,7 @@ public class FpdFileContents {
         return inList;\r
     }\r
     \r
-    public void removeModuleInBuildOptionsUserExtensions (String fvName, String userId, int id, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) {\r
+    public void removeModuleInBuildOptionsUserExtensions (String fvName, String userId, String id, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) {\r
         //\r
         // if there is only one module before remove operation, the whole user extension should be removed.\r
         //\r
@@ -2069,7 +2131,7 @@ public class FpdFileContents {
             if (cursor.toChild(elementUserExts)) {\r
                 do {\r
                     cursor.push();\r
-                    if (cursor.getAttributeText(attribUserId).equals(userId) && cursor.getAttributeText(attribId).equals(id+"")) {\r
+                    if (cursor.getAttributeText(attribUserId).equals(userId) && cursor.getAttributeText(attribId).equals(id)) {\r
                         cursor.toChild(elementFvName);\r
                         String elementName = cursor.getTextValue();\r
                         if (elementName.equals(fvName)) {\r
@@ -2110,7 +2172,7 @@ public class FpdFileContents {
         }\r
     }\r
     \r
-    public void addModuleIntoBuildOptionsUserExtensions (String fvName, String userId, int id, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) {\r
+    public void addModuleIntoBuildOptionsUserExtensions (String fvName, String userId, String id, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) {\r
         if (moduleInBuildOptionsUserExtensions (fvName, userId, id, moduleGuid, moduleVersion, packageGuid, packageVersion, arch)) {\r
             return;\r
         }\r
@@ -2123,7 +2185,7 @@ public class FpdFileContents {
             if (!ues.getUserID().equals(userId)) {\r
                 continue;\r
             }\r
-            if (ues.getIdentifier() == null || ues.getIdentifier().intValue() != id) {\r
+            if (ues.getIdentifier() == null || !ues.getIdentifier().equals(id)) {\r
                 continue;\r
             }\r
             XmlCursor cursor = ues.newCursor();\r
@@ -2385,10 +2447,8 @@ public class FpdFileContents {
     }\r
     \r
     public void updateBuildOptionsFfsSectionsType(int i, String type) {\r
-        BuildOptionsDocument.BuildOptions.Ffs ffs = getfpdBuildOpts().addNewFfs();\r
-        if (type != null) {\r
-            ffs.addNewSections().setEncapsulationType(type);\r
-        }\r
+        BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
+        ffs.getSections().setEncapsulationType(type);\r
     }\r
     \r
     public void genBuildOptionsFfsAttribute(int i, String name, String value) {\r
@@ -3689,10 +3749,10 @@ class PcdItemTypeConflictException extends Exception {
     PcdItemTypeConflictException (String pcdName, String info) {\r
         ModuleIdentification mi = WorkspaceProfile.getModuleId(info);\r
         if (mi != null) {\r
-            details = pcdName + " ItemType Conflicts with " + mi.getName() + " in Pkg " + mi.getPackageId().getName();    \r
+            details = pcdName + " ItemType Conflicts with " + mi.getName() + "\n in Pkg " + mi.getPackageId().getName();    \r
         }\r
         else {\r
-            details = pcdName + " ItemType Conflicts with " + info;\r
+            details = pcdName + " ItemType Conflicts with \n" + info;\r
         }\r
     }\r
     \r
@@ -3715,7 +3775,7 @@ class PcdItemTypeConflictException extends Exception {
             moduleInfo2 = info2;\r
         }\r
         \r
-        details = pcdName + " ItemType Conflicts in " + moduleInfo1 + " and " + moduleInfo2;\r
+        details = pcdName + " ItemType Conflicts in \n" + moduleInfo1 + "\n and " + moduleInfo2;\r
     }\r
     \r
     public String getMessage() {\r