import java.util.Hashtable;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.UUID;\r
\r
-import org.tianocore.build.autogen.CommonDefinition;\r
import org.tianocore.build.pcd.action.ActionMessage;\r
\r
/** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
/// Memory database. The string "cName + SpaceNameGuid" is primary key.\r
/// memory database is in global scope, and it will be used for others PCD tools.\r
///\r
- private static Map<String, Token> memoryDatabase = null;\r
+ private static Map<String, Token> memoryDatabase = null;\r
+\r
///\r
- /// The log file name for dumping memory database.\r
+ /// Before build a module, the used libary will be build firstly, the PCD of these\r
+ /// libarry is inheritted by the module, so stored module's PCD information as PCD\r
+ /// context of building libary.\r
+ /// \r
+ public static List<UsageInstance> UsageInstanceContext = null;\r
///\r
- private static String logFileName = null;\r
-\r
+ /// \r
+ /// \r
+ public static String CurrentModuleName = null;\r
public static String PcdPeimHString = "";\r
public static String PcdPeimCString = "";\r
public static String PcdDxeHString = "";\r
}\r
}\r
\r
- /**\r
- Get the log file name.\r
- **/\r
- public String getLogFileName() {\r
- return logFileName;\r
- }\r
-\r
- /**\r
- Set parameter log file name.\r
- \r
- @param fileName log file name parameter.\r
- **/\r
- public void setLogFileName(String fileName) {\r
- logFileName = fileName;\r
- }\r
-\r
/**\r
Judege whether token exists in memory database\r
\r
return tokenArray;\r
}\r
\r
-\r
+ /**\r
+ Get record array only contains DYNAMIC or DYNAMIC_EX type PCD.\r
+ \r
+ @return ArrayList\r
+ */\r
private ArrayList getDynamicRecordArray() {\r
Token[] tokenArray = getRecordArray();\r
int index = 0;\r
int count = 0;\r
- ArrayList al = new ArrayList();\r
+ ArrayList<Token> al = new ArrayList<Token>();\r
\r
for (index = 0; index < tokenArray.length; index++) {\r
- if (tokenArray[index].pcdType == Token.PCD_TYPE.DYNAMIC ||\r
- tokenArray[index].pcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
+ if (tokenArray[index].isDynamicPCD) {\r
al.add(tokenArray[index]);\r
}\r
}\r
int usageInstanceIndex = 0;\r
int index = 0;\r
ArrayList tokenArrayList = getDynamicRecordArray();\r
- List<UsageInstance> usageInstanceArray = null;\r
+ Object[] usageInstanceArray = null;\r
UsageInstance usageInstance = null;\r
\r
//pei = new ArrayList<Token>();\r
for (index = 0; index < tokenArrayList.size(); index++) {\r
boolean found = false;\r
Token token = (Token) tokenArrayList.get(index);\r
- if (token.producers != null) {\r
- usageInstanceArray = token.producers;\r
- for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex++) {\r
- usageInstance = (UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
- if (CommonDefinition.isPeiPhaseComponent(usageInstance.componentType)) {\r
+ if (token.consumers != null) {\r
+ usageInstanceArray = token.consumers.entrySet().toArray();\r
+ for (usageInstanceIndex = 0; usageInstanceIndex < token.consumers.size(); usageInstanceIndex ++) {\r
+ usageInstance =(UsageInstance) (((Map.Entry)usageInstanceArray[usageInstanceIndex]).getValue());\r
+ if (usageInstance.isPeiPhaseComponent()) {\r
pei.add(token);\r
found = true;\r
break;\r
}\r
}\r
-\r
- }\r
- if (!found) {\r
- if (token.consumers != null) {\r
- usageInstanceArray = token.consumers;\r
- for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
- usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
- if (CommonDefinition.isPeiPhaseComponent(usageInstance.componentType)) {\r
- pei.add(token);\r
- found = true;\r
- break;\r
- }\r
- }\r
- }\r
}\r
\r
- //\r
// If no PEI components reference the PCD entry, we insert it to DXE list\r
//\r
if (!found) {\r
}\r
\r
/**\r
- Get all PCD record for a module according to module's name.\r
+ Get all PCD record for a module according to module's name, module's GUID,\r
+ package name, package GUID, arch, version information.\r
\r
@param moduleName the name of module.\r
\r
@return all usage instance for this module in memory database.\r
**/\r
- public List<UsageInstance> getUsageInstanceArrayByModuleName(String moduleName) {\r
+ public List<UsageInstance> getUsageInstanceArrayByModuleName(String moduleName,\r
+ UUID moduleGuid,\r
+ String packageName,\r
+ UUID packageGuid,\r
+ String arch,\r
+ String version) {\r
+\r
+ String primaryKey = UsageInstance.getPrimaryKey(moduleName, \r
+ moduleGuid,\r
+ packageName,\r
+ packageGuid,\r
+ arch,\r
+ version);\r
+\r
+ return getUsageInstanceArrayByKeyString(primaryKey);\r
+ }\r
+\r
+ /**\r
+ Get all PCD token for a usage instance according to primary key.\r
+ \r
+ @param primaryKey the primary key of usage instance.\r
+ \r
+ @return List<UsageInstance>\r
+ */\r
+ public List<UsageInstance> getUsageInstanceArrayByKeyString(String primaryKey) {\r
Token[] tokenArray = null;\r
int recordIndex = 0; \r
- int usageInstanceIndex = 0;\r
- List<UsageInstance> usageInstanceArray = null;\r
UsageInstance usageInstance = null;\r
List<UsageInstance> returnArray = new ArrayList<UsageInstance>();\r
\r
// Loop to find all PCD record related to current module\r
//\r
for (recordIndex = 0; recordIndex < getDBSize(); recordIndex ++) {\r
- if (tokenArray[recordIndex].producers != null) {\r
- usageInstanceArray = tokenArray[recordIndex].producers;\r
- for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
- usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
- if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
- returnArray.add(usageInstance);\r
- }\r
- }\r
- }\r
-\r
- if (tokenArray[recordIndex].consumers != null) {\r
- usageInstanceArray = tokenArray[recordIndex].consumers;\r
- for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
- usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
- if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
- returnArray.add(usageInstance);\r
- }\r
+ if (tokenArray[recordIndex].consumers.size() != 0) {\r
+ usageInstance = tokenArray[recordIndex].consumers.get(primaryKey);\r
+ if (usageInstance != null) {\r
+ returnArray.add(usageInstance);\r
}\r
}\r
}\r
\r
- if (returnArray.size() == 0) {\r
- ActionMessage.warning(this, "Can *not* find any usage instance for " + moduleName + " !");\r
- }\r
-\r
return returnArray;\r
}\r
\r
int usageIndex = 0;\r
int moduleIndex = 0;\r
Token[] tokenArray = null;\r
+ Object[] usageInstanceArray = null;\r
List<String> moduleNames = new ArrayList<String>();\r
UsageInstance usageInstance = null;\r
boolean bFound = false;\r
\r
- tokenArray = this.getRecordArray();\r
- //\r
- // Find all producer usage instance for retrieving module's name\r
- //\r
- for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
- for (usageIndex = 0; usageIndex < tokenArray[indexToken].producers.size(); usageIndex ++) {\r
- usageInstance = tokenArray[indexToken].producers.get(usageIndex);\r
- bFound = false;\r
- for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
- if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
- bFound = true;\r
- break;\r
- }\r
- }\r
- if (!bFound) {\r
- moduleNames.add(usageInstance.moduleName);\r
- }\r
- }\r
- }\r
-\r
+ tokenArray = getRecordArray();\r
//\r
// Find all consumer usage instance for retrieving module's name\r
//\r
for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
+ usageInstanceArray = tokenArray[indexToken].consumers.entrySet().toArray();\r
for (usageIndex = 0; usageIndex < tokenArray[indexToken].consumers.size(); usageIndex ++) {\r
- usageInstance = tokenArray[indexToken].consumers.get(usageIndex);\r
+ usageInstance = (UsageInstance)((Map.Entry)usageInstanceArray[usageIndex]).getValue();\r
bFound = false;\r
for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
- if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
+ if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.getPrimaryKey())) {\r
bFound = true;\r
break;\r
}\r
}\r
if (!bFound) {\r
- moduleNames.add(usageInstance.moduleName);\r
+ moduleNames.add(usageInstance.getPrimaryKey());\r
}\r
}\r
}\r
return moduleNames;\r
}\r
-\r
- /**\r
- Dump all PCD record into file for reviewing.\r
- **/\r
- public void DumpAllRecords() {\r
- BufferedWriter bWriter = null;\r
- Object[] tokenArray = null;\r
- Map.Entry entry = null;\r
- Token token = null;\r
- int index = 0;\r
- int usageIndex = 0;\r
- UsageInstance usageInstance = null;\r
- String inheritString = null;\r
- String componentTypeName = null;\r
-\r
- try {\r
- bWriter = new BufferedWriter(new FileWriter(new File(logFileName)));\r
- tokenArray = memoryDatabase.entrySet().toArray();\r
- for (index = 0; index < memoryDatabase.size(); index ++) {\r
- entry =(Map.Entry) tokenArray [index];\r
- token =(Token) entry.getValue();\r
- bWriter.write("****** token [" + Integer.toString(index) + "] ******\r\n");\r
- bWriter.write(" cName:" + token.cName + "\r\n");\r
- for (usageIndex = 0; usageIndex < token.producers.size(); usageIndex ++) {\r
- usageInstance =(UsageInstance)token.producers.get(usageIndex);\r
- componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
-\r
- if (usageInstance.isInherit) {\r
- inheritString = "Inherit";\r
- } else {\r
- inheritString = "";\r
- }\r
- bWriter.write(String.format(" (Producer)#%d: %s:%s Package:%s %s\r\n",\r
- usageIndex,\r
- componentTypeName,\r
- usageInstance.moduleName,\r
- usageInstance.packageName,\r
- inheritString\r
- )\r
- );\r
- }\r
- for (usageIndex = 0; usageIndex < token.consumers.size(); usageIndex ++) {\r
- usageInstance =(UsageInstance)token.consumers.get(usageIndex);\r
- componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
- if (usageInstance.isInherit) {\r
- inheritString = "Inherit";\r
- } else {\r
- inheritString = "";\r
- }\r
- bWriter.write(String.format(" (Consumer)#%d: %s:%s Package:%s %s\r\n",\r
- usageIndex,\r
- componentTypeName,\r
- usageInstance.moduleName,\r
- usageInstance.packageName,\r
- inheritString\r
- )\r
- );\r
- }\r
- }\r
- bWriter.close();\r
- } catch (IOException exp) {\r
- ActionMessage.warning(this, "Failed to open database log file: " + logFileName);\r
- }\r
- }\r
}\r