import java.util.*;\r
import java.util.regex.*;\r
\r
+import org.apache.xmlbeans.XmlObject;\r
+import org.apache.xmlbeans.XmlObject.Factory;\r
+import org.tianocore.DbPathAndFilename;\r
+import org.tianocore.FrameworkDatabaseDocument;\r
+import org.tianocore.FrameworkDatabaseDocument.FrameworkDatabase;\r
+import org.tianocore.GuidDeclarationsDocument.GuidDeclarations;\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
importPkgGuid("PkgGuid.csv");\r
importDBLib("Library.csv");\r
importDBGuid("Guid.csv", "Guid");\r
private Map<String,Func> hashfunc = new HashMap<String,Func>();\r
private Map<String,Macro> hashmacro = new HashMap<String,Macro>();\r
private Map<String,String> hashPkgGuid = new HashMap<String,String>();\r
+\r
\r
//-------------------------------------import------------------------------------------//\r
private void importPkgGuid(String filename) throws Exception {\r
}\r
\r
public static final Database getInstance() {\r
+ if (INSTANCE == null) {\r
+ Database.init();\r
+ }\r
return INSTANCE;\r
}\r
+\r
+\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 + \r
+ "\\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
+ GuidDeclarations guidDeclarations;\r
+\r
+ pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+ guidDeclarations = spdDatabase.getGuidDeclarations();\r
+ if (guidDeclarations != null) {\r
+ Iterator<GuidDeclarations.Entry> itGuids;\r
+\r
+ itGuids = guidDeclarations.getEntryList().iterator();\r
+ while (itGuids.hasNext()) {\r
+ hashDbGuids.put(itGuids.next().getCName(), pkgGuid); \r
+ }\r
+ }\r
+ \r
+ }\r
+\r
+ private static final void collectPpiDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
+ String pkgGuid;\r
+ PpiDeclarations ppiDeclarations;\r
+\r
+ pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+ ppiDeclarations = spdDatabase.getPpiDeclarations();\r
+\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 static final void collectProtocolDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
+ String pkgGuid;\r
+ ProtocolDeclarations protocolDeclarations;\r
+\r
+ pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+ protocolDeclarations = spdDatabase.getProtocolDeclarations();\r
+\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 static final void collectPackageDatabase(String packageFileName) throws Exception {\r
+ XmlObject xmlPackage;\r
+ PackageSurfaceArea spdDatabase;\r
+ File pkgFile;\r
+ \r
+ pkgFile = new File(packageFileName);\r
+ xmlPackage = XmlObject.Factory.parse(pkgFile);\r
+ spdDatabase = ((PackageSurfaceAreaDocument) xmlPackage).getPackageSurfaceArea();\r
+ \r
+ collectGuidDatabase(spdDatabase);\r
+ collectProtocolDatabase(spdDatabase);\r
+ collectPpiDatabase(spdDatabase);\r
+ collectLibDataBase(spdDatabase, pkgFile.getParent());\r
+\r
+\r
+ }\r
+ public static final void collectWorkSpaceDatabase() throws Exception {\r
+ String databaseFileName;\r
+ File databaseFile;\r
+ XmlObject xmlDatabase;\r
+ FrameworkDatabase frameworkDatabase;\r
+ Iterator<DbPathAndFilename> packageFile;\r
+ \r
+ workspacePath = System.getenv("WORKSPACE");\r
+ \r
+ if (workspacePath == null) {\r
+ String errorMessage = "Envivornment variable \"WORKSPACE\" is not set!";\r
+ throw new Exception(errorMessage);\r
+ }\r
+ databaseFileName = workspacePath + File.separator + \r
+ "Tools" + File.separator +\r
+ "Conf" + File.separator + \r
+ "FrameworkDatabase.db";\r
+ System.out.println("Open " + databaseFileName);\r
+ databaseFile = new File(databaseFileName);\r
+ xmlDatabase = XmlObject.Factory.parse(databaseFile);\r
+ frameworkDatabase = ((FrameworkDatabaseDocument) xmlDatabase).getFrameworkDatabase();\r
+ packageFile = frameworkDatabase.getPackageList().getFilenameList().iterator();\r
+\r
+ while (packageFile.hasNext()) {\r
+ String packageFileName = packageFile.next().getStringValue();\r
+ packageFileName = workspacePath + File.separator + packageFileName;\r
+ packageFileName = convertToOsFilePath(packageFileName);\r
+\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
+ }\r
}\r