]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/GenBuild/org/tianocore/build/pcd/action/PlatformPcdPreprocessActionForBuilding.java
Restructuring for better separation of Tool packages.
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / pcd / action / PlatformPcdPreprocessActionForBuilding.java
diff --git a/Tools/Java/Source/GenBuild/org/tianocore/build/pcd/action/PlatformPcdPreprocessActionForBuilding.java b/Tools/Java/Source/GenBuild/org/tianocore/build/pcd/action/PlatformPcdPreprocessActionForBuilding.java
new file mode 100644 (file)
index 0000000..6d71dd3
--- /dev/null
@@ -0,0 +1,372 @@
+/** @file\r
+  PlatformPcdPreprocessActionForBuilding class.\r
+\r
+  This action class is to collect PCD information from MSA, SPD, FPD xml file.\r
+  This class will be used for wizard and build tools, So it can *not* inherit\r
+  from buildAction or wizardAction.\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+package org.tianocore.build.pcd.action;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.xmlbeans.XmlException;\r
+import org.apache.xmlbeans.XmlObject;\r
+import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions;\r
+import org.tianocore.PcdBuildDefinitionDocument;\r
+import org.tianocore.PlatformSurfaceAreaDocument;\r
+import org.tianocore.build.exception.PlatformPcdPreprocessBuildException;\r
+import org.tianocore.build.global.GlobalData;\r
+import org.tianocore.build.id.FpdModuleIdentification;\r
+import org.tianocore.pcd.action.PlatformPcdPreprocessAction;\r
+import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
+import org.tianocore.pcd.entity.ModulePcdInfoFromFpd;\r
+import org.tianocore.pcd.entity.Token;\r
+import org.tianocore.pcd.entity.UsageIdentification;\r
+import org.tianocore.pcd.exception.EntityException;\r
+import org.tianocore.pcd.exception.PlatformPcdPreprocessException;\r
+\r
+/**\r
+   This action class is to collect PCD information from MSA, SPD, FPD xml file.\r
+   This class will be used for wizard and build tools, So it can *not* inherit\r
+   from buildAction or UIAction.\r
+**/\r
+public class PlatformPcdPreprocessActionForBuilding extends PlatformPcdPreprocessAction {\r
+    ///\r
+    /// FPD file path.\r
+    ///\r
+    private String                      fpdFilePath;\r
+\r
+    ///\r
+    /// Message level for CollectPCDAction.\r
+    ///\r
+    private int                         originalMessageLevel;\r
+\r
+    ///\r
+    /// Cache the fpd docment instance for private usage.\r
+    ///\r
+    private PlatformSurfaceAreaDocument fpdDocInstance;\r
+\r
+    /**\r
+      Set FPDFileName parameter for this action class.\r
+\r
+      @param fpdFilePath    fpd file path\r
+    **/\r
+    public void setFPDFilePath(String fpdFilePath) {\r
+        this.fpdFilePath = fpdFilePath;\r
+    }\r
+\r
+    /**\r
+      Common function interface for outer.\r
+\r
+      @param fpdFilePath    The fpd file path of current build or processing.\r
+\r
+      @throws  PlatformPreprocessBuildException \r
+                            The exception of this function. Because it can *not* be predict\r
+                            where the action class will be used. So only Exception can be throw.\r
+\r
+    **/\r
+    public void perform(String fpdFilePath) \r
+        throws PlatformPcdPreprocessBuildException {\r
+        this.fpdFilePath = fpdFilePath;\r
+        checkParameter();\r
+        execute();\r
+    }\r
+\r
+    /**\r
+      Core execution function for this action class.\r
+\r
+      This function work flows will be:\r
+      1) Collect and prepocess PCD information from FPD file, all PCD\r
+      information will be stored into memory database.\r
+      2) Generate 3 strings for\r
+        a) All modules using Dynamic(Ex) PCD entry.(Token Number)\r
+        b) PEI PCDDatabase (C Structure) for PCD Service PEIM.\r
+        c) DXE PCD Database (C structure) for PCD Service DXE.\r
+\r
+\r
+      @throws  EntityException Exception indicate failed to execute this action.\r
+\r
+    **/\r
+    public void execute() throws PlatformPcdPreprocessBuildException {\r
+        String errorMessageHeader   = "Failed to initialize the Pcd memory database because: ";\r
+        String errorsForPreprocess  = null;\r
+\r
+        //\r
+        // Get memoryDatabaseManager instance from GlobalData.\r
+        // The memoryDatabaseManager should be initialized as static variable\r
+        // in some Pre-process class.\r
+        //\r
+        setPcdDbManager(GlobalData.getPCDMemoryDBManager());\r
+\r
+        //\r
+        // Collect all PCD information defined in FPD file.\r
+        // Evenry token defind in FPD will be created as an token into\r
+        // memory database.\r
+        //\r
+        try {\r
+            initPcdMemoryDbWithPlatformInfo();\r
+        } catch (PlatformPcdPreprocessException exp) {\r
+            throw new PlatformPcdPreprocessBuildException(errorMessageHeader + exp.getMessage());\r
+        }\r
+        errorsForPreprocess = this.getErrorString();\r
+        if (errorsForPreprocess != null) {\r
+            throw new PlatformPcdPreprocessBuildException(errorMessageHeader + "\r\n" + errorsForPreprocess);\r
+        }\r
+\r
+        //\r
+        // Generate for PEI, DXE PCD DATABASE's definition and initialization.\r
+        //\r
+        try {\r
+            genPcdDatabaseSourceCode ();\r
+        } catch (EntityException exp) {\r
+            throw new PlatformPcdPreprocessBuildException(errorMessageHeader + "\r\n" + exp.getMessage());\r
+        }\r
+    }\r
+\r
+    /**\r
+      Override function: implementate the method of get Guid string information from SPD file.\r
+\r
+      @param guidCName      Guid CName string.\r
+\r
+      @return String        Guid information from SPD file.\r
+      @throws PlatformPcdPreprocessException\r
+                            Fail to get Guid information from SPD file.\r
+    **/\r
+    public String getGuidInfoFromSpd(String guidCName) throws PlatformPcdPreprocessException {\r
+        String tokenSpaceStrRet = null;\r
+        try {\r
+            tokenSpaceStrRet = GlobalData.getGuidInfoFromCname(guidCName);\r
+        } catch ( Exception e ) {\r
+            throw new PlatformPcdPreprocessException ("Failed to get Guid CName " + guidCName + " from the SPD file!");\r
+        }\r
+        return tokenSpaceStrRet;\r
+    }\r
+\r
+    /**\r
+      This function generates source code for PCD Database.\r
+\r
+      @throws EntityException  If the token does *not* exist in memory database.\r
+\r
+    **/\r
+    private void genPcdDatabaseSourceCode()\r
+        throws EntityException {\r
+        String PcdCommonHeaderString = PcdDatabase.getPcdDatabaseCommonDefinitions();\r
+\r
+        ArrayList<Token> alPei = new ArrayList<Token> ();\r
+        ArrayList<Token> alDxe = new ArrayList<Token> ();\r
+\r
+        getPcdDbManager().getTwoPhaseDynamicRecordArray(alPei, alDxe);\r
+        PcdDatabase pcdPeiDatabase = new PcdDatabase (alPei, "PEI", 0);\r
+        pcdPeiDatabase.genCode();\r
+        MemoryDatabaseManager.PcdPeimHString        = PcdCommonHeaderString + pcdPeiDatabase.getHString() +\r
+                                                      PcdDatabase.getPcdPeiDatabaseDefinitions();\r
+        MemoryDatabaseManager.PcdPeimCString        = pcdPeiDatabase.getCString();\r
+\r
+        PcdDatabase pcdDxeDatabase = new PcdDatabase(alDxe, "DXE", alPei.size());\r
+        pcdDxeDatabase.genCode();\r
+        MemoryDatabaseManager.PcdDxeHString   = MemoryDatabaseManager.PcdPeimHString + pcdDxeDatabase.getHString() +\r
+                                                PcdDatabase.getPcdDxeDatabaseDefinitions();\r
+        MemoryDatabaseManager.PcdDxeCString   = pcdDxeDatabase.getCString();\r
+    }\r
+\r
+    /**\r
+      Override function: Get component array from FPD.\r
+\r
+      This function maybe provided by some Global class.\r
+\r
+      @return List<ModuleInfo>                  the component array.\r
+      @throws PlatformPcdPreprocessException    get all modules in <ModuleSA> in FPD file.\r
+\r
+    **/\r
+    public List<ModulePcdInfoFromFpd> getComponentsFromFpd()\r
+        throws PlatformPcdPreprocessException {\r
+        List<ModulePcdInfoFromFpd>                  allModules          = new ArrayList<ModulePcdInfoFromFpd>();\r
+        Map<FpdModuleIdentification, XmlObject>     pcdBuildDefinitions = null;\r
+        UsageIdentification                         usageId             = null;\r
+\r
+        pcdBuildDefinitions = GlobalData.getFpdPcdBuildDefinitions();\r
+        if (pcdBuildDefinitions == null) {\r
+            return null;\r
+        }\r
+\r
+        //\r
+        // Loop map to retrieve all PCD build definition and Module id\r
+        //\r
+        Iterator item = pcdBuildDefinitions.keySet().iterator();\r
+        while (item.hasNext()){\r
+            FpdModuleIdentification id = (FpdModuleIdentification) item.next();\r
+            usageId                    = new UsageIdentification(id.getModule().getName(),\r
+                                                                 id.getModule().getGuid(),\r
+                                                                 id.getModule().getPackage().getName(),\r
+                                                                 id.getModule().getPackage().getGuid(),\r
+                                                                 id.getArch(),\r
+                                                                 id.getModule().getVersion(),\r
+                                                                 id.getModule().getModuleType());\r
+            allModules.add(\r
+                new ModulePcdInfoFromFpd(\r
+                    usageId, \r
+                    ((PcdBuildDefinitionDocument)pcdBuildDefinitions.get(id)).getPcdBuildDefinition()));\r
+        }\r
+        return allModules;\r
+    }\r
+\r
+    /**\r
+       Override function: Verify the datum value according its datum size and datum type, this\r
+       function maybe moved to FPD verification tools in future.\r
+\r
+       @param cName         The token name\r
+       @param moduleName    The module who use this PCD token\r
+       @param datum         The PCD's datum\r
+       @param datumType     The PCD's datum type\r
+       @param maxDatumSize  The max size for PCD's Datum.\r
+\r
+       @return String       exception strings.\r
+     */\r
+    public String verifyDatum(String            cName,\r
+                              String            moduleName,\r
+                              String            datum,\r
+                              Token.DATUM_TYPE  datumType,\r
+                              int               maxDatumSize) {\r
+        //\r
+        // In building system, datum should not be checked, the checking work\r
+        // should be done by wizard tools or PCD verification tools.\r
+        //                                \r
+        return null;\r
+    }\r
+\r
+    /**\r
+       Override function: Get dynamic information for a dynamic PCD from <DynamicPcdBuildDefinition> seciton in FPD file.\r
+\r
+       This function should be implemented in GlobalData in future.\r
+\r
+       @param token         The token instance which has hold module's PCD information\r
+       @param moduleName    The name of module who will use this Dynamic PCD.\r
+\r
+       @return DynamicPcdBuildDefinitions.PcdBuildData\r
+    **/\r
+    public DynamicPcdBuildDefinitions.PcdBuildData getDynamicInfoFromFpd(Token     token,\r
+                                                                         String    moduleName)\r
+        throws PlatformPcdPreprocessException {\r
+        int    index             = 0;\r
+        String exceptionString   = null;\r
+        String dynamicPrimaryKey = null;\r
+        DynamicPcdBuildDefinitions                    dynamicPcdBuildDefinitions = null;\r
+        List<DynamicPcdBuildDefinitions.PcdBuildData> dynamicPcdBuildDataArray   = null;\r
+        String                                        tokenSpaceStrRet           = null;\r
+\r
+        //\r
+        // If FPD document is not be opened, open and initialize it.\r
+        // BUGBUG: The code should be moved into GlobalData in future.\r
+        //\r
+        if (fpdDocInstance == null) {\r
+            try {\r
+                fpdDocInstance = (PlatformSurfaceAreaDocument)XmlObject.Factory.parse(new File(fpdFilePath));\r
+            } catch(IOException ioE) {\r
+                throw new PlatformPcdPreprocessException("File IO error for xml file:" + fpdFilePath + "\n" + ioE.getMessage());\r
+            } catch(XmlException xmlE) {\r
+                throw new PlatformPcdPreprocessException("Can't parse the FPD xml fle:" + fpdFilePath + "\n" + xmlE.getMessage());\r
+            }\r
+        }\r
+\r
+        dynamicPcdBuildDefinitions = fpdDocInstance.getPlatformSurfaceArea().getDynamicPcdBuildDefinitions();\r
+        if (dynamicPcdBuildDefinitions == null) {\r
+            exceptionString = String.format("[FPD file error] There are no <PcdDynamicBuildDescriptions> elements in FPD file but there are Dynamic type "+\r
+                                            "PCD entries %s in module %s!",\r
+                                            token.cName,\r
+                                            moduleName);\r
+            putError(exceptionString);\r
+            return null;\r
+        }\r
+\r
+        dynamicPcdBuildDataArray = dynamicPcdBuildDefinitions.getPcdBuildDataList();\r
+        for (index = 0; index < dynamicPcdBuildDataArray.size(); index ++) {\r
+            tokenSpaceStrRet = getGuidInfoFromSpd(dynamicPcdBuildDataArray.get(index).getTokenSpaceGuidCName());\r
+\r
+            if (tokenSpaceStrRet == null) {\r
+                exceptionString = "Fail to get token space guid for token " + dynamicPcdBuildDataArray.get(index).getCName();\r
+                putError(exceptionString);\r
+                continue;\r
+            }\r
+\r
+            dynamicPrimaryKey = Token.getPrimaryKeyString(dynamicPcdBuildDataArray.get(index).getCName(),\r
+                                                          tokenSpaceStrRet);\r
+            if (dynamicPrimaryKey.equals(token.getPrimaryKeyString())) {\r
+                return dynamicPcdBuildDataArray.get(index);\r
+            }\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
+    /**\r
+       Override function: get all <DynamicPcdBuildDefinition> from FPD file.\r
+\r
+       @return List<DynamicPcdBuildDefinitions.PcdBuildData>    All DYNAMIC PCD list in <DynamicPcdBuildDefinitions> in FPD file.\r
+       @throws PlatformPcdPreprocessBuildException              Failure to get dynamic information list.\r
+\r
+    **/\r
+    public List<DynamicPcdBuildDefinitions.PcdBuildData>\r
+                                            getAllDynamicPcdInfoFromFpd()\r
+        throws PlatformPcdPreprocessException {\r
+        DynamicPcdBuildDefinitions dynamicPcdBuildDefinitions = null;\r
+\r
+        //\r
+        // Open fpd document to get <DynamicPcdBuildDefinition> Section.\r
+        // BUGBUG: the function should be move GlobalData in furture.\r
+        //\r
+        if (fpdDocInstance == null) {\r
+            try {\r
+                fpdDocInstance = (PlatformSurfaceAreaDocument)XmlObject.Factory.parse(new File(fpdFilePath));\r
+            } catch(IOException ioE) {\r
+                throw new PlatformPcdPreprocessException("File IO error for xml file:" + fpdFilePath + "\n" + ioE.getMessage());\r
+            } catch(XmlException xmlE) {\r
+                throw new PlatformPcdPreprocessException("Can't parse the FPD xml fle:" + fpdFilePath + "\n" + xmlE.getMessage());\r
+            }\r
+        }\r
+\r
+        dynamicPcdBuildDefinitions = fpdDocInstance.getPlatformSurfaceArea().getDynamicPcdBuildDefinitions();\r
+        if (dynamicPcdBuildDefinitions == null) {\r
+            return null;\r
+        }\r
+\r
+        return dynamicPcdBuildDefinitions.getPcdBuildDataList();\r
+    }\r
+\r
+    /**\r
+      check parameter for this action.\r
+\r
+      @throws PlatformPcdPreprocessBuildException  Bad parameter.\r
+    **/\r
+    private void checkParameter() throws PlatformPcdPreprocessBuildException {\r
+        File file = null;\r
+\r
+        if (fpdFilePath == null) {\r
+            throw new PlatformPcdPreprocessBuildException("FPDFileName should be empty for CollectPCDAtion!");\r
+        }\r
+\r
+        if (fpdFilePath.length() == 0) {\r
+            throw new PlatformPcdPreprocessBuildException("FPDFileName should be empty for CollectPCDAtion!");\r
+        }\r
+\r
+        file = new File(fpdFilePath);\r
+\r
+        if(!file.exists()) {\r
+            throw new PlatformPcdPreprocessBuildException("FPD File " + fpdFilePath + " does not exist!");\r
+        }\r
+    }\r
+}\r