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
}\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
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