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
.w3c
.dom
.Node
;
28 import org
.apache
.xmlbeans
.XmlObject
;
29 import org
.apache
.xmlbeans
.XmlString
;
31 import org
.tianocore
.BuildOptionsDocument
;
32 import org
.tianocore
.CNameType
;
33 import org
.tianocore
.ExternsDocument
;
34 import org
.tianocore
.FileNameConvention
;
35 import org
.tianocore
.FvImagesDocument
;
36 import org
.tianocore
.GuidDeclarationsDocument
;
37 import org
.tianocore
.GuidsDocument
;
38 import org
.tianocore
.LibrariesDocument
;
39 import org
.tianocore
.LibraryClassDeclarationsDocument
;
40 import org
.tianocore
.LibraryClassDocument
;
41 import org
.tianocore
.ModuleDefinitionsDocument
;
42 import org
.tianocore
.ModuleSADocument
;
43 import org
.tianocore
.ModuleSaBuildOptionsDocument
;
44 import org
.tianocore
.ModuleTypeDef
;
45 import org
.tianocore
.MsaFilesDocument
;
46 import org
.tianocore
.MsaHeaderDocument
;
47 import org
.tianocore
.OptionDocument
;
48 import org
.tianocore
.PPIsDocument
;
49 import org
.tianocore
.PackageDependenciesDocument
;
50 import org
.tianocore
.PackageHeadersDocument
;
51 import org
.tianocore
.PcdCodedDocument
;
52 import org
.tianocore
.PlatformDefinitionsDocument
;
53 import org
.tianocore
.PlatformHeaderDocument
;
54 import org
.tianocore
.PpiDeclarationsDocument
;
55 import org
.tianocore
.ProtocolDeclarationsDocument
;
56 import org
.tianocore
.Sentence
;
57 import org
.tianocore
.SpdHeaderDocument
;
58 import org
.tianocore
.UserExtensionsDocument
;
59 import org
.tianocore
.FilenameDocument
.Filename
;
60 import org
.tianocore
.MsaHeaderDocument
.MsaHeader
;
61 import org
.tianocore
.ProtocolsDocument
.Protocols
.Protocol
;
62 import org
.tianocore
.ProtocolsDocument
.Protocols
.ProtocolNotify
;
63 import org
.tianocore
.PcdDriverTypes
;
65 import org
.tianocore
.common
.logger
.EdkLog
;
66 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
67 import org
.tianocore
.build
.id
.ModuleIdentification
;
68 import org
.tianocore
.build
.id
.PackageIdentification
;
69 import org
.tianocore
.build
.id
.PlatformIdentification
;
70 import org
.tianocore
.build
.toolchain
.ToolChainInfo
;
71 import org
.tianocore
.build
.autogen
.CommonDefinition
;
74 * SurfaceAreaQuery class is used to query Surface Area information from msa,
75 * mbd, spd and fpd files.
77 * This class should not instantiated. All the public interfaces is static.
81 public class SurfaceAreaQuery
{
83 public static String prefix
= "http://www.TianoCore.org/2006/Edk2.0";
86 // / Contains name/value pairs of Surface Area document object. The name is
87 // / always the top level element name.
89 private static Map
<String
, XmlObject
> map
= null;
92 // / mapStack is used to do nested query
94 private static Stack
<Map
<String
, XmlObject
>> mapStack
= new Stack
<Map
<String
, XmlObject
>>();
97 // / prefix of name space
99 private static String nsPrefix
= "sans";
102 // / xmlbeans needs a name space for each Xpath element
104 private static String ns
= null;
107 // / keep the namep declaration for xmlbeans Xpath query
109 private static String queryDeclaration
= null;
112 * Set a Surface Area document for query later
115 * A Surface Area document in TopLevelElementName/XmlObject
118 public static void setDoc(Map
<String
, XmlObject
> map
) {
120 queryDeclaration
= "declare namespace " + nsPrefix
+ "='" + ns
+ "'; ";
121 SurfaceAreaQuery
.map
= map
;
125 * Push current used Surface Area document into query stack. The given new
126 * document will be used for any immediately followed getXXX() callings,
127 * untill pop() is called.
130 * The TopLevelElementName/XmlObject format of a Surface Area
133 public static void push(Map
<String
, XmlObject
> newMap
) {
134 mapStack
.push(SurfaceAreaQuery
.map
);
135 SurfaceAreaQuery
.map
= newMap
;
139 * Discard current used Surface Area document and use the top document in
142 public static void pop() {
143 SurfaceAreaQuery
.map
= mapStack
.pop();
147 // / Convert xPath to be namespace qualified, which is necessary for
149 // / selectPath(). For example, converting /MsaHeader/ModuleType to
150 // / /ns:MsaHeader/ns:ModuleType
152 private static String
normalizeQueryString(String
[] exp
, String from
) {
153 StringBuffer normQueryString
= new StringBuffer(4096);
156 while (i
< exp
.length
) {
157 String newExp
= from
+ exp
[i
];
158 Pattern pattern
= Pattern
.compile("([^/]*)(/|//)([^/]+)");
159 Matcher matcher
= pattern
.matcher(newExp
);
161 while (matcher
.find()) {
162 String starter
= newExp
.substring(matcher
.start(1), matcher
164 String seperator
= newExp
.substring(matcher
.start(2), matcher
166 String token
= newExp
.substring(matcher
.start(3), matcher
169 normQueryString
.append(starter
);
170 normQueryString
.append(seperator
);
171 normQueryString
.append(nsPrefix
);
172 normQueryString
.append(":");
173 normQueryString
.append(token
);
177 if (i
< exp
.length
) {
178 normQueryString
.append(" | ");
182 return normQueryString
.toString();
186 * Search all XML documents stored in "map" for the specified xPath, using
187 * relative path (starting with '$this')
190 * xpath query string array
191 * @returns An array of XmlObject if elements are found at the specified
193 * @returns NULL if nothing is at the specified xpath
195 public static Object
[] get(String
[] xPath
) {
200 String
[] keys
= (String
[]) map
.keySet().toArray(new String
[map
.size()]);
201 List
<Object
> result
= new ArrayList
<Object
>();
202 for (int i
= 0; i
< keys
.length
; ++i
) {
203 XmlObject rootNode
= (XmlObject
) map
.get(keys
[i
]);
204 if (rootNode
== null) {
208 String query
= queryDeclaration
209 + normalizeQueryString(xPath
, "$this/" + keys
[i
]);
210 XmlObject
[] tmp
= rootNode
.selectPath(query
);
211 for (int j
= 0; j
< tmp
.length
; ++j
) {
212 result
.add((Object
)tmp
[j
]);
216 int size
= result
.size();
221 return (Object
[]) result
.toArray(new Object
[size
]);
225 * Search XML documents named by "rootName" for the given xPath, using
226 * relative path (starting with '$this')
229 * The top level element name
231 * The xpath query string array
232 * @returns An array of XmlObject if elements are found at the given xpath
233 * @returns NULL if nothing is found at the given xpath
235 public static Object
[] get(String rootName
, String
[] xPath
) {
240 XmlObject root
= (XmlObject
) map
.get(rootName
);
245 String query
= queryDeclaration
246 + normalizeQueryString(xPath
, "$this/" + rootName
);
247 XmlObject
[] result
= root
.selectPath(query
);
248 if (result
.length
> 0) {
249 return (Object
[])result
;
252 query
= queryDeclaration
+ normalizeQueryString(xPath
, "/" + rootName
);
253 result
= root
.selectPath(query
);
254 if (result
.length
> 0) {
255 return (Object
[])result
;
262 * Retrieve SourceFiles/Filename for specified ARCH type
266 * @returns An 2 dimension string array if elements are found at the known
268 * @returns NULL if nothing is found at the known xpath
270 public static String
[][] getSourceFiles(String arch
) {
274 xPath
= new String
[] { "/Filename" };
276 returns
= get("SourceFiles", xPath
);
278 if (returns
== null || returns
.length
== 0) {
279 return new String
[0][0];
282 Filename
[] sourceFileNames
= (Filename
[]) returns
;
283 List
<String
[]> outputList
= new ArrayList
<String
[]>();
284 for (int i
= 0; i
< sourceFileNames
.length
; i
++) {
285 List archList
= sourceFileNames
[i
].getSupArchList();
286 if (arch
== null || arch
.equalsIgnoreCase("") || archList
== null || contains(archList
, arch
)) {
287 outputList
.add(new String
[] {sourceFileNames
[i
].getToolCode(),sourceFileNames
[i
].getStringValue()});
291 String
[][] outputString
= new String
[outputList
.size()][2];
292 for (int index
= 0; index
< outputList
.size(); index
++) {
293 outputString
[index
][0] = outputList
.get(index
)[0];
294 outputString
[index
][1] = outputList
.get(index
)[1];
300 * Retrieve /PlatformDefinitions/OutputDirectory from FPD
302 * @returns Directory names array if elements are found at the known xpath
303 * @returns Empty if nothing is found at the known xpath
305 public static String
getFpdOutputDirectory() {
306 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
308 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
309 if (returns
== null || returns
.length
== 0) {
312 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
313 return item
.getOutputDirectory();
316 public static String
getFpdIntermediateDirectories() {
317 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
319 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
320 if (returns
== null || returns
.length
== 0) {
323 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
324 if(item
.getIntermediateDirectories() == null) {
328 return item
.getIntermediateDirectories().toString();
332 public static String
getModuleFfsKeyword() {
333 String
[] xPath
= new String
[] { "/" };
335 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
336 if (returns
== null || returns
.length
== 0) {
339 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
340 return item
.getFfsFormatKey();
343 public static String
getModuleFvBindingKeyword() {
344 String
[] xPath
= new String
[] { "/" };
346 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
347 if (returns
== null || returns
.length
== 0) {
350 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
351 return item
.getFvBinding();
354 public static List
getModuleSupportedArchs() {
355 String
[] xPath
= new String
[] { "/" };
357 Object
[] returns
= get("ModuleDefinitions", xPath
);
358 if (returns
== null || returns
.length
== 0) {
361 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
362 return item
.getSupportedArchitectures();
365 public static BuildOptionsDocument
.BuildOptions
.Ffs
[] getFpdFfs() {
366 String
[] xPath
= new String
[] {"/Ffs"};
368 Object
[] returns
= get("BuildOptions", xPath
);
369 if (returns
== null || returns
.length
== 0) {
370 return new BuildOptionsDocument
.BuildOptions
.Ffs
[0];
372 return (BuildOptionsDocument
.BuildOptions
.Ffs
[])returns
;
375 public static String
getModuleOutputFileBasename() {
376 String
[] xPath
= new String
[] { "/" };
378 Object
[] returns
= get("ModuleDefinitions", xPath
);
379 if (returns
== null || returns
.length
== 0) {
382 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
383 return item
.getOutputFileBasename();
387 * Retrieve BuildOptions/Option or Arch/Option
389 * @param toolChainFamilyFlag
390 * if true, retrieve options for toolchain family; otherwise for
393 * @returns String[][5] name, target, toolchain, arch, coommand of options
394 * if elements are found at the known xpath. String[0][] if dont
397 * @returns Empty array if nothing is there
399 public static String
[][] getOptions(String from
, String
[] xPath
, boolean toolChainFamilyFlag
) {
400 String target
= null;
401 String toolchain
= null;
402 String toolchainFamily
= null;
403 List
<String
> archList
= null;
405 String optionName
= null;
407 Object
[] returns
= get(from
, xPath
);
408 if (returns
== null) {
409 return new String
[0][5];
412 List
<String
[]> optionList
= new ArrayList
<String
[]>();
413 OptionDocument
.Option option
;
415 for (int i
= 0; i
< returns
.length
; i
++) {
416 option
= (OptionDocument
.Option
) returns
[i
];
419 // Get Target, ToolChain(Family), Arch, Cmd, and Option from Option,
421 // put to result[][5] array in above order.
424 if (option
.getBuildTargets() == null) {
428 target
= option
.getBuildTargets().toString();
430 if (target
!= null) {
431 targetList
= target
.split(" ");
433 targetList
= new String
[1];
434 targetList
[0] = null;
437 if (toolChainFamilyFlag
) {
438 toolchainFamily
= option
.getToolChainFamily();
439 if (toolchainFamily
!= null) {
440 toolchain
= toolchainFamily
.toString();
445 toolchain
= option
.getTagName();
448 archList
= new ArrayList
<String
>();
449 List archEnumList
= option
.getSupArchList();
450 if (archEnumList
== null) {
453 //archList.addAll(archEnumList);
454 Iterator it
= archEnumList
.iterator();
455 while (it
.hasNext()) {
456 String archType
= (String
)it
.next();
457 archList
.add(archType
);
461 cmd
= option
.getToolCode();
463 optionName
= option
.getStringValue();
464 for (int t
= 0; t
< targetList
.length
; t
++) {
465 for (int j
= 0; j
< archList
.size(); j
++) {
466 optionList
.add(new String
[] { targetList
[t
],
467 toolchain
, archList
.get(j
), cmd
, optionName
});
472 String
[][] result
= new String
[optionList
.size()][5];
473 for (int i
= 0; i
< optionList
.size(); i
++) {
474 result
[i
][0] = optionList
.get(i
)[0];
475 result
[i
][1] = optionList
.get(i
)[1];
476 result
[i
][2] = optionList
.get(i
)[2];
477 result
[i
][3] = optionList
.get(i
)[3];
478 result
[i
][4] = optionList
.get(i
)[4];
483 public static String
[][] getModuleBuildOptions(boolean toolChainFamilyFlag
) {
486 if (toolChainFamilyFlag
== true) {
487 xPath
= new String
[] {
488 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
489 "/Options/Option[@ToolChainFamily]", };
491 xPath
= new String
[] {
492 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
493 "/Options/Option[@TagName]", };
495 return getOptions("ModuleSaBuildOptions", xPath
, toolChainFamilyFlag
);
498 public static String
[][] getPlatformBuildOptions(boolean toolChainFamilyFlag
) {
501 if (toolChainFamilyFlag
== true) {
502 xPath
= new String
[] {
503 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
504 "/BuildOptions/Options/Option[@ToolChainFamily]", };
506 xPath
= new String
[] {
507 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
508 "/BuildOptions/Options/Option[@TagName]", };
511 return getOptions("PlatformSurfaceArea", xPath
, toolChainFamilyFlag
);
514 public static ToolChainInfo
getFpdToolChainInfo() {
515 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
517 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
518 if (returns
== null || returns
.length
== 0) {
522 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
523 ToolChainInfo toolChainInfo
= new ToolChainInfo();
524 toolChainInfo
.addTargets(item
.getBuildTargets().toString());
525 toolChainInfo
.addArchs(item
.getSupportedArchitectures().toString());
526 toolChainInfo
.addTagnames((String
)null);
527 return toolChainInfo
;
531 * Retrieve <xxxHeader>/ModuleType
533 * @returns The module type name if elements are found at the known xpath
534 * @returns null if nothing is there
536 public static String
getModuleType() {
537 String
[] xPath
= new String
[] { "/ModuleType" };
539 Object
[] returns
= get(xPath
);
540 if (returns
!= null && returns
.length
> 0) {
541 ModuleTypeDef type
= (ModuleTypeDef
) returns
[0];
542 return type
.enumValue().toString();
549 * Retrieve PackageDependencies/Package
554 * @returns package name list if elements are found at the known xpath
555 * @returns null if nothing is there
557 public static PackageIdentification
[] getDependencePkg(String arch
) {
559 String packageGuid
= null;
560 String packageVersion
= null;
563 xPath
= new String
[] { "/Package" };
565 Object
[] returns
= get("PackageDependencies", xPath
);
566 if (returns
== null) {
567 return new PackageIdentification
[0];
571 // Get packageIdentification
573 List
<PackageIdentification
> packageIdList
= new ArrayList
<PackageIdentification
>();
574 for (int i
= 0; i
< returns
.length
; i
++) {
575 PackageDependenciesDocument
.PackageDependencies
.Package item
= (PackageDependenciesDocument
.PackageDependencies
.Package
) returns
[i
];
576 List archList
= item
.getSupArchList();
577 if (arch
== null || archList
== null || contains(archList
, arch
)) {
578 packageGuid
= item
.getPackageGuid();
579 packageVersion
= item
.getPackageVersion();
580 packageIdList
.add(new PackageIdentification(null, packageGuid
,
586 // transfer packageIdentification list to array.
588 PackageIdentification
[] packageIdArray
= new PackageIdentification
[packageIdList
.size()];
589 for (int i
= 0; i
< packageIdList
.size(); i
++) {
590 packageIdArray
[i
] = new PackageIdentification(null, packageIdList
.get(i
).getGuid(),packageIdList
.get(i
).getVersion());
592 return packageIdArray
;
596 * Retrieve LibraryClassDefinitions/LibraryClass for specified usage
599 * Library class usage
601 * @returns LibraryClass objects list if elements are found at the known
603 * @returns null if nothing is there
605 public static String
[] getLibraryClasses(String usage
, String arch
) {
607 if (usage
== null || usage
.equals("")) {
608 xPath
= new String
[] { "/LibraryClass" };
610 xPath
= new String
[] { "/LibraryClass[@Usage='" + usage
+ "']" };
613 Object
[] returns
= get("LibraryClassDefinitions", xPath
);
614 if (returns
== null || returns
.length
== 0) {
615 return new String
[0];
618 LibraryClassDocument
.LibraryClass
[] libraryClassList
= (LibraryClassDocument
.LibraryClass
[]) returns
;
619 List
<String
> libraryClassName
= new ArrayList
<String
>();
620 for (int i
= 0; i
< libraryClassList
.length
; i
++) {
621 List archList
= libraryClassList
[i
].getSupArchList();
623 if (arch
== null || contains(archList
, arch
)) {
624 libraryClassName
.add(libraryClassList
[i
].getKeyword());
628 String
[] libraryArray
= new String
[libraryClassName
.size()];
629 libraryClassName
.toArray(libraryArray
);
634 * Retrieve ModuleEntryPoint names
636 * @returns ModuleEntryPoint name list if elements are found at the known
638 * @returns null if nothing is there
640 public static String
[] getModuleEntryPointArray() {
641 String
[] xPath
= new String
[] { "/Extern/ModuleEntryPoint" };
643 Object
[] returns
= get("Externs", xPath
);
645 if (returns
!= null && returns
.length
> 0) {
646 String
[] entryPoints
= new String
[returns
.length
];
648 for (int i
= 0; i
< returns
.length
; ++i
) {
649 entryPoints
[i
] = ((CNameType
) returns
[i
]).getStringValue();
659 * retrieve Protocol for specified usage
662 * Protocol usage arch Architecture
664 * @returns Protocol String list if elements are found at the known xpath
665 * @returns String[0] if nothing is there
667 public static String
[] getProtocolArray(String arch
, String usage
) {
669 String usageXpath
= "";
670 String archXpath
= "";
672 if (arch
== null || arch
.equals("")) {
673 return new String
[0];
675 archXpath
= "/Protocol";
676 if (usage
!= null && !usage
.equals("")) {
677 usageXpath
= "/Protocol[@Usage='" + usage
+ "']";
678 xPath
= new String
[] { usageXpath
, archXpath
};
680 return getProtocolArray(arch
);
685 Object
[] returns
= get("Protocols", xPath
);
686 if (returns
== null) {
687 return new String
[0];
689 Protocol
[] protocolList
= (Protocol
[]) returns
;
691 String
[] protocolArray
= new String
[returns
.length
];
692 for (int i
= 0; i
< returns
.length
; i
++) {
693 protocolArray
[i
] = protocolList
[i
].getProtocolCName();
695 return protocolArray
;
699 * retrieve Protocol for specified usage
704 * @returns Protocol String list if elements are found at the known xpath
705 * @returns String[0] if nothing is there
707 public static String
[] getProtocolArray(String arch
) {
710 if (arch
== null || arch
.equals("")) {
711 return new String
[0];
713 xPath
= new String
[] { "/Protocol" };
716 Object
[] returns
= get("Protocols", xPath
);
717 if (returns
== null) {
718 return new String
[0];
720 Protocol
[] returnlList
= (Protocol
[]) returns
;
722 List
<String
> protocolList
= new ArrayList
<String
>();
724 for (int i
= 0; i
< returns
.length
; i
++) {
725 List archList
= returnlList
[i
].getSupArchList();
726 if (archList
== null || contains(archList
, arch
)){
727 protocolList
.add(returnlList
[i
].getProtocolCName());
730 String
[] protocolArray
= new String
[protocolList
.size()];
731 for (int i
= 0; i
< protocolList
.size(); i
++) {
732 protocolArray
[i
] = protocolList
.get(i
);
734 return protocolArray
;
738 * Retrieve ProtocolNotify for specified usage
741 * ProtocolNotify usage
743 * @returns String[] if elements are found at the known xpath
744 * @returns String[0] if nothing is there
746 public static String
[] getProtocolNotifyArray(String arch
) {
749 if (arch
== null || arch
.equals("")) {
750 return new String
[0];
752 xPath
= new String
[] { "/ProtocolNotify" };
755 Object
[] returns
= get("Protocols", xPath
);
756 if (returns
== null) {
757 return new String
[0];
760 List
<String
> protocolNotifyList
= new ArrayList
<String
>();
762 for (int i
= 0; i
< returns
.length
; i
++) {
763 List archList
= ((ProtocolNotify
) returns
[i
]).getSupArchList();
764 if (archList
== null || contains(archList
, arch
)){
765 protocolNotifyList
.add(((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName());
769 String
[] protocolNotifyArray
= new String
[protocolNotifyList
.size()];
770 for (int i
= 0; i
< protocolNotifyList
.size(); i
++) {
771 protocolNotifyArray
[i
] = protocolNotifyList
.get(i
);
773 return protocolNotifyArray
;
777 * Retrieve ProtocolNotify for specified usage
780 * ProtocolNotify usage
782 * @returns String[] if elements are found at the known xpath
783 * @returns String[0] if nothing is there
785 public static String
[] getProtocolNotifyArray(String arch
, String usage
) {
791 if (arch
== null || arch
.equals("")) {
792 return new String
[0];
794 archXpath
= "/ProtocolNotify";
795 if (usage
!= null && !usage
.equals("")) {
796 usageXpath
= "/ProtocolNotify[@Usage='" + arch
+ "']";
797 xPath
= new String
[] { archXpath
, usageXpath
};
799 return getProtocolNotifyArray(arch
);
803 Object
[] returns
= get("Protocols", xPath
);
804 if (returns
== null) {
805 return new String
[0];
808 String
[] protocolNotifyList
= new String
[returns
.length
];
810 for (int i
= 0; i
< returns
.length
; i
++) {
811 protocolNotifyList
[i
] = ((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName();
813 return protocolNotifyList
;
817 * Retrieve ModuleUnloadImage names
819 * @returns ModuleUnloadImage name list if elements are found at the known
821 * @returns null if nothing is there
823 public static String
[] getModuleUnloadImageArray() {
824 String
[] xPath
= new String
[] { "/Extern/ModuleUnloadImage" };
826 Object
[] returns
= get("Externs", xPath
);
827 if (returns
!= null && returns
.length
> 0) {
828 String
[] stringArray
= new String
[returns
.length
];
829 CNameType
[] doc
= (CNameType
[]) returns
;
831 for (int i
= 0; i
< returns
.length
; ++i
) {
832 stringArray
[i
] = doc
[i
].getStringValue();
844 * @returns Extern objects list if elements are found at the known xpath
845 * @returns null if nothing is there
847 public static ExternsDocument
.Externs
.Extern
[] getExternArray() {
848 String
[] xPath
= new String
[] { "/Extern" };
850 Object
[] returns
= get("Externs", xPath
);
851 if (returns
!= null && returns
.length
> 0) {
852 return (ExternsDocument
.Externs
.Extern
[]) returns
;
859 * Retrieve PpiNotify for specified arch
864 * @returns String[] if elements are found at the known xpath
865 * @returns String[0] if nothing is there
867 public static String
[] getPpiNotifyArray(String arch
) {
870 if (arch
== null || arch
.equals("")) {
871 return new String
[0];
873 xPath
= new String
[] { "/PpiNotify" };
876 Object
[] returns
= get("PPIs", xPath
);
877 if (returns
== null) {
878 return new String
[0];
882 List
<String
> ppiNotifyList
= new ArrayList
<String
>();
883 for (int i
= 0; i
< returns
.length
; i
++) {
884 List archList
= ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getSupArchList();
885 if (archList
== null || contains(archList
, arch
)){
886 ppiNotifyList
.add(((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName());
890 String
[] ppiNotifyArray
= new String
[ppiNotifyList
.size()];
891 for (int i
= 0; i
< ppiNotifyList
.size(); i
++) {
892 ppiNotifyArray
[i
] = ppiNotifyList
.get(i
);
895 return ppiNotifyArray
;
899 * Retrieve PpiNotify for specified usage and arch
902 * PpiNotify arch usage PpiNotify usage
905 * @returns String[] if elements are found at the known xpath
906 * @returns String[0] if nothing is there
908 public static String
[] getPpiNotifyArray(String arch
, String usage
) {
914 if (arch
== null || arch
.equals("")) {
915 return new String
[0];
917 archXpath
= "/PpiNotify";
918 if (usage
!= null && !usage
.equals("")) {
919 usageXpath
= "/PpiNotify[@Usage='" + arch
+ "']";
920 xPath
= new String
[] { archXpath
, usageXpath
};
922 return getProtocolNotifyArray(arch
);
926 Object
[] returns
= get("PPIs", xPath
);
927 if (returns
== null) {
928 return new String
[0];
931 String
[] ppiNotifyList
= new String
[returns
.length
];
933 for (int i
= 0; i
< returns
.length
; i
++) {
934 ppiNotifyList
[i
] = ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName();
936 return ppiNotifyList
;
940 * Retrieve Ppi for specified arch
945 * @returns String[] if elements are found at the known xpath
946 * @returns String[0] if nothing is there
948 public static String
[] getPpiArray(String arch
) {
951 if (arch
== null || arch
.equals("")) {
952 return new String
[0];
954 xPath
= new String
[] { "/Ppi" };
957 Object
[] returns
= get("PPIs", xPath
);
958 if (returns
== null) {
959 return new String
[0];
962 List
<String
> ppiList
= new ArrayList
<String
>();
963 for (int i
= 0; i
< returns
.length
; i
++) {
964 List archList
= ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getSupArchList();
965 if (archList
== null || contains(archList
, arch
)){
966 ppiList
.add(((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName());
970 String
[] ppiArray
= new String
[ppiList
.size()];
971 for (int i
= 0; i
< ppiList
.size(); i
++) {
972 ppiArray
[i
] = ppiList
.get(i
);
978 * Retrieve PpiNotify for specified usage and arch
981 * PpiNotify arch usage PpiNotify usage
984 * @returns String[] if elements are found at the known xpath
985 * @returns String[0] if nothing is there
987 public static String
[] getPpiArray(String arch
, String usage
) {
993 if (arch
== null || arch
.equals("")) {
994 return new String
[0];
997 if (usage
!= null && !usage
.equals("")) {
998 usageXpath
= "/Ppi[@Usage='" + arch
+ "']";
999 xPath
= new String
[] { archXpath
, usageXpath
};
1001 return getProtocolNotifyArray(arch
);
1005 Object
[] returns
= get("PPIs", xPath
);
1006 if (returns
== null) {
1007 return new String
[0];
1010 String
[] ppiList
= new String
[returns
.length
];
1012 for (int i
= 0; i
< returns
.length
; i
++) {
1013 ppiList
[i
] = ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName();
1019 * Retrieve GuidEntry information for specified usage
1024 * @returns GuidEntry objects list if elements are found at the known xpath
1025 * @returns null if nothing is there
1027 public static String
[] getGuidEntryArray(String arch
) {
1030 if (arch
== null || arch
.equals("")) {
1031 xPath
= new String
[] { "/GuidCNames" };
1033 xPath
= new String
[] { "/GuidCNames" };
1036 Object
[] returns
= get("Guids", xPath
);
1037 if (returns
== null) {
1038 return new String
[0];
1041 List
<String
> guidList
= new ArrayList
<String
>();
1042 for (int i
= 0; i
< returns
.length
; i
++) {
1043 List archList
= ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getSupArchList();
1044 if (archList
== null || contains(archList
, arch
)){
1045 guidList
.add(((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName());
1049 String
[] guidArray
= new String
[guidList
.size()];
1050 for (int i
= 0; i
< guidList
.size(); i
++) {
1051 guidArray
[i
] = guidList
.get(i
);
1058 * Retrieve GuidEntry information for specified usage
1061 * GuidEntry arch usage GuidEntry usage
1063 * @returns GuidEntry objects list if elements are found at the known xpath
1064 * @returns null if nothing is there
1066 public static String
[] getGuidEntryArray(String arch
, String usage
) {
1071 if (arch
== null || arch
.equals("")) {
1072 return new String
[0];
1074 archXpath
= "/GuidEntry";
1075 if (usage
!= null && !usage
.equals("")) {
1076 usageXpath
= "/GuidEntry[@Usage='" + arch
+ "']";
1077 xPath
= new String
[] { archXpath
, usageXpath
};
1079 return getProtocolNotifyArray(arch
);
1083 Object
[] returns
= get("Guids", xPath
);
1084 if (returns
== null) {
1085 return new String
[0];
1088 String
[] guidList
= new String
[returns
.length
];
1090 for (int i
= 0; i
< returns
.length
; i
++) {
1091 guidList
[i
] = ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName();
1097 * Retrieve Library instance information
1102 * Library instance usage
1104 * @returns library instance name list if elements are found at the known
1106 * @returns null if nothing is there
1108 public static ModuleIdentification
[] getLibraryInstance(String arch
) {
1110 String saGuid
= null;
1111 String saVersion
= null;
1112 String pkgGuid
= null;
1113 String pkgVersion
= null;
1115 if (arch
== null || arch
.equalsIgnoreCase("")) {
1116 xPath
= new String
[] { "/Instance" };
1119 // Since Schema don't have SupArchList now, so the follow Xpath is
1120 // equal to "/Instance" and [not(@SupArchList) or @SupArchList= arch]
1121 // don't have effect.
1123 xPath
= new String
[] { "/Instance[not(@SupArchList) or @SupArchList='"
1127 Object
[] returns
= get("Libraries", xPath
);
1128 if (returns
== null || returns
.length
== 0) {
1129 return new ModuleIdentification
[0];
1132 ModuleIdentification
[] saIdList
= new ModuleIdentification
[returns
.length
];
1133 for (int i
= 0; i
< returns
.length
; i
++) {
1134 LibrariesDocument
.Libraries
.Instance library
= (LibrariesDocument
.Libraries
.Instance
) returns
[i
];
1135 saGuid
= library
.getModuleGuid();
1136 saVersion
= library
.getModuleVersion();
1138 pkgGuid
= library
.getPackageGuid();
1139 pkgVersion
= library
.getPackageVersion();
1141 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1143 PackageIdentification pkgId
= new PackageIdentification(null,
1144 pkgGuid
, pkgVersion
);
1145 saId
.setPackage(pkgId
);
1154 // / This method is used for retrieving the elements information which has
1155 // / CName sub-element
1157 private static String
[] getCNames(String from
, String xPath
[]) {
1158 Object
[] returns
= get(from
, xPath
);
1159 if (returns
== null || returns
.length
== 0) {
1163 String
[] strings
= new String
[returns
.length
];
1164 for (int i
= 0; i
< returns
.length
; ++i
) {
1166 strings
[i
] = ((CNameType
) returns
[i
]).getStringValue();
1173 * Retrive library's constructor name
1175 * @returns constructor name list if elements are found at the known xpath
1176 * @returns null if nothing is there
1178 public static String
getLibConstructorName() {
1179 String
[] xPath
= new String
[] { "/Extern/Constructor" };
1181 Object
[] returns
= get("Externs", xPath
);
1182 if (returns
!= null && returns
.length
> 0) {
1183 CNameType constructor
= ((CNameType
) returns
[0]);
1184 return constructor
.getStringValue();
1191 * Retrive library's destructor name
1193 * @returns destructor name list if elements are found at the known xpath
1194 * @returns null if nothing is there
1196 public static String
getLibDestructorName() {
1197 String
[] xPath
= new String
[] { "/Extern/Destructor" };
1199 Object
[] returns
= get("Externs", xPath
);
1200 if (returns
!= null && returns
.length
> 0) {
1202 // Only support one Destructor function.
1204 CNameType destructor
= (CNameType
) returns
[0];
1205 return destructor
.getStringValue();
1212 * Retrive DriverBinding names
1214 * @returns DriverBinding name list if elements are found at the known xpath
1215 * @returns null if nothing is there
1217 public static String
[] getDriverBindingArray() {
1218 String
[] xPath
= new String
[] { "/Extern/DriverBinding" };
1219 return getCNames("Externs", xPath
);
1223 * Retrive ComponentName names
1225 * @returns ComponentName name list if elements are found at the known xpath
1226 * @returns null if nothing is there
1228 public static String
[] getComponentNameArray() {
1229 String
[] xPath
= new String
[] { "/Extern/ComponentName" };
1230 return getCNames("Externs", xPath
);
1234 * Retrive DriverConfig names
1236 * @returns DriverConfig name list if elements are found at the known xpath
1237 * @returns null if nothing is there
1239 public static String
[] getDriverConfigArray() {
1240 String
[] xPath
= new String
[] { "/Extern/DriverConfig" };
1241 return getCNames("Externs", xPath
);
1245 * Retrive DriverDiag names
1247 * @returns DriverDiag name list if elements are found at the known xpath
1248 * @returns null if nothing is there
1250 public static String
[] getDriverDiagArray() {
1251 String
[] xPath
= new String
[] { "/Extern/DriverDiag" };
1252 return getCNames("Externs", xPath
);
1256 * Retrive SetVirtualAddressMapCallBack names
1258 * @returns SetVirtualAddressMapCallBack name list if elements are found at
1260 * @returns null if nothing is there
1262 public static String
[] getSetVirtualAddressMapCallBackArray() {
1263 String
[] xPath
= new String
[] { "/Extern/SetVirtualAddressMapCallBack" };
1264 return getCNames("Externs", xPath
);
1268 * Retrive ExitBootServicesCallBack names
1270 * @returns ExitBootServicesCallBack name list if elements are found at the
1272 * @returns null if nothing is there
1274 public static String
[] getExitBootServicesCallBackArray() {
1275 String
[] xPath
= new String
[] { "/Extern/ExitBootServicesCallBack" };
1276 return getCNames("Externs", xPath
);
1280 Judge whether current driver is PEI_PCD_DRIVER or DXE_PCD_DRIVER or
1283 @return CommonDefinition.PCD_DRIVER_TYPE the type of current driver
1285 public static CommonDefinition
.PCD_DRIVER_TYPE
getPcdDriverType() {
1286 String
[] xPath
= new String
[] {"/PcdIsDriver"};
1287 Object
[] results
= get ("Externs", xPath
);
1289 if (results
!= null && results
.length
!= 0) {
1290 PcdDriverTypes type
= (PcdDriverTypes
) results
[0];
1291 String typeStr
= type
.enumValue().toString();
1292 if (typeStr
.equals(CommonDefinition
.PCD_DRIVER_TYPE
.PEI_PCD_DRIVER
.toString())) {
1293 return CommonDefinition
.PCD_DRIVER_TYPE
.PEI_PCD_DRIVER
;
1294 } else if (typeStr
.equals(CommonDefinition
.PCD_DRIVER_TYPE
.DXE_PCD_DRIVER
.toString())) {
1295 return CommonDefinition
.PCD_DRIVER_TYPE
.DXE_PCD_DRIVER
;
1297 return CommonDefinition
.PCD_DRIVER_TYPE
.UNKNOWN_PCD_DRIVER
;
1300 return CommonDefinition
.PCD_DRIVER_TYPE
.NOT_PCD_DRIVER
;
1304 * Retrieve module surface area file information
1306 * @returns ModuleSA objects list if elements are found at the known xpath
1307 * @returns Empty ModuleSA list if nothing is there
1309 public static Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> getFpdModules() {
1310 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1311 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1313 String fvBinding
= null;
1314 String saGuid
= null;
1315 String saVersion
= null;
1316 String pkgGuid
= null;
1317 String pkgVersion
= null;
1319 Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> fpdModuleMap
= new LinkedHashMap
<FpdModuleIdentification
, Map
<String
, XmlObject
>>();
1321 if (result
== null) {
1322 return fpdModuleMap
;
1325 for (int i
= 0; i
< result
.length
; i
++) {
1327 // Get Fpd SA Module element node and add to ObjectMap.
1329 Map
<String
, XmlObject
> ObjectMap
= new HashMap
<String
, XmlObject
>();
1330 ModuleSADocument
.ModuleSA moduleSA
= (ModuleSADocument
.ModuleSA
) result
[i
];
1331 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getLibraries() != null) {
1332 ObjectMap
.put("Libraries", moduleSA
.getLibraries());
1334 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getPcdBuildDefinition() != null) {
1335 ObjectMap
.put("PcdBuildDefinition", moduleSA
.getPcdBuildDefinition());
1337 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getModuleSaBuildOptions() != null) {
1338 ObjectMap
.put("ModuleSaBuildOptions", moduleSA
.getModuleSaBuildOptions());
1342 // Get Fpd SA Module attribute and create FpdMoudleIdentification.
1344 if (moduleSA
.isSetSupArchList()) {
1345 arch
= moduleSA
.getSupArchList().toString();
1352 saVersion
= ((ModuleSADocument
.ModuleSA
) result
[i
]).getModuleVersion();
1354 saGuid
= moduleSA
.getModuleGuid();
1355 pkgGuid
= moduleSA
.getPackageGuid();
1356 pkgVersion
= moduleSA
.getPackageVersion();
1359 // Create Module Identification which have class member of package
1362 PackageIdentification pkgId
= new PackageIdentification(null, pkgGuid
, pkgVersion
);
1363 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
, saVersion
);
1365 saId
.setPackage(pkgId
);
1368 // Create FpdModule Identification which have class member of module
1371 String
[] archList
= new String
[0];
1372 if (arch
== null || arch
.trim().length() == 0) {
1373 archList
= GlobalData
.getToolChainInfo().getArchs();
1375 archList
= arch
.split(" ");
1377 for (int j
= 0; j
< archList
.length
; j
++) {
1378 FpdModuleIdentification fpdSaId
= new FpdModuleIdentification(saId
, archList
[j
]);
1380 if (fvBinding
!= null) {
1381 fpdSaId
.setFvBinding(fvBinding
);
1385 // Put element to Map<FpdModuleIdentification, Map<String,
1388 fpdModuleMap
.put(fpdSaId
, ObjectMap
);
1391 return fpdModuleMap
;
1395 * Retrieve valid image names
1397 * @returns valid iamges name list if elements are found at the known xpath
1398 * @returns empty list if nothing is there
1400 public static String
[] getFpdValidImageNames() {
1401 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='ImageName']/FvImageNames" };
1403 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1404 if (queryResult
== null) {
1405 return new String
[0];
1408 String
[] result
= new String
[queryResult
.length
];
1409 for (int i
= 0; i
< queryResult
.length
; i
++) {
1410 result
[i
] = ((XmlString
) queryResult
[i
]).getStringValue();
1416 public static Node
getFpdUserExtensionPreBuild() {
1417 String
[] xPath
= new String
[] { "/UserExtensions[@UserID='TianoCore' and @Identifier='0']" };
1419 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1420 if (queryResult
== null || queryResult
.length
== 0) {
1423 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1425 return a
.getDomNode();
1428 public static Node
getFpdUserExtensionPostBuild() {
1429 String
[] xPath
= new String
[] { "/UserExtensions[@UserID='TianoCore' and @Identifier='1']" };
1431 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1432 if (queryResult
== null || queryResult
.length
== 0) {
1435 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1437 return a
.getDomNode();
1441 * Retrieve FV image option information
1446 * @returns option name/value list if elements are found at the known xpath
1447 * @returns empty list if nothing is there
1449 public static String
[][] getFpdOptions(String fvName
) {
1450 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Options' and ./FvImageNames='"
1451 + fvName
+ "']/FvImageOptions" };
1452 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1453 if (queryResult
== null) {
1454 return new String
[0][];
1456 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1457 for (int i
= 0; i
< queryResult
.length
; i
++) {
1458 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1459 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
1460 .getNameValueList();
1461 Iterator iter
= namevalues
.iterator();
1462 while (iter
.hasNext()) {
1463 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1465 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1468 String
[][] result
= new String
[list
.size()][2];
1469 for (int i
= 0; i
< list
.size(); i
++) {
1470 result
[i
][0] = list
.get(i
)[0];
1471 result
[i
][1] = list
.get(i
)[1];
1477 public static XmlObject
getFpdBuildOptions() {
1478 String
[] xPath
= new String
[] { "/BuildOptions" };
1480 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1482 if (queryResult
== null || queryResult
.length
== 0) {
1485 return (XmlObject
)queryResult
[0];
1488 public static PlatformIdentification
getFpdHeader() {
1489 String
[] xPath
= new String
[] { "/PlatformHeader" };
1491 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
1493 if (returns
== null || returns
.length
== 0) {
1496 PlatformHeaderDocument
.PlatformHeader header
= (PlatformHeaderDocument
.PlatformHeader
) returns
[0];
1498 String name
= header
.getPlatformName();
1500 String guid
= header
.getGuidValue();
1502 String version
= header
.getVersion();
1504 return new PlatformIdentification(name
, guid
, version
);
1508 * Retrieve FV image attributes information
1513 * @returns attribute name/value list if elements are found at the known
1515 * @returns empty list if nothing is there
1517 public static String
[][] getFpdAttributes(String fvName
) {
1518 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Attributes' and ./FvImageNames='"
1519 + fvName
+ "']/FvImageOptions" };
1520 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1521 if (queryResult
== null) {
1522 return new String
[0][];
1524 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1525 for (int i
= 0; i
< queryResult
.length
; i
++) {
1527 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1528 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1529 Iterator iter
= namevalues
.iterator();
1530 while (iter
.hasNext()) {
1531 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1533 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1536 String
[][] result
= new String
[list
.size()][2];
1537 for (int i
= 0; i
< list
.size(); i
++) {
1538 result
[i
][0] = list
.get(i
)[0];
1539 result
[i
][1] = list
.get(i
)[1];
1545 * Retrieve flash definition file name
1547 * @returns file name if elements are found at the known xpath
1548 * @returns null if nothing is there
1550 public static String
getFlashDefinitionFile() {
1551 String
[] xPath
= new String
[] { "/PlatformDefinitions/FlashDeviceDefinitions/FlashDefinitionFile" };
1553 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1554 if (queryResult
== null || queryResult
.length
== 0) {
1558 FileNameConvention filename
= (FileNameConvention
) queryResult
[queryResult
.length
- 1];
1559 return filename
.getStringValue();
1562 public static String
[][] getFpdGlobalVariable() {
1563 String
[] xPath
= new String
[] { "/Flash/FvImages/NameValue" };
1564 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1565 if (queryResult
== null) {
1566 return new String
[0][];
1569 String
[][] result
= new String
[queryResult
.length
][2];
1571 for (int i
= 0; i
< queryResult
.length
; i
++) {
1572 FvImagesDocument
.FvImages
.NameValue item
= (FvImagesDocument
.FvImages
.NameValue
)queryResult
[i
];
1573 result
[i
][0] = item
.getName();
1574 result
[i
][1] = item
.getValue();
1580 * Retrieve FV image component options
1585 * @returns name/value pairs list if elements are found at the known xpath
1586 * @returns empty list if nothing is there
1588 public static String
[][] getFpdComponents(String fvName
) {
1589 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Components' and ./FvImageNames='"+ fvName
+ "']/FvImageOptions" };
1590 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1591 if (queryResult
== null) {
1592 return new String
[0][];
1595 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1596 for (int i
= 0; i
< queryResult
.length
; i
++) {
1597 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1598 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1599 Iterator iter
= namevalues
.iterator();
1600 while (iter
.hasNext()) {
1601 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1603 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1606 String
[][] result
= new String
[list
.size()][2];
1607 for (int i
= 0; i
< list
.size(); i
++) {
1608 result
[i
][0] = list
.get(i
)[0];
1609 result
[i
][1] = list
.get(i
)[1];
1615 * Retrieve PCD tokens
1617 * @returns CName/ItemType pairs list if elements are found at the known
1619 * @returns null if nothing is there
1621 public static String
[][] getPcdTokenArray() {
1622 String
[] xPath
= new String
[] { "/PcdData" };
1624 Object
[] returns
= get("PCDs", xPath
);
1625 if (returns
== null || returns
.length
== 0) {
1633 * Retrieve MAS header
1638 public static ModuleIdentification
getMsaHeader() {
1639 String
[] xPath
= new String
[] { "/" };
1640 Object
[] returns
= get("MsaHeader", xPath
);
1642 if (returns
== null || returns
.length
== 0) {
1646 MsaHeader msaHeader
= (MsaHeader
) returns
[0];
1648 // Get BaseName, ModuleType, GuidValue, Version
1649 // which in MsaHeader.
1651 String name
= msaHeader
.getModuleName();
1652 String moduleType
= msaHeader
.getModuleType().toString();
1653 String guid
= msaHeader
.getGuidValue();
1654 String version
= msaHeader
.getVersion();
1656 ModuleIdentification moduleId
= new ModuleIdentification(name
, guid
,
1659 moduleId
.setModuleType(moduleType
);
1665 * Retrieve Extern Specification
1669 * @return String[] If have specification element in the <extern> String[0]
1670 * If no specification element in the <extern>
1674 public static String
[] getExternSpecificaiton() {
1675 String
[] xPath
= new String
[] { "/Specification" };
1677 Object
[] queryResult
= get("Externs", xPath
);
1678 if (queryResult
== null) {
1679 return new String
[0];
1682 String
[] specificationList
= new String
[queryResult
.length
];
1683 for (int i
= 0; i
< queryResult
.length
; i
++) {
1684 specificationList
[i
] = ((Sentence
)queryResult
[i
])
1687 return specificationList
;
1691 * Retreive MsaFile which in SPD
1694 * @return String[][3] The string sequence is ModuleName, ModuleGuid,
1695 * ModuleVersion, MsaFile String[0][] If no msafile in SPD
1697 public static String
[] getSpdMsaFile() {
1698 String
[] xPath
= new String
[] { "/MsaFiles" };
1700 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1701 if (returns
== null) {
1702 return new String
[0];
1705 List
<String
> filenameList
= ((MsaFilesDocument
.MsaFiles
) returns
[0])
1707 return filenameList
.toArray(new String
[filenameList
.size()]);
1713 public static Map
<String
, String
[]> getSpdLibraryClasses() {
1714 String
[] xPath
= new String
[] { "/LibraryClassDeclarations/LibraryClass" };
1716 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1719 // Create Map, Key - LibraryClass, String[] - LibraryClass Header file.
1721 Map
<String
, String
[]> libClassHeaderMap
= new HashMap
<String
, String
[]>();
1723 if (returns
== null) {
1724 return libClassHeaderMap
;
1727 for (int i
= 0; i
< returns
.length
; i
++) {
1728 LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass library
= (LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass
) returns
[i
];
1729 libClassHeaderMap
.put(library
.getName(), new String
[] { library
1730 .getIncludeHeader() });
1732 return libClassHeaderMap
;
1738 public static Map
<String
, String
> getSpdPackageHeaderFiles() {
1739 String
[] xPath
= new String
[] { "/PackageHeaders/IncludePkgHeader" };
1741 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1744 // Create Map, Key - ModuleType, String - PackageInclude Header file.
1746 Map
<String
, String
> packageIncludeMap
= new HashMap
<String
, String
>();
1748 if (returns
== null) {
1749 return packageIncludeMap
;
1752 for (int i
= 0; i
< returns
.length
; i
++) {
1753 PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader includeHeader
= (PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader
) returns
[i
];
1754 packageIncludeMap
.put(includeHeader
.getModuleType().toString(),
1755 includeHeader
.getStringValue());
1757 return packageIncludeMap
;
1760 public static PackageIdentification
getSpdHeader() {
1761 String
[] xPath
= new String
[] { "/SpdHeader" };
1763 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1765 if (returns
== null || returns
.length
== 0) {
1769 SpdHeaderDocument
.SpdHeader header
= (SpdHeaderDocument
.SpdHeader
) returns
[0];
1771 String name
= header
.getPackageName();
1773 String guid
= header
.getGuidValue();
1775 String version
= header
.getVersion();
1777 return new PackageIdentification(name
, guid
, version
);
1783 public static Map
<String
, String
[]> getSpdGuid() {
1784 String
[] xPath
= new String
[] { "/GuidDeclarations/Entry" };
1786 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1789 // Create Map, Key - GuidName, String[] - C_NAME & GUID value.
1791 Map
<String
, String
[]> guidDeclMap
= new HashMap
<String
, String
[]>();
1792 if (returns
== null) {
1796 for (int i
= 0; i
< returns
.length
; i
++) {
1797 GuidDeclarationsDocument
.GuidDeclarations
.Entry entry
= (GuidDeclarationsDocument
.GuidDeclarations
.Entry
) returns
[i
];
1798 String
[] guidPair
= new String
[2];
1799 guidPair
[0] = entry
.getCName();
1800 guidPair
[1] = entry
.getGuidValue();
1801 guidDeclMap
.put(entry
.getCName(), guidPair
);
1802 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1803 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[0]);
1804 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[1]);
1812 public static Map
<String
, String
[]> getSpdProtocol() {
1813 String
[] xPath
= new String
[] { "/ProtocolDeclarations/Entry" };
1815 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1818 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1820 Map
<String
, String
[]> protoclMap
= new HashMap
<String
, String
[]>();
1822 if (returns
== null) {
1826 for (int i
= 0; i
< returns
.length
; i
++) {
1827 ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry entry
= (ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry
) returns
[i
];
1828 String
[] protocolPair
= new String
[2];
1830 protocolPair
[0] = entry
.getCName();
1831 protocolPair
[1] = entry
.getGuidValue();
1832 protoclMap
.put(entry
.getCName(), protocolPair
);
1833 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1834 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[0]);
1835 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[1]);
1841 * getSpdPpi() Retrieve the SPD PPI Entry
1844 * @return Map<String, String[2]> if get the PPI entry from SPD. Key - PPI
1845 * Name String[0] - PPI CNAME String[1] - PPI Guid Null if no PPI
1848 public static Map
<String
, String
[]> getSpdPpi() {
1849 String
[] xPath
= new String
[] { "/PpiDeclarations/Entry" };
1851 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1854 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1856 Map
<String
, String
[]> ppiMap
= new HashMap
<String
, String
[]>();
1858 if (returns
== null) {
1862 for (int i
= 0; i
< returns
.length
; i
++) {
1863 PpiDeclarationsDocument
.PpiDeclarations
.Entry entry
= (PpiDeclarationsDocument
.PpiDeclarations
.Entry
) returns
[i
];
1864 String
[] ppiPair
= new String
[2];
1865 ppiPair
[0] = entry
.getCName();
1866 ppiPair
[1] = entry
.getGuidValue();
1867 ppiMap
.put(entry
.getCName(), ppiPair
);
1873 * Retrieve module Guid string
1875 * @returns GUILD string if elements are found at the known xpath
1876 * @returns null if nothing is there
1878 public static String
getModuleGuid() {
1879 String
[] xPath
= new String
[] { "" };
1881 Object
[] returns
= get("MsaHeader", xPath
);
1882 if (returns
!= null && returns
.length
> 0) {
1883 String guid
= ((MsaHeaderDocument
.MsaHeader
) returns
[0])
1894 public static ModuleSADocument
.ModuleSA
[] getFpdModuleSAs() {
1895 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1896 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1897 if (result
!= null) {
1898 return (ModuleSADocument
.ModuleSA
[]) result
;
1900 return new ModuleSADocument
.ModuleSA
[0];
1904 Get name array of PCD in a module. In one module, token space
1905 is same, and token name should not be conflicted.
1909 public static String
[] getModulePcdEntryNameArray() {
1910 PcdCodedDocument
.PcdCoded
.PcdEntry
[] pcdEntries
= null;
1913 String
[] xPath
= new String
[] {"/PcdEntry"};
1914 Object
[] returns
= get ("PcdCoded", xPath
);
1916 if (returns
== null) {
1917 return new String
[0];
1920 pcdEntries
= (PcdCodedDocument
.PcdCoded
.PcdEntry
[])returns
;
1921 results
= new String
[pcdEntries
.length
];
1923 for (index
= 0; index
< pcdEntries
.length
; index
++) {
1924 results
[index
] = pcdEntries
[index
].getCName();
1930 Search in a List for a given string
1934 public static boolean contains(List list
, String str
) {
1935 if (list
== null || list
.size()== 0) {
1938 Iterator it
= list
.iterator();
1939 while (it
.hasNext()) {
1940 String s
= (String
)it
.next();
1941 if (s
.equalsIgnoreCase(str
)) {
1949 public static boolean isHaveTianoR8FlashMap(){
1950 String
[] xPath
= new String
[] {"/"};
1951 Object
[] returns
= get ("Externs", xPath
);
1953 if (returns
== null) {
1957 ExternsDocument
.Externs ext
= (ExternsDocument
.Externs
)returns
[0];
1959 if (ext
.getTianoR8FlashMapH()){