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 @SuppressWarnings("unchecked")
281 List
<String
> archList
= sourceFileNames
[i
].getSupArchList();
282 if (arch
== null || arch
.equalsIgnoreCase("") || archList
== null || archList
.contains(arch
)) {
283 outputList
.add(new String
[] {sourceFileNames
[i
].getToolCode(),sourceFileNames
[i
].getStringValue()});
287 String
[][] outputString
= new String
[outputList
.size()][2];
288 for (int index
= 0; index
< outputList
.size(); index
++) {
289 outputString
[index
][0] = outputList
.get(index
)[0];
290 outputString
[index
][1] = outputList
.get(index
)[1];
296 * Retrieve /PlatformDefinitions/OutputDirectory from FPD
298 * @returns Directory names array if elements are found at the known xpath
299 * @returns Empty if nothing is found at the known xpath
301 public static String
getFpdOutputDirectory() {
302 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
304 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
305 if (returns
== null || returns
.length
== 0) {
308 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
309 return item
.getOutputDirectory();
312 public static String
getFpdIntermediateDirectories() {
313 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
315 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
316 if (returns
== null || returns
.length
== 0) {
319 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
320 if(item
.getIntermediateDirectories() == null) {
324 return item
.getIntermediateDirectories().toString();
328 public static String
getModuleFfsKeyword() {
329 String
[] xPath
= new String
[] { "/" };
331 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
332 if (returns
== null || returns
.length
== 0) {
335 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
336 return item
.getFfsFormatKey();
339 public static String
getModuleFvBindingKeyword() {
340 String
[] xPath
= new String
[] { "/" };
342 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
343 if (returns
== null || returns
.length
== 0) {
346 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
347 return item
.getFvBinding();
350 public static List
getModuleSupportedArchs() {
351 String
[] xPath
= new String
[] { "/" };
353 Object
[] returns
= get("ModuleDefinitions", xPath
);
354 if (returns
== null || returns
.length
== 0) {
357 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
358 return item
.getSupportedArchitectures();
361 public static BuildOptionsDocument
.BuildOptions
.Ffs
[] getFpdFfs() {
362 String
[] xPath
= new String
[] {"/Ffs"};
364 Object
[] returns
= get("BuildOptions", xPath
);
365 if (returns
== null || returns
.length
== 0) {
366 return new BuildOptionsDocument
.BuildOptions
.Ffs
[0];
368 return (BuildOptionsDocument
.BuildOptions
.Ffs
[])returns
;
371 public static String
getModuleOutputFileBasename() {
372 String
[] xPath
= new String
[] { "/" };
374 Object
[] returns
= get("ModuleDefinitions", xPath
);
375 if (returns
== null || returns
.length
== 0) {
378 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
379 return item
.getOutputFileBasename();
383 * Retrieve BuildOptions/Option or Arch/Option
385 * @param toolChainFamilyFlag
386 * if true, retrieve options for toolchain family; otherwise for
389 * @returns String[][5] name, target, toolchain, arch, coommand of options
390 * if elements are found at the known xpath. String[0][] if dont
393 * @returns Empty array if nothing is there
395 public static String
[][] getOptions(String from
, String
[] xPath
, boolean toolChainFamilyFlag
) {
396 String target
= null;
397 String toolchain
= null;
398 String toolchainFamily
= null;
399 List
<String
> archList
= null;
401 String targetName
= null;
402 String optionName
= null;
404 Object
[] returns
= get(from
, xPath
);
405 if (returns
== null) {
406 return new String
[0][5];
409 List
<String
[]> optionList
= new ArrayList
<String
[]>();
410 OptionDocument
.Option option
;
412 for (int i
= 0; i
< returns
.length
; i
++) {
413 option
= (OptionDocument
.Option
) returns
[i
];
416 // Get Target, ToolChain(Family), Arch, Cmd, and Option from Option,
418 // put to result[][5] array in above order.
421 if (option
.getBuildTargets() == null) {
425 target
= option
.getBuildTargets().toString();
427 if (target
!= null) {
428 targetList
= target
.split(" ");
430 targetList
= new String
[1];
431 targetList
[0] = null;
434 if (toolChainFamilyFlag
) {
435 toolchainFamily
= option
.getToolChainFamily();
436 if (toolchainFamily
!= null) {
437 toolchain
= toolchainFamily
.toString();
442 toolchain
= option
.getTagName();
445 archList
= new ArrayList
<String
>();
446 @SuppressWarnings("unchecked")
447 List
<String
> archEnumList
= option
.getSupArchList();
448 if (archEnumList
== null) {
451 archList
.addAll(archEnumList
);
453 Iterator it = archEnumList.iterator();
454 while (it.hasNext()) {
455 System.out.println(it.next().getClass().getName());
456 SupportedArchitectures.Enum archType = it.next();
457 archList.add(archType.toString());
462 cmd
= option
.getToolCode();
464 optionName
= option
.getStringValue();
465 for (int t
= 0; t
< targetList
.length
; t
++) {
466 for (int j
= 0; j
< archList
.size(); j
++) {
467 optionList
.add(new String
[] { targetList
[t
],
468 toolchain
, archList
.get(j
), cmd
, optionName
});
473 String
[][] result
= new String
[optionList
.size()][5];
474 for (int i
= 0; i
< optionList
.size(); i
++) {
475 result
[i
][0] = optionList
.get(i
)[0];
476 result
[i
][1] = optionList
.get(i
)[1];
477 result
[i
][2] = optionList
.get(i
)[2];
478 result
[i
][3] = optionList
.get(i
)[3];
479 result
[i
][4] = optionList
.get(i
)[4];
484 public static String
[][] getModuleBuildOptions(boolean toolChainFamilyFlag
) {
487 if (toolChainFamilyFlag
== true) {
488 xPath
= new String
[] {
489 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
490 "/Options/Option[@ToolChainFamily]", };
492 xPath
= new String
[] {
493 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
494 "/Options/Option[@TagName]", };
496 return getOptions("ModuleSaBuildOptions", xPath
, toolChainFamilyFlag
);
499 public static String
[][] getPlatformBuildOptions(boolean toolChainFamilyFlag
) {
502 if (toolChainFamilyFlag
== true) {
503 xPath
= new String
[] {
504 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
505 "/BuildOptions/Options/Option[@ToolChainFamily]", };
507 xPath
= new String
[] {
508 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
509 "/BuildOptions/Options/Option[@TagName]", };
512 return getOptions("PlatformSurfaceArea", xPath
, toolChainFamilyFlag
);
515 public static ToolChainInfo
getFpdToolChainInfo() {
516 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
518 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
519 if (returns
== null || returns
.length
== 0) {
523 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
524 ToolChainInfo toolChainInfo
= new ToolChainInfo();
525 toolChainInfo
.addTargets(item
.getBuildTargets().toString());
526 toolChainInfo
.addArchs(item
.getSupportedArchitectures().toString());
527 toolChainInfo
.addTagnames((String
)null);
528 return toolChainInfo
;
532 * Retrieve <xxxHeader>/ModuleType
534 * @returns The module type name if elements are found at the known xpath
535 * @returns null if nothing is there
537 public static String
getModuleType() {
538 String
[] xPath
= new String
[] { "/ModuleType" };
540 Object
[] returns
= get(xPath
);
541 if (returns
!= null && returns
.length
> 0) {
542 ModuleTypeDef type
= (ModuleTypeDef
) returns
[0];
543 return type
.enumValue().toString();
550 * Retrieve PackageDependencies/Package
555 * @returns package name list if elements are found at the known xpath
556 * @returns null if nothing is there
558 public static PackageIdentification
[] getDependencePkg(String arch
) {
560 String packageGuid
= null;
561 String packageVersion
= null;
564 xPath
= new String
[] { "/Package" };
566 Object
[] returns
= get("PackageDependencies", xPath
);
567 if (returns
== null) {
568 return new PackageIdentification
[0];
572 // Get packageIdentification
574 List
<PackageIdentification
> packageIdList
= new ArrayList
<PackageIdentification
>();
575 for (int i
= 0; i
< returns
.length
; i
++) {
576 PackageDependenciesDocument
.PackageDependencies
.Package item
= (PackageDependenciesDocument
.PackageDependencies
.Package
) returns
[i
];
577 @SuppressWarnings("unchecked")
578 List
<String
> archList
= item
.getSupArchList();
579 if (arch
== null || archList
== null || archList
.contains(arch
)) {
580 packageGuid
= item
.getPackageGuid();
581 packageVersion
= item
.getPackageVersion();
582 packageIdList
.add(new PackageIdentification(null, packageGuid
,
588 // transfer packageIdentification list to array.
590 PackageIdentification
[] packageIdArray
= new PackageIdentification
[packageIdList
.size()];
591 for (int i
= 0; i
< packageIdList
.size(); i
++) {
592 packageIdArray
[i
] = new PackageIdentification(null, packageIdList
.get(i
).getGuid(),packageIdList
.get(i
).getVersion());
594 return packageIdArray
;
598 * Retrieve LibraryClassDefinitions/LibraryClass for specified usage
601 * Library class usage
603 * @returns LibraryClass objects list if elements are found at the known
605 * @returns null if nothing is there
607 public static String
[] getLibraryClasses(String usage
) {
610 if (usage
== null || usage
.equals("")) {
611 xPath
= new String
[] { "/LibraryClass" };
613 xPath
= new String
[] { "/LibraryClass[@Usage='" + usage
+ "']" };
616 Object
[] returns
= get("LibraryClassDefinitions", xPath
);
617 if (returns
== null || returns
.length
== 0) {
618 return new String
[0];
621 LibraryClassDocument
.LibraryClass
[] libraryClassList
= (LibraryClassDocument
.LibraryClass
[]) returns
;
622 String
[] libraryClassName
= new String
[libraryClassList
.length
];
623 for (int i
= 0; i
< libraryClassList
.length
; i
++) {
624 libraryClassName
[i
] = libraryClassList
[i
].getKeyword();
626 return libraryClassName
;
630 * Retrieve ModuleEntryPoint names
632 * @returns ModuleEntryPoint name list if elements are found at the known
634 * @returns null if nothing is there
636 public static String
[] getModuleEntryPointArray() {
637 String
[] xPath
= new String
[] { "/Extern/ModuleEntryPoint" };
639 Object
[] returns
= get("Externs", xPath
);
641 if (returns
!= null && returns
.length
> 0) {
642 String
[] entryPoints
= new String
[returns
.length
];
644 for (int i
= 0; i
< returns
.length
; ++i
) {
645 entryPoints
[i
] = ((CNameType
) returns
[i
]).getStringValue();
655 * retrieve Protocol for specified usage
658 * Protocol usage arch Architecture
660 * @returns Protocol String list if elements are found at the known xpath
661 * @returns String[0] if nothing is there
663 public static String
[] getProtocolArray(String arch
, String usage
) {
665 String usageXpath
= "";
666 String archXpath
= "";
668 if (arch
== null || arch
.equals("")) {
669 return new String
[0];
671 archXpath
= "/Protocol";
672 if (usage
!= null && !usage
.equals("")) {
673 usageXpath
= "/Protocol[@Usage='" + usage
+ "']";
674 xPath
= new String
[] { usageXpath
, archXpath
};
676 return getProtocolArray(arch
);
681 Object
[] returns
= get("Protocols", xPath
);
682 if (returns
== null) {
683 return new String
[0];
685 Protocol
[] protocolList
= (Protocol
[]) returns
;
687 String
[] protocolArray
= new String
[returns
.length
];
688 for (int i
= 0; i
< returns
.length
; i
++) {
689 protocolArray
[i
] = protocolList
[i
].getProtocolCName();
691 return protocolArray
;
695 * retrieve Protocol for specified usage
700 * @returns Protocol String list if elements are found at the known xpath
701 * @returns String[0] if nothing is there
703 public static String
[] getProtocolArray(String arch
) {
706 if (arch
== null || arch
.equals("")) {
707 return new String
[0];
709 xPath
= new String
[] { "/Protocol" };
712 Object
[] returns
= get("Protocols", xPath
);
713 if (returns
== null) {
714 return new String
[0];
716 Protocol
[] returnlList
= (Protocol
[]) returns
;
718 List
<String
> protocolList
= new ArrayList
<String
>();
720 for (int i
= 0; i
< returns
.length
; i
++) {
721 @SuppressWarnings("unchecked")
722 List
<String
> archList
= returnlList
[i
].getSupArchList();
723 if (archList
== null || archList
.contains(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 @SuppressWarnings("unchecked")
761 List
<String
> archList
= ((ProtocolNotify
) returns
[i
]).getSupArchList();
762 if (archList
== null || archList
.contains(arch
)){
763 protocolNotifyList
.add(((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName());
767 String
[] protocolNotifyArray
= new String
[protocolNotifyList
.size()];
768 for (int i
= 0; i
< protocolNotifyList
.size(); i
++) {
769 protocolNotifyArray
[i
] = protocolNotifyList
.get(i
);
771 return protocolNotifyArray
;
775 * Retrieve ProtocolNotify for specified usage
778 * ProtocolNotify usage
780 * @returns String[] if elements are found at the known xpath
781 * @returns String[0] if nothing is there
783 public static String
[] getProtocolNotifyArray(String arch
, String usage
) {
789 if (arch
== null || arch
.equals("")) {
790 return new String
[0];
792 archXpath
= "/ProtocolNotify";
793 if (usage
!= null && !usage
.equals("")) {
794 usageXpath
= "/ProtocolNotify[@Usage='" + arch
+ "']";
795 xPath
= new String
[] { archXpath
, usageXpath
};
797 return getProtocolNotifyArray(arch
);
801 Object
[] returns
= get("Protocols", xPath
);
802 if (returns
== null) {
803 return new String
[0];
806 String
[] protocolNotifyList
= new String
[returns
.length
];
808 for (int i
= 0; i
< returns
.length
; i
++) {
809 protocolNotifyList
[i
] = ((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName();
811 return protocolNotifyList
;
815 * Retrieve ModuleUnloadImage names
817 * @returns ModuleUnloadImage name list if elements are found at the known
819 * @returns null if nothing is there
821 public static String
[] getModuleUnloadImageArray() {
822 String
[] xPath
= new String
[] { "/Extern/ModuleUnloadImage" };
824 Object
[] returns
= get("Externs", xPath
);
825 if (returns
!= null && returns
.length
> 0) {
826 String
[] stringArray
= new String
[returns
.length
];
827 CNameType
[] doc
= (CNameType
[]) returns
;
829 for (int i
= 0; i
< returns
.length
; ++i
) {
830 stringArray
[i
] = doc
[i
].getStringValue();
842 * @returns Extern objects list if elements are found at the known xpath
843 * @returns null if nothing is there
845 public static ExternsDocument
.Externs
.Extern
[] getExternArray() {
846 String
[] xPath
= new String
[] { "/Extern" };
848 Object
[] returns
= get("Externs", xPath
);
849 if (returns
!= null && returns
.length
> 0) {
850 return (ExternsDocument
.Externs
.Extern
[]) returns
;
857 * Retrieve PpiNotify for specified arch
862 * @returns String[] if elements are found at the known xpath
863 * @returns String[0] if nothing is there
865 public static String
[] getPpiNotifyArray(String arch
) {
868 if (arch
== null || arch
.equals("")) {
869 return new String
[0];
871 xPath
= new String
[] { "/PpiNotify" };
874 Object
[] returns
= get("PPIs", xPath
);
875 if (returns
== null) {
876 return new String
[0];
880 List
<String
> ppiNotifyList
= new ArrayList
<String
>();
881 for (int i
= 0; i
< returns
.length
; i
++) {
882 @SuppressWarnings("unchecked")
883 List
<String
> archList
= ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getSupArchList();
884 if (archList
== null || archList
.contains(arch
)){
885 ppiNotifyList
.add(((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName());
889 String
[] ppiNotifyArray
= new String
[ppiNotifyList
.size()];
890 for (int i
= 0; i
< ppiNotifyList
.size(); i
++) {
891 ppiNotifyArray
[i
] = ppiNotifyList
.get(i
);
894 return ppiNotifyArray
;
898 * Retrieve PpiNotify for specified usage and arch
901 * PpiNotify arch usage PpiNotify usage
904 * @returns String[] if elements are found at the known xpath
905 * @returns String[0] if nothing is there
907 public static String
[] getPpiNotifyArray(String arch
, String usage
) {
913 if (arch
== null || arch
.equals("")) {
914 return new String
[0];
916 archXpath
= "/PpiNotify";
917 if (usage
!= null && !usage
.equals("")) {
918 usageXpath
= "/PpiNotify[@Usage='" + arch
+ "']";
919 xPath
= new String
[] { archXpath
, usageXpath
};
921 return getProtocolNotifyArray(arch
);
925 Object
[] returns
= get("PPIs", xPath
);
926 if (returns
== null) {
927 return new String
[0];
930 String
[] ppiNotifyList
= new String
[returns
.length
];
932 for (int i
= 0; i
< returns
.length
; i
++) {
933 ppiNotifyList
[i
] = ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName();
935 return ppiNotifyList
;
939 * Retrieve Ppi for specified arch
944 * @returns String[] if elements are found at the known xpath
945 * @returns String[0] if nothing is there
947 public static String
[] getPpiArray(String arch
) {
950 if (arch
== null || arch
.equals("")) {
951 return new String
[0];
953 xPath
= new String
[] { "/Ppi" };
956 Object
[] returns
= get("PPIs", xPath
);
957 if (returns
== null) {
958 return new String
[0];
961 List
<String
> ppiList
= new ArrayList
<String
>();
962 for (int i
= 0; i
< returns
.length
; i
++) {
963 @SuppressWarnings("unchecked")
964 List
<String
> archList
= ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getSupArchList();
965 if (archList
== null || archList
.contains(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 @SuppressWarnings("unchecked")
1044 List
<String
> archList
= ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getSupArchList();
1045 if (archList
== null || archList
.contains(arch
)){
1046 guidList
.add(((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName());
1050 String
[] guidArray
= new String
[guidList
.size()];
1051 for (int i
= 0; i
< guidList
.size(); i
++) {
1052 guidArray
[i
] = guidList
.get(i
);
1059 * Retrieve GuidEntry information for specified usage
1062 * GuidEntry arch usage GuidEntry usage
1064 * @returns GuidEntry objects list if elements are found at the known xpath
1065 * @returns null if nothing is there
1067 public static String
[] getGuidEntryArray(String arch
, String usage
) {
1072 if (arch
== null || arch
.equals("")) {
1073 return new String
[0];
1075 archXpath
= "/GuidEntry";
1076 if (usage
!= null && !usage
.equals("")) {
1077 usageXpath
= "/GuidEntry[@Usage='" + arch
+ "']";
1078 xPath
= new String
[] { archXpath
, usageXpath
};
1080 return getProtocolNotifyArray(arch
);
1084 Object
[] returns
= get("Guids", xPath
);
1085 if (returns
== null) {
1086 return new String
[0];
1089 String
[] guidList
= new String
[returns
.length
];
1091 for (int i
= 0; i
< returns
.length
; i
++) {
1092 guidList
[i
] = ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName();
1098 * Retrieve Library instance information
1103 * Library instance usage
1105 * @returns library instance name list if elements are found at the known
1107 * @returns null if nothing is there
1109 public static ModuleIdentification
[] getLibraryInstance(String arch
) {
1111 String saGuid
= null;
1112 String saVersion
= null;
1113 String pkgGuid
= null;
1114 String pkgVersion
= null;
1116 if (arch
== null || arch
.equalsIgnoreCase("")) {
1117 xPath
= new String
[] { "/Instance" };
1120 // Since Schema don't have SupArchList now, so the follow Xpath is
1121 // equal to "/Instance" and [not(@SupArchList) or @SupArchList= arch]
1122 // don't have effect.
1124 xPath
= new String
[] { "/Instance[not(@SupArchList) or @SupArchList='"
1128 Object
[] returns
= get("Libraries", xPath
);
1129 if (returns
== null || returns
.length
== 0) {
1130 return new ModuleIdentification
[0];
1133 ModuleIdentification
[] saIdList
= new ModuleIdentification
[returns
.length
];
1134 for (int i
= 0; i
< returns
.length
; i
++) {
1135 LibrariesDocument
.Libraries
.Instance library
= (LibrariesDocument
.Libraries
.Instance
) returns
[i
];
1136 saGuid
= library
.getModuleGuid();
1137 saVersion
= library
.getModuleVersion();
1139 pkgGuid
= library
.getPackageGuid();
1140 pkgVersion
= library
.getPackageVersion();
1142 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1144 PackageIdentification pkgId
= new PackageIdentification(null,
1145 pkgGuid
, pkgVersion
);
1146 saId
.setPackage(pkgId
);
1155 // / This method is used for retrieving the elements information which has
1156 // / CName sub-element
1158 private static String
[] getCNames(String from
, String xPath
[]) {
1159 Object
[] returns
= get(from
, xPath
);
1160 if (returns
== null || returns
.length
== 0) {
1164 String
[] strings
= new String
[returns
.length
];
1165 for (int i
= 0; i
< returns
.length
; ++i
) {
1167 strings
[i
] = ((CNameType
) returns
[i
]).getStringValue();
1174 * Retrive library's constructor name
1176 * @returns constructor name list if elements are found at the known xpath
1177 * @returns null if nothing is there
1179 public static String
getLibConstructorName() {
1180 String
[] xPath
= new String
[] { "/Extern/Constructor" };
1182 Object
[] returns
= get("Externs", xPath
);
1183 if (returns
!= null && returns
.length
> 0) {
1184 CNameType constructor
= ((CNameType
) returns
[0]);
1185 return constructor
.getStringValue();
1192 * Retrive library's destructor name
1194 * @returns destructor name list if elements are found at the known xpath
1195 * @returns null if nothing is there
1197 public static String
getLibDestructorName() {
1198 String
[] xPath
= new String
[] { "/Extern/Destructor" };
1200 Object
[] returns
= get("Externs", xPath
);
1201 if (returns
!= null && returns
.length
> 0) {
1203 // Only support one Destructor function.
1205 CNameType destructor
= (CNameType
) returns
[0];
1206 return destructor
.getStringValue();
1213 * Retrive DriverBinding names
1215 * @returns DriverBinding name list if elements are found at the known xpath
1216 * @returns null if nothing is there
1218 public static String
[] getDriverBindingArray() {
1219 String
[] xPath
= new String
[] { "/Extern/DriverBinding" };
1220 return getCNames("Externs", xPath
);
1224 * Retrive ComponentName names
1226 * @returns ComponentName name list if elements are found at the known xpath
1227 * @returns null if nothing is there
1229 public static String
[] getComponentNameArray() {
1230 String
[] xPath
= new String
[] { "/Extern/ComponentName" };
1231 return getCNames("Externs", xPath
);
1235 * Retrive DriverConfig names
1237 * @returns DriverConfig name list if elements are found at the known xpath
1238 * @returns null if nothing is there
1240 public static String
[] getDriverConfigArray() {
1241 String
[] xPath
= new String
[] { "/Extern/DriverConfig" };
1242 return getCNames("Externs", xPath
);
1246 * Retrive DriverDiag names
1248 * @returns DriverDiag name list if elements are found at the known xpath
1249 * @returns null if nothing is there
1251 public static String
[] getDriverDiagArray() {
1252 String
[] xPath
= new String
[] { "/Extern/DriverDiag" };
1253 return getCNames("Externs", xPath
);
1257 * Retrive SetVirtualAddressMapCallBack names
1259 * @returns SetVirtualAddressMapCallBack name list if elements are found at
1261 * @returns null if nothing is there
1263 public static String
[] getSetVirtualAddressMapCallBackArray() {
1264 String
[] xPath
= new String
[] { "/Extern/SetVirtualAddressMapCallBack" };
1265 return getCNames("Externs", xPath
);
1269 * Retrive ExitBootServicesCallBack names
1271 * @returns ExitBootServicesCallBack name list if elements are found at the
1273 * @returns null if nothing is there
1275 public static String
[] getExitBootServicesCallBackArray() {
1276 String
[] xPath
= new String
[] { "/Extern/ExitBootServicesCallBack" };
1277 return getCNames("Externs", xPath
);
1281 * Retrieve module surface area file information
1283 * @returns ModuleSA objects list if elements are found at the known xpath
1284 * @returns Empty ModuleSA list if nothing is there
1286 public static Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> getFpdModules() {
1287 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1288 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1290 String fvBinding
= null;
1291 String saGuid
= null;
1292 String saVersion
= null;
1293 String pkgGuid
= null;
1294 String pkgVersion
= null;
1296 Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> fpdModuleMap
= new LinkedHashMap
<FpdModuleIdentification
, Map
<String
, XmlObject
>>();
1298 if (result
== null) {
1299 return fpdModuleMap
;
1302 for (int i
= 0; i
< result
.length
; i
++) {
1304 // Get Fpd SA Module element node and add to ObjectMap.
1306 Map
<String
, XmlObject
> ObjectMap
= new HashMap
<String
, XmlObject
>();
1307 ModuleSADocument
.ModuleSA moduleSA
= (ModuleSADocument
.ModuleSA
) result
[i
];
1308 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getLibraries() != null) {
1309 ObjectMap
.put("Libraries", moduleSA
.getLibraries());
1311 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getPcdBuildDefinition() != null) {
1312 ObjectMap
.put("PcdBuildDefinition", moduleSA
1313 .getPcdBuildDefinition());
1315 if (((ModuleSADocument
.ModuleSA
) result
[i
])
1316 .getModuleSaBuildOptions() != null) {
1317 ObjectMap
.put("ModuleSaBuildOptions", moduleSA
1318 .getModuleSaBuildOptions());
1322 // Get Fpd SA Module attribute and create FpdMoudleIdentification.
1324 arch
= moduleSA
.getSupArchList().toString();
1328 saVersion
= ((ModuleSADocument
.ModuleSA
) result
[i
])
1329 .getModuleVersion();
1331 saGuid
= moduleSA
.getModuleGuid();
1332 pkgGuid
= moduleSA
.getPackageGuid();
1333 pkgVersion
= moduleSA
.getPackageVersion();
1336 // Create Module Identification which have class member of package
1339 PackageIdentification pkgId
= new PackageIdentification(null,
1340 pkgGuid
, pkgVersion
);
1341 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1344 saId
.setPackage(pkgId
);
1347 // Create FpdModule Identification which have class member of module
1351 String
[] archList
= arch
.split(" ");
1352 for (int j
= 0; j
< archList
.length
; j
++) {
1353 FpdModuleIdentification fpdSaId
= new FpdModuleIdentification(saId
, archList
[j
]);
1355 if (fvBinding
!= null) {
1356 fpdSaId
.setFvBinding(fvBinding
);
1360 // Put element to Map<FpdModuleIdentification, Map<String,
1363 fpdModuleMap
.put(fpdSaId
, ObjectMap
);
1367 return fpdModuleMap
;
1371 * Retrieve valid image names
1373 * @returns valid iamges name list if elements are found at the known xpath
1374 * @returns empty list if nothing is there
1376 public static String
[] getFpdValidImageNames() {
1377 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='ImageName']/FvImageNames" };
1379 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1380 if (queryResult
== null) {
1381 return new String
[0];
1384 String
[] result
= new String
[queryResult
.length
];
1385 for (int i
= 0; i
< queryResult
.length
; i
++) {
1386 result
[i
] = ((XmlString
) queryResult
[i
]).getStringValue();
1392 public static Node
getFpdUserExtension() {
1393 String
[] xPath
= new String
[] { "/UserExtensions[@UserID='TianoCore']" };
1395 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1396 if (queryResult
== null || queryResult
.length
== 0) {
1399 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1401 return a
.getDomNode();
1405 * Retrieve FV image option information
1410 * @returns option name/value list if elements are found at the known xpath
1411 * @returns empty list if nothing is there
1413 public static String
[][] getFpdOptions(String fvName
) {
1414 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Options' and ./FvImageNames='"
1415 + fvName
.toUpperCase() + "']/FvImageOptions" };
1416 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1417 if (queryResult
== null) {
1418 return new String
[0][];
1420 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1421 for (int i
= 0; i
< queryResult
.length
; i
++) {
1422 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1423 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
1424 .getNameValueList();
1425 Iterator iter
= namevalues
.iterator();
1426 while (iter
.hasNext()) {
1427 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1429 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1432 String
[][] result
= new String
[list
.size()][2];
1433 for (int i
= 0; i
< list
.size(); i
++) {
1434 result
[i
][0] = list
.get(i
)[0];
1435 result
[i
][1] = list
.get(i
)[1];
1441 public static XmlObject
getFpdBuildOptions() {
1442 String
[] xPath
= new String
[] { "/BuildOptions" };
1444 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1446 if (queryResult
== null || queryResult
.length
== 0) {
1449 return (XmlObject
)queryResult
[0];
1452 public static PlatformIdentification
getFpdHeader() {
1453 String
[] xPath
= new String
[] { "/PlatformHeader" };
1455 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
1457 if (returns
== null || returns
.length
== 0) {
1460 PlatformHeaderDocument
.PlatformHeader header
= (PlatformHeaderDocument
.PlatformHeader
) returns
[0];
1462 String name
= header
.getPlatformName();
1464 String guid
= header
.getGuidValue();
1466 String version
= header
.getVersion();
1468 return new PlatformIdentification(name
, guid
, version
);
1472 * Retrieve FV image attributes information
1477 * @returns attribute name/value list if elements are found at the known
1479 * @returns empty list if nothing is there
1481 public static String
[][] getFpdAttributes(String fvName
) {
1482 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Attributes' and ./FvImageNames='"
1483 + fvName
.toUpperCase() + "']/FvImageOptions" };
1484 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1485 if (queryResult
== null) {
1486 return new String
[0][];
1488 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1489 for (int i
= 0; i
< queryResult
.length
; i
++) {
1491 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1492 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1493 Iterator iter
= namevalues
.iterator();
1494 while (iter
.hasNext()) {
1495 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1497 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1500 String
[][] result
= new String
[list
.size()][2];
1501 for (int i
= 0; i
< list
.size(); i
++) {
1502 result
[i
][0] = list
.get(i
)[0];
1503 result
[i
][1] = list
.get(i
)[1];
1509 * Retrieve flash definition file name
1511 * @returns file name if elements are found at the known xpath
1512 * @returns null if nothing is there
1514 public static String
getFlashDefinitionFile() {
1515 String
[] xPath
= new String
[] { "/PlatformDefinitions/FlashDeviceDefinitions/FlashDefinitionFile" };
1517 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1518 if (queryResult
== null || queryResult
.length
== 0) {
1522 FileNameConvention filename
= (FileNameConvention
) queryResult
[queryResult
.length
- 1];
1523 return filename
.getStringValue();
1526 public static String
[][] getFpdGlobalVariable() {
1527 String
[] xPath
= new String
[] { "/Flash/FvImages/NameValue" };
1528 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1529 if (queryResult
== null) {
1530 return new String
[0][];
1533 String
[][] result
= new String
[queryResult
.length
][2];
1535 for (int i
= 0; i
< queryResult
.length
; i
++) {
1536 FvImagesDocument
.FvImages
.NameValue item
= (FvImagesDocument
.FvImages
.NameValue
)queryResult
[i
];
1537 result
[i
][0] = item
.getName();
1538 result
[i
][1] = item
.getValue();
1544 * Retrieve FV image component options
1549 * @returns name/value pairs list if elements are found at the known xpath
1550 * @returns empty list if nothing is there
1552 public static String
[][] getFpdComponents(String fvName
) {
1553 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Components' and ./FvImageNames='"+ fvName
.toUpperCase() + "']/FvImageOptions" };
1554 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1555 if (queryResult
== null) {
1556 return new String
[0][];
1559 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1560 for (int i
= 0; i
< queryResult
.length
; i
++) {
1561 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1562 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1563 Iterator iter
= namevalues
.iterator();
1564 while (iter
.hasNext()) {
1565 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1567 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1570 String
[][] result
= new String
[list
.size()][2];
1571 for (int i
= 0; i
< list
.size(); i
++) {
1572 result
[i
][0] = list
.get(i
)[0];
1573 result
[i
][1] = list
.get(i
)[1];
1579 * Retrieve PCD tokens
1581 * @returns CName/ItemType pairs list if elements are found at the known
1583 * @returns null if nothing is there
1585 public static String
[][] getPcdTokenArray() {
1586 String
[] xPath
= new String
[] { "/PcdData" };
1588 Object
[] returns
= get("PCDs", xPath
);
1589 if (returns
== null || returns
.length
== 0) {
1593 // PcdCoded.PcdData[] pcds = (PcdCoded.PcdData[]) returns;
1594 // String[][] result = new String[pcds.length][2];
1595 // for (int i = 0; i < returns.length; ++i) {
1596 // if (pcds[i].getItemType() != null) {
1597 // result[i][1] = pcds[i].getItemType().toString();
1599 // result[i][1] = null;
1601 // result[i][0] = pcds[i].getCName();
1608 * Get the PcdToken array from module's surface area document. The array
1609 * should contains following data:
1611 * -------------------------------------------------------------------
1614 * CName | ItemType | TokenspaceName | DefaultValue | Usage | HelpText
1617 * -------------------------------------------------------------------
1620 * Note: Until new schema applying, now we can only get CName, ItemType,
1623 * @return 2-array table contains all information of PCD token retrieved
1626 public static Object
[][] etModulePCDTokenArray() {
1629 // Object[][] result;
1630 // PCDs.PcdData[] pcds;
1631 // String[] xPath = new String[] { "/PcdData" };
1632 // Object[] returns = get("PCDs", xPath);
1634 // if ((returns == null) || (returns.length == 0)) {
1638 // pcds = (PCDs.PcdData[]) returns;
1639 // result = new Object[pcds.length][6];
1640 // for (index = 0; index < pcds.length; index++) {
1644 // result[index][0] = pcds[index].getCName();
1646 // // Get ItemType: FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODLE,
1647 // // DYNAMIC, DYNAMIC_EX
1649 // if (pcds[index].getItemType() != null) {
1650 // result[index][1] = pcds[index].getItemType().toString();
1652 // result[index][1] = null;
1656 // // BUGBUG: following field can *not* be got from current MSA until
1657 // // schema changed.
1659 // // result [index][2] = pcds[index].getTokenSpaceName();
1660 // result[index][2] = null;
1661 // result[index][3] = pcds[index].getDefaultValue();
1662 // // result [index][4] = pcds[index].getUsage ();
1663 // result[index][4] = null;
1664 // // result [index][5] = pcds[index].getHelpText ();
1665 // result[index][5] = null;
1671 * Retrieve MAS header
1676 public static ModuleIdentification
getMsaHeader() {
1677 String
[] xPath
= new String
[] { "/" };
1678 Object
[] returns
= get("MsaHeader", xPath
);
1680 if (returns
== null || returns
.length
== 0) {
1684 MsaHeader msaHeader
= (MsaHeader
) returns
[0];
1686 // Get BaseName, ModuleType, GuidValue, Version
1687 // which in MsaHeader.
1689 String name
= msaHeader
.getModuleName();
1690 String moduleType
= msaHeader
.getModuleType().toString();
1691 String guid
= msaHeader
.getGuidValue();
1692 String version
= msaHeader
.getVersion();
1694 ModuleIdentification moduleId
= new ModuleIdentification(name
, guid
,
1697 moduleId
.setModuleType(moduleType
);
1703 * Retrieve Extern Specification
1707 * @return String[] If have specification element in the <extern> String[0]
1708 * If no specification element in the <extern>
1712 public static String
[] getExternSpecificaiton() {
1713 String
[] xPath
= new String
[] { "/Specification" };
1715 Object
[] queryResult
= get("Externs", xPath
);
1716 if (queryResult
== null) {
1717 return new String
[0];
1720 String
[] specificationList
= new String
[queryResult
.length
];
1721 for (int i
= 0; i
< queryResult
.length
; i
++) {
1722 specificationList
[i
] = ((Sentence
)queryResult
[i
])
1725 return specificationList
;
1729 * Retreive MsaFile which in SPD
1732 * @return String[][3] The string sequence is ModuleName, ModuleGuid,
1733 * ModuleVersion, MsaFile String[0][] If no msafile in SPD
1735 public static String
[] getSpdMsaFile() {
1736 String
[] xPath
= new String
[] { "/MsaFiles" };
1738 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1739 if (returns
== null) {
1740 return new String
[0];
1743 List
<String
> filenameList
= ((MsaFilesDocument
.MsaFiles
) returns
[0])
1745 return filenameList
.toArray(new String
[filenameList
.size()]);
1751 public static Map
<String
, String
[]> getSpdLibraryClasses() {
1752 String
[] xPath
= new String
[] { "/LibraryClassDeclarations/LibraryClass" };
1754 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1757 // Create Map, Key - LibraryClass, String[] - LibraryClass Header file.
1759 Map
<String
, String
[]> libClassHeaderMap
= new HashMap
<String
, String
[]>();
1761 if (returns
== null) {
1762 return libClassHeaderMap
;
1765 for (int i
= 0; i
< returns
.length
; i
++) {
1766 LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass library
= (LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass
) returns
[i
];
1767 libClassHeaderMap
.put(library
.getName(), new String
[] { library
1768 .getIncludeHeader() });
1770 return libClassHeaderMap
;
1776 public static Map
<String
, String
> getSpdPackageHeaderFiles() {
1777 String
[] xPath
= new String
[] { "/PackageHeaders/IncludePkgHeader" };
1779 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1782 // Create Map, Key - ModuleType, String - PackageInclude Header file.
1784 Map
<String
, String
> packageIncludeMap
= new HashMap
<String
, String
>();
1786 if (returns
== null) {
1787 return packageIncludeMap
;
1789 // GlobalData.log.info("" + returns[0].getClass().getName());
1790 for (int i
= 0; i
< returns
.length
; i
++) {
1791 PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader includeHeader
= (PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader
) returns
[i
];
1792 packageIncludeMap
.put(includeHeader
.getModuleType().toString(),
1793 includeHeader
.getStringValue());
1795 return packageIncludeMap
;
1798 public static PackageIdentification
getSpdHeader() {
1799 String
[] xPath
= new String
[] { "/SpdHeader" };
1801 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1803 if (returns
== null || returns
.length
== 0) {
1807 SpdHeaderDocument
.SpdHeader header
= (SpdHeaderDocument
.SpdHeader
) returns
[0];
1809 String name
= header
.getPackageName();
1811 String guid
= header
.getGuidValue();
1813 String version
= header
.getVersion();
1815 return new PackageIdentification(name
, guid
, version
);
1821 public static Map
<String
, String
[]> getSpdGuid() {
1822 String
[] xPath
= new String
[] { "/GuidDeclarations/Entry" };
1824 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1827 // Create Map, Key - GuidName, String[] - C_NAME & GUID value.
1829 Map
<String
, String
[]> guidDeclMap
= new HashMap
<String
, String
[]>();
1830 if (returns
== null) {
1834 for (int i
= 0; i
< returns
.length
; i
++) {
1835 GuidDeclarationsDocument
.GuidDeclarations
.Entry entry
= (GuidDeclarationsDocument
.GuidDeclarations
.Entry
) returns
[i
];
1836 String
[] guidPair
= new String
[2];
1837 guidPair
[0] = entry
.getCName();
1838 guidPair
[1] = entry
.getGuidValue();
1839 guidDeclMap
.put(entry
.getName(), guidPair
);
1840 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1841 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[0]);
1842 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[1]);
1850 public static Map
<String
, String
[]> getSpdProtocol() {
1851 String
[] xPath
= new String
[] { "/ProtocolDeclarations/Entry" };
1853 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1856 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1858 Map
<String
, String
[]> protoclMap
= new HashMap
<String
, String
[]>();
1860 if (returns
== null) {
1864 for (int i
= 0; i
< returns
.length
; i
++) {
1865 ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry entry
= (ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry
) returns
[i
];
1866 String
[] protocolPair
= new String
[2];
1868 protocolPair
[0] = entry
.getCName();
1869 protocolPair
[1] = entry
.getGuidValue();
1870 protoclMap
.put(entry
.getName(), protocolPair
);
1871 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1872 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[0]);
1873 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[1]);
1879 * getSpdPpi() Retrieve the SPD PPI Entry
1882 * @return Map<String, String[2]> if get the PPI entry from SPD. Key - PPI
1883 * Name String[0] - PPI CNAME String[1] - PPI Guid Null if no PPI
1886 public static Map
<String
, String
[]> getSpdPpi() {
1887 String
[] xPath
= new String
[] { "/PpiDeclarations/Entry" };
1889 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1892 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1894 Map
<String
, String
[]> ppiMap
= new HashMap
<String
, String
[]>();
1896 if (returns
== null) {
1900 for (int i
= 0; i
< returns
.length
; i
++) {
1901 PpiDeclarationsDocument
.PpiDeclarations
.Entry entry
= (PpiDeclarationsDocument
.PpiDeclarations
.Entry
) returns
[i
];
1902 String
[] ppiPair
= new String
[2];
1903 ppiPair
[0] = entry
.getCName();
1904 ppiPair
[1] = entry
.getGuidValue();
1905 ppiMap
.put(entry
.getName(), ppiPair
);
1911 * getToolChainFamily
1913 * This function is to retrieve ToolChainFamily attribute of FPD
1917 * @return toolChainFamily If find toolChainFamily attribute in
1918 * <BuildOptions> Null If don't have toolChainFamily in
1921 public String
getToolChainFamily() {
1922 String toolChainFamily
;
1923 String
[] xPath
= new String
[] { "/BuildOptions" };
1925 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1926 if (result
== null) {
1929 // toolChainFamily =
1930 // ((BuildOptionsDocument.BuildOptions)result[0]).getToolChainFamilies();
1931 // return toolChainFamily;
1936 * Retrieve module Guid string
1938 * @returns GUILD string if elements are found at the known xpath
1939 * @returns null if nothing is there
1941 public static String
getModuleGuid() {
1942 String
[] xPath
= new String
[] { "" };
1944 Object
[] returns
= get("MsaHeader", xPath
);
1945 if (returns
!= null && returns
.length
> 0) {
1946 String guid
= ((MsaHeaderDocument
.MsaHeader
) returns
[0])
1957 public static ModuleSADocument
.ModuleSA
[] getFpdModuleSAs() {
1958 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1959 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1960 if (result
!= null) {
1961 return (ModuleSADocument
.ModuleSA
[]) result
;
1963 return new ModuleSADocument
.ModuleSA
[0];
1967 Get name array of PCD in a module. In one module, token space
1968 is same, and token name should not be conflicted.
1972 public static String
[] getModulePcdEntryNameArray() {
1973 PcdCodedDocument
.PcdCoded
.PcdEntry
[] pcdEntries
= null;
1976 String
[] xPath
= new String
[] {"/PcdEntry"};
1977 Object
[] returns
= get ("PcdCoded", xPath
);
1979 if (returns
== null) {
1980 return new String
[0];
1983 pcdEntries
= (PcdCodedDocument
.PcdCoded
.PcdEntry
[])returns
;
1984 results
= new String
[pcdEntries
.length
];
1986 for (index
= 0; index
< pcdEntries
.length
; index
++) {
1987 results
[index
] = pcdEntries
[index
].getCName();