]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java
Modify FrameworkModules editor for FPD files to meet the new PCD type adjust operatio...
[mirror_edk2.git] / Tools / Java / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdFileContents.java
index a59b2d4f792b5f6078ab37ac623fafade111942a..82a3ded696cd50b1471073e2fc5f6cca528b5b1d 100644 (file)
@@ -389,9 +389,9 @@ public class FpdFileContents {
         int pcdCount = getPcdDataCount(seqModuleSa);\r
         String[][] saaModuleSaPcd = new String[pcdCount][7];\r
         getPcdData(seqModuleSa, saaModuleSaPcd);\r
-        String mg = moduleSa.getModuleGuid();\r
+        String mg = moduleSa.getModuleGuid().toLowerCase();\r
         String mv = moduleSa.getModuleVersion();\r
-        String pg = moduleSa.getPackageGuid();\r
+        String pg = moduleSa.getPackageGuid().toLowerCase();\r
         String pv = moduleSa.getPackageVersion();\r
         String arch = listToString(moduleSa.getSupArchList());\r
         //\r
@@ -440,7 +440,7 @@ public class FpdFileContents {
                     ArrayList<String> al = getDynPcdMapValue(msaPcd.getCName() + " " + msaPcd.getTokenSpaceGuidCName());\r
                     if (al != null) {\r
                         for (int j = 0; j < al.size(); ++j) {\r
-                            if (al.get(j).contains(moduleKey)) {\r
+                            if (al.get(j).startsWith(moduleKey)) {\r
                                 continue msaPcdIter;\r
                             }\r
                         }\r
@@ -462,7 +462,7 @@ public class FpdFileContents {
                                                                         : msaPcd.getDefaultValue();\r
 \r
                     genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(),\r
-                               msaPcd.getPcdItemType().toString(), spdPcd.getDatumType() + "", defaultVal, moduleSa);\r
+                               msaPcd.getPcdItemType().toString(), spdPcd.getDatumType() + "", defaultVal, moduleSa, spdPcd);\r
                     dataModified = true;\r
                  }\r
 \r
@@ -607,54 +607,49 @@ public class FpdFileContents {
      * @param sa Results: HelpText, Original item type.\r
      * @return\r
      */\r
-    public boolean getPcdBuildDataInfo(ModuleIdentification mi, String cName, String tsGuid, String[] sa) throws Exception{\r
-        try {\r
-           \r
-            ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)WorkspaceProfile.getModuleXmlObject(mi);\r
-            if (msa.getPcdCoded() == null) {\r
-                return false;\r
+    public boolean getPcdBuildDataInfo(ModuleIdentification mi, String cName, String tsGuid, String[] sa, Vector<String> validPcdTypes) throws Exception{\r
+       \r
+        ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea) WorkspaceProfile\r
+                                                                                                                        .getModuleXmlObject(mi);\r
+        if (msa.getPcdCoded() == null) {\r
+            return false;\r
+        }\r
+\r
+        PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi);\r
+        //\r
+        // First look through MSA pcd entries.\r
+        //\r
+        List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
+        ListIterator li = l.listIterator();\r
+        while (li.hasNext()) {\r
+            PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry) li.next();\r
+            if (!msaPcd.getCName().equals(cName)) {\r
+                continue;\r
             }\r
-            \r
-            Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
-            m.put("ModuleSurfaceArea", msa);\r
-            SurfaceAreaQuery.setDoc(m);\r
-            PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi);\r
-            //\r
-            // First look through MSA pcd entries.\r
-            //\r
-            List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
-            ListIterator li = l.listIterator();\r
-            while(li.hasNext()) {\r
-                PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
-                if (!msaPcd.getCName().equals(cName)) {\r
-                    continue;\r
-                }\r
-                if (!msaPcd.getTokenSpaceGuidCName().equals(tsGuid)) {\r
-                    continue;\r
-                }\r
-                PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
-                if (spdPcd == null) {\r
-                    //\r
-                    // ToDo Error \r
-                    //\r
-                    throw new PcdDeclNotFound(mi.getName() + " " + msaPcd.getCName());\r
-                }\r
+            if (!msaPcd.getTokenSpaceGuidCName().equals(tsGuid)) {\r
+                continue;\r
+            }\r
+            PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
+            if (spdPcd == null || spdPcd.getValidUsage() == null) {\r
                 //\r
-                // Get Pcd help text and original item type.\r
+                // ToDo Error \r
                 //\r
-                sa[0] = spdPcd.getHelpText() + msaPcd.getHelpText();\r
-                sa[1] = msaPcd.getPcdItemType()+"";\r
-                sa[2] = msa.getModuleDefinitions().getBinaryModule()+"";\r
-                return true;\r
+                throw new PcdDeclNotFound(mi.getName() + " " + msaPcd.getCName());\r
             }\r
-            \r
-            \r
-        }\r
-        catch (Exception e){\r
-            e.printStackTrace();\r
-            throw e;\r
+            //\r
+            // Get Pcd help text and original item type.\r
+            //\r
+            sa[0] = spdPcd.getHelpText() + msaPcd.getHelpText();\r
+            sa[1] = msaPcd.getPcdItemType() + "";\r
+            sa[2] = msa.getModuleDefinitions().getBinaryModule() + "";\r
+            ListIterator iter = spdPcd.getValidUsage().listIterator();\r
+            while (iter.hasNext()) {\r
+                String usage = iter.next().toString();\r
+                validPcdTypes.add(usage);\r
+            }\r
+            return true;\r
         }\r
-        \r
+\r
         return false;\r
     }\r
     \r
@@ -1151,46 +1146,40 @@ public class FpdFileContents {
     public void addFrameworkModulesPcdBuildDefs(ModuleIdentification mi, String arch, ModuleSADocument.ModuleSA moduleSa) throws Exception {\r
         //ToDo add Arch filter\r
         \r
-        try {\r
-            if (moduleSa == null) {\r
-                moduleSa = genModuleSA(mi, arch);\r
-            }\r
-            \r
-            ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)WorkspaceProfile.getModuleXmlObject(mi);\r
-            if (msa.getPcdCoded() == null) {\r
-                return;\r
-            }\r
-            \r
-            Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
-            m.put("ModuleSurfaceArea", msa);\r
-            SurfaceAreaQuery.setDoc(m);\r
-            PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi);\r
-            //\r
-            // Implementing InitializePlatformPcdBuildDefinitions\r
-            //\r
-            List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
-            ListIterator li = l.listIterator();\r
-            while(li.hasNext()) {\r
-                PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\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 " + mi.getName());\r
-                }\r
+        if (moduleSa == null) {\r
+            moduleSa = genModuleSA(mi, arch);\r
+        }\r
+\r
+        ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea) WorkspaceProfile\r
+                                                                                                                        .getModuleXmlObject(mi);\r
+        if (msa.getPcdCoded() == null) {\r
+            return;\r
+        }\r
+\r
+        PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi);\r
+        //\r
+        // Implementing InitializePlatformPcdBuildDefinitions\r
+        //\r
+        List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
+        ListIterator li = l.listIterator();\r
+        while (li.hasNext()) {\r
+            PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry) li.next();\r
+            PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
+            if (spdPcd == null) {\r
                 //\r
-                // AddItem to ModuleSA PcdBuildDefinitions\r
+                // ToDo Error \r
                 //\r
-                String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue();\r
-                \r
-                genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType().toString(), spdPcd.getDatumType()+"", defaultVal, moduleSa);\r
+                throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd.getCName() + " in Module "\r
+                                          + mi.getName());\r
             }\r
-            \r
-        }\r
-        catch (Exception e){\r
-            \r
-            throw e; \r
+            //\r
+            // AddItem to ModuleSA PcdBuildDefinitions\r
+            //\r
+            String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue();\r
+\r
+            genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType()\r
+                                                                                                    .toString(),\r
+                       spdPcd.getDatumType() + "", defaultVal, moduleSa, spdPcd);\r
         }\r
         \r
     }\r
@@ -1251,7 +1240,25 @@ public class FpdFileContents {
         return msa;\r
     }\r
     \r
-    private void genPcdData (String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal, ModuleSADocument.ModuleSA moduleSa) \r
+    private String chooseDefaultPcdType (List validPcdTypes) {\r
+        String choosedType = "";\r
+        if (validPcdTypes.contains("FIXED_AT_BUILD")) {\r
+            choosedType = "FIXED_AT_BUILD";\r
+        }\r
+        else if (validPcdTypes.contains("DYNAMIC")) {\r
+            choosedType = "DYNAMIC";\r
+        }\r
+        else if (validPcdTypes.contains("PATCHABLE_IN_MODULE")) {\r
+            choosedType = "PATCHABLE_IN_MODULE";\r
+        }\r
+        else if (validPcdTypes.contains("DYNAMIC_EX")) {\r
+            choosedType = "DYNAMIC_EX";\r
+        }\r
+        return choosedType;\r
+    }\r
+    \r
+    private void genPcdData (String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal, \r
+                             ModuleSADocument.ModuleSA moduleSa, PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd) \r
     throws PcdItemTypeConflictException, PcdValueMalFormed{\r
         if (moduleSa.getPcdBuildDefinition() == null){\r
             moduleSa.addNewPcdBuildDefinition();\r
@@ -1275,12 +1282,43 @@ public class FpdFileContents {
                 return;\r
             }\r
         }\r
+        // if pcd type from MSA file is Dynamic\r
+        // we must choose one default type from SPD file for it.\r
+        //\r
+        List validPcdTypes = spdPcd.getValidUsage();\r
         //\r
         // Using existing Pcd type, if this pcd already exists in other ModuleSA\r
         //\r
         if (pcdConsumer.size() > 0) {\r
+            //\r
+            // platform should only contain one type for each pcd.\r
+            //\r
+            String existingItemType = itemType (pcdConsumer.get(0));\r
+            for (int i = 1; i < pcdConsumer.size(); ++i) {\r
+                if (!existingItemType.equals(itemType(pcdConsumer.get(i)))) {\r
+                    throw new PcdItemTypeConflictException (cName, pcdConsumer.get(0), pcdConsumer.get(i));\r
+                }\r
+            }\r
             \r
-            itemType = itemType (pcdConsumer.get(0));\r
+            if (itemType.equals("DYNAMIC")) {\r
+                if (!validPcdTypes.contains(existingItemType)) {\r
+                    throw new PcdItemTypeConflictException(cName, pcdConsumer.get(0));\r
+                }\r
+                itemType = existingItemType;\r
+            }\r
+            else {\r
+                if (!itemType.equals(existingItemType)) {\r
+                    throw new PcdItemTypeConflictException(cName, pcdConsumer.get(0));\r
+                }\r
+            }\r
+        }\r
+        //\r
+        // if this is the first occurence of this pcd. \r
+        //\r
+        else {\r
+            if (itemType.equals("DYNAMIC")) {\r
+                itemType = chooseDefaultPcdType (validPcdTypes);\r
+            }\r
         }\r
         String listValue = moduleInfo + " " + itemType;\r
         pcdConsumer.add(listValue);\r
@@ -3636,9 +3674,36 @@ class PcdItemTypeConflictException extends Exception {
     private static final long serialVersionUID = 1L;\r
     private String details = null;\r
     \r
-    PcdItemTypeConflictException(String pcdName, String info){\r
+    PcdItemTypeConflictException (String pcdName, String info) {\r
         ModuleIdentification mi = WorkspaceProfile.getModuleId(info);\r
-        details = pcdName + " ItemType Conflicts with " + mi.getName() + " in Pkg " + mi.getPackageId().getName();\r
+        if (mi != null) {\r
+            details = pcdName + " ItemType Conflicts with " + mi.getName() + " in Pkg " + mi.getPackageId().getName();    \r
+        }\r
+        else {\r
+            details = pcdName + " ItemType Conflicts with " + info;\r
+        }\r
+    }\r
+    \r
+    PcdItemTypeConflictException (String pcdName, String info1, String info2) {\r
+        ModuleIdentification mi1 = WorkspaceProfile.getModuleId(info1);\r
+        ModuleIdentification mi2 = WorkspaceProfile.getModuleId(info2);\r
+        String moduleInfo1 = "";\r
+        String moduleInfo2 = "";\r
+        if (mi1 != null) {\r
+            moduleInfo1 = mi1.getName() + " in Pkg " + mi1.getPackageId().getName();\r
+        }\r
+        else {\r
+            moduleInfo1 = info1;\r
+        }\r
+        \r
+        if (mi2 != null) {\r
+            moduleInfo2 = mi2.getName() + " in Pkg " + mi2.getPackageId().getName();\r
+        }\r
+        else {\r
+            moduleInfo2 = info2;\r
+        }\r
+        \r
+        details = pcdName + " ItemType Conflicts in " + moduleInfo1 + " and " + moduleInfo2;\r
     }\r
     \r
     public String getMessage() {\r