]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/entity/MemoryDatabaseManager.java
Initial import.
[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
23import java.util.HashMap;\r
24import java.util.List;\r
25import java.util.Map;\r
26\r
27import org.tianocore.build.autogen.CommonDefinition;\r
28import org.tianocore.build.pcd.action.ActionMessage;\r
29\r
30/** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
31**/\r
32public class MemoryDatabaseManager {\r
33 ///\r
34 /// Memory database. The string "cName + SpaceNameGuid" is primary key.\r
35 /// memory database is in global scope, and it will be used for others PCD tools.\r
36 ///\r
37 private static Map<String, Token> memoryDatabase = null;\r
38 ///\r
39 /// The log file name for dumping memory database.\r
40 ///\r
41 private static String logFileName = null;\r
42\r
43 /**\r
44 Constructure function\r
45 **/\r
46 public MemoryDatabaseManager() {\r
47 //\r
48 // Allocate memory for new database in global scope.\r
49 //\r
50 if (memoryDatabase == null) {\r
51 memoryDatabase = new HashMap<String, Token>();\r
52 }\r
53 }\r
54\r
55 /**\r
56 Get the log file name.\r
57 **/\r
58 public String getLogFileName() {\r
59 return logFileName;\r
60 }\r
61\r
62 /**\r
63 Set parameter log file name.\r
64 \r
65 @param fileName log file name parameter.\r
66 **/\r
67 public void setLogFileName(String fileName) {\r
68 logFileName = fileName;\r
69 }\r
70\r
71 /**\r
72 Judege whether token exists in memory database\r
73 \r
74 @param primaryKey the primaryKey for searching token\r
75 \r
76 @retval TRUE - token already exist in database.\r
77 @retval FALSE - token does not exist in database.\r
78 **/\r
79 public boolean isTokenInDatabase(String primaryKey) {\r
80 return (memoryDatabase.get(primaryKey) != null);\r
81 }\r
82\r
83 /**\r
84 Add a pcd token into memory database.\r
85 \r
86 @param primaryKey the primary key for searching token\r
87 @param token token instance\r
88 **/\r
89 public void addTokenToDatabase(String primaryKey, Token token) {\r
90 memoryDatabase.put(primaryKey, token);\r
91 }\r
92\r
93 /**\r
94 Get a token instance from memory database with primary key.\r
95 \r
96 @param primaryKey the primary key for searching token\r
97 \r
98 @return token instance.\r
99 **/\r
100 public Token getTokenByKey(String primaryKey) {\r
101 return memoryDatabase.get(primaryKey);\r
102 }\r
103\r
104 /**\r
105 Get the number of PCD token record in memory database.\r
106 \r
107 @return the number of PCD token record in memory database.\r
108 **/\r
109 public int getDBSize() {\r
110 return memoryDatabase.size();\r
111 }\r
112\r
113 /**\r
114 Get the token record array contained all PCD token in memory database.\r
115 \r
116 @return the token record array contained all PCD token in memory database.\r
117 **/\r
118 public Token[] getRecordArray() {\r
119 Token[] tokenArray = null;\r
120 Object[] dataArray = null;\r
121 Map.Entry entry = null;\r
122 int index = 0;\r
123\r
124 if (memoryDatabase == null) {\r
125 return null;\r
126 }\r
127\r
128 dataArray = memoryDatabase.entrySet().toArray();\r
129 tokenArray = new Token[memoryDatabase.size()];\r
130 for (index = 0; index < memoryDatabase.size(); index ++) {\r
131 entry =(Map.Entry) dataArray [index];\r
132 tokenArray[index] =(Token) entry.getValue();\r
133 }\r
134\r
135 return tokenArray;\r
136 }\r
137\r
138 /**\r
139 Get all PCD record for a module according to module's name.\r
140 \r
141 @param moduleName the name of module.\r
142 \r
143 @return all usage instance for this module in memory database.\r
144 **/\r
145 public List<UsageInstance> getUsageInstanceArrayByModuleName(String moduleName) {\r
146 Token[] tokenArray = null;\r
147 int recordIndex = 0; \r
148 int usageInstanceIndex = 0;\r
149 List<UsageInstance> usageInstanceArray = null;\r
150 UsageInstance usageInstance = null;\r
151 List<UsageInstance> returnArray = new ArrayList<UsageInstance>();\r
152\r
153 tokenArray = getRecordArray();\r
154\r
155 //\r
156 // Loop to find all PCD record related to current module\r
157 //\r
158 for (recordIndex = 0; recordIndex < getDBSize(); recordIndex ++) {\r
159 if (tokenArray[recordIndex].producers != null) {\r
160 usageInstanceArray = tokenArray[recordIndex].producers;\r
161 for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
162 usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
163 if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
164 returnArray.add(usageInstance);\r
165 }\r
166 }\r
167 }\r
168\r
169 if (tokenArray[recordIndex].consumers != null) {\r
170 usageInstanceArray = tokenArray[recordIndex].consumers;\r
171 for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
172 usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
173 if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
174 returnArray.add(usageInstance);\r
175 }\r
176 }\r
177 }\r
178 }\r
179\r
180 if (returnArray.size() == 0) {\r
181 ActionMessage.warning(this, "Can *not* find any usage instance for " + moduleName + " !");\r
182 }\r
183\r
184 return returnArray;\r
185 }\r
186\r
187 /**\r
188 Get all modules name who contains PCD information\r
189 \r
190 @return Array for module name\r
191 **/\r
192 public List<String> getAllModuleArray()\r
193 {\r
194 int indexToken = 0;\r
195 int usageIndex = 0;\r
196 int moduleIndex = 0;\r
197 Token[] tokenArray = null;\r
198 List<String> moduleNames = new ArrayList<String>();\r
199 UsageInstance usageInstance = null;\r
200 boolean bFound = false;\r
201\r
202 tokenArray = this.getRecordArray();\r
203 //\r
204 // Find all producer usage instance for retrieving module's name\r
205 //\r
206 for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
207 for (usageIndex = 0; usageIndex < tokenArray[indexToken].producers.size(); usageIndex ++) {\r
208 usageInstance = tokenArray[indexToken].producers.get(usageIndex);\r
209 bFound = false;\r
210 for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
211 if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
212 bFound = true;\r
213 break;\r
214 }\r
215 }\r
216 if (!bFound) {\r
217 moduleNames.add(usageInstance.moduleName);\r
218 }\r
219 }\r
220 }\r
221\r
222 //\r
223 // Find all consumer usage instance for retrieving module's name\r
224 //\r
225 for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
226 for (usageIndex = 0; usageIndex < tokenArray[indexToken].consumers.size(); usageIndex ++) {\r
227 usageInstance = tokenArray[indexToken].consumers.get(usageIndex);\r
228 bFound = false;\r
229 for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
230 if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
231 bFound = true;\r
232 break;\r
233 }\r
234 }\r
235 if (!bFound) {\r
236 moduleNames.add(usageInstance.moduleName);\r
237 }\r
238 }\r
239 }\r
240 return moduleNames;\r
241 }\r
242\r
243 /**\r
244 Dump all PCD record into file for reviewing.\r
245 **/\r
246 public void DumpAllRecords() {\r
247 BufferedWriter bWriter = null;\r
248 Object[] tokenArray = null;\r
249 Map.Entry entry = null;\r
250 Token token = null;\r
251 int index = 0;\r
252 int usageIndex = 0;\r
253 UsageInstance usageInstance = null;\r
254 String inheritString = null;\r
255 String componentTypeName = null;\r
256\r
257 try {\r
258 bWriter = new BufferedWriter(new FileWriter(new File(logFileName)));\r
259 tokenArray = memoryDatabase.entrySet().toArray();\r
260 for (index = 0; index < memoryDatabase.size(); index ++) {\r
261 entry =(Map.Entry) tokenArray [index];\r
262 token =(Token) entry.getValue();\r
263 bWriter.write("****** token [" + Integer.toString(index) + "] ******\r\n");\r
264 bWriter.write(" cName:" + token.cName + "\r\n");\r
265 for (usageIndex = 0; usageIndex < token.producers.size(); usageIndex ++) {\r
266 usageInstance =(UsageInstance)token.producers.get(usageIndex);\r
267 componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
268\r
269 if (usageInstance.isInherit) {\r
270 inheritString = "Inherit";\r
271 } else {\r
272 inheritString = "";\r
273 }\r
274 bWriter.write(String.format(" (Producer)#%d: %s:%s Package:%s %s\r\n",\r
275 usageIndex,\r
276 componentTypeName,\r
277 usageInstance.moduleName,\r
278 usageInstance.packageName,\r
279 inheritString\r
280 )\r
281 );\r
282 }\r
283 for (usageIndex = 0; usageIndex < token.consumers.size(); usageIndex ++) {\r
284 usageInstance =(UsageInstance)token.consumers.get(usageIndex);\r
285 componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
286 if (usageInstance.isInherit) {\r
287 inheritString = "Inherit";\r
288 } else {\r
289 inheritString = "";\r
290 }\r
291 bWriter.write(String.format(" (Consumer)#%d: %s:%s Package:%s %s\r\n",\r
292 usageIndex,\r
293 componentTypeName,\r
294 usageInstance.moduleName,\r
295 usageInstance.packageName,\r
296 inheritString\r
297 )\r
298 );\r
299 }\r
300 }\r
301 bWriter.close();\r
302 } catch (IOException exp) {\r
303 ActionMessage.warning(this, "Failed to open database log file: " + logFileName);\r
304 }\r
305 }\r
306}\r