]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Preparative work to collect Library info from workspace dynamically.
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 30 Oct 2006 06:29:54 +0000 (06:29 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 30 Oct 2006 06:29:54 +0000 (06:29 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1857 6f19259b-4bc3-4df7-8a09-765794883524

Tools/Java/Source/MigrationTools/org/tianocore/migration/Database.java

index 686dbe32b4aef3a9bcfa5fea4de018f5eb85aad3..c875cb57d078e8069d361f99622853d5c57b5320 100644 (file)
@@ -22,21 +22,22 @@ import org.tianocore.DbPathAndFilename;
 import org.tianocore.FrameworkDatabaseDocument;\r
 import org.tianocore.FrameworkDatabaseDocument.FrameworkDatabase;\r
 import org.tianocore.GuidDeclarationsDocument.GuidDeclarations;\r
-import org.tianocore.PpiDeclarationsDocument.PpiDeclarations;\r
-import org.tianocore.ProtocolDeclarationsDocument.ProtocolDeclarations;\r
-\r
 import org.tianocore.PackageListDocument.PackageList;\r
 import org.tianocore.PackageSurfaceAreaDocument;\r
 import org.tianocore.PackageSurfaceAreaDocument.PackageSurfaceArea;\r
+import org.tianocore.PpiDeclarationsDocument.PpiDeclarations;\r
+import org.tianocore.ProtocolDeclarationsDocument.ProtocolDeclarations;\r
+import org.tianocore.LibraryClassDeclarationsDocument.LibraryClassDeclarations;\r
+import org.tianocore.LibraryClassDeclarationsDocument.LibraryClassDeclarations.LibraryClass;\r
 \r
 public final class Database {\r
-    private static final Database INSTANCE = Database.init();\r
+    private static final Database INSTANCE = null;\r
     \r
     Database(String path) {\r
         DatabasePath = path;\r
 \r
         try {\r
-            // collectWorkSpaceDatabase();\r
+            collectWorkSpaceDatabase();\r
             importPkgGuid("PkgGuid.csv");\r
             importDBLib("Library.csv");\r
             importDBGuid("Guid.csv", "Guid");\r
@@ -219,64 +220,203 @@ public final class Database {
     }\r
     \r
     public static final Database getInstance() {\r
+        if (INSTANCE == null) {\r
+            Database.init();\r
+        }\r
         return INSTANCE;\r
     }\r
 \r
-    private HashMap<String, String> hashDatabaseGuids     = new HashMap<String, String> ();\r
-    private HashMap<String, String> hashDatabasePpis      = new HashMap<String, String> ();\r
-    private HashMap<String, String> hashDatabaseProtocols = new HashMap<String, String> ();\r
 \r
-    private final void collectGuidDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
+\r
+    private static String                  workspacePath;\r
+    private static HashMap<String, String> hashDbGuids        = new HashMap<String, String>();\r
+    private static HashMap<String, String> hashDbPpis         = new HashMap<String, String>();\r
+    private static HashMap<String, String> hashDbProtocols    = new HashMap<String, String>();\r
+    private static HashMap<String, String> hashDbLibSymbols   = new HashMap<String, String>();\r
+    private static HashMap<String, String> hashDbLibFunctions = new HashMap<String, String>();\r
+    private static HashMap<String, String> hashDbLibExterns   = new HashMap<String, String>();\r
+\r
+    private static final String     regLibClassName = ".*\\W(\\w[\\w\\d]*)\\.h";\r
+    private static final Pattern    ptnLibClassName = Pattern.compile(regLibClassName);\r
+\r
+    private static final String     regLibSymbol    = "#define\\s+(\\w[\\w\\d]*)";\r
+    private static final Pattern    ptnLibSymbol    = Pattern.compile(regLibSymbol);\r
+\r
+    private static final String     regLibDataType  = "[A-Z][A-Z0-9_]*\\s*\\**";\r
+    private static final String     regLibFunction  = regLibDataType + "\\s*(?:EFIAPI)?\\s+" + \r
+                                                      "(\\w[\\w\\d]*)\\s*\\([^)]*\\)\\s*;";\r
+    private static final Pattern    ptnLibFunction  = Pattern.compile(regLibFunction);\r
+\r
+    private static final String     regLibExtern    = "extern\\s+" + regLibDataType + "\\s*(\\w[\\w\\d]*)";\r
+    private static final Pattern    ptnLibExtern    = Pattern.compile(regLibExtern);\r
+\r
+    private static final String convertToOsFilePath(String filePath) {\r
+        return filePath.replace("/", File.separator).replace("\\", File.separator);\r
+    }\r
+    private static final void collectLibHeaderFileInfo(String libHeaderFile, String pkgGuid) throws Exception {\r
+        String  fileContents;\r
+        String  libClassName;\r
+        String  libContainer;\r
+        Matcher mtrLibClass;\r
+        Matcher mtrLibSymbol;\r
+        Matcher mtrLibFunction;\r
+        Matcher mtrLibExtern;\r
+\r
+        System.out.println ("Parsing: " + libHeaderFile);\r
+        mtrLibClass = ptnLibClassName.matcher(libHeaderFile);\r
+        if (!mtrLibClass.matches()) {\r
+            throw new Exception("Illegal libary header file");\r
+        }\r
+        libClassName = mtrLibClass.group(1);\r
+        libContainer = libClassName + "@" + pkgGuid;\r
+\r
+        fileContents = Common.file2string(libHeaderFile);\r
+        mtrLibSymbol = ptnLibSymbol.matcher(fileContents);\r
+        while (mtrLibSymbol.find()) {\r
+            String libSymbol;\r
+            String oldLibContainer;\r
+\r
+            libSymbol       = mtrLibSymbol.group(1);\r
+            oldLibContainer = hashDbLibSymbols.put(libSymbol, libContainer);\r
+            if (oldLibContainer != null) {\r
+                String warnMessage;\r
+\r
+                warnMessage = "Duplicated Lib Symbol:" + libSymbol + " Found. " +\r
+                              "Later package will overide the previous one"; \r
+                System.out.println(warnMessage);\r
+            }\r
+        }\r
+\r
+        mtrLibFunction = ptnLibFunction.matcher(fileContents);\r
+        while (mtrLibFunction.find()) {\r
+            String libFunction;\r
+            String oldLibContainer;\r
+\r
+            libFunction     = mtrLibFunction.group(1);\r
+            oldLibContainer = hashDbLibFunctions.put(libFunction, libContainer);\r
+            if (oldLibContainer != null) {\r
+                String warnMessage;\r
+\r
+                warnMessage = "Duplicated Lib Function:" + libFunction + " Found. " +\r
+                              "Later package will overide the previous one"; \r
+                System.out.println(warnMessage);\r
+            }\r
+        }\r
+\r
+        mtrLibExtern = ptnLibExtern.matcher(fileContents);\r
+        while (mtrLibExtern.find()) {\r
+            String libExtern;\r
+            String oldLibContainer;\r
+\r
+            libExtern = mtrLibExtern.group(1);\r
+            oldLibContainer = hashDbLibExterns.put(libExtern, libContainer);\r
+            if (oldLibContainer != null) {\r
+                String warnMessage;\r
+\r
+                warnMessage = "Duplicated Lib Extern:" + libExtern + " Found. " +\r
+                              "Later package will overide the previous one"; \r
+                System.out.println(warnMessage);\r
+            }\r
+        }\r
+    }\r
+    private static final void collectLibDataBase(PackageSurfaceArea spdDatabase, String pkgDirectory) throws Exception {\r
+        String                              pkgGuid;\r
+        LibraryClassDeclarations            libClassDeclarations;\r
+\r
+        pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+        libClassDeclarations = spdDatabase.getLibraryClassDeclarations();\r
+        if (libClassDeclarations != null) {\r
+            Iterator<LibraryClass>   itLibClass;\r
+\r
+            itLibClass = libClassDeclarations.getLibraryClassList().iterator();\r
+            while (itLibClass.hasNext()) {\r
+                String  libHeaderFile;\r
+\r
+                libHeaderFile = pkgDirectory + File.separator +\r
+                                itLibClass.next().getIncludeHeader(); \r
+                libHeaderFile = convertToOsFilePath (libHeaderFile);\r
+                try {\r
+                    collectLibHeaderFileInfo(libHeaderFile, pkgGuid);\r
+                } catch (Exception e) {\r
+                    String errorMessage;\r
+\r
+                    errorMessage = "Error (" + e.getMessage() + ")occurs when parsing " +\r
+                                   libHeaderFile;\r
+                    System.out.println(errorMessage);\r
+                }\r
+            }\r
+        }\r
+    }\r
+    private static final void collectGuidDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
         String                              pkgGuid;\r
-        Iterator<GuidDeclarations.Entry>    itGuids;\r
+        GuidDeclarations                    guidDeclarations;\r
 \r
         pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+        guidDeclarations = spdDatabase.getGuidDeclarations();\r
+        if (guidDeclarations != null) {\r
+            Iterator<GuidDeclarations.Entry>    itGuids;\r
 \r
-        itGuids = spdDatabase.getGuidDeclarations().getEntryList().iterator();\r
-        while (itGuids.hasNext()) {\r
-            hashDatabaseGuids.put(itGuids.next().getCName(), pkgGuid); \r
+            itGuids = guidDeclarations.getEntryList().iterator();\r
+            while (itGuids.hasNext()) {\r
+                hashDbGuids.put(itGuids.next().getCName(), pkgGuid); \r
+            }\r
         }\r
+        \r
     }\r
 \r
-    private final void collectPpiDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
+    private static final void collectPpiDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
         String                              pkgGuid;\r
-        Iterator<PpiDeclarations.Entry>     itPpis;\r
+        PpiDeclarations                     ppiDeclarations;\r
 \r
         pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+        ppiDeclarations = spdDatabase.getPpiDeclarations();\r
 \r
-        itPpis = spdDatabase.getPpiDeclarations().getEntryList().iterator();\r
-        while (itPpis.hasNext()) {\r
-            hashDatabasePpis.put(itPpis.next().getCName(), pkgGuid); \r
+        if (ppiDeclarations != null) {\r
+            Iterator<PpiDeclarations.Entry>     itPpis;\r
+\r
+            itPpis = ppiDeclarations.getEntryList().iterator();\r
+            while (itPpis.hasNext()) {\r
+                hashDbPpis.put(itPpis.next().getCName(), pkgGuid); \r
+            }\r
         }\r
+        \r
     }\r
 \r
-    private final void collectProtocolDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
+    private static final void collectProtocolDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
         String                                  pkgGuid;\r
-        Iterator<ProtocolDeclarations.Entry>    itProtocols;\r
+        ProtocolDeclarations                    protocolDeclarations;\r
 \r
         pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+        protocolDeclarations = spdDatabase.getProtocolDeclarations();\r
 \r
-        itProtocols = spdDatabase.getProtocolDeclarations().getEntryList().iterator();\r
-        while (itProtocols.hasNext()) {\r
-            hashDatabaseGuids.put(itProtocols.next().getCName(), pkgGuid); \r
+        if (protocolDeclarations != null) {\r
+            Iterator<ProtocolDeclarations.Entry>    itProtocols;\r
+\r
+            itProtocols = protocolDeclarations.getEntryList().iterator();\r
+            while (itProtocols.hasNext()) {\r
+                hashDbGuids.put(itProtocols.next().getCName(), pkgGuid); \r
+            }\r
         }\r
+       \r
     }\r
 \r
-    private final void collectPackageDatabase(String packageFileName) throws Exception {\r
+    private static final void collectPackageDatabase(String packageFileName) throws Exception {\r
         XmlObject            xmlPackage;\r
         PackageSurfaceArea   spdDatabase;\r
-\r
-        xmlPackage  = XmlObject.Factory.parse(new File(packageFileName));\r
+        File                 pkgFile;\r
+       \r
+        pkgFile     = new File(packageFileName);\r
+        xmlPackage  = XmlObject.Factory.parse(pkgFile);\r
         spdDatabase = ((PackageSurfaceAreaDocument) xmlPackage).getPackageSurfaceArea();\r
-\r
\r
         collectGuidDatabase(spdDatabase);\r
         collectProtocolDatabase(spdDatabase);\r
         collectPpiDatabase(spdDatabase);\r
+        collectLibDataBase(spdDatabase,  pkgFile.getParent());\r
 \r
 \r
     }\r
-    public final void collectWorkSpaceDatabase() throws Exception {\r
-        String                      workspacePath;\r
+    public static final void collectWorkSpaceDatabase() throws Exception {\r
         String                      databaseFileName;\r
         File                        databaseFile;\r
         XmlObject                   xmlDatabase;\r
@@ -302,16 +442,14 @@ public final class Database {
         while (packageFile.hasNext()) {\r
             String packageFileName = packageFile.next().getStringValue();\r
             packageFileName = workspacePath + File.separator + packageFileName;\r
-            packageFileName = packageFileName.replace("/", File.separator);\r
+            packageFileName = convertToOsFilePath(packageFileName);\r
 \r
-            System.out.println("Parse: " + packageFileName);\r
+            System.out.println("Parsing: " + packageFileName);\r
             try {\r
                 collectPackageDatabase(packageFileName);\r
             } catch (Exception e) {\r
                 System.out.println("Error occured when opening " + packageFileName + e.getMessage());\r
             }\r
         }\r
-        return;\r
     }\r
-    \r
 }\r