]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Java/Source/MigrationTools/org/tianocore/migration/Database.java
Database singleton
[mirror_edk2.git] / Tools / Java / Source / MigrationTools / org / tianocore / migration / Database.java
CommitLineData
b0282412 1/** @file\r
2 \r
3 Copyright (c) 2006, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8 \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 \r
12 **/\r
0dc8c589 13package org.tianocore.migration;\r
14\r
15import java.io.*;\r
16import java.util.*;\r
eee63a7b 17import java.util.regex.*;\r
0dc8c589 18\r
e83a1d9a 19import org.apache.xmlbeans.XmlObject;\r
20import org.apache.xmlbeans.XmlObject.Factory;\r
21import org.tianocore.DbPathAndFilename;\r
22import org.tianocore.FrameworkDatabaseDocument;\r
23import org.tianocore.FrameworkDatabaseDocument.FrameworkDatabase;\r
24import org.tianocore.GuidDeclarationsDocument.GuidDeclarations;\r
e83a1d9a 25import org.tianocore.PackageListDocument.PackageList;\r
26import org.tianocore.PackageSurfaceAreaDocument;\r
27import org.tianocore.PackageSurfaceAreaDocument.PackageSurfaceArea;\r
99f757db 28import org.tianocore.PpiDeclarationsDocument.PpiDeclarations;\r
29import org.tianocore.ProtocolDeclarationsDocument.ProtocolDeclarations;\r
30import org.tianocore.LibraryClassDeclarationsDocument.LibraryClassDeclarations;\r
31import org.tianocore.LibraryClassDeclarationsDocument.LibraryClassDeclarations.LibraryClass;\r
e83a1d9a 32\r
7bcb8d17 33public final class Database {\r
8de9f9e1 34 private static final Database INSTANCE = Database.init();;\r
27e0221a 35 \r
36 Database(String path) {\r
37 DatabasePath = path;\r
4f60c26f 38\r
27e0221a 39 try {\r
76734b24 40 //collectWorkSpaceDatabase();\r
9c0e70cb 41 importPkgGuid("PkgGuid.csv");\r
27e0221a 42 importDBLib("Library.csv");\r
43 importDBGuid("Guid.csv", "Guid");\r
44 importDBGuid("Ppi.csv", "Ppi");\r
45 importDBGuid("Protocol.csv", "Protocol");\r
46 importDBMacro("Macro.csv");\r
47 importListR8Only();\r
48 } catch (Exception e) {\r
49 System.out.println(e.getMessage());\r
50 }\r
51 }\r
52 \r
53 public String DatabasePath;\r
54 public Set<String> error = new HashSet<String>();\r
55 public Set<String> r8only = new HashSet<String>();\r
56 \r
57 private Map<String,Guid> hashguid = new HashMap<String,Guid>();\r
58 private Map<String,Func> hashfunc = new HashMap<String,Func>();\r
59 private Map<String,Macro> hashmacro = new HashMap<String,Macro>();\r
9c0e70cb 60 private Map<String,String> hashPkgGuid = new HashMap<String,String>();\r
e83a1d9a 61\r
27e0221a 62 \r
63 //-------------------------------------import------------------------------------------//\r
9c0e70cb 64 private void importPkgGuid(String filename) throws Exception {\r
65 BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r
66 String line;\r
67 String[] linecontext;\r
9c0e70cb 68 \r
69 if (rd.ready()) {\r
70 System.out.println("Found " + filename + ", Importing Package Guid Database.");\r
71 //\r
72 // Skip the title row.\r
73 // \r
74 line = rd.readLine();\r
75 while ((line = rd.readLine()) != null) {\r
76 if (line.length() != 0) {\r
77 linecontext = line.split(",");\r
78 hashPkgGuid.put(linecontext[0], linecontext[1]);\r
79 }\r
80 }\r
81 }\r
82 }\r
83 public Iterator<String> dumpAllPkgGuid() {\r
84 return hashPkgGuid.values().iterator();\r
85 }\r
27e0221a 86 private void importDBLib(String filename) throws Exception {\r
87 BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r
88 String line;\r
89 String[] linecontext;\r
90 Func lf;\r
91 \r
92 if (rd.ready()) {\r
93 System.out.println("Found " + filename + ", Importing Library Database.");\r
94 while ((line = rd.readLine()) != null) {\r
95 if (line.length() != 0) {\r
96 linecontext = line.split(",");\r
97 lf = new Func(linecontext);\r
98 hashfunc.put(lf.r8funcname,lf);\r
99 }\r
100 }\r
101 }\r
102 }\r
103 \r
104 private void importDBGuid(String filename, String type) throws Exception {\r
105 BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r
106 String line;\r
107 String[] linecontext;\r
108 Guid gu;\r
109 \r
110 if (rd.ready()) {\r
111 System.out.println("Found " + filename + ", Importing " + type + " Database.");\r
112 while ((line = rd.readLine()) != null) {\r
113 if (line.length() != 0) {\r
114 linecontext = line.split(",");\r
115 gu = new Guid(linecontext, type);\r
116 hashguid.put(gu.r8name,gu);\r
117 }\r
118 }\r
119 }\r
120 }\r
121 \r
122 private void importDBMacro(String filename) throws Exception {\r
123 BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r
124 String line;\r
125 String[] linecontext;\r
126 Macro mc;\r
127 \r
128 if (rd.ready()) {\r
129 System.out.println("Found " + filename + ", Importing Macro Database.");\r
130 while ((line = rd.readLine()) != null) {\r
131 if (line.length() != 0) {\r
132 linecontext = line.split(",");\r
133 mc = new Macro(linecontext);\r
134 hashmacro.put(mc.r8name,mc);\r
135 }\r
136 }\r
137 }\r
138 }\r
eee63a7b 139\r
27e0221a 140 private void importListR8Only() throws Exception {\r
141 Pattern ptnr8only = Pattern.compile("////#?(\\w*)?.*?R8_(.*?)\\s*\\(.*?////~", Pattern.DOTALL);\r
142 String wholeline = Common.file2string(DatabasePath + File.separator + "R8Lib.c");\r
143 System.out.println("Found " + "R8Lib.c" + ", Importing R8Lib Database.");\r
144 Matcher mtrr8only = ptnr8only.matcher(wholeline);\r
145 while (mtrr8only.find()) {\r
146 r8only.add(mtrr8only.group(2));\r
147 }\r
148 }\r
149 \r
150 //-------------------------------------import------------------------------------------//\r
eee63a7b 151\r
27e0221a 152 //-------------------------------------get------------------------------------------//\r
eee63a7b 153\r
27e0221a 154 public String getR9Lib(String r8funcname) {\r
155 String temp = null;\r
156 if (hashfunc.containsKey(r8funcname)) {\r
157 temp = hashfunc.get(r8funcname).r9libname;\r
158 }\r
159 return temp;\r
160 }\r
161 \r
162 public String getR9Func(String r8funcname) {\r
163 String temp = null;\r
164 if (hashfunc.containsKey(r8funcname)) {\r
165 temp = hashfunc.get(r8funcname).r9funcname;\r
166 }\r
167 return temp;\r
168 }\r
169 \r
170 public String getR9Macro(String r8macro) {\r
171 return hashmacro.get(r8macro).r9name; // the verification job of if the macro exists in the database is done when registering it\r
172 }\r
7bcb8d17 173\r
27e0221a 174 public String getR9Guidname(String r8Guid) {\r
175 String temp = null;\r
176 try {\r
177 temp = hashguid.get(r8Guid).r9name;\r
178 } catch (NullPointerException e) {\r
179 error.add("getR9Guidname :" + r8Guid);\r
180 }\r
181 return temp;\r
182 }\r
7bcb8d17 183\r
27e0221a 184 public String getGuidType(String r8Guid) {\r
185 String temp = null;\r
186 try {\r
187 temp = hashguid.get(r8Guid).type;\r
188 } catch (NullPointerException e) {\r
189 error.add("getR9Guidname :" + r8Guid);\r
190 }\r
191 return temp;\r
192 }\r
7bcb8d17 193\r
27e0221a 194 //-------------------------------------get------------------------------------------//\r
eee63a7b 195\r
27e0221a 196 //-------------------------------------has------------------------------------------//\r
eee63a7b 197\r
27e0221a 198 public boolean hasFunc(String r8lib) {\r
199 return hashfunc.containsKey(r8lib);\r
200 }\r
eee63a7b 201\r
27e0221a 202 public boolean hasGuid(String r8guid) {\r
203 return hashguid.containsKey(r8guid);\r
204 }\r
eee63a7b 205\r
27e0221a 206 public boolean hasMacro(String r8macro) {\r
207 return hashmacro.containsKey(r8macro);\r
208 }\r
209 \r
210 //-------------------------------------has------------------------------------------//\r
211 \r
212 //-------------------------------------init------------------------------------------//\r
4f60c26f 213\r
27e0221a 214 private static final Database init() {\r
215 if (System.getenv("WORKSPACE") == null) {\r
216 return new Database("C:" + File.separator + "tianocore" + File.separator + "edk2" + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration");\r
217 } else {\r
218 return new Database(System.getenv("WORKSPACE") + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration");\r
219 }\r
220 }\r
221 \r
222 public static final Database getInstance() {\r
223 return INSTANCE;\r
224 }\r
e83a1d9a 225\r
e83a1d9a 226\r
99f757db 227\r
8de9f9e1 228 private String workspacePath;\r
229 private HashMap<String, String> hashDbGuids = new HashMap<String, String>();\r
230 private HashMap<String, String> hashDbPpis = new HashMap<String, String>();\r
231 private HashMap<String, String> hashDbProtocols = new HashMap<String, String>();\r
232 private HashMap<String, String> hashDbLibSymbols = new HashMap<String, String>();\r
233 private HashMap<String, String> hashDbLibFunctions = new HashMap<String, String>();\r
234 private HashMap<String, String> hashDbLibExterns = new HashMap<String, String>();\r
99f757db 235\r
8de9f9e1 236 private final String regLibClassName = ".*\\W(\\w[\\w\\d]*)\\.h";\r
237 private final Pattern ptnLibClassName = Pattern.compile(regLibClassName);\r
99f757db 238\r
8de9f9e1 239 private final String regLibSymbol = "#define\\s+(\\w[\\w\\d]*)";\r
240 private final Pattern ptnLibSymbol = Pattern.compile(regLibSymbol);\r
99f757db 241\r
8de9f9e1 242 private final String regLibDataType = "[A-Z][A-Z0-9_]*\\s*\\**";\r
243 private final String regLibFunction = regLibDataType + "\\s*(?:EFIAPI)?\\s+" + \r
99f757db 244 "(\\w[\\w\\d]*)\\s*\\([^)]*\\)\\s*;";\r
8de9f9e1 245 private Pattern ptnLibFunction = Pattern.compile(regLibFunction);\r
99f757db 246\r
8de9f9e1 247 private final String regLibExtern = "extern\\s+" + regLibDataType + \r
76734b24 248 "\\s*(\\w[\\w\\d]*)";\r
8de9f9e1 249 private final Pattern ptnLibExtern = Pattern.compile(regLibExtern);\r
99f757db 250\r
8de9f9e1 251 private final String convertToOsFilePath(String filePath) {\r
99f757db 252 return filePath.replace("/", File.separator).replace("\\", File.separator);\r
253 }\r
8de9f9e1 254 private final void collectLibHeaderFileInfo(String libHeaderFile, String pkgGuid) throws Exception {\r
99f757db 255 String fileContents;\r
256 String libClassName;\r
257 String libContainer;\r
258 Matcher mtrLibClass;\r
259 Matcher mtrLibSymbol;\r
260 Matcher mtrLibFunction;\r
261 Matcher mtrLibExtern;\r
262\r
263 System.out.println ("Parsing: " + libHeaderFile);\r
264 mtrLibClass = ptnLibClassName.matcher(libHeaderFile);\r
265 if (!mtrLibClass.matches()) {\r
266 throw new Exception("Illegal libary header file");\r
267 }\r
268 libClassName = mtrLibClass.group(1);\r
269 libContainer = libClassName + "@" + pkgGuid;\r
270\r
271 fileContents = Common.file2string(libHeaderFile);\r
272 mtrLibSymbol = ptnLibSymbol.matcher(fileContents);\r
273 while (mtrLibSymbol.find()) {\r
274 String libSymbol;\r
275 String oldLibContainer;\r
276\r
277 libSymbol = mtrLibSymbol.group(1);\r
278 oldLibContainer = hashDbLibSymbols.put(libSymbol, libContainer);\r
279 if (oldLibContainer != null) {\r
280 String warnMessage;\r
281\r
282 warnMessage = "Duplicated Lib Symbol:" + libSymbol + " Found. " +\r
283 "Later package will overide the previous one"; \r
284 System.out.println(warnMessage);\r
285 }\r
286 }\r
287\r
288 mtrLibFunction = ptnLibFunction.matcher(fileContents);\r
289 while (mtrLibFunction.find()) {\r
290 String libFunction;\r
291 String oldLibContainer;\r
292\r
293 libFunction = mtrLibFunction.group(1);\r
294 oldLibContainer = hashDbLibFunctions.put(libFunction, libContainer);\r
295 if (oldLibContainer != null) {\r
296 String warnMessage;\r
297\r
298 warnMessage = "Duplicated Lib Function:" + libFunction + " Found. " +\r
299 "Later package will overide the previous one"; \r
300 System.out.println(warnMessage);\r
301 }\r
302 }\r
303\r
304 mtrLibExtern = ptnLibExtern.matcher(fileContents);\r
305 while (mtrLibExtern.find()) {\r
306 String libExtern;\r
307 String oldLibContainer;\r
308\r
309 libExtern = mtrLibExtern.group(1);\r
310 oldLibContainer = hashDbLibExterns.put(libExtern, libContainer);\r
311 if (oldLibContainer != null) {\r
312 String warnMessage;\r
313\r
314 warnMessage = "Duplicated Lib Extern:" + libExtern + " Found. " +\r
315 "Later package will overide the previous one"; \r
316 System.out.println(warnMessage);\r
317 }\r
318 }\r
319 }\r
8de9f9e1 320 private final void collectLibDataBase(PackageSurfaceArea spdDatabase, String pkgDirectory) throws Exception {\r
99f757db 321 String pkgGuid;\r
322 LibraryClassDeclarations libClassDeclarations;\r
323\r
324 pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
325 libClassDeclarations = spdDatabase.getLibraryClassDeclarations();\r
326 if (libClassDeclarations != null) {\r
327 Iterator<LibraryClass> itLibClass;\r
328\r
329 itLibClass = libClassDeclarations.getLibraryClassList().iterator();\r
330 while (itLibClass.hasNext()) {\r
331 String libHeaderFile;\r
332\r
333 libHeaderFile = pkgDirectory + File.separator +\r
334 itLibClass.next().getIncludeHeader(); \r
335 libHeaderFile = convertToOsFilePath (libHeaderFile);\r
336 try {\r
337 collectLibHeaderFileInfo(libHeaderFile, pkgGuid);\r
338 } catch (Exception e) {\r
339 String errorMessage;\r
340\r
341 errorMessage = "Error (" + e.getMessage() + ")occurs when parsing " +\r
342 libHeaderFile;\r
343 System.out.println(errorMessage);\r
344 }\r
345 }\r
346 }\r
347 }\r
8de9f9e1 348 private final void collectGuidDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
e83a1d9a 349 String pkgGuid;\r
99f757db 350 GuidDeclarations guidDeclarations;\r
e83a1d9a 351\r
352 pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
99f757db 353 guidDeclarations = spdDatabase.getGuidDeclarations();\r
354 if (guidDeclarations != null) {\r
355 Iterator<GuidDeclarations.Entry> itGuids;\r
e83a1d9a 356\r
99f757db 357 itGuids = guidDeclarations.getEntryList().iterator();\r
358 while (itGuids.hasNext()) {\r
359 hashDbGuids.put(itGuids.next().getCName(), pkgGuid); \r
360 }\r
e83a1d9a 361 }\r
99f757db 362 \r
e83a1d9a 363 }\r
364\r
8de9f9e1 365 private final void collectPpiDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
e83a1d9a 366 String pkgGuid;\r
99f757db 367 PpiDeclarations ppiDeclarations;\r
e83a1d9a 368\r
369 pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
99f757db 370 ppiDeclarations = spdDatabase.getPpiDeclarations();\r
e83a1d9a 371\r
99f757db 372 if (ppiDeclarations != null) {\r
373 Iterator<PpiDeclarations.Entry> itPpis;\r
374\r
375 itPpis = ppiDeclarations.getEntryList().iterator();\r
376 while (itPpis.hasNext()) {\r
377 hashDbPpis.put(itPpis.next().getCName(), pkgGuid); \r
378 }\r
e83a1d9a 379 }\r
99f757db 380 \r
e83a1d9a 381 }\r
382\r
8de9f9e1 383 private final void collectProtocolDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r
e83a1d9a 384 String pkgGuid;\r
99f757db 385 ProtocolDeclarations protocolDeclarations;\r
e83a1d9a 386\r
387 pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
99f757db 388 protocolDeclarations = spdDatabase.getProtocolDeclarations();\r
e83a1d9a 389\r
99f757db 390 if (protocolDeclarations != null) {\r
391 Iterator<ProtocolDeclarations.Entry> itProtocols;\r
392\r
393 itProtocols = protocolDeclarations.getEntryList().iterator();\r
394 while (itProtocols.hasNext()) {\r
395 hashDbGuids.put(itProtocols.next().getCName(), pkgGuid); \r
396 }\r
e83a1d9a 397 }\r
99f757db 398 \r
e83a1d9a 399 }\r
400\r
8de9f9e1 401 private final void collectPackageDatabase(String packageFileName) throws Exception {\r
e83a1d9a 402 XmlObject xmlPackage;\r
403 PackageSurfaceArea spdDatabase;\r
99f757db 404 File pkgFile;\r
405 \r
406 pkgFile = new File(packageFileName);\r
407 xmlPackage = XmlObject.Factory.parse(pkgFile);\r
e83a1d9a 408 spdDatabase = ((PackageSurfaceAreaDocument) xmlPackage).getPackageSurfaceArea();\r
99f757db 409 \r
e83a1d9a 410 collectGuidDatabase(spdDatabase);\r
411 collectProtocolDatabase(spdDatabase);\r
412 collectPpiDatabase(spdDatabase);\r
99f757db 413 collectLibDataBase(spdDatabase, pkgFile.getParent());\r
e83a1d9a 414\r
415\r
416 }\r
8de9f9e1 417 public final void collectWorkSpaceDatabase() throws Exception {\r
e83a1d9a 418 String databaseFileName;\r
419 File databaseFile;\r
420 XmlObject xmlDatabase;\r
421 FrameworkDatabase frameworkDatabase;\r
422 Iterator<DbPathAndFilename> packageFile;\r
423 \r
424 workspacePath = System.getenv("WORKSPACE");\r
425 \r
426 if (workspacePath == null) {\r
427 String errorMessage = "Envivornment variable \"WORKSPACE\" is not set!";\r
428 throw new Exception(errorMessage);\r
429 }\r
430 databaseFileName = workspacePath + File.separator + \r
431 "Tools" + File.separator +\r
432 "Conf" + File.separator + \r
433 "FrameworkDatabase.db";\r
434 System.out.println("Open " + databaseFileName);\r
435 databaseFile = new File(databaseFileName);\r
436 xmlDatabase = XmlObject.Factory.parse(databaseFile);\r
437 frameworkDatabase = ((FrameworkDatabaseDocument) xmlDatabase).getFrameworkDatabase();\r
438 packageFile = frameworkDatabase.getPackageList().getFilenameList().iterator();\r
439\r
440 while (packageFile.hasNext()) {\r
441 String packageFileName = packageFile.next().getStringValue();\r
442 packageFileName = workspacePath + File.separator + packageFileName;\r
99f757db 443 packageFileName = convertToOsFilePath(packageFileName);\r
e83a1d9a 444\r
99f757db 445 System.out.println("Parsing: " + packageFileName);\r
e83a1d9a 446 try {\r
447 collectPackageDatabase(packageFileName);\r
448 } catch (Exception e) {\r
449 System.out.println("Error occured when opening " + packageFileName + e.getMessage());\r
450 }\r
451 }\r
e83a1d9a 452 }\r
0dc8c589 453}\r