2 This file is for surface area information retrieval.
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 package org
.tianocore
.build
.global
;
16 import java
.util
.ArrayList
;
17 import java
.util
.HashMap
;
18 import java
.util
.Iterator
;
19 import java
.util
.LinkedHashMap
;
20 import java
.util
.List
;
22 import java
.util
.Stack
;
23 import java
.util
.regex
.Matcher
;
24 import java
.util
.regex
.Pattern
;
26 import org
.apache
.xmlbeans
.XmlObject
;
27 import org
.apache
.xmlbeans
.XmlString
;
28 import org
.tianocore
.BuildOptionsDocument
;
29 import org
.tianocore
.CNameType
;
30 import org
.tianocore
.ExternsDocument
;
31 import org
.tianocore
.FileNameConvention
;
32 import org
.tianocore
.FvImagesDocument
;
33 import org
.tianocore
.GuidDeclarationsDocument
;
34 import org
.tianocore
.GuidsDocument
;
35 import org
.tianocore
.LibrariesDocument
;
36 import org
.tianocore
.LibraryClassDeclarationsDocument
;
37 import org
.tianocore
.LibraryClassDocument
;
38 import org
.tianocore
.ModuleDefinitionsDocument
;
39 import org
.tianocore
.ModuleSADocument
;
40 import org
.tianocore
.ModuleSaBuildOptionsDocument
;
41 import org
.tianocore
.ModuleTypeDef
;
42 import org
.tianocore
.MsaFilesDocument
;
43 import org
.tianocore
.MsaHeaderDocument
;
44 import org
.tianocore
.OptionDocument
;
45 import org
.tianocore
.PPIsDocument
;
46 import org
.tianocore
.PackageDependenciesDocument
;
47 import org
.tianocore
.PackageHeadersDocument
;
48 import org
.tianocore
.PcdCodedDocument
;
49 import org
.tianocore
.PlatformDefinitionsDocument
;
50 import org
.tianocore
.PlatformHeaderDocument
;
51 import org
.tianocore
.PpiDeclarationsDocument
;
52 import org
.tianocore
.ProtocolDeclarationsDocument
;
53 import org
.tianocore
.Sentence
;
54 import org
.tianocore
.SpdHeaderDocument
;
55 import org
.tianocore
.UserExtensionsDocument
;
56 import org
.tianocore
.FilenameDocument
.Filename
;
57 import org
.tianocore
.MsaHeaderDocument
.MsaHeader
;
58 import org
.tianocore
.ProtocolsDocument
.Protocols
.Protocol
;
59 import org
.tianocore
.ProtocolsDocument
.Protocols
.ProtocolNotify
;
60 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
61 import org
.tianocore
.build
.id
.ModuleIdentification
;
62 import org
.tianocore
.build
.id
.PackageIdentification
;
63 import org
.tianocore
.build
.id
.PlatformIdentification
;
64 import org
.tianocore
.build
.toolchain
.ToolChainInfo
;
65 import org
.tianocore
.logger
.EdkLog
;
66 import org
.w3c
.dom
.Node
;
69 * SurfaceAreaQuery class is used to query Surface Area information from msa,
70 * mbd, spd and fpd files.
72 * This class should not instantiated. All the public interfaces is static.
76 public class SurfaceAreaQuery
{
78 public static String prefix
= "http://www.TianoCore.org/2006/Edk2.0";
81 // / Contains name/value pairs of Surface Area document object. The name is
82 // / always the top level element name.
84 private static Map
<String
, XmlObject
> map
= null;
87 // / mapStack is used to do nested query
89 private static Stack
<Map
<String
, XmlObject
>> mapStack
= new Stack
<Map
<String
, XmlObject
>>();
92 // / prefix of name space
94 private static String nsPrefix
= "sans";
97 // / xmlbeans needs a name space for each Xpath element
99 private static String ns
= null;
102 // / keep the namep declaration for xmlbeans Xpath query
104 private static String queryDeclaration
= null;
107 * Set a Surface Area document for query later
110 * A Surface Area document in TopLevelElementName/XmlObject
113 public static void setDoc(Map
<String
, XmlObject
> map
) {
115 queryDeclaration
= "declare namespace " + nsPrefix
+ "='" + ns
+ "'; ";
116 SurfaceAreaQuery
.map
= map
;
120 * Push current used Surface Area document into query stack. The given new
121 * document will be used for any immediately followed getXXX() callings,
122 * untill pop() is called.
125 * The TopLevelElementName/XmlObject format of a Surface Area
128 public static void push(Map
<String
, XmlObject
> newMap
) {
129 mapStack
.push(SurfaceAreaQuery
.map
);
130 SurfaceAreaQuery
.map
= newMap
;
134 * Discard current used Surface Area document and use the top document in
137 public static void pop() {
138 SurfaceAreaQuery
.map
= mapStack
.pop();
142 // / Convert xPath to be namespace qualified, which is necessary for
144 // / selectPath(). For example, converting /MsaHeader/ModuleType to
145 // / /ns:MsaHeader/ns:ModuleType
147 private static String
normalizeQueryString(String
[] exp
, String from
) {
148 StringBuffer normQueryString
= new StringBuffer(4096);
151 while (i
< exp
.length
) {
152 String newExp
= from
+ exp
[i
];
153 Pattern pattern
= Pattern
.compile("([^/]*)(/|//)([^/]+)");
154 Matcher matcher
= pattern
.matcher(newExp
);
156 while (matcher
.find()) {
157 String starter
= newExp
.substring(matcher
.start(1), matcher
159 String seperator
= newExp
.substring(matcher
.start(2), matcher
161 String token
= newExp
.substring(matcher
.start(3), matcher
164 normQueryString
.append(starter
);
165 normQueryString
.append(seperator
);
166 normQueryString
.append(nsPrefix
);
167 normQueryString
.append(":");
168 normQueryString
.append(token
);
172 if (i
< exp
.length
) {
173 normQueryString
.append(" | ");
177 return normQueryString
.toString();
181 * Search all XML documents stored in "map" for the specified xPath, using
182 * relative path (starting with '$this')
185 * xpath query string array
186 * @returns An array of XmlObject if elements are found at the specified
188 * @returns NULL if nothing is at the specified xpath
190 public static Object
[] get(String
[] xPath
) {
195 String
[] keys
= (String
[]) map
.keySet().toArray(new String
[map
.size()]);
196 List
<Object
> result
= new ArrayList
<Object
>();
197 for (int i
= 0; i
< keys
.length
; ++i
) {
198 XmlObject rootNode
= (XmlObject
) map
.get(keys
[i
]);
199 if (rootNode
== null) {
203 String query
= queryDeclaration
204 + normalizeQueryString(xPath
, "$this/" + keys
[i
]);
205 XmlObject
[] tmp
= rootNode
.selectPath(query
);
206 for (int j
= 0; j
< tmp
.length
; ++j
) {
207 result
.add((Object
)tmp
[j
]);
211 int size
= result
.size();
216 return (Object
[]) result
.toArray(new Object
[size
]);
220 * Search XML documents named by "rootName" for the given xPath, using
221 * relative path (starting with '$this')
224 * The top level element name
226 * The xpath query string array
227 * @returns An array of XmlObject if elements are found at the given xpath
228 * @returns NULL if nothing is found at the given xpath
230 public static Object
[] get(String rootName
, String
[] xPath
) {
235 XmlObject root
= (XmlObject
) map
.get(rootName
);
240 String query
= queryDeclaration
241 + normalizeQueryString(xPath
, "$this/" + rootName
);
242 XmlObject
[] result
= root
.selectPath(query
);
243 if (result
.length
> 0) {
244 return (Object
[])result
;
247 query
= queryDeclaration
+ normalizeQueryString(xPath
, "/" + rootName
);
248 result
= root
.selectPath(query
);
249 if (result
.length
> 0) {
250 return (Object
[])result
;
257 * Retrieve SourceFiles/Filename for specified ARCH type
261 * @returns An 2 dimension string array if elements are found at the known
263 * @returns NULL if nothing is found at the known xpath
265 public static String
[][] getSourceFiles(String arch
) {
269 xPath
= new String
[] { "/Filename" };
271 returns
= get("SourceFiles", xPath
);
273 if (returns
== null || returns
.length
== 0) {
274 return new String
[0][0];
277 Filename
[] sourceFileNames
= (Filename
[]) returns
;
278 List
<String
[]> outputList
= new ArrayList
<String
[]>();
279 for (int i
= 0; i
< sourceFileNames
.length
; i
++) {
280 List archList
= sourceFileNames
[i
].getSupArchList();
281 if (arch
== null || arch
.equalsIgnoreCase("") || archList
== null || contains(archList
, arch
)) {
282 outputList
.add(new String
[] {sourceFileNames
[i
].getToolCode(),sourceFileNames
[i
].getStringValue()});
286 String
[][] outputString
= new String
[outputList
.size()][2];
287 for (int index
= 0; index
< outputList
.size(); index
++) {
288 outputString
[index
][0] = outputList
.get(index
)[0];
289 outputString
[index
][1] = outputList
.get(index
)[1];
295 * Retrieve /PlatformDefinitions/OutputDirectory from FPD
297 * @returns Directory names array if elements are found at the known xpath
298 * @returns Empty if nothing is found at the known xpath
300 public static String
getFpdOutputDirectory() {
301 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
303 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
304 if (returns
== null || returns
.length
== 0) {
307 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
308 return item
.getOutputDirectory();
311 public static String
getFpdIntermediateDirectories() {
312 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
314 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
315 if (returns
== null || returns
.length
== 0) {
318 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
319 if(item
.getIntermediateDirectories() == null) {
323 return item
.getIntermediateDirectories().toString();
327 public static String
getModuleFfsKeyword() {
328 String
[] xPath
= new String
[] { "/" };
330 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
331 if (returns
== null || returns
.length
== 0) {
334 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
335 return item
.getFfsFormatKey();
338 public static String
getModuleFvBindingKeyword() {
339 String
[] xPath
= new String
[] { "/" };
341 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
342 if (returns
== null || returns
.length
== 0) {
345 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
346 return item
.getFvBinding();
349 public static List
getModuleSupportedArchs() {
350 String
[] xPath
= new String
[] { "/" };
352 Object
[] returns
= get("ModuleDefinitions", xPath
);
353 if (returns
== null || returns
.length
== 0) {
356 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
357 return item
.getSupportedArchitectures();
360 public static BuildOptionsDocument
.BuildOptions
.Ffs
[] getFpdFfs() {
361 String
[] xPath
= new String
[] {"/Ffs"};
363 Object
[] returns
= get("BuildOptions", xPath
);
364 if (returns
== null || returns
.length
== 0) {
365 return new BuildOptionsDocument
.BuildOptions
.Ffs
[0];
367 return (BuildOptionsDocument
.BuildOptions
.Ffs
[])returns
;
370 public static String
getModuleOutputFileBasename() {
371 String
[] xPath
= new String
[] { "/" };
373 Object
[] returns
= get("ModuleDefinitions", xPath
);
374 if (returns
== null || returns
.length
== 0) {
377 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
378 return item
.getOutputFileBasename();
382 * Retrieve BuildOptions/Option or Arch/Option
384 * @param toolChainFamilyFlag
385 * if true, retrieve options for toolchain family; otherwise for
388 * @returns String[][5] name, target, toolchain, arch, coommand of options
389 * if elements are found at the known xpath. String[0][] if dont
392 * @returns Empty array if nothing is there
394 public static String
[][] getOptions(String from
, String
[] xPath
, boolean toolChainFamilyFlag
) {
395 String target
= null;
396 String toolchain
= null;
397 String toolchainFamily
= null;
398 List
<String
> archList
= null;
400 String targetName
= null;
401 String optionName
= null;
403 Object
[] returns
= get(from
, xPath
);
404 if (returns
== null) {
405 return new String
[0][5];
408 List
<String
[]> optionList
= new ArrayList
<String
[]>();
409 OptionDocument
.Option option
;
411 for (int i
= 0; i
< returns
.length
; i
++) {
412 option
= (OptionDocument
.Option
) returns
[i
];
415 // Get Target, ToolChain(Family), Arch, Cmd, and Option from Option,
417 // put to result[][5] array in above order.
420 if (option
.getBuildTargets() == null) {
424 target
= option
.getBuildTargets().toString();
426 if (target
!= null) {
427 targetList
= target
.split(" ");
429 targetList
= new String
[1];
430 targetList
[0] = null;
433 if (toolChainFamilyFlag
) {
434 toolchainFamily
= option
.getToolChainFamily();
435 if (toolchainFamily
!= null) {
436 toolchain
= toolchainFamily
.toString();
441 toolchain
= option
.getTagName();
444 archList
= new ArrayList
<String
>();
445 List archEnumList
= option
.getSupArchList();
446 if (archEnumList
== null) {
449 //archList.addAll(archEnumList);
450 Iterator it
= archEnumList
.iterator();
451 while (it
.hasNext()) {
452 String archType
= (String
)it
.next();
453 archList
.add(archType
);
457 cmd
= option
.getToolCode();
459 optionName
= option
.getStringValue();
460 for (int t
= 0; t
< targetList
.length
; t
++) {
461 for (int j
= 0; j
< archList
.size(); j
++) {
462 optionList
.add(new String
[] { targetList
[t
],
463 toolchain
, archList
.get(j
), cmd
, optionName
});
468 String
[][] result
= new String
[optionList
.size()][5];
469 for (int i
= 0; i
< optionList
.size(); i
++) {
470 result
[i
][0] = optionList
.get(i
)[0];
471 result
[i
][1] = optionList
.get(i
)[1];
472 result
[i
][2] = optionList
.get(i
)[2];
473 result
[i
][3] = optionList
.get(i
)[3];
474 result
[i
][4] = optionList
.get(i
)[4];
479 public static String
[][] getModuleBuildOptions(boolean toolChainFamilyFlag
) {
482 if (toolChainFamilyFlag
== true) {
483 xPath
= new String
[] {
484 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
485 "/Options/Option[@ToolChainFamily]", };
487 xPath
= new String
[] {
488 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
489 "/Options/Option[@TagName]", };
491 return getOptions("ModuleSaBuildOptions", xPath
, toolChainFamilyFlag
);
494 public static String
[][] getPlatformBuildOptions(boolean toolChainFamilyFlag
) {
497 if (toolChainFamilyFlag
== true) {
498 xPath
= new String
[] {
499 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
500 "/BuildOptions/Options/Option[@ToolChainFamily]", };
502 xPath
= new String
[] {
503 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
504 "/BuildOptions/Options/Option[@TagName]", };
507 return getOptions("PlatformSurfaceArea", xPath
, toolChainFamilyFlag
);
510 public static ToolChainInfo
getFpdToolChainInfo() {
511 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
513 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
514 if (returns
== null || returns
.length
== 0) {
518 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
519 ToolChainInfo toolChainInfo
= new ToolChainInfo();
520 toolChainInfo
.addTargets(item
.getBuildTargets().toString());
521 toolChainInfo
.addArchs(item
.getSupportedArchitectures().toString());
522 toolChainInfo
.addTagnames((String
)null);
523 return toolChainInfo
;
527 * Retrieve <xxxHeader>/ModuleType
529 * @returns The module type name if elements are found at the known xpath
530 * @returns null if nothing is there
532 public static String
getModuleType() {
533 String
[] xPath
= new String
[] { "/ModuleType" };
535 Object
[] returns
= get(xPath
);
536 if (returns
!= null && returns
.length
> 0) {
537 ModuleTypeDef type
= (ModuleTypeDef
) returns
[0];
538 return type
.enumValue().toString();
545 * Retrieve PackageDependencies/Package
550 * @returns package name list if elements are found at the known xpath
551 * @returns null if nothing is there
553 public static PackageIdentification
[] getDependencePkg(String arch
) {
555 String packageGuid
= null;
556 String packageVersion
= null;
559 xPath
= new String
[] { "/Package" };
561 Object
[] returns
= get("PackageDependencies", xPath
);
562 if (returns
== null) {
563 return new PackageIdentification
[0];
567 // Get packageIdentification
569 List
<PackageIdentification
> packageIdList
= new ArrayList
<PackageIdentification
>();
570 for (int i
= 0; i
< returns
.length
; i
++) {
571 PackageDependenciesDocument
.PackageDependencies
.Package item
= (PackageDependenciesDocument
.PackageDependencies
.Package
) returns
[i
];
572 List archList
= item
.getSupArchList();
573 if (arch
== null || archList
== null || contains(archList
, arch
)) {
574 packageGuid
= item
.getPackageGuid();
575 packageVersion
= item
.getPackageVersion();
576 packageIdList
.add(new PackageIdentification(null, packageGuid
,
582 // transfer packageIdentification list to array.
584 PackageIdentification
[] packageIdArray
= new PackageIdentification
[packageIdList
.size()];
585 for (int i
= 0; i
< packageIdList
.size(); i
++) {
586 packageIdArray
[i
] = new PackageIdentification(null, packageIdList
.get(i
).getGuid(),packageIdList
.get(i
).getVersion());
588 return packageIdArray
;
592 * Retrieve LibraryClassDefinitions/LibraryClass for specified usage
595 * Library class usage
597 * @returns LibraryClass objects list if elements are found at the known
599 * @returns null if nothing is there
601 public static String
[] getLibraryClasses(String usage
, String arch
) {
603 if (usage
== null || usage
.equals("")) {
604 xPath
= new String
[] { "/LibraryClass" };
606 xPath
= new String
[] { "/LibraryClass[@Usage='" + usage
+ "']" };
609 Object
[] returns
= get("LibraryClassDefinitions", xPath
);
610 if (returns
== null || returns
.length
== 0) {
611 return new String
[0];
614 LibraryClassDocument
.LibraryClass
[] libraryClassList
= (LibraryClassDocument
.LibraryClass
[]) returns
;
615 List
<String
> libraryClassName
= new ArrayList
<String
>();
616 for (int i
= 0; i
< libraryClassList
.length
; i
++) {
617 List archList
= libraryClassList
[i
].getSupArchList();
619 if (arch
== null || contains(archList
, arch
)) {
620 libraryClassName
.add(libraryClassList
[i
].getKeyword());
623 String
[] libraryArray
= new String
[libraryClassName
.size()];
624 for (int i
= 0; i
< libraryClassName
.size(); i
++) {
625 libraryArray
[i
] = libraryClassName
.get(i
);
631 * Retrieve ModuleEntryPoint names
633 * @returns ModuleEntryPoint name list if elements are found at the known
635 * @returns null if nothing is there
637 public static String
[] getModuleEntryPointArray() {
638 String
[] xPath
= new String
[] { "/Extern/ModuleEntryPoint" };
640 Object
[] returns
= get("Externs", xPath
);
642 if (returns
!= null && returns
.length
> 0) {
643 String
[] entryPoints
= new String
[returns
.length
];
645 for (int i
= 0; i
< returns
.length
; ++i
) {
646 entryPoints
[i
] = ((CNameType
) returns
[i
]).getStringValue();
656 * retrieve Protocol for specified usage
659 * Protocol usage arch Architecture
661 * @returns Protocol String list if elements are found at the known xpath
662 * @returns String[0] if nothing is there
664 public static String
[] getProtocolArray(String arch
, String usage
) {
666 String usageXpath
= "";
667 String archXpath
= "";
669 if (arch
== null || arch
.equals("")) {
670 return new String
[0];
672 archXpath
= "/Protocol";
673 if (usage
!= null && !usage
.equals("")) {
674 usageXpath
= "/Protocol[@Usage='" + usage
+ "']";
675 xPath
= new String
[] { usageXpath
, archXpath
};
677 return getProtocolArray(arch
);
682 Object
[] returns
= get("Protocols", xPath
);
683 if (returns
== null) {
684 return new String
[0];
686 Protocol
[] protocolList
= (Protocol
[]) returns
;
688 String
[] protocolArray
= new String
[returns
.length
];
689 for (int i
= 0; i
< returns
.length
; i
++) {
690 protocolArray
[i
] = protocolList
[i
].getProtocolCName();
692 return protocolArray
;
696 * retrieve Protocol for specified usage
701 * @returns Protocol String list if elements are found at the known xpath
702 * @returns String[0] if nothing is there
704 public static String
[] getProtocolArray(String arch
) {
707 if (arch
== null || arch
.equals("")) {
708 return new String
[0];
710 xPath
= new String
[] { "/Protocol" };
713 Object
[] returns
= get("Protocols", xPath
);
714 if (returns
== null) {
715 return new String
[0];
717 Protocol
[] returnlList
= (Protocol
[]) returns
;
719 List
<String
> protocolList
= new ArrayList
<String
>();
721 for (int i
= 0; i
< returns
.length
; i
++) {
722 List archList
= returnlList
[i
].getSupArchList();
723 if (archList
== null || contains(archList
, arch
)){
724 protocolList
.add(returnlList
[i
].getProtocolCName());
727 String
[] protocolArray
= new String
[protocolList
.size()];
728 for (int i
= 0; i
< protocolList
.size(); i
++) {
729 protocolArray
[i
] = protocolList
.get(i
);
731 return protocolArray
;
735 * Retrieve ProtocolNotify for specified usage
738 * ProtocolNotify usage
740 * @returns String[] if elements are found at the known xpath
741 * @returns String[0] if nothing is there
743 public static String
[] getProtocolNotifyArray(String arch
) {
746 if (arch
== null || arch
.equals("")) {
747 return new String
[0];
749 xPath
= new String
[] { "/ProtocolNotify" };
752 Object
[] returns
= get("Protocols", xPath
);
753 if (returns
== null) {
754 return new String
[0];
757 List
<String
> protocolNotifyList
= new ArrayList
<String
>();
759 for (int i
= 0; i
< returns
.length
; i
++) {
760 List archList
= ((ProtocolNotify
) returns
[i
]).getSupArchList();
761 if (archList
== null || contains(archList
, arch
)){
762 protocolNotifyList
.add(((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName());
766 String
[] protocolNotifyArray
= new String
[protocolNotifyList
.size()];
767 for (int i
= 0; i
< protocolNotifyList
.size(); i
++) {
768 protocolNotifyArray
[i
] = protocolNotifyList
.get(i
);
770 return protocolNotifyArray
;
774 * Retrieve ProtocolNotify for specified usage
777 * ProtocolNotify usage
779 * @returns String[] if elements are found at the known xpath
780 * @returns String[0] if nothing is there
782 public static String
[] getProtocolNotifyArray(String arch
, String usage
) {
788 if (arch
== null || arch
.equals("")) {
789 return new String
[0];
791 archXpath
= "/ProtocolNotify";
792 if (usage
!= null && !usage
.equals("")) {
793 usageXpath
= "/ProtocolNotify[@Usage='" + arch
+ "']";
794 xPath
= new String
[] { archXpath
, usageXpath
};
796 return getProtocolNotifyArray(arch
);
800 Object
[] returns
= get("Protocols", xPath
);
801 if (returns
== null) {
802 return new String
[0];
805 String
[] protocolNotifyList
= new String
[returns
.length
];
807 for (int i
= 0; i
< returns
.length
; i
++) {
808 protocolNotifyList
[i
] = ((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName();
810 return protocolNotifyList
;
814 * Retrieve ModuleUnloadImage names
816 * @returns ModuleUnloadImage name list if elements are found at the known
818 * @returns null if nothing is there
820 public static String
[] getModuleUnloadImageArray() {
821 String
[] xPath
= new String
[] { "/Extern/ModuleUnloadImage" };
823 Object
[] returns
= get("Externs", xPath
);
824 if (returns
!= null && returns
.length
> 0) {
825 String
[] stringArray
= new String
[returns
.length
];
826 CNameType
[] doc
= (CNameType
[]) returns
;
828 for (int i
= 0; i
< returns
.length
; ++i
) {
829 stringArray
[i
] = doc
[i
].getStringValue();
841 * @returns Extern objects list if elements are found at the known xpath
842 * @returns null if nothing is there
844 public static ExternsDocument
.Externs
.Extern
[] getExternArray() {
845 String
[] xPath
= new String
[] { "/Extern" };
847 Object
[] returns
= get("Externs", xPath
);
848 if (returns
!= null && returns
.length
> 0) {
849 return (ExternsDocument
.Externs
.Extern
[]) returns
;
856 * Retrieve PpiNotify for specified arch
861 * @returns String[] if elements are found at the known xpath
862 * @returns String[0] if nothing is there
864 public static String
[] getPpiNotifyArray(String arch
) {
867 if (arch
== null || arch
.equals("")) {
868 return new String
[0];
870 xPath
= new String
[] { "/PpiNotify" };
873 Object
[] returns
= get("PPIs", xPath
);
874 if (returns
== null) {
875 return new String
[0];
879 List
<String
> ppiNotifyList
= new ArrayList
<String
>();
880 for (int i
= 0; i
< returns
.length
; i
++) {
881 List archList
= ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getSupArchList();
882 if (archList
== null || contains(archList
, arch
)){
883 ppiNotifyList
.add(((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName());
887 String
[] ppiNotifyArray
= new String
[ppiNotifyList
.size()];
888 for (int i
= 0; i
< ppiNotifyList
.size(); i
++) {
889 ppiNotifyArray
[i
] = ppiNotifyList
.get(i
);
892 return ppiNotifyArray
;
896 * Retrieve PpiNotify for specified usage and arch
899 * PpiNotify arch usage PpiNotify usage
902 * @returns String[] if elements are found at the known xpath
903 * @returns String[0] if nothing is there
905 public static String
[] getPpiNotifyArray(String arch
, String usage
) {
911 if (arch
== null || arch
.equals("")) {
912 return new String
[0];
914 archXpath
= "/PpiNotify";
915 if (usage
!= null && !usage
.equals("")) {
916 usageXpath
= "/PpiNotify[@Usage='" + arch
+ "']";
917 xPath
= new String
[] { archXpath
, usageXpath
};
919 return getProtocolNotifyArray(arch
);
923 Object
[] returns
= get("PPIs", xPath
);
924 if (returns
== null) {
925 return new String
[0];
928 String
[] ppiNotifyList
= new String
[returns
.length
];
930 for (int i
= 0; i
< returns
.length
; i
++) {
931 ppiNotifyList
[i
] = ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName();
933 return ppiNotifyList
;
937 * Retrieve Ppi for specified arch
942 * @returns String[] if elements are found at the known xpath
943 * @returns String[0] if nothing is there
945 public static String
[] getPpiArray(String arch
) {
948 if (arch
== null || arch
.equals("")) {
949 return new String
[0];
951 xPath
= new String
[] { "/Ppi" };
954 Object
[] returns
= get("PPIs", xPath
);
955 if (returns
== null) {
956 return new String
[0];
959 List
<String
> ppiList
= new ArrayList
<String
>();
960 for (int i
= 0; i
< returns
.length
; i
++) {
961 List archList
= ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getSupArchList();
962 if (archList
== null || contains(archList
, arch
)){
963 ppiList
.add(((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName());
967 String
[] ppiArray
= new String
[ppiList
.size()];
968 for (int i
= 0; i
< ppiList
.size(); i
++) {
969 ppiArray
[i
] = ppiList
.get(i
);
975 * Retrieve PpiNotify for specified usage and arch
978 * PpiNotify arch usage PpiNotify usage
981 * @returns String[] if elements are found at the known xpath
982 * @returns String[0] if nothing is there
984 public static String
[] getPpiArray(String arch
, String usage
) {
990 if (arch
== null || arch
.equals("")) {
991 return new String
[0];
994 if (usage
!= null && !usage
.equals("")) {
995 usageXpath
= "/Ppi[@Usage='" + arch
+ "']";
996 xPath
= new String
[] { archXpath
, usageXpath
};
998 return getProtocolNotifyArray(arch
);
1002 Object
[] returns
= get("PPIs", xPath
);
1003 if (returns
== null) {
1004 return new String
[0];
1007 String
[] ppiList
= new String
[returns
.length
];
1009 for (int i
= 0; i
< returns
.length
; i
++) {
1010 ppiList
[i
] = ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName();
1016 * Retrieve GuidEntry information for specified usage
1021 * @returns GuidEntry objects list if elements are found at the known xpath
1022 * @returns null if nothing is there
1024 public static String
[] getGuidEntryArray(String arch
) {
1027 if (arch
== null || arch
.equals("")) {
1028 xPath
= new String
[] { "/GuidCNames" };
1030 xPath
= new String
[] { "/GuidCNames" };
1033 Object
[] returns
= get("Guids", xPath
);
1034 if (returns
== null) {
1035 return new String
[0];
1038 List
<String
> guidList
= new ArrayList
<String
>();
1039 for (int i
= 0; i
< returns
.length
; i
++) {
1040 List archList
= ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getSupArchList();
1041 if (archList
== null || contains(archList
, arch
)){
1042 guidList
.add(((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName());
1046 String
[] guidArray
= new String
[guidList
.size()];
1047 for (int i
= 0; i
< guidList
.size(); i
++) {
1048 guidArray
[i
] = guidList
.get(i
);
1055 * Retrieve GuidEntry information for specified usage
1058 * GuidEntry arch usage GuidEntry usage
1060 * @returns GuidEntry objects list if elements are found at the known xpath
1061 * @returns null if nothing is there
1063 public static String
[] getGuidEntryArray(String arch
, String usage
) {
1068 if (arch
== null || arch
.equals("")) {
1069 return new String
[0];
1071 archXpath
= "/GuidEntry";
1072 if (usage
!= null && !usage
.equals("")) {
1073 usageXpath
= "/GuidEntry[@Usage='" + arch
+ "']";
1074 xPath
= new String
[] { archXpath
, usageXpath
};
1076 return getProtocolNotifyArray(arch
);
1080 Object
[] returns
= get("Guids", xPath
);
1081 if (returns
== null) {
1082 return new String
[0];
1085 String
[] guidList
= new String
[returns
.length
];
1087 for (int i
= 0; i
< returns
.length
; i
++) {
1088 guidList
[i
] = ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName();
1094 * Retrieve Library instance information
1099 * Library instance usage
1101 * @returns library instance name list if elements are found at the known
1103 * @returns null if nothing is there
1105 public static ModuleIdentification
[] getLibraryInstance(String arch
) {
1107 String saGuid
= null;
1108 String saVersion
= null;
1109 String pkgGuid
= null;
1110 String pkgVersion
= null;
1112 if (arch
== null || arch
.equalsIgnoreCase("")) {
1113 xPath
= new String
[] { "/Instance" };
1116 // Since Schema don't have SupArchList now, so the follow Xpath is
1117 // equal to "/Instance" and [not(@SupArchList) or @SupArchList= arch]
1118 // don't have effect.
1120 xPath
= new String
[] { "/Instance[not(@SupArchList) or @SupArchList='"
1124 Object
[] returns
= get("Libraries", xPath
);
1125 if (returns
== null || returns
.length
== 0) {
1126 return new ModuleIdentification
[0];
1129 ModuleIdentification
[] saIdList
= new ModuleIdentification
[returns
.length
];
1130 for (int i
= 0; i
< returns
.length
; i
++) {
1131 LibrariesDocument
.Libraries
.Instance library
= (LibrariesDocument
.Libraries
.Instance
) returns
[i
];
1132 saGuid
= library
.getModuleGuid();
1133 saVersion
= library
.getModuleVersion();
1135 pkgGuid
= library
.getPackageGuid();
1136 pkgVersion
= library
.getPackageVersion();
1138 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1140 PackageIdentification pkgId
= new PackageIdentification(null,
1141 pkgGuid
, pkgVersion
);
1142 saId
.setPackage(pkgId
);
1151 // / This method is used for retrieving the elements information which has
1152 // / CName sub-element
1154 private static String
[] getCNames(String from
, String xPath
[]) {
1155 Object
[] returns
= get(from
, xPath
);
1156 if (returns
== null || returns
.length
== 0) {
1160 String
[] strings
= new String
[returns
.length
];
1161 for (int i
= 0; i
< returns
.length
; ++i
) {
1163 strings
[i
] = ((CNameType
) returns
[i
]).getStringValue();
1170 * Retrive library's constructor name
1172 * @returns constructor name list if elements are found at the known xpath
1173 * @returns null if nothing is there
1175 public static String
getLibConstructorName() {
1176 String
[] xPath
= new String
[] { "/Extern/Constructor" };
1178 Object
[] returns
= get("Externs", xPath
);
1179 if (returns
!= null && returns
.length
> 0) {
1180 CNameType constructor
= ((CNameType
) returns
[0]);
1181 return constructor
.getStringValue();
1188 * Retrive library's destructor name
1190 * @returns destructor name list if elements are found at the known xpath
1191 * @returns null if nothing is there
1193 public static String
getLibDestructorName() {
1194 String
[] xPath
= new String
[] { "/Extern/Destructor" };
1196 Object
[] returns
= get("Externs", xPath
);
1197 if (returns
!= null && returns
.length
> 0) {
1199 // Only support one Destructor function.
1201 CNameType destructor
= (CNameType
) returns
[0];
1202 return destructor
.getStringValue();
1209 * Retrive DriverBinding names
1211 * @returns DriverBinding name list if elements are found at the known xpath
1212 * @returns null if nothing is there
1214 public static String
[] getDriverBindingArray() {
1215 String
[] xPath
= new String
[] { "/Extern/DriverBinding" };
1216 return getCNames("Externs", xPath
);
1220 * Retrive ComponentName names
1222 * @returns ComponentName name list if elements are found at the known xpath
1223 * @returns null if nothing is there
1225 public static String
[] getComponentNameArray() {
1226 String
[] xPath
= new String
[] { "/Extern/ComponentName" };
1227 return getCNames("Externs", xPath
);
1231 * Retrive DriverConfig names
1233 * @returns DriverConfig name list if elements are found at the known xpath
1234 * @returns null if nothing is there
1236 public static String
[] getDriverConfigArray() {
1237 String
[] xPath
= new String
[] { "/Extern/DriverConfig" };
1238 return getCNames("Externs", xPath
);
1242 * Retrive DriverDiag names
1244 * @returns DriverDiag name list if elements are found at the known xpath
1245 * @returns null if nothing is there
1247 public static String
[] getDriverDiagArray() {
1248 String
[] xPath
= new String
[] { "/Extern/DriverDiag" };
1249 return getCNames("Externs", xPath
);
1253 * Retrive SetVirtualAddressMapCallBack names
1255 * @returns SetVirtualAddressMapCallBack name list if elements are found at
1257 * @returns null if nothing is there
1259 public static String
[] getSetVirtualAddressMapCallBackArray() {
1260 String
[] xPath
= new String
[] { "/Extern/SetVirtualAddressMapCallBack" };
1261 return getCNames("Externs", xPath
);
1265 * Retrive ExitBootServicesCallBack names
1267 * @returns ExitBootServicesCallBack name list if elements are found at the
1269 * @returns null if nothing is there
1271 public static String
[] getExitBootServicesCallBackArray() {
1272 String
[] xPath
= new String
[] { "/Extern/ExitBootServicesCallBack" };
1273 return getCNames("Externs", xPath
);
1277 * Retrieve module surface area file information
1279 * @returns ModuleSA objects list if elements are found at the known xpath
1280 * @returns Empty ModuleSA list if nothing is there
1282 public static Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> getFpdModules() {
1283 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1284 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1286 String fvBinding
= null;
1287 String saGuid
= null;
1288 String saVersion
= null;
1289 String pkgGuid
= null;
1290 String pkgVersion
= null;
1292 Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> fpdModuleMap
= new LinkedHashMap
<FpdModuleIdentification
, Map
<String
, XmlObject
>>();
1294 if (result
== null) {
1295 return fpdModuleMap
;
1298 for (int i
= 0; i
< result
.length
; i
++) {
1300 // Get Fpd SA Module element node and add to ObjectMap.
1302 Map
<String
, XmlObject
> ObjectMap
= new HashMap
<String
, XmlObject
>();
1303 ModuleSADocument
.ModuleSA moduleSA
= (ModuleSADocument
.ModuleSA
) result
[i
];
1304 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getLibraries() != null) {
1305 ObjectMap
.put("Libraries", moduleSA
.getLibraries());
1307 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getPcdBuildDefinition() != null) {
1308 ObjectMap
.put("PcdBuildDefinition", moduleSA
1309 .getPcdBuildDefinition());
1311 if (((ModuleSADocument
.ModuleSA
) result
[i
])
1312 .getModuleSaBuildOptions() != null) {
1313 ObjectMap
.put("ModuleSaBuildOptions", moduleSA
1314 .getModuleSaBuildOptions());
1318 // Get Fpd SA Module attribute and create FpdMoudleIdentification.
1320 arch
= moduleSA
.getSupArchList().toString();
1324 saVersion
= ((ModuleSADocument
.ModuleSA
) result
[i
])
1325 .getModuleVersion();
1327 saGuid
= moduleSA
.getModuleGuid();
1328 pkgGuid
= moduleSA
.getPackageGuid();
1329 pkgVersion
= moduleSA
.getPackageVersion();
1332 // Create Module Identification which have class member of package
1335 PackageIdentification pkgId
= new PackageIdentification(null,
1336 pkgGuid
, pkgVersion
);
1337 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1340 saId
.setPackage(pkgId
);
1343 // Create FpdModule Identification which have class member of module
1347 String
[] archList
= arch
.split(" ");
1348 for (int j
= 0; j
< archList
.length
; j
++) {
1349 FpdModuleIdentification fpdSaId
= new FpdModuleIdentification(saId
, archList
[j
]);
1351 if (fvBinding
!= null) {
1352 fpdSaId
.setFvBinding(fvBinding
);
1356 // Put element to Map<FpdModuleIdentification, Map<String,
1359 fpdModuleMap
.put(fpdSaId
, ObjectMap
);
1363 return fpdModuleMap
;
1367 * Retrieve valid image names
1369 * @returns valid iamges name list if elements are found at the known xpath
1370 * @returns empty list if nothing is there
1372 public static String
[] getFpdValidImageNames() {
1373 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='ImageName']/FvImageNames" };
1375 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1376 if (queryResult
== null) {
1377 return new String
[0];
1380 String
[] result
= new String
[queryResult
.length
];
1381 for (int i
= 0; i
< queryResult
.length
; i
++) {
1382 result
[i
] = ((XmlString
) queryResult
[i
]).getStringValue();
1388 public static Node
getFpdUserExtension() {
1389 String
[] xPath
= new String
[] { "/UserExtensions[@UserID='TianoCore']" };
1391 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1392 if (queryResult
== null || queryResult
.length
== 0) {
1395 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1397 return a
.getDomNode();
1401 * Retrieve FV image option information
1406 * @returns option name/value list if elements are found at the known xpath
1407 * @returns empty list if nothing is there
1409 public static String
[][] getFpdOptions(String fvName
) {
1410 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Options' and ./FvImageNames='"
1411 + fvName
.toUpperCase() + "']/FvImageOptions" };
1412 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1413 if (queryResult
== null) {
1414 return new String
[0][];
1416 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1417 for (int i
= 0; i
< queryResult
.length
; i
++) {
1418 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1419 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
1420 .getNameValueList();
1421 Iterator iter
= namevalues
.iterator();
1422 while (iter
.hasNext()) {
1423 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1425 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1428 String
[][] result
= new String
[list
.size()][2];
1429 for (int i
= 0; i
< list
.size(); i
++) {
1430 result
[i
][0] = list
.get(i
)[0];
1431 result
[i
][1] = list
.get(i
)[1];
1437 public static XmlObject
getFpdBuildOptions() {
1438 String
[] xPath
= new String
[] { "/BuildOptions" };
1440 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1442 if (queryResult
== null || queryResult
.length
== 0) {
1445 return (XmlObject
)queryResult
[0];
1448 public static PlatformIdentification
getFpdHeader() {
1449 String
[] xPath
= new String
[] { "/PlatformHeader" };
1451 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
1453 if (returns
== null || returns
.length
== 0) {
1456 PlatformHeaderDocument
.PlatformHeader header
= (PlatformHeaderDocument
.PlatformHeader
) returns
[0];
1458 String name
= header
.getPlatformName();
1460 String guid
= header
.getGuidValue();
1462 String version
= header
.getVersion();
1464 return new PlatformIdentification(name
, guid
, version
);
1468 * Retrieve FV image attributes information
1473 * @returns attribute name/value list if elements are found at the known
1475 * @returns empty list if nothing is there
1477 public static String
[][] getFpdAttributes(String fvName
) {
1478 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Attributes' and ./FvImageNames='"
1479 + fvName
.toUpperCase() + "']/FvImageOptions" };
1480 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1481 if (queryResult
== null) {
1482 return new String
[0][];
1484 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1485 for (int i
= 0; i
< queryResult
.length
; i
++) {
1487 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1488 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1489 Iterator iter
= namevalues
.iterator();
1490 while (iter
.hasNext()) {
1491 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1493 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1496 String
[][] result
= new String
[list
.size()][2];
1497 for (int i
= 0; i
< list
.size(); i
++) {
1498 result
[i
][0] = list
.get(i
)[0];
1499 result
[i
][1] = list
.get(i
)[1];
1505 * Retrieve flash definition file name
1507 * @returns file name if elements are found at the known xpath
1508 * @returns null if nothing is there
1510 public static String
getFlashDefinitionFile() {
1511 String
[] xPath
= new String
[] { "/PlatformDefinitions/FlashDeviceDefinitions/FlashDefinitionFile" };
1513 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1514 if (queryResult
== null || queryResult
.length
== 0) {
1518 FileNameConvention filename
= (FileNameConvention
) queryResult
[queryResult
.length
- 1];
1519 return filename
.getStringValue();
1522 public static String
[][] getFpdGlobalVariable() {
1523 String
[] xPath
= new String
[] { "/Flash/FvImages/NameValue" };
1524 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1525 if (queryResult
== null) {
1526 return new String
[0][];
1529 String
[][] result
= new String
[queryResult
.length
][2];
1531 for (int i
= 0; i
< queryResult
.length
; i
++) {
1532 FvImagesDocument
.FvImages
.NameValue item
= (FvImagesDocument
.FvImages
.NameValue
)queryResult
[i
];
1533 result
[i
][0] = item
.getName();
1534 result
[i
][1] = item
.getValue();
1540 * Retrieve FV image component options
1545 * @returns name/value pairs list if elements are found at the known xpath
1546 * @returns empty list if nothing is there
1548 public static String
[][] getFpdComponents(String fvName
) {
1549 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Components' and ./FvImageNames='"+ fvName
.toUpperCase() + "']/FvImageOptions" };
1550 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1551 if (queryResult
== null) {
1552 return new String
[0][];
1555 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1556 for (int i
= 0; i
< queryResult
.length
; i
++) {
1557 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1558 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1559 Iterator iter
= namevalues
.iterator();
1560 while (iter
.hasNext()) {
1561 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1563 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1566 String
[][] result
= new String
[list
.size()][2];
1567 for (int i
= 0; i
< list
.size(); i
++) {
1568 result
[i
][0] = list
.get(i
)[0];
1569 result
[i
][1] = list
.get(i
)[1];
1575 * Retrieve PCD tokens
1577 * @returns CName/ItemType pairs list if elements are found at the known
1579 * @returns null if nothing is there
1581 public static String
[][] getPcdTokenArray() {
1582 String
[] xPath
= new String
[] { "/PcdData" };
1584 Object
[] returns
= get("PCDs", xPath
);
1585 if (returns
== null || returns
.length
== 0) {
1593 * Retrieve MAS header
1598 public static ModuleIdentification
getMsaHeader() {
1599 String
[] xPath
= new String
[] { "/" };
1600 Object
[] returns
= get("MsaHeader", xPath
);
1602 if (returns
== null || returns
.length
== 0) {
1606 MsaHeader msaHeader
= (MsaHeader
) returns
[0];
1608 // Get BaseName, ModuleType, GuidValue, Version
1609 // which in MsaHeader.
1611 String name
= msaHeader
.getModuleName();
1612 String moduleType
= msaHeader
.getModuleType().toString();
1613 String guid
= msaHeader
.getGuidValue();
1614 String version
= msaHeader
.getVersion();
1616 ModuleIdentification moduleId
= new ModuleIdentification(name
, guid
,
1619 moduleId
.setModuleType(moduleType
);
1625 * Retrieve Extern Specification
1629 * @return String[] If have specification element in the <extern> String[0]
1630 * If no specification element in the <extern>
1634 public static String
[] getExternSpecificaiton() {
1635 String
[] xPath
= new String
[] { "/Specification" };
1637 Object
[] queryResult
= get("Externs", xPath
);
1638 if (queryResult
== null) {
1639 return new String
[0];
1642 String
[] specificationList
= new String
[queryResult
.length
];
1643 for (int i
= 0; i
< queryResult
.length
; i
++) {
1644 specificationList
[i
] = ((Sentence
)queryResult
[i
])
1647 return specificationList
;
1651 * Retreive MsaFile which in SPD
1654 * @return String[][3] The string sequence is ModuleName, ModuleGuid,
1655 * ModuleVersion, MsaFile String[0][] If no msafile in SPD
1657 public static String
[] getSpdMsaFile() {
1658 String
[] xPath
= new String
[] { "/MsaFiles" };
1660 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1661 if (returns
== null) {
1662 return new String
[0];
1665 List
<String
> filenameList
= ((MsaFilesDocument
.MsaFiles
) returns
[0])
1667 return filenameList
.toArray(new String
[filenameList
.size()]);
1673 public static Map
<String
, String
[]> getSpdLibraryClasses() {
1674 String
[] xPath
= new String
[] { "/LibraryClassDeclarations/LibraryClass" };
1676 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1679 // Create Map, Key - LibraryClass, String[] - LibraryClass Header file.
1681 Map
<String
, String
[]> libClassHeaderMap
= new HashMap
<String
, String
[]>();
1683 if (returns
== null) {
1684 return libClassHeaderMap
;
1687 for (int i
= 0; i
< returns
.length
; i
++) {
1688 LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass library
= (LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass
) returns
[i
];
1689 libClassHeaderMap
.put(library
.getName(), new String
[] { library
1690 .getIncludeHeader() });
1692 return libClassHeaderMap
;
1698 public static Map
<String
, String
> getSpdPackageHeaderFiles() {
1699 String
[] xPath
= new String
[] { "/PackageHeaders/IncludePkgHeader" };
1701 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1704 // Create Map, Key - ModuleType, String - PackageInclude Header file.
1706 Map
<String
, String
> packageIncludeMap
= new HashMap
<String
, String
>();
1708 if (returns
== null) {
1709 return packageIncludeMap
;
1712 for (int i
= 0; i
< returns
.length
; i
++) {
1713 PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader includeHeader
= (PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader
) returns
[i
];
1714 packageIncludeMap
.put(includeHeader
.getModuleType().toString(),
1715 includeHeader
.getStringValue());
1717 return packageIncludeMap
;
1720 public static PackageIdentification
getSpdHeader() {
1721 String
[] xPath
= new String
[] { "/SpdHeader" };
1723 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1725 if (returns
== null || returns
.length
== 0) {
1729 SpdHeaderDocument
.SpdHeader header
= (SpdHeaderDocument
.SpdHeader
) returns
[0];
1731 String name
= header
.getPackageName();
1733 String guid
= header
.getGuidValue();
1735 String version
= header
.getVersion();
1737 return new PackageIdentification(name
, guid
, version
);
1743 public static Map
<String
, String
[]> getSpdGuid() {
1744 String
[] xPath
= new String
[] { "/GuidDeclarations/Entry" };
1746 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1749 // Create Map, Key - GuidName, String[] - C_NAME & GUID value.
1751 Map
<String
, String
[]> guidDeclMap
= new HashMap
<String
, String
[]>();
1752 if (returns
== null) {
1756 for (int i
= 0; i
< returns
.length
; i
++) {
1757 GuidDeclarationsDocument
.GuidDeclarations
.Entry entry
= (GuidDeclarationsDocument
.GuidDeclarations
.Entry
) returns
[i
];
1758 String
[] guidPair
= new String
[2];
1759 guidPair
[0] = entry
.getCName();
1760 guidPair
[1] = entry
.getGuidValue();
1761 guidDeclMap
.put(entry
.getName(), guidPair
);
1762 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1763 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[0]);
1764 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[1]);
1772 public static Map
<String
, String
[]> getSpdProtocol() {
1773 String
[] xPath
= new String
[] { "/ProtocolDeclarations/Entry" };
1775 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1778 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1780 Map
<String
, String
[]> protoclMap
= new HashMap
<String
, String
[]>();
1782 if (returns
== null) {
1786 for (int i
= 0; i
< returns
.length
; i
++) {
1787 ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry entry
= (ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry
) returns
[i
];
1788 String
[] protocolPair
= new String
[2];
1790 protocolPair
[0] = entry
.getCName();
1791 protocolPair
[1] = entry
.getGuidValue();
1792 protoclMap
.put(entry
.getName(), protocolPair
);
1793 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1794 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[0]);
1795 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[1]);
1801 * getSpdPpi() Retrieve the SPD PPI Entry
1804 * @return Map<String, String[2]> if get the PPI entry from SPD. Key - PPI
1805 * Name String[0] - PPI CNAME String[1] - PPI Guid Null if no PPI
1808 public static Map
<String
, String
[]> getSpdPpi() {
1809 String
[] xPath
= new String
[] { "/PpiDeclarations/Entry" };
1811 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1814 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1816 Map
<String
, String
[]> ppiMap
= new HashMap
<String
, String
[]>();
1818 if (returns
== null) {
1822 for (int i
= 0; i
< returns
.length
; i
++) {
1823 PpiDeclarationsDocument
.PpiDeclarations
.Entry entry
= (PpiDeclarationsDocument
.PpiDeclarations
.Entry
) returns
[i
];
1824 String
[] ppiPair
= new String
[2];
1825 ppiPair
[0] = entry
.getCName();
1826 ppiPair
[1] = entry
.getGuidValue();
1827 ppiMap
.put(entry
.getName(), ppiPair
);
1833 * Retrieve module Guid string
1835 * @returns GUILD string if elements are found at the known xpath
1836 * @returns null if nothing is there
1838 public static String
getModuleGuid() {
1839 String
[] xPath
= new String
[] { "" };
1841 Object
[] returns
= get("MsaHeader", xPath
);
1842 if (returns
!= null && returns
.length
> 0) {
1843 String guid
= ((MsaHeaderDocument
.MsaHeader
) returns
[0])
1854 public static ModuleSADocument
.ModuleSA
[] getFpdModuleSAs() {
1855 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1856 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1857 if (result
!= null) {
1858 return (ModuleSADocument
.ModuleSA
[]) result
;
1860 return new ModuleSADocument
.ModuleSA
[0];
1864 Get name array of PCD in a module. In one module, token space
1865 is same, and token name should not be conflicted.
1869 public static String
[] getModulePcdEntryNameArray() {
1870 PcdCodedDocument
.PcdCoded
.PcdEntry
[] pcdEntries
= null;
1873 String
[] xPath
= new String
[] {"/PcdEntry"};
1874 Object
[] returns
= get ("PcdCoded", xPath
);
1876 if (returns
== null) {
1877 return new String
[0];
1880 pcdEntries
= (PcdCodedDocument
.PcdCoded
.PcdEntry
[])returns
;
1881 results
= new String
[pcdEntries
.length
];
1883 for (index
= 0; index
< pcdEntries
.length
; index
++) {
1884 results
[index
] = pcdEntries
[index
].getCName();
1890 Search in a List for a given string
1894 public static boolean contains(List list
, String str
) {
1895 if (list
== null || list
.size()== 0) {
1898 Iterator it
= list
.iterator();
1899 while (it
.hasNext()) {
1900 String s
= (String
)it
.next();
1901 if (s
.equalsIgnoreCase(str
)) {