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
.XmlCursor
;
27 import org
.apache
.xmlbeans
.XmlObject
;
28 import org
.apache
.xmlbeans
.XmlString
;
29 import org
.tianocore
.BuildOptionsDocument
;
30 import org
.tianocore
.CNameType
;
31 import org
.tianocore
.ExternsDocument
;
32 import org
.tianocore
.FileNameConvention
;
33 import org
.tianocore
.FvImagesDocument
;
34 import org
.tianocore
.GuidDeclarationsDocument
;
35 import org
.tianocore
.GuidsDocument
;
36 import org
.tianocore
.LibrariesDocument
;
37 import org
.tianocore
.LibraryClassDeclarationsDocument
;
38 import org
.tianocore
.LibraryClassDocument
;
39 import org
.tianocore
.ModuleDefinitionsDocument
;
40 import org
.tianocore
.ModuleSADocument
;
41 import org
.tianocore
.ModuleSaBuildOptionsDocument
;
42 import org
.tianocore
.ModuleTypeDef
;
43 import org
.tianocore
.MsaFilesDocument
;
44 import org
.tianocore
.MsaHeaderDocument
;
45 import org
.tianocore
.OptionDocument
;
46 import org
.tianocore
.PPIsDocument
;
47 import org
.tianocore
.PackageDependenciesDocument
;
48 import org
.tianocore
.PackageHeadersDocument
;
49 import org
.tianocore
.PcdCodedDocument
;
50 import org
.tianocore
.PlatformDefinitionsDocument
;
51 import org
.tianocore
.PlatformHeaderDocument
;
52 import org
.tianocore
.PpiDeclarationsDocument
;
53 import org
.tianocore
.ProtocolDeclarationsDocument
;
54 import org
.tianocore
.Sentence
;
55 import org
.tianocore
.SpdHeaderDocument
;
56 import org
.tianocore
.UserExtensionsDocument
;
57 import org
.tianocore
.FilenameDocument
.Filename
;
58 import org
.tianocore
.MsaHeaderDocument
.MsaHeader
;
59 import org
.tianocore
.ProtocolsDocument
.Protocols
.Protocol
;
60 import org
.tianocore
.ProtocolsDocument
.Protocols
.ProtocolNotify
;
61 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
62 import org
.tianocore
.build
.id
.ModuleIdentification
;
63 import org
.tianocore
.build
.id
.PackageIdentification
;
64 import org
.tianocore
.build
.id
.PlatformIdentification
;
65 import org
.tianocore
.build
.toolchain
.ToolChainInfo
;
66 import org
.tianocore
.logger
.EdkLog
;
67 import org
.w3c
.dom
.Node
;
70 * SurfaceAreaQuery class is used to query Surface Area information from msa,
71 * mbd, spd and fpd files.
73 * This class should not instantiated. All the public interfaces is static.
77 public class SurfaceAreaQuery
{
79 public static String prefix
= "http://www.TianoCore.org/2006/Edk2.0";
82 // / Contains name/value pairs of Surface Area document object. The name is
83 // / always the top level element name.
85 private static Map
<String
, XmlObject
> map
= null;
88 // / mapStack is used to do nested query
90 private static Stack
<Map
<String
, XmlObject
>> mapStack
= new Stack
<Map
<String
, XmlObject
>>();
93 // / prefix of name space
95 private static String nsPrefix
= "sans";
98 // / xmlbeans needs a name space for each Xpath element
100 private static String ns
= null;
103 // / keep the namep declaration for xmlbeans Xpath query
105 private static String queryDeclaration
= null;
108 * Set a Surface Area document for query later
111 * A Surface Area document in TopLevelElementName/XmlObject
114 public static void setDoc(Map
<String
, XmlObject
> map
) {
116 queryDeclaration
= "declare namespace " + nsPrefix
+ "='" + ns
+ "'; ";
117 SurfaceAreaQuery
.map
= map
;
121 * Push current used Surface Area document into query stack. The given new
122 * document will be used for any immediately followed getXXX() callings,
123 * untill pop() is called.
126 * The TopLevelElementName/XmlObject format of a Surface Area
129 public static void push(Map
<String
, XmlObject
> newMap
) {
130 mapStack
.push(SurfaceAreaQuery
.map
);
131 SurfaceAreaQuery
.map
= newMap
;
135 * Discard current used Surface Area document and use the top document in
138 public static void pop() {
139 SurfaceAreaQuery
.map
= mapStack
.pop();
143 // / Convert xPath to be namespace qualified, which is necessary for
145 // / selectPath(). For example, converting /MsaHeader/ModuleType to
146 // / /ns:MsaHeader/ns:ModuleType
148 private static String
normalizeQueryString(String
[] exp
, String from
) {
149 StringBuffer normQueryString
= new StringBuffer(4096);
152 while (i
< exp
.length
) {
153 String newExp
= from
+ exp
[i
];
154 Pattern pattern
= Pattern
.compile("([^/]*)(/|//)([^/]+)");
155 Matcher matcher
= pattern
.matcher(newExp
);
157 while (matcher
.find()) {
158 String starter
= newExp
.substring(matcher
.start(1), matcher
160 String seperator
= newExp
.substring(matcher
.start(2), matcher
162 String token
= newExp
.substring(matcher
.start(3), matcher
165 normQueryString
.append(starter
);
166 normQueryString
.append(seperator
);
167 normQueryString
.append(nsPrefix
);
168 normQueryString
.append(":");
169 normQueryString
.append(token
);
173 if (i
< exp
.length
) {
174 normQueryString
.append(" | ");
178 return normQueryString
.toString();
182 * Search all XML documents stored in "map" for the specified xPath, using
183 * relative path (starting with '$this')
186 * xpath query string array
187 * @returns An array of XmlObject if elements are found at the specified
189 * @returns NULL if nothing is at the specified xpath
191 public static Object
[] get(String
[] xPath
) {
196 String
[] keys
= (String
[]) map
.keySet().toArray(new String
[map
.size()]);
197 List
<Object
> result
= new ArrayList
<Object
>();
198 for (int i
= 0; i
< keys
.length
; ++i
) {
199 XmlObject rootNode
= (XmlObject
) map
.get(keys
[i
]);
200 if (rootNode
== null) {
204 String query
= queryDeclaration
205 + normalizeQueryString(xPath
, "$this/" + keys
[i
]);
206 XmlObject
[] tmp
= rootNode
.selectPath(query
);
207 for (int j
= 0; j
< tmp
.length
; ++j
) {
208 result
.add((Object
)tmp
[j
]);
212 int size
= result
.size();
217 return (Object
[]) result
.toArray(new Object
[size
]);
221 * Search XML documents named by "rootName" for the given xPath, using
222 * relative path (starting with '$this')
225 * The top level element name
227 * The xpath query string array
228 * @returns An array of XmlObject if elements are found at the given xpath
229 * @returns NULL if nothing is found at the given xpath
231 public static Object
[] get(String rootName
, String
[] xPath
) {
236 XmlObject root
= (XmlObject
) map
.get(rootName
);
241 String query
= queryDeclaration
242 + normalizeQueryString(xPath
, "$this/" + rootName
);
243 XmlObject
[] result
= root
.selectPath(query
);
244 if (result
.length
> 0) {
245 return (Object
[])result
;
248 query
= queryDeclaration
+ normalizeQueryString(xPath
, "/" + rootName
);
249 result
= root
.selectPath(query
);
250 if (result
.length
> 0) {
251 return (Object
[])result
;
258 * Retrieve SourceFiles/Filename for specified ARCH type
262 * @returns An 2 dimension string array if elements are found at the known
264 * @returns NULL if nothing is found at the known xpath
266 public static String
[][] getSourceFiles(String arch
) {
270 xPath
= new String
[] { "/Filename" };
272 returns
= get("SourceFiles", xPath
);
274 if (returns
== null || returns
.length
== 0) {
275 return new String
[0][0];
278 Filename
[] sourceFileNames
= (Filename
[]) returns
;
279 List
<String
[]> outputList
= new ArrayList
<String
[]>();
280 for (int i
= 0; i
< sourceFileNames
.length
; i
++) {
281 @SuppressWarnings("unchecked")
282 List
<String
> archList
= sourceFileNames
[i
].getSupArchList();
283 if (arch
== null || arch
.equalsIgnoreCase("") || archList
== null || archList
.contains(arch
)) {
284 outputList
.add(new String
[] {sourceFileNames
[i
].getToolCode(),sourceFileNames
[i
].getStringValue()});
288 String
[][] outputString
= new String
[outputList
.size()][2];
289 for (int index
= 0; index
< outputList
.size(); index
++) {
290 outputString
[index
][0] = outputList
.get(index
)[0];
291 outputString
[index
][1] = outputList
.get(index
)[1];
297 * Retrieve /PlatformDefinitions/OutputDirectory from FPD
299 * @returns Directory names array if elements are found at the known xpath
300 * @returns Empty if nothing is found at the known xpath
302 public static String
getFpdOutputDirectory() {
303 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
305 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
306 if (returns
== null || returns
.length
== 0) {
309 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
310 return item
.getOutputDirectory();
313 public static String
getFpdIntermediateDirectories() {
314 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
316 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
317 if (returns
== null || returns
.length
== 0) {
320 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
321 if(item
.getIntermediateDirectories() == null) {
325 return item
.getIntermediateDirectories().toString();
329 public static String
getModuleFfsKeyword() {
330 String
[] xPath
= new String
[] { "/" };
332 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
333 if (returns
== null || returns
.length
== 0) {
336 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
337 return item
.getFfsFormatKey();
340 public static String
getModuleFvBindingKeyword() {
341 String
[] xPath
= new String
[] { "/" };
343 Object
[] returns
= get("ModuleSaBuildOptions", xPath
);
344 if (returns
== null || returns
.length
== 0) {
347 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions item
= (ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions
)returns
[0];
348 return item
.getFvBinding();
351 public static List
getModuleSupportedArchs() {
352 String
[] xPath
= new String
[] { "/" };
354 Object
[] returns
= get("ModuleDefinitions", xPath
);
355 if (returns
== null || returns
.length
== 0) {
358 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
359 return item
.getSupportedArchitectures();
362 public static BuildOptionsDocument
.BuildOptions
.Ffs
[] getFpdFfs() {
363 String
[] xPath
= new String
[] {"/Ffs"};
365 Object
[] returns
= get("BuildOptions", xPath
);
366 if (returns
== null || returns
.length
== 0) {
367 return new BuildOptionsDocument
.BuildOptions
.Ffs
[0];
369 return (BuildOptionsDocument
.BuildOptions
.Ffs
[])returns
;
372 public static String
getModuleOutputFileBasename() {
373 String
[] xPath
= new String
[] { "/" };
375 Object
[] returns
= get("ModuleDefinitions", xPath
);
376 if (returns
== null || returns
.length
== 0) {
379 ModuleDefinitionsDocument
.ModuleDefinitions item
= (ModuleDefinitionsDocument
.ModuleDefinitions
)returns
[0];
380 return item
.getOutputFileBasename();
384 * Retrieve BuildOptions/Option or Arch/Option
386 * @param toolChainFamilyFlag
387 * if true, retrieve options for toolchain family; otherwise for
390 * @returns String[][5] name, target, toolchain, arch, coommand of options
391 * if elements are found at the known xpath. String[0][] if dont
394 * @returns Empty array if nothing is there
396 public static String
[][] getOptions(String from
, String
[] xPath
, boolean toolChainFamilyFlag
) {
397 String target
= null;
398 String toolchain
= null;
399 String toolchainFamily
= null;
400 List
<String
> archList
= null;
402 String targetName
= null;
403 String optionName
= null;
405 Object
[] returns
= get(from
, xPath
);
406 if (returns
== null) {
407 return new String
[0][5];
410 List
<String
[]> optionList
= new ArrayList
<String
[]>();
411 OptionDocument
.Option option
;
413 for (int i
= 0; i
< returns
.length
; i
++) {
414 option
= (OptionDocument
.Option
) returns
[i
];
417 // Get Target, ToolChain(Family), Arch, Cmd, and Option from Option,
419 // put to result[][5] array in above order.
422 if (option
.getBuildTargets() == null) {
426 target
= option
.getBuildTargets().toString();
428 if (target
!= null) {
429 targetList
= target
.split(" ");
431 targetList
= new String
[1];
432 targetList
[0] = null;
435 if (toolChainFamilyFlag
) {
436 toolchainFamily
= option
.getToolChainFamily();
437 if (toolchainFamily
!= null) {
438 toolchain
= toolchainFamily
.toString();
443 toolchain
= option
.getTagName();
446 archList
= new ArrayList
<String
>();
447 @SuppressWarnings("unchecked")
448 List
<String
> archEnumList
= option
.getSupArchList();
449 if (archEnumList
== null) {
452 archList
.addAll(archEnumList
);
454 Iterator it = archEnumList.iterator();
455 while (it.hasNext()) {
456 System.out.println(it.next().getClass().getName());
457 SupportedArchitectures.Enum archType = it.next();
458 archList.add(archType.toString());
463 cmd
= option
.getToolCode();
465 optionName
= option
.getStringValue();
466 for (int t
= 0; t
< targetList
.length
; t
++) {
467 for (int j
= 0; j
< archList
.size(); j
++) {
468 optionList
.add(new String
[] { targetList
[t
],
469 toolchain
, archList
.get(j
), cmd
, optionName
});
474 String
[][] result
= new String
[optionList
.size()][5];
475 for (int i
= 0; i
< optionList
.size(); i
++) {
476 result
[i
][0] = optionList
.get(i
)[0];
477 result
[i
][1] = optionList
.get(i
)[1];
478 result
[i
][2] = optionList
.get(i
)[2];
479 result
[i
][3] = optionList
.get(i
)[3];
480 result
[i
][4] = optionList
.get(i
)[4];
485 public static String
[][] getModuleBuildOptions(boolean toolChainFamilyFlag
) {
488 if (toolChainFamilyFlag
== true) {
489 xPath
= new String
[] {
490 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
491 "/Options/Option[@ToolChainFamily]", };
493 xPath
= new String
[] {
494 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
495 "/Options/Option[@TagName]", };
497 return getOptions("ModuleSaBuildOptions", xPath
, toolChainFamilyFlag
);
500 public static String
[][] getPlatformBuildOptions(boolean toolChainFamilyFlag
) {
503 if (toolChainFamilyFlag
== true) {
504 xPath
= new String
[] {
505 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
506 "/BuildOptions/Options/Option[@ToolChainFamily]", };
508 xPath
= new String
[] {
509 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
510 "/BuildOptions/Options/Option[@TagName]", };
513 return getOptions("PlatformSurfaceArea", xPath
, toolChainFamilyFlag
);
516 public static ToolChainInfo
getFpdToolChainInfo() {
517 String
[] xPath
= new String
[] { "/PlatformDefinitions" };
519 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
520 if (returns
== null || returns
.length
== 0) {
524 PlatformDefinitionsDocument
.PlatformDefinitions item
= (PlatformDefinitionsDocument
.PlatformDefinitions
)returns
[0];
525 ToolChainInfo toolChainInfo
= new ToolChainInfo();
526 toolChainInfo
.addTargets(item
.getBuildTargets().toString());
527 toolChainInfo
.addArchs(item
.getSupportedArchitectures().toString());
528 toolChainInfo
.addTagnames((String
)null);
529 return toolChainInfo
;
533 * Retrieve <xxxHeader>/ModuleType
535 * @returns The module type name if elements are found at the known xpath
536 * @returns null if nothing is there
538 public static String
getModuleType() {
539 String
[] xPath
= new String
[] { "/ModuleType" };
541 Object
[] returns
= get(xPath
);
542 if (returns
!= null && returns
.length
> 0) {
543 ModuleTypeDef type
= (ModuleTypeDef
) returns
[0];
544 return type
.enumValue().toString();
551 * Retrieve PackageDependencies/Package
556 * @returns package name list if elements are found at the known xpath
557 * @returns null if nothing is there
559 public static PackageIdentification
[] getDependencePkg(String arch
) {
561 String packageGuid
= null;
562 String packageVersion
= null;
565 xPath
= new String
[] { "/Package" };
567 Object
[] returns
= get("PackageDependencies", xPath
);
568 if (returns
== null) {
569 return new PackageIdentification
[0];
571 PackageIdentification
[] packageIdList
= new PackageIdentification
[returns
.length
];
572 for (int i
= 0; i
< returns
.length
; i
++) {
573 PackageDependenciesDocument
.PackageDependencies
.Package item
= (PackageDependenciesDocument
.PackageDependencies
.Package
) returns
[i
];
574 @SuppressWarnings("unchecked")
575 List
<String
> archList
= item
.getSupArchList();
576 if (arch
== null || archList
== null || archList
.contains(arch
)) {
577 packageGuid
= item
.getPackageGuid();
578 packageVersion
= item
.getPackageVersion();
579 packageIdList
[i
] = (new PackageIdentification(null, packageGuid
,
583 return packageIdList
;
587 * Retrieve LibraryClassDefinitions/LibraryClass for specified usage
590 * Library class usage
592 * @returns LibraryClass objects list if elements are found at the known
594 * @returns null if nothing is there
596 public static String
[] getLibraryClasses(String usage
) {
599 if (usage
== null || usage
.equals("")) {
600 xPath
= new String
[] { "/LibraryClass" };
602 xPath
= new String
[] { "/LibraryClass[@Usage='" + usage
+ "']" };
605 Object
[] returns
= get("LibraryClassDefinitions", xPath
);
606 if (returns
== null || returns
.length
== 0) {
607 return new String
[0];
610 LibraryClassDocument
.LibraryClass
[] libraryClassList
= (LibraryClassDocument
.LibraryClass
[]) returns
;
611 String
[] libraryClassName
= new String
[libraryClassList
.length
];
612 for (int i
= 0; i
< libraryClassList
.length
; i
++) {
613 libraryClassName
[i
] = libraryClassList
[i
].getKeyword();
615 return libraryClassName
;
619 * Retrieve ModuleEntryPoint names
621 * @returns ModuleEntryPoint name list if elements are found at the known
623 * @returns null if nothing is there
625 public static String
[] getModuleEntryPointArray() {
626 String
[] xPath
= new String
[] { "/Extern/ModuleEntryPoint" };
628 Object
[] returns
= get("Externs", xPath
);
630 if (returns
!= null && returns
.length
> 0) {
631 String
[] entryPoints
= new String
[returns
.length
];
633 for (int i
= 0; i
< returns
.length
; ++i
) {
634 entryPoints
[i
] = ((CNameType
) returns
[i
]).getStringValue();
644 * retrieve Protocol for specified usage
647 * Protocol usage arch Architecture
649 * @returns Protocol String list if elements are found at the known xpath
650 * @returns String[0] if nothing is there
652 public static String
[] getProtocolArray(String arch
, String usage
) {
654 String usageXpath
= "";
655 String archXpath
= "";
657 if (arch
== null || arch
.equals("")) {
658 return new String
[0];
660 archXpath
= "/Protocol";
661 if (usage
!= null && !usage
.equals("")) {
662 usageXpath
= "/Protocol[@Usage='" + usage
+ "']";
663 xPath
= new String
[] { usageXpath
, archXpath
};
665 return getProtocolArray(arch
);
670 Object
[] returns
= get("Protocols", xPath
);
671 if (returns
== null) {
672 return new String
[0];
674 Protocol
[] protocolList
= (Protocol
[]) returns
;
676 String
[] protocolArray
= new String
[returns
.length
];
677 for (int i
= 0; i
< returns
.length
; i
++) {
678 protocolArray
[i
] = protocolList
[i
].getProtocolCName();
680 return protocolArray
;
684 * retrieve Protocol for specified usage
689 * @returns Protocol String list if elements are found at the known xpath
690 * @returns String[0] if nothing is there
692 public static String
[] getProtocolArray(String arch
) {
695 if (arch
== null || arch
.equals("")) {
696 return new String
[0];
698 xPath
= new String
[] { "/Protocol" };
701 Object
[] returns
= get("Protocols", xPath
);
702 if (returns
== null) {
703 return new String
[0];
705 Protocol
[] returnlList
= (Protocol
[]) returns
;
707 List
<String
> protocolList
= new ArrayList
<String
>();
709 for (int i
= 0; i
< returns
.length
; i
++) {
710 @SuppressWarnings("unchecked")
711 List
<String
> archList
= returnlList
[i
].getSupArchList();
712 if (archList
== null || archList
.contains(arch
)){
713 protocolList
.add(returnlList
[i
].getProtocolCName());
716 String
[] protocolArray
= new String
[protocolList
.size()];
717 for (int i
= 0; i
< protocolList
.size(); i
++) {
718 protocolArray
[i
] = protocolList
.get(i
);
720 return protocolArray
;
724 * Retrieve ProtocolNotify for specified usage
727 * ProtocolNotify usage
729 * @returns String[] if elements are found at the known xpath
730 * @returns String[0] if nothing is there
732 public static String
[] getProtocolNotifyArray(String arch
) {
735 if (arch
== null || arch
.equals("")) {
736 return new String
[0];
738 xPath
= new String
[] { "/ProtocolNotify" };
741 Object
[] returns
= get("Protocols", xPath
);
742 if (returns
== null) {
743 return new String
[0];
746 List
<String
> protocolNotifyList
= new ArrayList
<String
>();
748 for (int i
= 0; i
< returns
.length
; i
++) {
749 @SuppressWarnings("unchecked")
750 List
<String
> archList
= ((ProtocolNotify
) returns
[i
]).getSupArchList();
751 if (archList
== null || archList
.contains(arch
)){
752 protocolNotifyList
.add(((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName());
756 String
[] protocolNotifyArray
= new String
[protocolNotifyList
.size()];
757 for (int i
= 0; i
< protocolNotifyList
.size(); i
++) {
758 protocolNotifyArray
[i
] = protocolNotifyList
.get(i
);
760 return protocolNotifyArray
;
764 * Retrieve ProtocolNotify for specified usage
767 * ProtocolNotify usage
769 * @returns String[] if elements are found at the known xpath
770 * @returns String[0] if nothing is there
772 public static String
[] getProtocolNotifyArray(String arch
, String usage
) {
778 if (arch
== null || arch
.equals("")) {
779 return new String
[0];
781 archXpath
= "/ProtocolNotify";
782 if (usage
!= null && !usage
.equals("")) {
783 usageXpath
= "/ProtocolNotify[@Usage='" + arch
+ "']";
784 xPath
= new String
[] { archXpath
, usageXpath
};
786 return getProtocolNotifyArray(arch
);
790 Object
[] returns
= get("Protocols", xPath
);
791 if (returns
== null) {
792 return new String
[0];
795 String
[] protocolNotifyList
= new String
[returns
.length
];
797 for (int i
= 0; i
< returns
.length
; i
++) {
798 protocolNotifyList
[i
] = ((ProtocolNotify
) returns
[i
]).getProtocolNotifyCName();
800 return protocolNotifyList
;
804 * Retrieve ModuleUnloadImage names
806 * @returns ModuleUnloadImage name list if elements are found at the known
808 * @returns null if nothing is there
810 public static String
[] getModuleUnloadImageArray() {
811 String
[] xPath
= new String
[] { "/Extern/ModuleUnloadImage" };
813 Object
[] returns
= get("Externs", xPath
);
814 if (returns
!= null && returns
.length
> 0) {
815 String
[] stringArray
= new String
[returns
.length
];
816 CNameType
[] doc
= (CNameType
[]) returns
;
818 for (int i
= 0; i
< returns
.length
; ++i
) {
819 stringArray
[i
] = doc
[i
].getStringValue();
831 * @returns Extern objects list if elements are found at the known xpath
832 * @returns null if nothing is there
834 public static ExternsDocument
.Externs
.Extern
[] getExternArray() {
835 String
[] xPath
= new String
[] { "/Extern" };
837 Object
[] returns
= get("Externs", xPath
);
838 if (returns
!= null && returns
.length
> 0) {
839 return (ExternsDocument
.Externs
.Extern
[]) returns
;
846 * Retrieve PpiNotify for specified arch
851 * @returns String[] if elements are found at the known xpath
852 * @returns String[0] if nothing is there
854 public static String
[] getPpiNotifyArray(String arch
) {
857 if (arch
== null || arch
.equals("")) {
858 return new String
[0];
860 xPath
= new String
[] { "/PpiNotify" };
863 Object
[] returns
= get("PPIs", xPath
);
864 if (returns
== null) {
865 return new String
[0];
869 List
<String
> ppiNotifyList
= new ArrayList
<String
>();
870 for (int i
= 0; i
< returns
.length
; i
++) {
871 @SuppressWarnings("unchecked")
872 List
<String
> archList
= ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getSupArchList();
873 if (archList
== null || archList
.contains(arch
)){
874 ppiNotifyList
.add(((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName());
878 String
[] ppiNotifyArray
= new String
[ppiNotifyList
.size()];
879 for (int i
= 0; i
< ppiNotifyList
.size(); i
++) {
880 ppiNotifyArray
[i
] = ppiNotifyList
.get(i
);
883 return ppiNotifyArray
;
887 * Retrieve PpiNotify for specified usage and arch
890 * PpiNotify arch usage PpiNotify usage
893 * @returns String[] if elements are found at the known xpath
894 * @returns String[0] if nothing is there
896 public static String
[] getPpiNotifyArray(String arch
, String usage
) {
902 if (arch
== null || arch
.equals("")) {
903 return new String
[0];
905 archXpath
= "/PpiNotify";
906 if (usage
!= null && !usage
.equals("")) {
907 usageXpath
= "/PpiNotify[@Usage='" + arch
+ "']";
908 xPath
= new String
[] { archXpath
, usageXpath
};
910 return getProtocolNotifyArray(arch
);
914 Object
[] returns
= get("PPIs", xPath
);
915 if (returns
== null) {
916 return new String
[0];
919 String
[] ppiNotifyList
= new String
[returns
.length
];
921 for (int i
= 0; i
< returns
.length
; i
++) {
922 ppiNotifyList
[i
] = ((PPIsDocument
.PPIs
.PpiNotify
) returns
[i
]).getPpiNotifyCName();
924 return ppiNotifyList
;
928 * Retrieve Ppi for specified arch
933 * @returns String[] if elements are found at the known xpath
934 * @returns String[0] if nothing is there
936 public static String
[] getPpiArray(String arch
) {
939 if (arch
== null || arch
.equals("")) {
940 return new String
[0];
942 xPath
= new String
[] { "/Ppi" };
945 Object
[] returns
= get("PPIs", xPath
);
946 if (returns
== null) {
947 return new String
[0];
950 List
<String
> ppiList
= new ArrayList
<String
>();
951 for (int i
= 0; i
< returns
.length
; i
++) {
952 @SuppressWarnings("unchecked")
953 List
<String
> archList
= ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getSupArchList();
954 if (archList
== null || archList
.contains(arch
)){
955 ppiList
.add(((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName());
959 String
[] ppiArray
= new String
[ppiList
.size()];
960 for (int i
= 0; i
< ppiList
.size(); i
++) {
961 ppiArray
[i
] = ppiList
.get(i
);
967 * Retrieve PpiNotify for specified usage and arch
970 * PpiNotify arch usage PpiNotify usage
973 * @returns String[] if elements are found at the known xpath
974 * @returns String[0] if nothing is there
976 public static String
[] getPpiArray(String arch
, String usage
) {
982 if (arch
== null || arch
.equals("")) {
983 return new String
[0];
986 if (usage
!= null && !usage
.equals("")) {
987 usageXpath
= "/Ppi[@Usage='" + arch
+ "']";
988 xPath
= new String
[] { archXpath
, usageXpath
};
990 return getProtocolNotifyArray(arch
);
994 Object
[] returns
= get("PPIs", xPath
);
995 if (returns
== null) {
996 return new String
[0];
999 String
[] ppiList
= new String
[returns
.length
];
1001 for (int i
= 0; i
< returns
.length
; i
++) {
1002 ppiList
[i
] = ((PPIsDocument
.PPIs
.Ppi
) returns
[i
]).getPpiCName();
1008 * Retrieve GuidEntry information for specified usage
1013 * @returns GuidEntry objects list if elements are found at the known xpath
1014 * @returns null if nothing is there
1016 public static String
[] getGuidEntryArray(String arch
) {
1019 if (arch
== null || arch
.equals("")) {
1020 xPath
= new String
[] { "/GuidCNames" };
1022 xPath
= new String
[] { "/GuidCNames" };
1025 Object
[] returns
= get("Guids", xPath
);
1026 if (returns
== null) {
1027 return new String
[0];
1030 List
<String
> guidList
= new ArrayList
<String
>();
1031 for (int i
= 0; i
< returns
.length
; i
++) {
1032 @SuppressWarnings("unchecked")
1033 List
<String
> archList
= ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getSupArchList();
1034 if (archList
== null || archList
.contains(arch
)){
1035 guidList
.add(((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName());
1039 String
[] guidArray
= new String
[guidList
.size()];
1040 for (int i
= 0; i
< guidList
.size(); i
++) {
1041 guidArray
[i
] = guidList
.get(i
);
1048 * Retrieve GuidEntry information for specified usage
1051 * GuidEntry arch usage GuidEntry usage
1053 * @returns GuidEntry objects list if elements are found at the known xpath
1054 * @returns null if nothing is there
1056 public static String
[] getGuidEntryArray(String arch
, String usage
) {
1061 if (arch
== null || arch
.equals("")) {
1062 return new String
[0];
1064 archXpath
= "/GuidEntry";
1065 if (usage
!= null && !usage
.equals("")) {
1066 usageXpath
= "/GuidEntry[@Usage='" + arch
+ "']";
1067 xPath
= new String
[] { archXpath
, usageXpath
};
1069 return getProtocolNotifyArray(arch
);
1073 Object
[] returns
= get("Guids", xPath
);
1074 if (returns
== null) {
1075 return new String
[0];
1078 String
[] guidList
= new String
[returns
.length
];
1080 for (int i
= 0; i
< returns
.length
; i
++) {
1081 guidList
[i
] = ((GuidsDocument
.Guids
.GuidCNames
) returns
[i
]).getGuidCName();
1087 * Retrieve Library instance information
1092 * Library instance usage
1094 * @returns library instance name list if elements are found at the known
1096 * @returns null if nothing is there
1098 public static ModuleIdentification
[] getLibraryInstance(String arch
) {
1100 String saGuid
= null;
1101 String saVersion
= null;
1102 String pkgGuid
= null;
1103 String pkgVersion
= null;
1105 if (arch
== null || arch
.equalsIgnoreCase("")) {
1106 xPath
= new String
[] { "/Instance" };
1109 // Since Schema don't have SupArchList now, so the follow Xpath is
1110 // equal to "/Instance" and [not(@SupArchList) or @SupArchList= arch]
1111 // don't have effect.
1113 xPath
= new String
[] { "/Instance[not(@SupArchList) or @SupArchList='"
1117 Object
[] returns
= get("Libraries", xPath
);
1118 if (returns
== null || returns
.length
== 0) {
1119 return new ModuleIdentification
[0];
1122 ModuleIdentification
[] saIdList
= new ModuleIdentification
[returns
.length
];
1123 for (int i
= 0; i
< returns
.length
; i
++) {
1124 LibrariesDocument
.Libraries
.Instance library
= (LibrariesDocument
.Libraries
.Instance
) returns
[i
];
1125 saGuid
= library
.getModuleGuid();
1126 saVersion
= library
.getModuleVersion();
1128 pkgGuid
= library
.getPackageGuid();
1129 pkgVersion
= library
.getPackageVersion();
1131 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1133 PackageIdentification pkgId
= new PackageIdentification(null,
1134 pkgGuid
, pkgVersion
);
1135 saId
.setPackage(pkgId
);
1144 // / This method is used for retrieving the elements information which has
1145 // / CName sub-element
1147 private static String
[] getCNames(String from
, String xPath
[]) {
1148 Object
[] returns
= get(from
, xPath
);
1149 if (returns
== null || returns
.length
== 0) {
1153 String
[] strings
= new String
[returns
.length
];
1154 for (int i
= 0; i
< returns
.length
; ++i
) {
1156 strings
[i
] = ((CNameType
) returns
[i
]).getStringValue();
1163 * Retrive library's constructor name
1165 * @returns constructor name list if elements are found at the known xpath
1166 * @returns null if nothing is there
1168 public static String
getLibConstructorName() {
1169 String
[] xPath
= new String
[] { "/Extern/Constructor" };
1171 Object
[] returns
= get("Externs", xPath
);
1172 if (returns
!= null && returns
.length
> 0) {
1173 CNameType constructor
= ((CNameType
) returns
[0]);
1174 return constructor
.getStringValue();
1181 * Retrive library's destructor name
1183 * @returns destructor name list if elements are found at the known xpath
1184 * @returns null if nothing is there
1186 public static String
getLibDestructorName() {
1187 String
[] xPath
= new String
[] { "/Extern/Destructor" };
1189 Object
[] returns
= get("Externs", xPath
);
1190 if (returns
!= null && returns
.length
> 0) {
1192 // Only support one Destructor function.
1194 CNameType destructor
= (CNameType
) returns
[0];
1195 return destructor
.getStringValue();
1202 * Retrive DriverBinding names
1204 * @returns DriverBinding name list if elements are found at the known xpath
1205 * @returns null if nothing is there
1207 public static String
[] getDriverBindingArray() {
1208 String
[] xPath
= new String
[] { "/Extern/DriverBinding" };
1209 return getCNames("Externs", xPath
);
1213 * Retrive ComponentName names
1215 * @returns ComponentName name list if elements are found at the known xpath
1216 * @returns null if nothing is there
1218 public static String
[] getComponentNameArray() {
1219 String
[] xPath
= new String
[] { "/Extern/ComponentName" };
1220 return getCNames("Externs", xPath
);
1224 * Retrive DriverConfig names
1226 * @returns DriverConfig name list if elements are found at the known xpath
1227 * @returns null if nothing is there
1229 public static String
[] getDriverConfigArray() {
1230 String
[] xPath
= new String
[] { "/Extern/DriverConfig" };
1231 return getCNames("Externs", xPath
);
1235 * Retrive DriverDiag names
1237 * @returns DriverDiag name list if elements are found at the known xpath
1238 * @returns null if nothing is there
1240 public static String
[] getDriverDiagArray() {
1241 String
[] xPath
= new String
[] { "/Extern/DriverDiag" };
1242 return getCNames("Externs", xPath
);
1246 * Retrive SetVirtualAddressMapCallBack names
1248 * @returns SetVirtualAddressMapCallBack name list if elements are found at
1250 * @returns null if nothing is there
1252 public static String
[] getSetVirtualAddressMapCallBackArray() {
1253 String
[] xPath
= new String
[] { "/Extern/SetVirtualAddressMapCallBack" };
1254 return getCNames("Externs", xPath
);
1258 * Retrive ExitBootServicesCallBack names
1260 * @returns ExitBootServicesCallBack name list if elements are found at the
1262 * @returns null if nothing is there
1264 public static String
[] getExitBootServicesCallBackArray() {
1265 String
[] xPath
= new String
[] { "/Extern/ExitBootServicesCallBack" };
1266 return getCNames("Externs", xPath
);
1270 * Retrieve module surface area file information
1272 * @returns ModuleSA objects list if elements are found at the known xpath
1273 * @returns Empty ModuleSA list if nothing is there
1275 public static Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> getFpdModules() {
1276 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1277 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1279 String fvBinding
= null;
1280 String saGuid
= null;
1281 String saVersion
= null;
1282 String pkgGuid
= null;
1283 String pkgVersion
= null;
1285 Map
<FpdModuleIdentification
, Map
<String
, XmlObject
>> fpdModuleMap
= new LinkedHashMap
<FpdModuleIdentification
, Map
<String
, XmlObject
>>();
1287 if (result
== null) {
1288 return fpdModuleMap
;
1291 for (int i
= 0; i
< result
.length
; i
++) {
1293 // Get Fpd SA Module element node and add to ObjectMap.
1295 Map
<String
, XmlObject
> ObjectMap
= new HashMap
<String
, XmlObject
>();
1296 ModuleSADocument
.ModuleSA moduleSA
= (ModuleSADocument
.ModuleSA
) result
[i
];
1297 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getLibraries() != null) {
1298 ObjectMap
.put("Libraries", moduleSA
.getLibraries());
1300 if (((ModuleSADocument
.ModuleSA
) result
[i
]).getPcdBuildDefinition() != null) {
1301 ObjectMap
.put("PcdBuildDefinition", moduleSA
1302 .getPcdBuildDefinition());
1304 if (((ModuleSADocument
.ModuleSA
) result
[i
])
1305 .getModuleSaBuildOptions() != null) {
1306 ObjectMap
.put("ModuleSaBuildOptions", moduleSA
1307 .getModuleSaBuildOptions());
1311 // Get Fpd SA Module attribute and create FpdMoudleIdentification.
1313 arch
= moduleSA
.getSupArchList().toString();
1317 saVersion
= ((ModuleSADocument
.ModuleSA
) result
[i
])
1318 .getModuleVersion();
1320 saGuid
= moduleSA
.getModuleGuid();
1321 pkgGuid
= moduleSA
.getPackageGuid();
1322 pkgVersion
= moduleSA
.getPackageVersion();
1325 // Create Module Identification which have class member of package
1328 PackageIdentification pkgId
= new PackageIdentification(null,
1329 pkgGuid
, pkgVersion
);
1330 ModuleIdentification saId
= new ModuleIdentification(null, saGuid
,
1333 saId
.setPackage(pkgId
);
1336 // Create FpdModule Identification which have class member of module
1340 String
[] archList
= arch
.split(" ");
1341 for (int j
= 0; j
< archList
.length
; j
++) {
1342 FpdModuleIdentification fpdSaId
= new FpdModuleIdentification(saId
, archList
[j
]);
1344 if (fvBinding
!= null) {
1345 fpdSaId
.setFvBinding(fvBinding
);
1349 // Put element to Map<FpdModuleIdentification, Map<String,
1352 fpdModuleMap
.put(fpdSaId
, ObjectMap
);
1356 return fpdModuleMap
;
1360 * Retrieve valid image names
1362 * @returns valid iamges name list if elements are found at the known xpath
1363 * @returns empty list if nothing is there
1365 public static String
[] getFpdValidImageNames() {
1366 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='ImageName']/FvImageNames" };
1368 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1369 if (queryResult
== null) {
1370 return new String
[0];
1373 String
[] result
= new String
[queryResult
.length
];
1374 for (int i
= 0; i
< queryResult
.length
; i
++) {
1375 result
[i
] = ((XmlString
) queryResult
[i
]).getStringValue();
1381 public static Node
getFpdUserExtension() {
1382 String
[] xPath
= new String
[] { "/UserExtensions" };
1384 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1385 if (queryResult
== null && queryResult
.length
== 0) {
1388 UserExtensionsDocument
.UserExtensions a
= (UserExtensionsDocument
.UserExtensions
)queryResult
[0];
1390 return a
.getDomNode();
1394 * Retrieve FV image option information
1399 * @returns option name/value list if elements are found at the known xpath
1400 * @returns empty list if nothing is there
1402 public static String
[][] getFpdOptions(String fvName
) {
1403 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Options' and ./FvImageNames='"
1404 + fvName
.toUpperCase() + "']/FvImageOptions" };
1405 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1406 if (queryResult
== null) {
1407 return new String
[0][];
1409 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1410 for (int i
= 0; i
< queryResult
.length
; i
++) {
1411 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1412 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
1413 .getNameValueList();
1414 Iterator iter
= namevalues
.iterator();
1415 while (iter
.hasNext()) {
1416 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1418 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1421 String
[][] result
= new String
[list
.size()][2];
1422 for (int i
= 0; i
< list
.size(); i
++) {
1423 result
[i
][0] = list
.get(i
)[0];
1424 result
[i
][1] = list
.get(i
)[1];
1430 public static XmlObject
getFpdBuildOptions() {
1431 String
[] xPath
= new String
[] { "/BuildOptions" };
1433 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1435 if (queryResult
== null || queryResult
.length
== 0) {
1438 return (XmlObject
)queryResult
[0];
1441 public static PlatformIdentification
getFpdHeader() {
1442 String
[] xPath
= new String
[] { "/PlatformHeader" };
1444 Object
[] returns
= get("PlatformSurfaceArea", xPath
);
1446 if (returns
== null || returns
.length
== 0) {
1449 PlatformHeaderDocument
.PlatformHeader header
= (PlatformHeaderDocument
.PlatformHeader
) returns
[0];
1451 String name
= header
.getPlatformName();
1453 String guid
= header
.getGuidValue();
1455 String version
= header
.getVersion();
1457 return new PlatformIdentification(name
, guid
, version
);
1461 * Retrieve FV image attributes information
1466 * @returns attribute name/value list if elements are found at the known
1468 * @returns empty list if nothing is there
1470 public static String
[][] getFpdAttributes(String fvName
) {
1471 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Attributes' and ./FvImageNames='"
1472 + fvName
.toUpperCase() + "']/FvImageOptions" };
1473 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1474 if (queryResult
== null) {
1475 return new String
[0][];
1477 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1478 for (int i
= 0; i
< queryResult
.length
; i
++) {
1480 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1481 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1482 Iterator iter
= namevalues
.iterator();
1483 while (iter
.hasNext()) {
1484 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1486 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1489 String
[][] result
= new String
[list
.size()][2];
1490 for (int i
= 0; i
< list
.size(); i
++) {
1491 result
[i
][0] = list
.get(i
)[0];
1492 result
[i
][1] = list
.get(i
)[1];
1498 * Retrieve flash definition file name
1500 * @returns file name if elements are found at the known xpath
1501 * @returns null if nothing is there
1503 public static String
getFlashDefinitionFile() {
1504 String
[] xPath
= new String
[] { "/PlatformDefinitions/FlashDeviceDefinitions/FlashDefinitionFile" };
1506 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1507 if (queryResult
== null || queryResult
.length
== 0) {
1511 FileNameConvention filename
= (FileNameConvention
) queryResult
[queryResult
.length
- 1];
1512 return filename
.getStringValue();
1515 public static String
[][] getFpdGlobalVariable() {
1516 String
[] xPath
= new String
[] { "/Flash/FvImages/NameValue" };
1517 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1518 if (queryResult
== null) {
1519 return new String
[0][];
1522 String
[][] result
= new String
[queryResult
.length
][2];
1524 for (int i
= 0; i
< queryResult
.length
; i
++) {
1525 FvImagesDocument
.FvImages
.NameValue item
= (FvImagesDocument
.FvImages
.NameValue
)queryResult
[i
];
1526 result
[i
][0] = item
.getName();
1527 result
[i
][1] = item
.getValue();
1533 * Retrieve FV image component options
1538 * @returns name/value pairs list if elements are found at the known xpath
1539 * @returns empty list if nothing is there
1541 public static String
[][] getFpdComponents(String fvName
) {
1542 String
[] xPath
= new String
[] { "/Flash/FvImages/FvImage[@Type='Components' and ./FvImageNames='"+ fvName
.toUpperCase() + "']/FvImageOptions" };
1543 Object
[] queryResult
= get("PlatformSurfaceArea", xPath
);
1544 if (queryResult
== null) {
1545 return new String
[0][];
1548 ArrayList
<String
[]> list
= new ArrayList
<String
[]>();
1549 for (int i
= 0; i
< queryResult
.length
; i
++) {
1550 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions item
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
) queryResult
[i
];
1551 List
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> namevalues
= item
.getNameValueList();
1552 Iterator iter
= namevalues
.iterator();
1553 while (iter
.hasNext()) {
1554 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nvItem
= (FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
) iter
1556 list
.add(new String
[] { nvItem
.getName(), nvItem
.getValue() });
1559 String
[][] result
= new String
[list
.size()][2];
1560 for (int i
= 0; i
< list
.size(); i
++) {
1561 result
[i
][0] = list
.get(i
)[0];
1562 result
[i
][1] = list
.get(i
)[1];
1568 * Retrieve PCD tokens
1570 * @returns CName/ItemType pairs list if elements are found at the known
1572 * @returns null if nothing is there
1574 public static String
[][] getPcdTokenArray() {
1575 String
[] xPath
= new String
[] { "/PcdData" };
1577 Object
[] returns
= get("PCDs", xPath
);
1578 if (returns
== null || returns
.length
== 0) {
1582 // PcdCoded.PcdData[] pcds = (PcdCoded.PcdData[]) returns;
1583 // String[][] result = new String[pcds.length][2];
1584 // for (int i = 0; i < returns.length; ++i) {
1585 // if (pcds[i].getItemType() != null) {
1586 // result[i][1] = pcds[i].getItemType().toString();
1588 // result[i][1] = null;
1590 // result[i][0] = pcds[i].getCName();
1597 * Get the PcdToken array from module's surface area document. The array
1598 * should contains following data:
1600 * -------------------------------------------------------------------
1603 * CName | ItemType | TokenspaceName | DefaultValue | Usage | HelpText
1606 * -------------------------------------------------------------------
1609 * Note: Until new schema applying, now we can only get CName, ItemType,
1612 * @return 2-array table contains all information of PCD token retrieved
1615 public static Object
[][] etModulePCDTokenArray() {
1618 // Object[][] result;
1619 // PCDs.PcdData[] pcds;
1620 // String[] xPath = new String[] { "/PcdData" };
1621 // Object[] returns = get("PCDs", xPath);
1623 // if ((returns == null) || (returns.length == 0)) {
1627 // pcds = (PCDs.PcdData[]) returns;
1628 // result = new Object[pcds.length][6];
1629 // for (index = 0; index < pcds.length; index++) {
1633 // result[index][0] = pcds[index].getCName();
1635 // // Get ItemType: FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODLE,
1636 // // DYNAMIC, DYNAMIC_EX
1638 // if (pcds[index].getItemType() != null) {
1639 // result[index][1] = pcds[index].getItemType().toString();
1641 // result[index][1] = null;
1645 // // BUGBUG: following field can *not* be got from current MSA until
1646 // // schema changed.
1648 // // result [index][2] = pcds[index].getTokenSpaceName();
1649 // result[index][2] = null;
1650 // result[index][3] = pcds[index].getDefaultValue();
1651 // // result [index][4] = pcds[index].getUsage ();
1652 // result[index][4] = null;
1653 // // result [index][5] = pcds[index].getHelpText ();
1654 // result[index][5] = null;
1660 * Retrieve MAS header
1665 public static ModuleIdentification
getMsaHeader() {
1666 String
[] xPath
= new String
[] { "/" };
1667 Object
[] returns
= get("MsaHeader", xPath
);
1669 if (returns
== null || returns
.length
== 0) {
1673 MsaHeader msaHeader
= (MsaHeader
) returns
[0];
1675 // Get BaseName, ModuleType, GuidValue, Version
1676 // which in MsaHeader.
1678 String name
= msaHeader
.getModuleName();
1679 String moduleType
= msaHeader
.getModuleType().toString();
1680 String guid
= msaHeader
.getGuidValue();
1681 String version
= msaHeader
.getVersion();
1683 ModuleIdentification moduleId
= new ModuleIdentification(name
, guid
,
1686 moduleId
.setModuleType(moduleType
);
1692 * Retrieve Extern Specification
1696 * @return String[] If have specification element in the <extern> String[0]
1697 * If no specification element in the <extern>
1701 public static String
[] getExternSpecificaiton() {
1702 String
[] xPath
= new String
[] { "/Specification" };
1704 Object
[] queryResult
= get("Externs", xPath
);
1705 if (queryResult
== null) {
1706 return new String
[0];
1709 String
[] specificationList
= new String
[queryResult
.length
];
1710 for (int i
= 0; i
< queryResult
.length
; i
++) {
1711 specificationList
[i
] = ((Sentence
)queryResult
[i
])
1714 return specificationList
;
1718 * Retreive MsaFile which in SPD
1721 * @return String[][3] The string sequence is ModuleName, ModuleGuid,
1722 * ModuleVersion, MsaFile String[0][] If no msafile in SPD
1724 public static String
[] getSpdMsaFile() {
1725 String
[] xPath
= new String
[] { "/MsaFiles" };
1727 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1728 if (returns
== null) {
1729 return new String
[0];
1732 List
<String
> filenameList
= ((MsaFilesDocument
.MsaFiles
) returns
[0])
1734 return filenameList
.toArray(new String
[filenameList
.size()]);
1740 public static Map
<String
, String
[]> getSpdLibraryClasses() {
1741 String
[] xPath
= new String
[] { "/LibraryClassDeclarations/LibraryClass" };
1743 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1746 // Create Map, Key - LibraryClass, String[] - LibraryClass Header file.
1748 Map
<String
, String
[]> libClassHeaderMap
= new HashMap
<String
, String
[]>();
1750 if (returns
== null) {
1751 return libClassHeaderMap
;
1754 for (int i
= 0; i
< returns
.length
; i
++) {
1755 LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass library
= (LibraryClassDeclarationsDocument
.LibraryClassDeclarations
.LibraryClass
) returns
[i
];
1756 libClassHeaderMap
.put(library
.getName(), new String
[] { library
1757 .getIncludeHeader() });
1759 return libClassHeaderMap
;
1765 public static Map
<String
, String
> getSpdPackageHeaderFiles() {
1766 String
[] xPath
= new String
[] { "/PackageHeaders/IncludePkgHeader" };
1768 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1771 // Create Map, Key - ModuleType, String - PackageInclude Header file.
1773 Map
<String
, String
> packageIncludeMap
= new HashMap
<String
, String
>();
1775 if (returns
== null) {
1776 return packageIncludeMap
;
1778 // GlobalData.log.info("" + returns[0].getClass().getName());
1779 for (int i
= 0; i
< returns
.length
; i
++) {
1780 PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader includeHeader
= (PackageHeadersDocument
.PackageHeaders
.IncludePkgHeader
) returns
[i
];
1781 packageIncludeMap
.put(includeHeader
.getModuleType().toString(),
1782 includeHeader
.getStringValue());
1784 return packageIncludeMap
;
1787 public static PackageIdentification
getSpdHeader() {
1788 String
[] xPath
= new String
[] { "/SpdHeader" };
1790 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1792 if (returns
== null || returns
.length
== 0) {
1796 SpdHeaderDocument
.SpdHeader header
= (SpdHeaderDocument
.SpdHeader
) returns
[0];
1798 String name
= header
.getPackageName();
1800 String guid
= header
.getGuidValue();
1802 String version
= header
.getVersion();
1804 return new PackageIdentification(name
, guid
, version
);
1810 public static Map
<String
, String
[]> getSpdGuid() {
1811 String
[] xPath
= new String
[] { "/GuidDeclarations/Entry" };
1813 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1816 // Create Map, Key - GuidName, String[] - C_NAME & GUID value.
1818 Map
<String
, String
[]> guidDeclMap
= new HashMap
<String
, String
[]>();
1819 if (returns
== null) {
1823 for (int i
= 0; i
< returns
.length
; i
++) {
1824 GuidDeclarationsDocument
.GuidDeclarations
.Entry entry
= (GuidDeclarationsDocument
.GuidDeclarations
.Entry
) returns
[i
];
1825 String
[] guidPair
= new String
[2];
1826 guidPair
[0] = entry
.getCName();
1827 guidPair
[1] = entry
.getGuidValue();
1828 guidDeclMap
.put(entry
.getName(), guidPair
);
1829 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1830 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[0]);
1831 EdkLog
.log(EdkLog
.EDK_VERBOSE
, guidPair
[1]);
1839 public static Map
<String
, String
[]> getSpdProtocol() {
1840 String
[] xPath
= new String
[] { "/ProtocolDeclarations/Entry" };
1842 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1845 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1847 Map
<String
, String
[]> protoclMap
= new HashMap
<String
, String
[]>();
1849 if (returns
== null) {
1853 for (int i
= 0; i
< returns
.length
; i
++) {
1854 ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry entry
= (ProtocolDeclarationsDocument
.ProtocolDeclarations
.Entry
) returns
[i
];
1855 String
[] protocolPair
= new String
[2];
1857 protocolPair
[0] = entry
.getCName();
1858 protocolPair
[1] = entry
.getGuidValue();
1859 protoclMap
.put(entry
.getName(), protocolPair
);
1860 EdkLog
.log(EdkLog
.EDK_VERBOSE
, entry
.getName());
1861 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[0]);
1862 EdkLog
.log(EdkLog
.EDK_VERBOSE
, protocolPair
[1]);
1868 * getSpdPpi() Retrieve the SPD PPI Entry
1871 * @return Map<String, String[2]> if get the PPI entry from SPD. Key - PPI
1872 * Name String[0] - PPI CNAME String[1] - PPI Guid Null if no PPI
1875 public static Map
<String
, String
[]> getSpdPpi() {
1876 String
[] xPath
= new String
[] { "/PpiDeclarations/Entry" };
1878 Object
[] returns
= get("PackageSurfaceArea", xPath
);
1881 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1883 Map
<String
, String
[]> ppiMap
= new HashMap
<String
, String
[]>();
1885 if (returns
== null) {
1889 for (int i
= 0; i
< returns
.length
; i
++) {
1890 PpiDeclarationsDocument
.PpiDeclarations
.Entry entry
= (PpiDeclarationsDocument
.PpiDeclarations
.Entry
) returns
[i
];
1891 String
[] ppiPair
= new String
[2];
1892 ppiPair
[0] = entry
.getCName();
1893 ppiPair
[1] = entry
.getGuidValue();
1894 ppiMap
.put(entry
.getName(), ppiPair
);
1900 * getToolChainFamily
1902 * This function is to retrieve ToolChainFamily attribute of FPD
1906 * @return toolChainFamily If find toolChainFamily attribute in
1907 * <BuildOptions> Null If don't have toolChainFamily in
1910 public String
getToolChainFamily() {
1911 String toolChainFamily
;
1912 String
[] xPath
= new String
[] { "/BuildOptions" };
1914 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1915 if (result
== null) {
1918 // toolChainFamily =
1919 // ((BuildOptionsDocument.BuildOptions)result[0]).getToolChainFamilies();
1920 // return toolChainFamily;
1925 * Retrieve module Guid string
1927 * @returns GUILD string if elements are found at the known xpath
1928 * @returns null if nothing is there
1930 public static String
getModuleGuid() {
1931 String
[] xPath
= new String
[] { "" };
1933 Object
[] returns
= get("MsaHeader", xPath
);
1934 if (returns
!= null && returns
.length
> 0) {
1935 String guid
= ((MsaHeaderDocument
.MsaHeader
) returns
[0])
1946 public static ModuleSADocument
.ModuleSA
[] getFpdModuleSAs() {
1947 String
[] xPath
= new String
[] { "/FrameworkModules/ModuleSA" };
1948 Object
[] result
= get("PlatformSurfaceArea", xPath
);
1949 if (result
!= null) {
1950 return (ModuleSADocument
.ModuleSA
[]) result
;
1952 return new ModuleSADocument
.ModuleSA
[0];
1956 Get name array of PCD in a module. In one module, token space
1957 is same, and token name should not be conflicted.
1961 public static String
[] getModulePcdEntryNameArray() {
1962 PcdCodedDocument
.PcdCoded
.PcdEntry
[] pcdEntries
= null;
1965 String
[] xPath
= new String
[] {"/PcdEntry"};
1966 Object
[] returns
= get ("PcdCoded", xPath
);
1968 if (returns
== null) {
1969 return new String
[0];
1972 pcdEntries
= (PcdCodedDocument
.PcdCoded
.PcdEntry
[])returns
;
1973 results
= new String
[pcdEntries
.length
];
1975 for (index
= 0; index
< pcdEntries
.length
; index
++) {
1976 results
[index
] = pcdEntries
[index
].getCName();