]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/PcdTools/org/tianocore/pcd/entity/MemoryDatabaseManager.java
Because Pcd entity, exception and some action package are shared by Building tools...
[mirror_edk2.git] / Tools / Source / PcdTools / org / tianocore / 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
d14ebb43 16package org.tianocore.pcd.entity;\r
878ddf1f 17\r
878ddf1f 18import java.util.ArrayList;\r
19import java.util.HashMap;\r
20import java.util.List;\r
21import java.util.Map;\r
8840ad58 22import java.util.UUID;\r
878ddf1f 23\r
d14ebb43 24import org.tianocore.pcd.entity.UsageIdentification;\r
25import org.tianocore.pcd.exception.EntityException;\r
878ddf1f 26\r
27/** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
28**/\r
29public class MemoryDatabaseManager {\r
30 ///\r
31 /// Memory database. The string "cName + SpaceNameGuid" is primary key.\r
32 /// memory database is in global scope, and it will be used for others PCD tools.\r
33 ///\r
8840ad58 34 private static Map<String, Token> memoryDatabase = null;\r
35\r
878ddf1f 36 ///\r
8840ad58 37 /// Before build a module, the used libary will be build firstly, the PCD of these\r
38 /// libarry is inheritted by the module, so stored module's PCD information as PCD\r
39 /// context of building libary.\r
40 /// \r
41 public static List<UsageInstance> UsageInstanceContext = null;\r
eece174a 42\r
878ddf1f 43 ///\r
eece174a 44 /// Current module name, if now is buiding library, this value indicate this library\r
45 /// is for building what module.\r
8840ad58 46 /// \r
47 public static String CurrentModuleName = null;\r
eece174a 48\r
49 ///\r
50 /// String for PCD PEIM and DXE autogen file\r
51 /// \r
52 public static String PcdPeimHString = "";\r
53 public static String PcdPeimCString = "";\r
54 public static String PcdDxeHString = "";\r
55 public static String PcdDxeCString = "";\r
99d2c3c4 56\r
878ddf1f 57 /**\r
58 Constructure function\r
59 **/\r
60 public MemoryDatabaseManager() {\r
61 //\r
62 // Allocate memory for new database in global scope.\r
63 //\r
64 if (memoryDatabase == null) {\r
65 memoryDatabase = new HashMap<String, Token>();\r
66 }\r
67 }\r
68\r
878ddf1f 69 /**\r
70 Judege whether token exists in memory database\r
71 \r
72 @param primaryKey the primaryKey for searching token\r
73 \r
74 @retval TRUE - token already exist in database.\r
75 @retval FALSE - token does not exist in database.\r
76 **/\r
77 public boolean isTokenInDatabase(String primaryKey) {\r
78 return (memoryDatabase.get(primaryKey) != null);\r
79 }\r
80\r
81 /**\r
82 Add a pcd token into memory database.\r
83 \r
84 @param primaryKey the primary key for searching token\r
85 @param token token instance\r
86 **/\r
87 public void addTokenToDatabase(String primaryKey, Token token) {\r
88 memoryDatabase.put(primaryKey, token);\r
89 }\r
90\r
91 /**\r
92 Get a token instance from memory database with primary key.\r
93 \r
94 @param primaryKey the primary key for searching token\r
95 \r
96 @return token instance.\r
97 **/\r
98 public Token getTokenByKey(String primaryKey) {\r
99 return memoryDatabase.get(primaryKey);\r
100 }\r
101\r
102 /**\r
103 Get the number of PCD token record in memory database.\r
104 \r
105 @return the number of PCD token record in memory database.\r
106 **/\r
107 public int getDBSize() {\r
108 return memoryDatabase.size();\r
109 }\r
110\r
111 /**\r
112 Get the token record array contained all PCD token in memory database.\r
113 \r
114 @return the token record array contained all PCD token in memory database.\r
115 **/\r
116 public Token[] getRecordArray() {\r
117 Token[] tokenArray = null;\r
118 Object[] dataArray = null;\r
119 Map.Entry entry = null;\r
120 int index = 0;\r
121\r
122 if (memoryDatabase == null) {\r
123 return null;\r
124 }\r
125\r
126 dataArray = memoryDatabase.entrySet().toArray();\r
127 tokenArray = new Token[memoryDatabase.size()];\r
128 for (index = 0; index < memoryDatabase.size(); index ++) {\r
129 entry =(Map.Entry) dataArray [index];\r
130 tokenArray[index] =(Token) entry.getValue();\r
131 }\r
132\r
133 return tokenArray;\r
134 }\r
135\r
8840ad58 136 /**\r
137 Get record array only contains DYNAMIC or DYNAMIC_EX type PCD.\r
138 \r
139 @return ArrayList\r
140 */\r
141 private ArrayList getDynamicRecordArray() {\r
99d2c3c4 142 Token[] tokenArray = getRecordArray();\r
143 int index = 0;\r
6a4cae58 144 ArrayList<Token> al = new ArrayList<Token>();\r
99d2c3c4 145\r
146 for (index = 0; index < tokenArray.length; index++) {\r
6ff7a41c 147 if (tokenArray[index].isDynamicPCD) {\r
99d2c3c4 148 al.add(tokenArray[index]);\r
149 }\r
150 }\r
151\r
152 return al;\r
153 }\r
154\r
155\r
878ddf1f 156 /**\r
99d2c3c4 157 Get the token record array contained all PCD token referenced by PEI phase.\r
158 The output array is sorted based on descending order of the size of alignment for each feilds.\r
159\r
160 @return the token record array contained all PCD token referenced in PEI phase.\r
eece174a 161 @throws EntityException\r
99d2c3c4 162 **/\r
58f1099f 163 public void getTwoPhaseDynamicRecordArray(ArrayList<Token> pei, ArrayList<Token> dxe) \r
164 throws EntityException {\r
99d2c3c4 165 int usageInstanceIndex = 0;\r
166 int index = 0;\r
8840ad58 167 ArrayList tokenArrayList = getDynamicRecordArray();\r
168 Object[] usageInstanceArray = null;\r
99d2c3c4 169 UsageInstance usageInstance = null;\r
170\r
8840ad58 171 //pei = new ArrayList<Token>();\r
172 //dxe = new ArrayList<Token>();\r
173\r
99d2c3c4 174 for (index = 0; index < tokenArrayList.size(); index++) {\r
175 boolean found = false;\r
176 Token token = (Token) tokenArrayList.get(index);\r
8840ad58 177 if (token.consumers != null) {\r
178 usageInstanceArray = token.consumers.entrySet().toArray();\r
179 for (usageInstanceIndex = 0; usageInstanceIndex < token.consumers.size(); usageInstanceIndex ++) {\r
180 usageInstance =(UsageInstance) (((Map.Entry)usageInstanceArray[usageInstanceIndex]).getValue());\r
181 if (usageInstance.isPeiPhaseComponent()) {\r
99d2c3c4 182 pei.add(token);\r
183 found = true;\r
184 break;\r
185 }\r
186 }\r
99d2c3c4 187 }\r
188\r
58f1099f 189 //\r
190 // If no PEI components reference the PCD entry, \r
191 // we check if it is referenced in DXE driver. \r
32648c62 192 //\r
193 if (!found) {\r
58f1099f 194 if (token.consumers != null) {\r
195 usageInstanceArray = token.consumers.entrySet().toArray();\r
196 for (usageInstanceIndex = 0; usageInstanceIndex < token.consumers.size(); usageInstanceIndex ++) {\r
197 usageInstance =(UsageInstance) (((Map.Entry)usageInstanceArray[usageInstanceIndex]).getValue());\r
198 if (usageInstance.isDxePhaseComponent()) {\r
199 dxe.add(token);\r
200 found = true;\r
201 break;\r
202 }\r
203 }\r
204 }\r
205 \r
206 if (!found) {\r
8d82d611 207 if (token.isDynamicPCD && token.consumers.size() == 0) {\r
208 dxe.add(token);\r
209 } else {\r
210 //\r
211 // We only support Dynamice(EX) type for PEI and DXE phase.\r
212 // If it is not referenced in either PEI or DXE, throw exception now.\r
213 //\r
eece174a 214 throw new EntityException("[PCD tool Internal Error] Dynamic(EX) PCD Entries are referenced in module that is not in PEI phase nor in DXE phase.");\r
8d82d611 215 }\r
58f1099f 216 }\r
32648c62 217 }\r
99d2c3c4 218 }\r
219\r
32648c62 220 return;\r
99d2c3c4 221 }\r
222\r
32648c62 223 /**\r
8840ad58 224 Get all PCD record for a module according to module's name, module's GUID,\r
225 package name, package GUID, arch, version information.\r
878ddf1f 226 \r
d14ebb43 227 @param usageId the id of UsageInstance.\r
878ddf1f 228 \r
229 @return all usage instance for this module in memory database.\r
230 **/\r
d14ebb43 231 public List<UsageInstance> getUsageInstanceArrayByModuleName(UsageIdentification usageId) {\r
eece174a 232\r
d14ebb43 233 String primaryKey = UsageInstance.getPrimaryKey(usageId);\r
8840ad58 234\r
235 return getUsageInstanceArrayByKeyString(primaryKey);\r
236 }\r
237\r
238 /**\r
239 Get all PCD token for a usage instance according to primary key.\r
240 \r
241 @param primaryKey the primary key of usage instance.\r
242 \r
243 @return List<UsageInstance>\r
244 */\r
245 public List<UsageInstance> getUsageInstanceArrayByKeyString(String primaryKey) {\r
878ddf1f 246 Token[] tokenArray = null;\r
247 int recordIndex = 0; \r
878ddf1f 248 UsageInstance usageInstance = null;\r
249 List<UsageInstance> returnArray = new ArrayList<UsageInstance>();\r
250\r
251 tokenArray = getRecordArray();\r
252\r
253 //\r
254 // Loop to find all PCD record related to current module\r
255 //\r
256 for (recordIndex = 0; recordIndex < getDBSize(); recordIndex ++) {\r
8840ad58 257 if (tokenArray[recordIndex].consumers.size() != 0) {\r
258 usageInstance = tokenArray[recordIndex].consumers.get(primaryKey);\r
259 if (usageInstance != null) {\r
260 returnArray.add(usageInstance);\r
878ddf1f 261 }\r
262 }\r
263 }\r
264\r
878ddf1f 265 return returnArray;\r
266 }\r
267\r
268 /**\r
269 Get all modules name who contains PCD information\r
270 \r
271 @return Array for module name\r
272 **/\r
273 public List<String> getAllModuleArray()\r
274 {\r
275 int indexToken = 0;\r
276 int usageIndex = 0;\r
277 int moduleIndex = 0;\r
278 Token[] tokenArray = null;\r
8840ad58 279 Object[] usageInstanceArray = null;\r
878ddf1f 280 List<String> moduleNames = new ArrayList<String>();\r
281 UsageInstance usageInstance = null;\r
282 boolean bFound = false;\r
283\r
8840ad58 284 tokenArray = getRecordArray();\r
878ddf1f 285 //\r
286 // Find all consumer usage instance for retrieving module's name\r
287 //\r
288 for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
8840ad58 289 usageInstanceArray = tokenArray[indexToken].consumers.entrySet().toArray();\r
878ddf1f 290 for (usageIndex = 0; usageIndex < tokenArray[indexToken].consumers.size(); usageIndex ++) {\r
8840ad58 291 usageInstance = (UsageInstance)((Map.Entry)usageInstanceArray[usageIndex]).getValue();\r
878ddf1f 292 bFound = false;\r
293 for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
8840ad58 294 if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.getPrimaryKey())) {\r
878ddf1f 295 bFound = true;\r
296 break;\r
297 }\r
298 }\r
299 if (!bFound) {\r
8840ad58 300 moduleNames.add(usageInstance.getPrimaryKey());\r
878ddf1f 301 }\r
302 }\r
303 }\r
304 return moduleNames;\r
305 }\r
878ddf1f 306}\r