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
.exception
.EdkException
;
66 import org
.tianocore
.common
.logger
.EdkLog
;
67 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
68 import org
.tianocore
.build
.id
.ModuleIdentification
;
69 import org
.tianocore
.build
.id
.PackageIdentification
;
70 import org
.tianocore
.build
.id
.PlatformIdentification
;
71 import org
.tianocore
.build
.toolchain
.ToolChainInfo
;
72 import org
.tianocore
.build
.autogen
.CommonDefinition
;
75 * SurfaceAreaQuery class is used to query Surface Area information from msa,
76 * mbd, spd and fpd files.
78 * This class should not instantiated. All the public interfaces is static.
82 public class SurfaceAreaQuery
{
84 public String prefix
= "http://www.TianoCore.org/2006/Edk2.0";
87 // Contains name/value pairs of Surface Area document object. The name is
88 // always the top level element name.
90 private Map
<String
, XmlObject
> map
= null;
93 // mapStack is used to do nested query
95 private Stack
<Map
<String
, XmlObject
>> mapStack
= new Stack
<Map
<String
, XmlObject
>>();
98 // prefix of name space
100 private String nsPrefix
= "sans";
103 // xmlbeans needs a name space for each Xpath element
105 private String ns
= null;
108 // keep the namep declaration for xmlbeans Xpath query
110 private String queryDeclaration
= null;
112 private StringBuffer normQueryString
= new StringBuffer(4096);
113 private Pattern xPathPattern
= Pattern
.compile("([^/]*)(/|//)([^/]+)");
116 * Set a Surface Area document for query later
119 * A Surface Area document in TopLevelElementName/XmlObject
122 public SurfaceAreaQuery(Map
<String
, XmlObject
> map
) {
124 queryDeclaration
= "declare namespace " + nsPrefix
+ "='" + ns
+ "'; ";
129 * Push current used Surface Area document into query stack. The given new
130 * document will be used for any immediately followed getXXX() callings,
131 * untill pop() is called.
134 * The TopLevelElementName/XmlObject format of a Surface Area
137 public void push(Map
<String
, XmlObject
> newMap
) {
138 mapStack
.push(this.map
);
143 * Discard current used Surface Area document and use the top document in
147 this.map
= mapStack
.pop();
151 // / Convert xPath to be namespace qualified, which is necessary for
153 // / selectPath(). For example, converting /MsaHeader/ModuleType to
154 // / /ns:MsaHeader/ns:ModuleType
156 private String
normalizeQueryString(String
[] exp
, String from
) {
157 normQueryString
.setLength(0);
160 while (i
< exp
.length
) {
161 String newExp
= from
+ exp
[i
];
162 Matcher matcher
= xPathPattern
.matcher(newExp
);
164 while (matcher
.find()) {
165 String starter
= newExp
.substring(matcher
.start(1), matcher
167 String seperator
= newExp
.substring(matcher
.start(2), matcher
169 String token
= newExp
.substring(matcher
.start(3), matcher
172 normQueryString
.append(starter
);
173 normQueryString
.append(seperator
);
174 normQueryString
.append(nsPrefix
);
175 normQueryString
.append(":");
176 normQueryString
.append(token
);
180 if (i
< exp
.length
) {
181 normQueryString
.append(" | ");
185 return normQueryString
.toString();
189 * Search all XML documents stored in "map" for the specified xPath, using
190 * relative path (starting with '$this')
193 * xpath query string array
194 * @returns An array of XmlObject if elements are found at the specified
196 * @returns NULL if nothing is at the specified xpath
198 public Object
[] get(String
[] xPath
) {
203 String
[] keys
= (String
[]) map
.keySet().toArray(new String
[map
.size()]);
204 List
<Object
> result
= new ArrayList
<Object
>();
205 for (int i
= 0; i
< keys
.length
; ++i
) {
206 XmlObject rootNode
= (XmlObject
) map
.get(keys
[i
]);
207 if (rootNode
== null) {
211 String query
= queryDeclaration
212 + normalizeQueryString(xPath
, "$this/" + keys
[i
]);
213 XmlObject
[] tmp
= rootNode
.selectPath(query
);
214 for (int j
= 0; j
< tmp
.length
; ++j
) {
215 result
.add((Object
)tmp
[j
]);
219 int size
= result
.size();
224 return (Object
[]) result
.toArray(new Object
[size
]);
228 * Search XML documents named by "rootName" for the given xPath, using
229 * relative path (starting with '$this')
232 * The top level element name
234 * The xpath query string array
235 * @returns An array of XmlObject if elements are found at the given xpath
236 * @returns NULL if nothing is found at the given xpath
238 public Object
[] get(String rootName
, String
[] xPath
) {
243 XmlObject root
= (XmlObject
) map
.get(rootName
);
248 String query
= queryDeclaration
249 + normalizeQueryString(xPath
, "$this/" + rootName
);
250 XmlObject
[] result
= root
.selectPath(query
);
251 if (result
.length
> 0) {
252 return (Object
[])result
;
255 query
= queryDeclaration
+ normalizeQueryString(xPath
, "/" + rootName
);
256 result
= root
.selectPath(query
);
257 if (result
.length
> 0) {
258 return (Object
[])result
;
265 * Retrieve SourceFiles/Filename for specified ARCH type
269 * @returns An 2 dimension string array if elements are found at the known
271 * @returns NULL if nothing is found at the known xpath
273 public String
[][] getSourceFiles(String arch
) {
277 xPath
= new String
[] { "/Filename" };
279 returns
= get("SourceFiles", xPath
);
281 if (returns
== null || returns
.length
== 0) {
282 return new String
[0][0];
285 Filename
[] sourceFileNames
= (Filename
[]) returns
;
286 List
<String
[]> outputList
= new ArrayList
<String
[]>();
287 for (int i
= 0; i
< sourceFileNames
.length
; i
++) {
288 List archList
= sourceFileNames
[i
].getSupArchList();
289 if (arch
== null || arch
.equalsIgnoreCase("") || archList
== null || contains(archList
, arch
)) {
290 outputList
.add(new String
[] {sourceFileNames
[i
].getToolCode(),sourceFileNames
[i
].getStringValue()});
294 String
[][] outputString
= new String
[outputList
.size()][2];
295 for (int index
= 0; index
< outputList
.size(); index
++) {
296 outputString
[index
][0] = outputList
.get(index
)[0];
297 outputString
[index
][1] = outputList
.get(index
)[1];
303 * Retrieve /PlatformDefinitions/OutputDirectory from FPD
305 * @returns Directory names array if elements are found at the known xpath
306 * @returns Empty if nothing is found at the known xpath
308 public String
getFpdOutputDirectory() {
309 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
311 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
312 if (returns
== null || returns
.length
== 0) {
315 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
316 return item
.getOutputDirectory();
319 public String
getFpdIntermediateDirectories() {
320 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
322 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
323 if (returns
== null || returns
.length
== 0) {
326 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
327 if(item
.getIntermediateDirectories() == null) {
331 return item
.getIntermediateDirectories().toString();
335 public String
getModuleFfsKeyword() {
336 String
[] xPath
= new String
[] { "/" };
338 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
339 if (returns
== null || returns
.length
== 0) {
342 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
343 return item
.getFfsFormatKey();
346 public String
getModuleFvBindingKeyword() {
347 String
[] xPath
= new String
[] { "/" };
349 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
350 if (returns
== null || returns
.length
== 0) {
353 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
354 return item
.getFvBinding();
357 public List
getModuleSupportedArchs() {
358 String
[] xPath
= new String
[] { "/" };
360 Object
[] returns
= get("ModuleDefinitions", xPath
);
361 if (returns
== null || returns
.length
== 0) {
364 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
365 return item
.getSupportedArchitectures();
368 public BuildOptionsDocument
.BuildOptions
.Ffs
[] getFpdFfs() {
369 String
[] xPath
= new String
[] {"/Ffs"};
371 Object
[] returns
= get("BuildOptions", xPath
);
372 if (returns
== null || returns
.length
== 0) {
373 return new BuildOptionsDocument
.BuildOptions
.Ffs
[0];
375 return (BuildOptionsDocument
.BuildOptions
.Ffs
[])returns
;
378 public String
getModuleOutputFileBasename() {
379 String
[] xPath
= new String
[] { "/" };
381 Object
[] returns
= get("ModuleDefinitions", xPath
);
382 if (returns
== null || returns
.length
== 0) {
385 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
386 return item
.getOutputFileBasename();
390 * Retrieve BuildOptions/Option or Arch/Option
392 * @param toolChainFamilyFlag
393 * if true, retrieve options for toolchain family; otherwise for
396 * @returns String[][5] name, target, toolchain, arch, coommand of options
397 * if elements are found at the known xpath. String[0][] if dont
400 * @returns Empty array if nothing is there
402 public String
[][] getOptions(String from
, String
[] xPath
, boolean toolChainFamilyFlag
) {
403 String target
= null;
404 String toolchain
= null;
405 String toolchainFamily
= null;
406 List
<String
> archList
= null;
408 String optionName
= null;
410 Object
[] returns
= get(from
, xPath
);
411 if (returns
== null) {
412 return new String
[0][5];
415 List
<String
[]> optionList
= new ArrayList
<String
[]>();
416 OptionDocument
.Option option
;
418 for (int i
= 0; i
< returns
.length
; i
++) {
419 option
= (OptionDocument
.Option
) returns
[i
];
422 // Get Target, ToolChain(Family), Arch, Cmd, and Option from Option,
424 // put to result[][5] array in above order.
427 if (option
.getBuildTargets() == null) {
431 target
= option
.getBuildTargets().toString();
433 if (target
!= null) {
434 targetList
= target
.split(" ");
436 targetList
= new String
[1];
437 targetList
[0] = null;
440 if (toolChainFamilyFlag
) {
441 toolchainFamily
= option
.getToolChainFamily();
442 if (toolchainFamily
!= null) {
443 toolchain
= toolchainFamily
.toString();
448 toolchain
= option
.getTagName();
451 archList
= new ArrayList
<String
>();
452 List archEnumList
= option
.getSupArchList();
453 if (archEnumList
== null) {
456 //archList.addAll(archEnumList);
457 Iterator it
= archEnumList
.iterator();
458 while (it
.hasNext()) {
459 String archType
= (String
)it
.next();
460 archList
.add(archType
);
464 cmd
= option
.getToolCode();
466 optionName
= option
.getStringValue();
467 for (int t
= 0; t
< targetList
.length
; t
++) {
468 for (int j
= 0; j
< archList
.size(); j
++) {
469 optionList
.add(new String
[] { targetList
[t
],
470 toolchain
, archList
.get(j
), cmd
, optionName
});
475 String
[][] result
= new String
[optionList
.size()][5];
476 for (int i
= 0; i
< optionList
.size(); i
++) {
477 result
[i
][0] = optionList
.get(i
)[0];
478 result
[i
][1] = optionList
.get(i
)[1];
479 result
[i
][2] = optionList
.get(i
)[2];
480 result
[i
][3] = optionList
.get(i
)[3];
481 result
[i
][4] = optionList
.get(i
)[4];
486 public String
[][] getModuleBuildOptions(boolean toolChainFamilyFlag
) {
489 if (toolChainFamilyFlag
== true) {
490 xPath
= new String
[] {
491 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
492 "/Options/Option[@ToolChainFamily]", };
494 xPath
= new String
[] {
495 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
496 "/Options/Option[@TagName]", };
498 return getOptions("ModuleSaBuildOptions", xPath
, toolChainFamilyFlag
);
501 public String
[][] getPlatformBuildOptions(boolean toolChainFamilyFlag
) {
504 if (toolChainFamilyFlag
== true) {
505 xPath
= new String
[] {
506 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
507 "/BuildOptions/Options/Option[@ToolChainFamily]", };
509 xPath
= new String
[] {
510 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
511 "/BuildOptions/Options/Option[@TagName]", };
514 return getOptions("PlatformSurfaceArea", xPath
, toolChainFamilyFlag
);
517 public ToolChainInfo
getFpdToolChainInfo() {
518 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
520 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
521 if (returns
== null || returns
.length
== 0) {
525 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
526 ToolChainInfo toolChainInfo
= new ToolChainInfo();
527 toolChainInfo
.addTargets(item
.getBuildTargets().toString());
528 toolChainInfo
.addArchs(item
.getSupportedArchitectures().toString());
529 toolChainInfo
.addTagnames((String
)null);
530 return toolChainInfo
;
534 * Retrieve <xxxHeader>/ModuleType
536 * @returns The module type name if elements are found at the known xpath
537 * @returns null if nothing is there
539 public String
getModuleType() {
540 String
[] xPath
= new String
[] { "/ModuleType" };
542 Object
[] returns
= get(xPath
);
543 if (returns
!= null && returns
.length
> 0) {
544 ModuleTypeDef type
= (ModuleTypeDef
) returns
[0];
545 return type
.enumValue().toString();
552 * Retrieve PackageDependencies/Package
557 * @returns package name list if elements are found at the known xpath
558 * @returns null if nothing is there
560 public PackageIdentification
[] getDependencePkg(String arch
) throws EdkException
{
562 String packageGuid
= null;
563 String packageVersion
= null;
566 xPath
= new String
[] { "/Package" };
568 Object
[] returns
= get("PackageDependencies", xPath
);
569 if (returns
== null) {
570 return new PackageIdentification
[0];
574 // Get packageIdentification
576 List
<PackageIdentification
> packageIdList
= new ArrayList
<PackageIdentification
>();
577 for (int i
= 0; i
< returns
.length
; i
++) {
578 PackageDependenciesDocument
.PackageDependencies
.Package item
= (PackageDependenciesDocument
.PackageDependencies
.Package
) returns
[i
];
579 List archList
= item
.getSupArchList();
580 if (arch
== null || archList
== null || contains(archList
, arch
)) {
581 packageGuid
= item
.getPackageGuid();
582 packageVersion
= item
.getPackageVersion();
583 PackageIdentification pkgId
= new PackageIdentification(null, packageGuid
, packageVersion
);
584 GlobalData
.refreshPackageIdentification(pkgId
);
585 packageIdList
.add(pkgId
);
589 return packageIdList
.toArray(new PackageIdentification
[packageIdList
.size()]);
593 * Retrieve LibraryClassDefinitions/LibraryClass for specified usage
596 * Library class usage
598 * @returns LibraryClass objects list if elements are found at the known
600 * @returns null if nothing is there
602 public String
[] getLibraryClasses(String usage
, String arch
) {
604 if (usage
== null || usage
.equals("")) {
605 xPath
= new String
[] { "/LibraryClass" };
607 xPath
= new String
[] { "/LibraryClass[@Usage='" + usage
+ "']" };
610 Object
[] returns
= get("LibraryClassDefinitions", xPath
);
611 if (returns
== null || returns
.length
== 0) {
612 return new String
[0];
615 LibraryClassDocument
.LibraryClass
[] libraryClassList
= (LibraryClassDocument
.LibraryClass
[]) returns
;
616 List
<String
> libraryClassName
= new ArrayList
<String
>();
617 for (int i
= 0; i
< libraryClassList
.length
; i
++) {
618 List archList
= libraryClassList
[i
].getSupArchList();
620 if (arch
== null || contains(archList
, arch
)) {
621 libraryClassName
.add(libraryClassList
[i
].getKeyword());
625 String
[] libraryArray
= new String
[libraryClassName
.size()];
626 libraryClassName
.toArray(libraryArray
);
631 * Retrieve ModuleEntryPoint names
633 * @returns ModuleEntryPoint name list if elements are found at the known
635 * @returns null if nothing is there
637 public String
[] getModuleEntryPointArray() {
638 String
[] xPath
= new String
[] { "/Extern/ModuleEntryPoint" };
640 Object
[] returns
= get("Externs", xPath
);
642 if (returns
!= null && returns
.length
> 0) {
643 String
[] entryPoints
= new String
[returns
.length
];
645 for (int i
= 0; i
< returns
.length
; ++i
) {
646 entryPoints
[i
] = ((CNameType
) returns
[i
]).getStringValue();
656 * retrieve Protocol for specified usage
659 * Protocol usage arch Architecture
661 * @returns Protocol String list if elements are found at the known xpath
662 * @returns String[0] if nothing is there
664 public String
[] getProtocolArray(String arch
, String usage
) {
666 String usageXpath
= "";
667 String archXpath
= "";
669 if (arch
== null || arch
.equals("")) {
670 return new String
[0];
672 archXpath
= "/Protocol";
673 if (usage
!= null && !usage
.equals("")) {
674 usageXpath
= "/Protocol[@Usage='" + usage
+ "']";
675 xPath
= new String
[] { usageXpath
, archXpath
};
677 return getProtocolArray(arch
);
682 Object
[] returns
= get("Protocols", xPath
);
683 if (returns
== null) {
684 return new String
[0];
686 Protocol
[] protocolList
= (Protocol
[]) returns
;
688 String
[] protocolArray
= new String
[returns
.length
];
689 for (int i
= 0; i
< returns
.length
; i
++) {
690 protocolArray
[i
] = protocolList
[i
].getProtocolCName();
692 return protocolArray
;
696 * retrieve Protocol for specified usage
701 * @returns Protocol String list if elements are found at the known xpath
702 * @returns String[0] if nothing is there
704 public String
[] getProtocolArray(String arch
) {
707 if (arch
== null || arch
.equals("")) {
708 return new String
[0];
710 xPath
= new String
[] { "/Protocol" };
713 Object
[] returns
= get("Protocols", xPath
);
714 if (returns
== null) {
715 return new String
[0];
717 Protocol
[] returnlList
= (Protocol
[]) returns
;
719 List
<String
> protocolList
= new ArrayList
<String
>();
721 for (int i
= 0; i
< returns
.length
; i
++) {
722 List archList
= returnlList
[i
].getSupArchList();
723 if (archList
== null || contains(archList
, arch
)){
724 protocolList
.add(returnlList
[i
].getProtocolCName());
727 String
[] protocolArray
= new String
[protocolList
.size()];
728 for (int i
= 0; i
< protocolList
.size(); i
++) {
729 protocolArray
[i
] = protocolList
.get(i
);
731 return protocolArray
;
735 * Retrieve ProtocolNotify for specified usage
738 * ProtocolNotify usage
740 * @returns String[] if elements are found at the known xpath
741 * @returns String[0] if nothing is there
743 public String
[] getProtocolNotifyArray(String arch
) {
746 if (arch
== null || arch
.equals("")) {
747 return new String
[0];
749 xPath
= new String
[] { "/ProtocolNotify" };
752 Object
[] returns
= get("Protocols", xPath
);
753 if (returns
== null) {
754 return new String
[0];
757 List
<String
> protocolNotifyList
= new ArrayList
<String
>();
759 for (int i
= 0; i
< returns
.length
; i
++) {
760 List archList
= ((ProtocolNotify
) returns
[i
]).getSupArchList();
761 if (archList
== null || contains(archList
, arch
)){
762 protocolNotifyList
.add(((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName());
766 String
[] protocolNotifyArray
= new String
[protocolNotifyList
.size()];
767 for (int i
= 0; i
< protocolNotifyList
.size(); i
++) {
768 protocolNotifyArray
[i
] = protocolNotifyList
.get(i
);
770 return protocolNotifyArray
;
774 * Retrieve ProtocolNotify for specified usage
777 * ProtocolNotify usage
779 * @returns String[] if elements are found at the known xpath
780 * @returns String[0] if nothing is there
782 public String
[] getProtocolNotifyArray(String arch
, String usage
) {
788 if (arch
== null || arch
.equals("")) {
789 return new String
[0];
791 archXpath
= "/ProtocolNotify";
792 if (usage
!= null && !usage
.equals("")) {
793 usageXpath
= "/ProtocolNotify[@Usage='" + arch
+ "']";
794 xPath
= new String
[] { archXpath
, usageXpath
};
796 return getProtocolNotifyArray(arch
);
800 Object
[] returns
= get("Protocols", xPath
);
801 if (returns
== null) {
802 return new String
[0];
805 String
[] protocolNotifyList
= new String
[returns
.length
];
807 for (int i
= 0; i
< returns
.length
; i
++) {
808 protocolNotifyList
[i
] = ((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName();
810 return protocolNotifyList
;
814 * Retrieve ModuleUnloadImage names
816 * @returns ModuleUnloadImage name list if elements are found at the known
818 * @returns null if nothing is there
820 public String
[] getModuleUnloadImageArray() {
821 String
[] xPath
= new String
[] { "/Extern/ModuleUnloadImage" };
823 Object
[] returns
= get("Externs", xPath
);
824 if (returns
!= null && returns
.length
> 0) {
825 String
[] stringArray
= new String
[returns
.length
];
826 CNameType
[] doc
= (CNameType
[]) returns
;
828 for (int i
= 0; i
< returns
.length
; ++i
) {
829 stringArray
[i
] = doc
[i
].getStringValue();
841 * @returns Extern objects list if elements are found at the known xpath
842 * @returns null if nothing is there
844 public ExternsDocument
.Externs
.Extern
[] getExternArray() {
845 String
[] xPath
= new String
[] { "/Extern" };
847 Object
[] returns
= get("Externs", xPath
);
848 if (returns
!= null && returns
.length
> 0) {
849 return (ExternsDocument
.Externs
.Extern
[]) returns
;
856 * Retrieve PpiNotify for specified arch
861 * @returns String[] if elements are found at the known xpath
862 * @returns String[0] if nothing is there
864 public String
[] getPpiNotifyArray(String arch
) {
867 if (arch
== null || arch
.equals("")) {
868 return new String
[0];
870 xPath
= new String
[] { "/PpiNotify" };
873 Object
[] returns
= get("PPIs", xPath
);
874 if (returns
== null) {
875 return new String
[0];
879 List
<String
> ppiNotifyList
= new ArrayList
<String
>();
880 for (int i
= 0; i
< returns
.length
; i
++) {
881 List archList
= ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getSupArchList();
882 if (archList
== null || contains(archList
, arch
)){
883 ppiNotifyList
.add(((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName());
887 String
[] ppiNotifyArray
= new String
[ppiNotifyList
.size()];
888 for (int i
= 0; i
< ppiNotifyList
.size(); i
++) {
889 ppiNotifyArray
[i
] = ppiNotifyList
.get(i
);
892 return ppiNotifyArray
;
896 * Retrieve PpiNotify for specified usage and arch
899 * PpiNotify arch usage PpiNotify usage
902 * @returns String[] if elements are found at the known xpath
903 * @returns String[0] if nothing is there
905 public String
[] getPpiNotifyArray(String arch
, String usage
) {
911 if (arch
== null || arch
.equals("")) {
912 return new String
[0];
914 archXpath
= "/PpiNotify";
915 if (usage
!= null && !usage
.equals("")) {
916 usageXpath
= "/PpiNotify[@Usage='" + arch
+ "']";
917 xPath
= new String
[] { archXpath
, usageXpath
};
919 return getProtocolNotifyArray(arch
);
923 Object
[] returns
= get("PPIs", xPath
);
924 if (returns
== null) {
925 return new String
[0];
928 String
[] ppiNotifyList
= new String
[returns
.length
];
930 for (int i
= 0; i
< returns
.length
; i
++) {
931 ppiNotifyList
[i
] = ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName();
933 return ppiNotifyList
;
937 * Retrieve Ppi for specified arch
942 * @returns String[] if elements are found at the known xpath
943 * @returns String[0] if nothing is there
945 public String
[] getPpiArray(String arch
) {
948 if (arch
== null || arch
.equals("")) {
949 return new String
[0];
951 xPath
= new String
[] { "/Ppi" };
954 Object
[] returns
= get("PPIs", xPath
);
955 if (returns
== null) {
956 return new String
[0];
959 List
<String
> ppiList
= new ArrayList
<String
>();
960 for (int i
= 0; i
< returns
.length
; i
++) {
961 List archList
= ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getSupArchList();
962 if (archList
== null || contains(archList
, arch
)){
963 ppiList
.add(((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName());
967 String
[] ppiArray
= new String
[ppiList
.size()];
968 for (int i
= 0; i
< ppiList
.size(); i
++) {
969 ppiArray
[i
] = ppiList
.get(i
);
975 * Retrieve PpiNotify for specified usage and arch
978 * PpiNotify arch usage PpiNotify usage
981 * @returns String[] if elements are found at the known xpath
982 * @returns String[0] if nothing is there
984 public String
[] getPpiArray(String arch
, String usage
) {
990 if (arch
== null || arch
.equals("")) {
991 return new String
[0];
994 if (usage
!= null && !usage
.equals("")) {
995 usageXpath
= "/Ppi[@Usage='" + arch
+ "']";
996 xPath
= new String
[] { archXpath
, usageXpath
};
998 return getProtocolNotifyArray(arch
);
1002 Object
[] returns
= get("PPIs", xPath
);
1003 if (returns
== null) {
1004 return new String
[0];
1007 String
[] ppiList
= new String
[returns
.length
];
1009 for (int i
= 0; i
< returns
.length
; i
++) {
1010 ppiList
[i
] = ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName();
1016 * Retrieve GuidEntry information for specified usage
1021 * @returns GuidEntry objects list if elements are found at the known xpath
1022 * @returns null if nothing is there
1024 public String
[] getGuidEntryArray(String arch
) {
1027 if (arch
== null || arch
.equals("")) {
1028 xPath
= new String
[] { "/GuidCNames" };
1030 xPath
= new String
[] { "/GuidCNames" };
1033 Object
[] returns
= get("Guids", xPath
);
1034 if (returns
== null) {
1035 return new String
[0];
1038 List
<String
> guidList
= new ArrayList
<String
>();
1039 for (int i
= 0; i
< returns
.length
; i
++) {
1040 List archList
= ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getSupArchList();
1041 if (archList
== null || contains(archList
, arch
)){
1042 guidList
.add(((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName());
1046 String
[] guidArray
= new String
[guidList
.size()];
1047 for (int i
= 0; i
< guidList
.size(); i
++) {
1048 guidArray
[i
] = guidList
.get(i
);
1055 * Retrieve GuidEntry information for specified usage
1058 * GuidEntry arch usage GuidEntry usage
1060 * @returns GuidEntry objects list if elements are found at the known xpath
1061 * @returns null if nothing is there
1063 public String
[] getGuidEntryArray(String arch
, String usage
) {
1068 if (arch
== null || arch
.equals("")) {
1069 return new String
[0];
1071 archXpath
= "/GuidEntry";
1072 if (usage
!= null && !usage
.equals("")) {
1073 usageXpath
= "/GuidEntry[@Usage='" + arch
+ "']";
1074 xPath
= new String
[] { archXpath
, usageXpath
};
1076 return getProtocolNotifyArray(arch
);
1080 Object
[] returns
= get("Guids", xPath
);
1081 if (returns
== null) {
1082 return new String
[0];
1085 String
[] guidList
= new String
[returns
.length
];
1087 for (int i
= 0; i
< returns
.length
; i
++) {
1088 guidList
[i
] = ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName();
1094 * Retrieve Library instance information
1099 * Library instance usage
1101 * @returns library instance name list if elements are found at the known
1103 * @returns null if nothing is there
1105 public ModuleIdentification
[] getLibraryInstance(String arch
) throws EdkException
{
1107 String saGuid
= null;
1108 String saVersion
= null;
1109 String pkgGuid
= null;
1110 String pkgVersion
= null;
1112 if (arch
== null || arch
.equalsIgnoreCase("")) {
1113 xPath
= new String
[] { "/Instance" };
1116 // Since Schema don't have SupArchList now, so the follow Xpath is
1117 // equal to "/Instance" and [not(@SupArchList) or @SupArchList= arch]
1118 // don't have effect.
1120 xPath
= new String
[] { "/Instance[not(@SupArchList) or @SupArchList='"
1124 Object
[] returns
= get("Libraries", xPath
);
1125 if (returns
== null || returns
.length
== 0) {
1126 return new ModuleIdentification
[0];
1129 ModuleIdentification
[] saIdList
= new ModuleIdentification
[returns
.length
];
1130 for (int i
= 0; i
< returns
.length
; i
++) {
1131 LibrariesDocument
.Libraries
.Instance library
= (LibrariesDocument
.Libraries
.Instance
) returns
[i
];
1132 saGuid
= library
.getModuleGuid();
1133 saVersion
= library
.getModuleVersion();
1135 pkgGuid
= library
.getPackageGuid();
1136 pkgVersion
= library
.getPackageVersion();
1138 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1140 PackageIdentification pkgId
= new PackageIdentification(null,
1141 pkgGuid
, pkgVersion
);
1142 GlobalData
.refreshPackageIdentification(pkgId
);
1143 saId
.setPackage(pkgId
);
1144 GlobalData
.refreshModuleIdentification(saId
);
1153 // / This method is used for retrieving the elements information which has
1154 // / CName sub-element
1156 private String
[] getCNames(String from
, String xPath
[]) {
1157 Object
[] returns
= get(from
, xPath
);
1158 if (returns
== null || returns
.length
== 0) {
1162 String
[] strings
= new String
[returns
.length
];
1163 for (int i
= 0; i
< returns
.length
; ++i
) {
1165 strings
[i
] = ((CNameType
) returns
[i
]).getStringValue();
1172 * Retrive library's constructor name
1174 * @returns constructor name list if elements are found at the known xpath
1175 * @returns null if nothing is there
1177 public String
getLibConstructorName() {
1178 String
[] xPath
= new String
[] { "/Extern/Constructor" };
1180 Object
[] returns
= get("Externs", xPath
);
1181 if (returns
!= null && returns
.length
> 0) {
1182 CNameType constructor
= ((CNameType
) returns
[0]);
1183 return constructor
.getStringValue();
1190 * Retrive library's destructor name
1192 * @returns destructor name list if elements are found at the known xpath
1193 * @returns null if nothing is there
1195 public String
getLibDestructorName() {
1196 String
[] xPath
= new String
[] { "/Extern/Destructor" };
1198 Object
[] returns
= get("Externs", xPath
);
1199 if (returns
!= null && returns
.length
> 0) {
1201 // Only support one Destructor function.
1203 CNameType destructor
= (CNameType
) returns
[0];
1204 return destructor
.getStringValue();
1211 * Retrive DriverBinding names
1213 * @returns DriverBinding name list if elements are found at the known xpath
1214 * @returns null if nothing is there
1216 public String
[] getDriverBindingArray() {
1217 String
[] xPath
= new String
[] { "/Extern/DriverBinding" };
1218 return getCNames("Externs", xPath
);
1222 * Retrive ComponentName names
1224 * @returns ComponentName name list if elements are found at the known xpath
1225 * @returns null if nothing is there
1227 public String
[] getComponentNameArray() {
1228 String
[] xPath
= new String
[] { "/Extern/ComponentName" };
1229 return getCNames("Externs", xPath
);
1233 * Retrive DriverConfig names
1235 * @returns DriverConfig name list if elements are found at the known xpath
1236 * @returns null if nothing is there
1238 public String
[] getDriverConfigArray() {
1239 String
[] xPath
= new String
[] { "/Extern/DriverConfig" };
1240 return getCNames("Externs", xPath
);
1244 * Retrive DriverDiag names
1246 * @returns DriverDiag name list if elements are found at the known xpath
1247 * @returns null if nothing is there
1249 public String
[] getDriverDiagArray() {
1250 String
[] xPath
= new String
[] { "/Extern/DriverDiag" };
1251 return getCNames("Externs", xPath
);
1255 * Retrive SetVirtualAddressMapCallBack names
1257 * @returns SetVirtualAddressMapCallBack name list if elements are found at
1259 * @returns null if nothing is there
1261 public String
[] getSetVirtualAddressMapCallBackArray() {
1262 String
[] xPath
= new String
[] { "/Extern/SetVirtualAddressMapCallBack" };
1263 return getCNames("Externs", xPath
);
1267 * Retrive ExitBootServicesCallBack names
1269 * @returns ExitBootServicesCallBack name list if elements are found at the
1271 * @returns null if nothing is there
1273 public String
[] getExitBootServicesCallBackArray() {
1274 String
[] xPath
= new String
[] { "/Extern/ExitBootServicesCallBack" };
1275 return getCNames("Externs", xPath
);
1279 Judge whether current driver is PEI_PCD_DRIVER or DXE_PCD_DRIVER or
1282 @return CommonDefinition.PCD_DRIVER_TYPE the type of current driver
1284 public CommonDefinition
.PCD_DRIVER_TYPE
getPcdDriverType() {
1285 String
[] xPath
= new String
[] {"/PcdIsDriver"};
1286 Object
[] results
= get ("Externs", xPath
);
1288 if (results
!= null && results
.length
!= 0) {
1289 PcdDriverTypes type
= (PcdDriverTypes
) results
[0];
1290 String typeStr
= type
.enumValue().toString();
1291 if (typeStr
.equals(CommonDefinition
.PCD_DRIVER_TYPE
.PEI_PCD_DRIVER
.toString())) {
1292 return CommonDefinition
.PCD_DRIVER_TYPE
.PEI_PCD_DRIVER
;
1293 } else if (typeStr
.equals(CommonDefinition
.PCD_DRIVER_TYPE
.DXE_PCD_DRIVER
.toString())) {
1294 return CommonDefinition
.PCD_DRIVER_TYPE
.DXE_PCD_DRIVER
;
1296 return CommonDefinition
.PCD_DRIVER_TYPE
.UNKNOWN_PCD_DRIVER
;
1299 return CommonDefinition
.PCD_DRIVER_TYPE
.NOT_PCD_DRIVER
;
1303 * Retrieve module surface area file information
1305 * @returns ModuleSA objects list if elements are found at the known xpath
1306 * @returns Empty ModuleSA list if nothing is there
1308 public Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> getFpdModules() throws EdkException
{
1309 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1310 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1312 String fvBinding
= null;
1313 String saGuid
= null;
1314 String saVersion
= null;
1315 String pkgGuid
= null;
1316 String pkgVersion
= null;
1318 Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> fpdModuleMap
= new LinkedHashMap
<FpdModuleIdentification
, Map
<String
, XmlObject
>>();
1320 if (result
== null) {
1321 return fpdModuleMap
;
1324 for (int i
= 0; i
< result
.length
; i
++) {
1326 // Get Fpd SA Module element node and add to ObjectMap.
1328 Map
<String
, XmlObject
> ObjectMap
= new HashMap
<String
, XmlObject
>();
1329 ModuleSADocument
.ModuleSA moduleSA
= (ModuleSADocument
.ModuleSA
) result
[i
];
1330 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getLibraries() != null) {
1331 ObjectMap
.put("Libraries", moduleSA
.getLibraries());
1333 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getPcdBuildDefinition() != null) {
1334 ObjectMap
.put("PcdBuildDefinition", moduleSA
.getPcdBuildDefinition());
1336 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getModuleSaBuildOptions() != null) {
1337 ObjectMap
.put("ModuleSaBuildOptions", moduleSA
.getModuleSaBuildOptions());
1341 // Get Fpd SA Module attribute and create FpdMoudleIdentification.
1343 if (moduleSA
.isSetSupArchList()) {
1344 arch
= moduleSA
.getSupArchList().toString();
1351 saVersion
= ((ModuleSADocument
.ModuleSA
) result
[i
]).getModuleVersion();
1353 saGuid
= moduleSA
.getModuleGuid();
1354 pkgGuid
= moduleSA
.getPackageGuid();
1355 pkgVersion
= moduleSA
.getPackageVersion();
1358 // Create Module Identification which have class member of package
1361 PackageIdentification pkgId
= new PackageIdentification(null, pkgGuid
, pkgVersion
);
1362 GlobalData
.refreshPackageIdentification(pkgId
);
1363 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
, saVersion
);
1364 GlobalData
.refreshModuleIdentification(saId
);
1366 saId
.setPackage(pkgId
);
1369 // Create FpdModule Identification which have class member of module
1372 String
[] archList
= new String
[0];
1373 if (arch
== null || arch
.trim().length() == 0) {
1374 archList
= GlobalData
.getToolChainInfo().getArchs();
1376 archList
= arch
.split(" ");
1378 for (int j
= 0; j
< archList
.length
; j
++) {
1379 FpdModuleIdentification fpdSaId
= new FpdModuleIdentification(saId
, archList
[j
]);
1381 if (fvBinding
!= null) {
1382 fpdSaId
.setFvBinding(fvBinding
);
1386 // Put element to Map<FpdModuleIdentification, Map<String,
1389 fpdModuleMap
.put(fpdSaId
, ObjectMap
);
1392 return fpdModuleMap
;
1396 * Retrieve valid image names
1398 * @returns valid iamges name list if elements are found at the known xpath
1399 * @returns empty list if nothing is there
1401 public String
[] getFpdValidImageNames() {
1402 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='ImageName']/FvImageNames" };
1404 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1405 if (queryResult
== null) {
1406 return new String
[0];
1409 String
[] result
= new String
[queryResult
.length
];
1410 for (int i
= 0; i
< queryResult
.length
; i
++) {
1411 result
[i
] = ((XmlString
) queryResult
[i
]).getStringValue();
1417 public Node
getFpdUserExtensionPreBuild() {
1418 String
[] xPath
= new String
[] { "/UserExtensions[@UserID='TianoCore' and @Identifier='0']" };
1420 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1421 if (queryResult
== null || queryResult
.length
== 0) {
1424 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1426 return a
.getDomNode();
1429 public Node
getFpdUserExtensionPostBuild() {
1430 String
[] xPath
= new String
[] { "/UserExtensions[@UserID='TianoCore' and @Identifier='1']" };
1432 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1433 if (queryResult
== null || queryResult
.length
== 0) {
1436 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1438 return a
.getDomNode();
1442 * Retrieve FV image option information
1447 * @returns option name/value list if elements are found at the known xpath
1448 * @returns empty list if nothing is there
1450 public String
[][] getFpdOptions(String fvName
) {
1451 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Options' and ./FvImageNames='"
1452 + fvName
+ "']/FvImageOptions" };
1453 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1454 if (queryResult
== null) {
1455 return new String
[0][];
1457 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1458 for (int i
= 0; i
< queryResult
.length
; i
++) {
1459 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1460 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
1461 .getNameValueList();
1462 Iterator iter
= namevalues
.iterator();
1463 while (iter
.hasNext()) {
1464 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1466 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1469 String
[][] result
= new String
[list
.size()][2];
1470 for (int i
= 0; i
< list
.size(); i
++) {
1471 result
[i
][0] = list
.get(i
)[0];
1472 result
[i
][1] = list
.get(i
)[1];
1478 public XmlObject
getFpdBuildOptions() {
1479 String
[] xPath
= new String
[] { "/BuildOptions" };
1481 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1483 if (queryResult
== null || queryResult
.length
== 0) {
1486 return (XmlObject
)queryResult
[0];
1489 public PlatformIdentification
getFpdHeader() {
1490 String
[] xPath
= new String
[] { "/PlatformHeader" };
1492 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
1494 if (returns
== null || returns
.length
== 0) {
1497 PlatformHeaderDocument
.PlatformHeader header
= (PlatformHeaderDocument
.PlatformHeader
) returns
[0];
1499 String name
= header
.getPlatformName();
1501 String guid
= header
.getGuidValue();
1503 String version
= header
.getVersion();
1505 return new PlatformIdentification(name
, guid
, version
);
1509 * Retrieve FV image attributes information
1514 * @returns attribute name/value list if elements are found at the known
1516 * @returns empty list if nothing is there
1518 public String
[][] getFpdAttributes(String fvName
) {
1519 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Attributes' and ./FvImageNames='"
1520 + fvName
+ "']/FvImageOptions" };
1521 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1522 if (queryResult
== null) {
1523 return new String
[0][];
1525 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1526 for (int i
= 0; i
< queryResult
.length
; i
++) {
1528 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1529 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1530 Iterator iter
= namevalues
.iterator();
1531 while (iter
.hasNext()) {
1532 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1534 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1537 String
[][] result
= new String
[list
.size()][2];
1538 for (int i
= 0; i
< list
.size(); i
++) {
1539 result
[i
][0] = list
.get(i
)[0];
1540 result
[i
][1] = list
.get(i
)[1];
1546 * Retrieve flash definition file name
1548 * @returns file name if elements are found at the known xpath
1549 * @returns null if nothing is there
1551 public String
getFlashDefinitionFile() {
1552 String
[] xPath
= new String
[] { "/PlatformDefinitions/FlashDeviceDefinitions/FlashDefinitionFile" };
1554 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1555 if (queryResult
== null || queryResult
.length
== 0) {
1559 FileNameConvention filename
= (FileNameConvention
) queryResult
[queryResult
.length
- 1];
1560 return filename
.getStringValue();
1563 public String
[][] getFpdGlobalVariable() {
1564 String
[] xPath
= new String
[] { "/Flash/FvImages/NameValue" };
1565 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1566 if (queryResult
== null) {
1567 return new String
[0][];
1570 String
[][] result
= new String
[queryResult
.length
][2];
1572 for (int i
= 0; i
< queryResult
.length
; i
++) {
1573 FvImagesDocument
.FvImages
.NameValue item
= (FvImagesDocument
.FvImages
.NameValue
)queryResult
[i
];
1574 result
[i
][0] = item
.getName();
1575 result
[i
][1] = item
.getValue();
1581 * Retrieve FV image component options
1586 * @returns name/value pairs list if elements are found at the known xpath
1587 * @returns empty list if nothing is there
1589 public String
[][] getFpdComponents(String fvName
) {
1590 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Components' and ./FvImageNames='"+ fvName
+ "']/FvImageOptions" };
1591 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1592 if (queryResult
== null) {
1593 return new String
[0][];
1596 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1597 for (int i
= 0; i
< queryResult
.length
; i
++) {
1598 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1599 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1600 Iterator iter
= namevalues
.iterator();
1601 while (iter
.hasNext()) {
1602 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1604 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1607 String
[][] result
= new String
[list
.size()][2];
1608 for (int i
= 0; i
< list
.size(); i
++) {
1609 result
[i
][0] = list
.get(i
)[0];
1610 result
[i
][1] = list
.get(i
)[1];
1616 * Retrieve PCD tokens
1618 * @returns CName/ItemType pairs list if elements are found at the known
1620 * @returns null if nothing is there
1622 public String
[][] getPcdTokenArray() {
1623 String
[] xPath
= new String
[] { "/PcdData" };
1625 Object
[] returns
= get("PCDs", xPath
);
1626 if (returns
== null || returns
.length
== 0) {
1634 * Retrieve MAS header
1639 public ModuleIdentification
getMsaHeader() {
1640 String
[] xPath
= new String
[] { "/" };
1641 Object
[] returns
= get("MsaHeader", xPath
);
1643 if (returns
== null || returns
.length
== 0) {
1647 MsaHeader msaHeader
= (MsaHeader
) returns
[0];
1649 // Get BaseName, ModuleType, GuidValue, Version
1650 // which in MsaHeader.
1652 String name
= msaHeader
.getModuleName();
1653 String moduleType
= msaHeader
.getModuleType().toString();
1654 String guid
= msaHeader
.getGuidValue();
1655 String version
= msaHeader
.getVersion();
1657 ModuleIdentification moduleId
= new ModuleIdentification(name
, guid
,
1660 moduleId
.setModuleType(moduleType
);
1666 * Retrieve Extern Specification
1670 * @return String[] If have specification element in the <extern> String[0]
1671 * If no specification element in the <extern>
1675 public String
[] getExternSpecificaiton() {
1676 String
[] xPath
= new String
[] { "/Specification" };
1678 Object
[] queryResult
= get("Externs", xPath
);
1679 if (queryResult
== null) {
1680 return new String
[0];
1683 String
[] specificationList
= new String
[queryResult
.length
];
1684 for (int i
= 0; i
< queryResult
.length
; i
++) {
1685 specificationList
[i
] = ((Sentence
)queryResult
[i
])
1688 return specificationList
;
1692 * Retreive MsaFile which in SPD
1695 * @return String[][3] The string sequence is ModuleName, ModuleGuid,
1696 * ModuleVersion, MsaFile String[0][] If no msafile in SPD
1698 public String
[] getSpdMsaFile() {
1699 String
[] xPath
= new String
[] { "/MsaFiles" };
1701 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1702 if (returns
== null) {
1703 return new String
[0];
1706 List
<String
> filenameList
= ((MsaFilesDocument
.MsaFiles
) returns
[0])
1708 return filenameList
.toArray(new String
[filenameList
.size()]);
1714 public Map
<String
, String
[]> getSpdLibraryClasses() {
1715 String
[] xPath
= new String
[] { "/LibraryClassDeclarations/LibraryClass" };
1717 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1720 // Create Map, Key - LibraryClass, String[] - LibraryClass Header file.
1722 Map
<String
, String
[]> libClassHeaderMap
= new HashMap
<String
, String
[]>();
1724 if (returns
== null) {
1725 return libClassHeaderMap
;
1728 for (int i
= 0; i
< returns
.length
; i
++) {
1729 LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass library
= (LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass
) returns
[i
];
1730 libClassHeaderMap
.put(library
.getName(), new String
[] { library
1731 .getIncludeHeader() });
1733 return libClassHeaderMap
;
1739 public Map
<String
, String
> getSpdPackageHeaderFiles() {
1740 String
[] xPath
= new String
[] { "/PackageHeaders/IncludePkgHeader" };
1742 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1745 // Create Map, Key - ModuleType, String - PackageInclude Header file.
1747 Map
<String
, String
> packageIncludeMap
= new HashMap
<String
, String
>();
1749 if (returns
== null) {
1750 return packageIncludeMap
;
1753 for (int i
= 0; i
< returns
.length
; i
++) {
1754 PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader includeHeader
= (PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader
) returns
[i
];
1755 packageIncludeMap
.put(includeHeader
.getModuleType().toString(),
1756 includeHeader
.getStringValue());
1758 return packageIncludeMap
;
1761 public PackageIdentification
getSpdHeader() {
1762 String
[] xPath
= new String
[] { "/SpdHeader" };
1764 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1766 if (returns
== null || returns
.length
== 0) {
1770 SpdHeaderDocument
.SpdHeader header
= (SpdHeaderDocument
.SpdHeader
) returns
[0];
1772 String name
= header
.getPackageName();
1774 String guid
= header
.getGuidValue();
1776 String version
= header
.getVersion();
1778 return new PackageIdentification(name
, guid
, version
);
1784 public Map
<String
, String
[]> getSpdGuid() {
1785 String
[] xPath
= new String
[] { "/GuidDeclarations/Entry" };
1787 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1790 // Create Map, Key - GuidName, String[] - C_NAME & GUID value.
1792 Map
<String
, String
[]> guidDeclMap
= new HashMap
<String
, String
[]>();
1793 if (returns
== null) {
1797 for (int i
= 0; i
< returns
.length
; i
++) {
1798 GuidDeclarationsDocument
.GuidDeclarations
.Entry entry
= (GuidDeclarationsDocument
.GuidDeclarations
.Entry
) returns
[i
];
1799 String
[] guidPair
= new String
[2];
1800 guidPair
[0] = entry
.getCName();
1801 guidPair
[1] = entry
.getGuidValue();
1802 guidDeclMap
.put(entry
.getCName(), guidPair
);
1803 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1804 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[0]);
1805 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[1]);
1813 public Map
<String
, String
[]> getSpdProtocol() {
1814 String
[] xPath
= new String
[] { "/ProtocolDeclarations/Entry" };
1816 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1819 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1821 Map
<String
, String
[]> protoclMap
= new HashMap
<String
, String
[]>();
1823 if (returns
== null) {
1827 for (int i
= 0; i
< returns
.length
; i
++) {
1828 ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry entry
= (ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry
) returns
[i
];
1829 String
[] protocolPair
= new String
[2];
1831 protocolPair
[0] = entry
.getCName();
1832 protocolPair
[1] = entry
.getGuidValue();
1833 protoclMap
.put(entry
.getCName(), protocolPair
);
1834 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1835 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[0]);
1836 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[1]);
1842 * getSpdPpi() Retrieve the SPD PPI Entry
1845 * @return Map<String, String[2]> if get the PPI entry from SPD. Key - PPI
1846 * Name String[0] - PPI CNAME String[1] - PPI Guid Null if no PPI
1849 public Map
<String
, String
[]> getSpdPpi() {
1850 String
[] xPath
= new String
[] { "/PpiDeclarations/Entry" };
1852 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1855 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1857 Map
<String
, String
[]> ppiMap
= new HashMap
<String
, String
[]>();
1859 if (returns
== null) {
1863 for (int i
= 0; i
< returns
.length
; i
++) {
1864 PpiDeclarationsDocument
.PpiDeclarations
.Entry entry
= (PpiDeclarationsDocument
.PpiDeclarations
.Entry
) returns
[i
];
1865 String
[] ppiPair
= new String
[2];
1866 ppiPair
[0] = entry
.getCName();
1867 ppiPair
[1] = entry
.getGuidValue();
1868 ppiMap
.put(entry
.getCName(), ppiPair
);
1874 * Retrieve module Guid string
1876 * @returns GUILD string if elements are found at the known xpath
1877 * @returns null if nothing is there
1879 public String
getModuleGuid() {
1880 String
[] xPath
= new String
[] { "" };
1882 Object
[] returns
= get("MsaHeader", xPath
);
1883 if (returns
!= null && returns
.length
> 0) {
1884 String guid
= ((MsaHeaderDocument
.MsaHeader
) returns
[0])
1895 public ModuleSADocument
.ModuleSA
[] getFpdModuleSAs() {
1896 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1897 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1898 if (result
!= null) {
1899 return (ModuleSADocument
.ModuleSA
[]) result
;
1901 return new ModuleSADocument
.ModuleSA
[0];
1905 Get name array of PCD in a module. In one module, token space
1906 is same, and token name should not be conflicted.
1910 public String
[] getModulePcdEntryNameArray() {
1911 PcdCodedDocument
.PcdCoded
.PcdEntry
[] pcdEntries
= null;
1914 String
[] xPath
= new String
[] {"/PcdEntry"};
1915 Object
[] returns
= get ("PcdCoded", xPath
);
1917 if (returns
== null) {
1918 return new String
[0];
1921 pcdEntries
= (PcdCodedDocument
.PcdCoded
.PcdEntry
[])returns
;
1922 results
= new String
[pcdEntries
.length
];
1924 for (index
= 0; index
< pcdEntries
.length
; index
++) {
1925 results
[index
] = pcdEntries
[index
].getCName();
1931 Search in a List for a given string
1935 public boolean contains(List list
, String str
) {
1936 if (list
== null || list
.size()== 0) {
1939 Iterator it
= list
.iterator();
1940 while (it
.hasNext()) {
1941 String s
= (String
)it
.next();
1942 if (s
.equalsIgnoreCase(str
)) {
1950 public boolean isHaveTianoR8FlashMap(){
1951 String
[] xPath
= new String
[] {"/"};
1952 Object
[] returns
= get ("Externs", xPath
);
1954 if (returns
== null) {
1958 ExternsDocument
.Externs ext
= (ExternsDocument
.Externs
)returns
[0];
1960 if (ext
.getTianoR8FlashMapH()){