]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/entity/MemoryDatabaseManager.java
Remove the warning message reported when building GenBuild.jar
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / entity / MemoryDatabaseManager.java
CommitLineData
878ddf1f 1/** @file\r
2 MemoryDatabaseManager class.\r
3\r
4 Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
5 \r
6Copyright (c) 2006, Intel Corporation\r
7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11 \r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16package org.tianocore.build.pcd.entity;\r
17\r
18import java.io.BufferedWriter;\r
19import java.io.File;\r
20import java.io.FileWriter;\r
21import java.io.IOException;\r
22import java.util.ArrayList;\r
99d2c3c4 23import java.util.Collections;\r
24import java.util.Comparator;\r
878ddf1f 25import java.util.HashMap;\r
99d2c3c4 26import java.util.Hashtable;\r
878ddf1f 27import java.util.List;\r
28import java.util.Map;\r
29\r
30import org.tianocore.build.autogen.CommonDefinition;\r
31import org.tianocore.build.pcd.action.ActionMessage;\r
32\r
33/** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
34**/\r
35public class MemoryDatabaseManager {\r
36 ///\r
37 /// Memory database. The string "cName + SpaceNameGuid" is primary key.\r
38 /// memory database is in global scope, and it will be used for others PCD tools.\r
39 ///\r
40 private static Map<String, Token> memoryDatabase = null;\r
41 ///\r
42 /// The log file name for dumping memory database.\r
43 ///\r
44 private static String logFileName = null;\r
45\r
99d2c3c4 46 public static String PcdPeimHString = "";\r
32648c62 47 public static String PcdPeimCString = "";\r
48 public static String PcdDxeHString = "";\r
49 public static String PcdDxeCString = "";\r
99d2c3c4 50\r
878ddf1f 51 /**\r
52 Constructure function\r
53 **/\r
54 public MemoryDatabaseManager() {\r
55 //\r
56 // Allocate memory for new database in global scope.\r
57 //\r
58 if (memoryDatabase == null) {\r
59 memoryDatabase = new HashMap<String, Token>();\r
60 }\r
61 }\r
62\r
63 /**\r
64 Get the log file name.\r
65 **/\r
66 public String getLogFileName() {\r
67 return logFileName;\r
68 }\r
69\r
70 /**\r
71 Set parameter log file name.\r
72 \r
73 @param fileName log file name parameter.\r
74 **/\r
75 public void setLogFileName(String fileName) {\r
76 logFileName = fileName;\r
77 }\r
78\r
79 /**\r
80 Judege whether token exists in memory database\r
81 \r
82 @param primaryKey the primaryKey for searching token\r
83 \r
84 @retval TRUE - token already exist in database.\r
85 @retval FALSE - token does not exist in database.\r
86 **/\r
87 public boolean isTokenInDatabase(String primaryKey) {\r
88 return (memoryDatabase.get(primaryKey) != null);\r
89 }\r
90\r
91 /**\r
92 Add a pcd token into memory database.\r
93 \r
94 @param primaryKey the primary key for searching token\r
95 @param token token instance\r
96 **/\r
97 public void addTokenToDatabase(String primaryKey, Token token) {\r
98 memoryDatabase.put(primaryKey, token);\r
99 }\r
100\r
101 /**\r
102 Get a token instance from memory database with primary key.\r
103 \r
104 @param primaryKey the primary key for searching token\r
105 \r
106 @return token instance.\r
107 **/\r
108 public Token getTokenByKey(String primaryKey) {\r
109 return memoryDatabase.get(primaryKey);\r
110 }\r
111\r
112 /**\r
113 Get the number of PCD token record in memory database.\r
114 \r
115 @return the number of PCD token record in memory database.\r
116 **/\r
117 public int getDBSize() {\r
118 return memoryDatabase.size();\r
119 }\r
120\r
121 /**\r
122 Get the token record array contained all PCD token in memory database.\r
123 \r
124 @return the token record array contained all PCD token in memory database.\r
125 **/\r
126 public Token[] getRecordArray() {\r
127 Token[] tokenArray = null;\r
128 Object[] dataArray = null;\r
129 Map.Entry entry = null;\r
130 int index = 0;\r
131\r
132 if (memoryDatabase == null) {\r
133 return null;\r
134 }\r
135\r
136 dataArray = memoryDatabase.entrySet().toArray();\r
137 tokenArray = new Token[memoryDatabase.size()];\r
138 for (index = 0; index < memoryDatabase.size(); index ++) {\r
139 entry =(Map.Entry) dataArray [index];\r
140 tokenArray[index] =(Token) entry.getValue();\r
141 }\r
142\r
143 return tokenArray;\r
144 }\r
145\r
99d2c3c4 146\r
6a4cae58 147 private ArrayList<Token> getDynamicRecordArray() {\r
99d2c3c4 148 Token[] tokenArray = getRecordArray();\r
149 int index = 0;\r
150 int count = 0;\r
6a4cae58 151 ArrayList<Token> al = new ArrayList<Token>();\r
99d2c3c4 152\r
153 for (index = 0; index < tokenArray.length; index++) {\r
154 if (tokenArray[index].pcdType == Token.PCD_TYPE.DYNAMIC ||\r
155 tokenArray[index].pcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
156 al.add(tokenArray[index]);\r
157 }\r
158 }\r
159\r
160 return al;\r
161 }\r
162\r
163\r
878ddf1f 164 /**\r
99d2c3c4 165 Get the token record array contained all PCD token referenced by PEI phase.\r
166 The output array is sorted based on descending order of the size of alignment for each feilds.\r
167\r
168 @return the token record array contained all PCD token referenced in PEI phase.\r
169 **/\r
170 public void getTwoPhaseDynamicRecordArray(ArrayList<Token> pei, ArrayList<Token> dxe) {\r
171 int usageInstanceIndex = 0;\r
172 int index = 0;\r
6a4cae58 173 ArrayList<Token> tokenArrayList = getDynamicRecordArray();\r
99d2c3c4 174 List<UsageInstance> usageInstanceArray = null;\r
175 UsageInstance usageInstance = null;\r
176\r
99d2c3c4 177 for (index = 0; index < tokenArrayList.size(); index++) {\r
178 boolean found = false;\r
179 Token token = (Token) tokenArrayList.get(index);\r
180 if (token.producers != null) {\r
181 usageInstanceArray = token.producers;\r
182 for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex++) {\r
183 usageInstance = (UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
184 if (CommonDefinition.isPeiPhaseComponent(usageInstance.componentType)) {\r
185 pei.add(token);\r
186 found = true;\r
187 break;\r
188 }\r
189 }\r
190\r
191 }\r
192 if (!found) {\r
193 if (token.consumers != null) {\r
194 usageInstanceArray = token.consumers;\r
195 for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
196 usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
197 if (CommonDefinition.isPeiPhaseComponent(usageInstance.componentType)) {\r
198 pei.add(token);\r
32648c62 199 found = true;\r
99d2c3c4 200 break;\r
201 }\r
202 }\r
203 }\r
204 }\r
205\r
32648c62 206 //\r
207 // If no PEI components reference the PCD entry, we insert it to DXE list\r
208 //\r
209 if (!found) {\r
210 dxe.add(token);\r
211 }\r
99d2c3c4 212 }\r
213\r
32648c62 214 return;\r
99d2c3c4 215 }\r
216\r
32648c62 217 /**\r
878ddf1f 218 Get all PCD record for a module according to module's name.\r
219 \r
220 @param moduleName the name of module.\r
221 \r
222 @return all usage instance for this module in memory database.\r
223 **/\r
224 public List<UsageInstance> getUsageInstanceArrayByModuleName(String moduleName) {\r
225 Token[] tokenArray = null;\r
226 int recordIndex = 0; \r
227 int usageInstanceIndex = 0;\r
228 List<UsageInstance> usageInstanceArray = null;\r
229 UsageInstance usageInstance = null;\r
230 List<UsageInstance> returnArray = new ArrayList<UsageInstance>();\r
231\r
232 tokenArray = getRecordArray();\r
233\r
234 //\r
235 // Loop to find all PCD record related to current module\r
236 //\r
237 for (recordIndex = 0; recordIndex < getDBSize(); recordIndex ++) {\r
238 if (tokenArray[recordIndex].producers != null) {\r
239 usageInstanceArray = tokenArray[recordIndex].producers;\r
240 for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
241 usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
242 if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
243 returnArray.add(usageInstance);\r
244 }\r
245 }\r
246 }\r
247\r
248 if (tokenArray[recordIndex].consumers != null) {\r
249 usageInstanceArray = tokenArray[recordIndex].consumers;\r
250 for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
251 usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
252 if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
253 returnArray.add(usageInstance);\r
254 }\r
255 }\r
256 }\r
257 }\r
258\r
259 if (returnArray.size() == 0) {\r
260 ActionMessage.warning(this, "Can *not* find any usage instance for " + moduleName + " !");\r
261 }\r
262\r
263 return returnArray;\r
264 }\r
265\r
266 /**\r
267 Get all modules name who contains PCD information\r
268 \r
269 @return Array for module name\r
270 **/\r
271 public List<String> getAllModuleArray()\r
272 {\r
273 int indexToken = 0;\r
274 int usageIndex = 0;\r
275 int moduleIndex = 0;\r
276 Token[] tokenArray = null;\r
277 List<String> moduleNames = new ArrayList<String>();\r
278 UsageInstance usageInstance = null;\r
279 boolean bFound = false;\r
280\r
281 tokenArray = this.getRecordArray();\r
282 //\r
283 // Find all producer usage instance for retrieving module's name\r
284 //\r
285 for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
286 for (usageIndex = 0; usageIndex < tokenArray[indexToken].producers.size(); usageIndex ++) {\r
287 usageInstance = tokenArray[indexToken].producers.get(usageIndex);\r
288 bFound = false;\r
289 for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
290 if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
291 bFound = true;\r
292 break;\r
293 }\r
294 }\r
295 if (!bFound) {\r
296 moduleNames.add(usageInstance.moduleName);\r
297 }\r
298 }\r
299 }\r
300\r
301 //\r
302 // Find all consumer usage instance for retrieving module's name\r
303 //\r
304 for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
305 for (usageIndex = 0; usageIndex < tokenArray[indexToken].consumers.size(); usageIndex ++) {\r
306 usageInstance = tokenArray[indexToken].consumers.get(usageIndex);\r
307 bFound = false;\r
308 for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
309 if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
310 bFound = true;\r
311 break;\r
312 }\r
313 }\r
314 if (!bFound) {\r
315 moduleNames.add(usageInstance.moduleName);\r
316 }\r
317 }\r
318 }\r
319 return moduleNames;\r
320 }\r
321\r
322 /**\r
323 Dump all PCD record into file for reviewing.\r
324 **/\r
325 public void DumpAllRecords() {\r
326 BufferedWriter bWriter = null;\r
327 Object[] tokenArray = null;\r
328 Map.Entry entry = null;\r
329 Token token = null;\r
330 int index = 0;\r
331 int usageIndex = 0;\r
332 UsageInstance usageInstance = null;\r
333 String inheritString = null;\r
334 String componentTypeName = null;\r
335\r
336 try {\r
337 bWriter = new BufferedWriter(new FileWriter(new File(logFileName)));\r
338 tokenArray = memoryDatabase.entrySet().toArray();\r
339 for (index = 0; index < memoryDatabase.size(); index ++) {\r
340 entry =(Map.Entry) tokenArray [index];\r
341 token =(Token) entry.getValue();\r
342 bWriter.write("****** token [" + Integer.toString(index) + "] ******\r\n");\r
343 bWriter.write(" cName:" + token.cName + "\r\n");\r
344 for (usageIndex = 0; usageIndex < token.producers.size(); usageIndex ++) {\r
345 usageInstance =(UsageInstance)token.producers.get(usageIndex);\r
346 componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
347\r
348 if (usageInstance.isInherit) {\r
349 inheritString = "Inherit";\r
350 } else {\r
351 inheritString = "";\r
352 }\r
353 bWriter.write(String.format(" (Producer)#%d: %s:%s Package:%s %s\r\n",\r
354 usageIndex,\r
355 componentTypeName,\r
356 usageInstance.moduleName,\r
357 usageInstance.packageName,\r
358 inheritString\r
359 )\r
360 );\r
361 }\r
362 for (usageIndex = 0; usageIndex < token.consumers.size(); usageIndex ++) {\r
363 usageInstance =(UsageInstance)token.consumers.get(usageIndex);\r
364 componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
365 if (usageInstance.isInherit) {\r
366 inheritString = "Inherit";\r
367 } else {\r
368 inheritString = "";\r
369 }\r
370 bWriter.write(String.format(" (Consumer)#%d: %s:%s Package:%s %s\r\n",\r
371 usageIndex,\r
372 componentTypeName,\r
373 usageInstance.moduleName,\r
374 usageInstance.packageName,\r
375 inheritString\r
376 )\r
377 );\r
378 }\r
379 }\r
380 bWriter.close();\r
381 } catch (IOException exp) {\r
382 ActionMessage.warning(this, "Failed to open database log file: " + logFileName);\r
383 }\r
384 }\r
385}\r