]> git.proxmox.com Git - mirror_edk2.git/blob - Tools/Source/GenBuild/org/tianocore/build/global/SurfaceAreaQuery.java
235c604eb3c391ab68495842378ed767341e7f4c
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / global / SurfaceAreaQuery.java
1 /** @file
2 This file is for surface area information retrieval.
3
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
9
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.
12
13 **/
14 package org.tianocore.build.global;
15
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;
21 import java.util.Map;
22 import java.util.Stack;
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25
26 import org.apache.xmlbeans.XmlObject;
27 import org.apache.xmlbeans.XmlString;
28 import org.tianocore.BuildOptionsDocument;
29 import org.tianocore.CNameType;
30 import org.tianocore.ExternsDocument;
31 import org.tianocore.FileNameConvention;
32 import org.tianocore.FvImagesDocument;
33 import org.tianocore.GuidDeclarationsDocument;
34 import org.tianocore.GuidsDocument;
35 import org.tianocore.LibrariesDocument;
36 import org.tianocore.LibraryClassDeclarationsDocument;
37 import org.tianocore.LibraryClassDocument;
38 import org.tianocore.ModuleDefinitionsDocument;
39 import org.tianocore.ModuleSADocument;
40 import org.tianocore.ModuleSaBuildOptionsDocument;
41 import org.tianocore.ModuleTypeDef;
42 import org.tianocore.MsaFilesDocument;
43 import org.tianocore.MsaHeaderDocument;
44 import org.tianocore.OptionDocument;
45 import org.tianocore.PPIsDocument;
46 import org.tianocore.PackageDependenciesDocument;
47 import org.tianocore.PackageHeadersDocument;
48 import org.tianocore.PcdCodedDocument;
49 import org.tianocore.PlatformDefinitionsDocument;
50 import org.tianocore.PlatformHeaderDocument;
51 import org.tianocore.PpiDeclarationsDocument;
52 import org.tianocore.ProtocolDeclarationsDocument;
53 import org.tianocore.Sentence;
54 import org.tianocore.SpdHeaderDocument;
55 import org.tianocore.UserExtensionsDocument;
56 import org.tianocore.FilenameDocument.Filename;
57 import org.tianocore.MsaHeaderDocument.MsaHeader;
58 import org.tianocore.ProtocolsDocument.Protocols.Protocol;
59 import org.tianocore.ProtocolsDocument.Protocols.ProtocolNotify;
60 import org.tianocore.build.id.FpdModuleIdentification;
61 import org.tianocore.build.id.ModuleIdentification;
62 import org.tianocore.build.id.PackageIdentification;
63 import org.tianocore.build.id.PlatformIdentification;
64 import org.tianocore.build.toolchain.ToolChainInfo;
65 import org.tianocore.logger.EdkLog;
66 import org.w3c.dom.Node;
67
68 /**
69 * SurfaceAreaQuery class is used to query Surface Area information from msa,
70 * mbd, spd and fpd files.
71 *
72 * This class should not instantiated. All the public interfaces is static.
73 *
74 * @since GenBuild 1.0
75 */
76 public class SurfaceAreaQuery {
77
78 public static String prefix = "http://www.TianoCore.org/2006/Edk2.0";
79
80 // /
81 // / Contains name/value pairs of Surface Area document object. The name is
82 // / always the top level element name.
83 // /
84 private static Map<String, XmlObject> map = null;
85
86 // /
87 // / mapStack is used to do nested query
88 // /
89 private static Stack<Map<String, XmlObject>> mapStack = new Stack<Map<String, XmlObject>>();
90
91 // /
92 // / prefix of name space
93 // /
94 private static String nsPrefix = "sans";
95
96 // /
97 // / xmlbeans needs a name space for each Xpath element
98 // /
99 private static String ns = null;
100
101 // /
102 // / keep the namep declaration for xmlbeans Xpath query
103 // /
104 private static String queryDeclaration = null;
105
106 /**
107 * Set a Surface Area document for query later
108 *
109 * @param map
110 * A Surface Area document in TopLevelElementName/XmlObject
111 * format.
112 */
113 public static void setDoc(Map<String, XmlObject> map) {
114 ns = prefix;
115 queryDeclaration = "declare namespace " + nsPrefix + "='" + ns + "'; ";
116 SurfaceAreaQuery.map = map;
117 }
118
119 /**
120 * Push current used Surface Area document into query stack. The given new
121 * document will be used for any immediately followed getXXX() callings,
122 * untill pop() is called.
123 *
124 * @param newMap
125 * The TopLevelElementName/XmlObject format of a Surface Area
126 * document.
127 */
128 public static void push(Map<String, XmlObject> newMap) {
129 mapStack.push(SurfaceAreaQuery.map);
130 SurfaceAreaQuery.map = newMap;
131 }
132
133 /**
134 * Discard current used Surface Area document and use the top document in
135 * stack instead.
136 */
137 public static void pop() {
138 SurfaceAreaQuery.map = mapStack.pop();
139 }
140
141 // /
142 // / Convert xPath to be namespace qualified, which is necessary for
143 // XmlBeans
144 // / selectPath(). For example, converting /MsaHeader/ModuleType to
145 // / /ns:MsaHeader/ns:ModuleType
146 // /
147 private static String normalizeQueryString(String[] exp, String from) {
148 StringBuffer normQueryString = new StringBuffer(4096);
149
150 int i = 0;
151 while (i < exp.length) {
152 String newExp = from + exp[i];
153 Pattern pattern = Pattern.compile("([^/]*)(/|//)([^/]+)");
154 Matcher matcher = pattern.matcher(newExp);
155
156 while (matcher.find()) {
157 String starter = newExp.substring(matcher.start(1), matcher
158 .end(1));
159 String seperator = newExp.substring(matcher.start(2), matcher
160 .end(2));
161 String token = newExp.substring(matcher.start(3), matcher
162 .end(3));
163
164 normQueryString.append(starter);
165 normQueryString.append(seperator);
166 normQueryString.append(nsPrefix);
167 normQueryString.append(":");
168 normQueryString.append(token);
169 }
170
171 ++i;
172 if (i < exp.length) {
173 normQueryString.append(" | ");
174 }
175 }
176
177 return normQueryString.toString();
178 }
179
180 /**
181 * Search all XML documents stored in "map" for the specified xPath, using
182 * relative path (starting with '$this')
183 *
184 * @param xPath
185 * xpath query string array
186 * @returns An array of XmlObject if elements are found at the specified
187 * xpath
188 * @returns NULL if nothing is at the specified xpath
189 */
190 public static Object[] get(String[] xPath) {
191 if (map == null) {
192 return null;
193 }
194
195 String[] keys = (String[]) map.keySet().toArray(new String[map.size()]);
196 List<Object> result = new ArrayList<Object>();
197 for (int i = 0; i < keys.length; ++i) {
198 XmlObject rootNode = (XmlObject) map.get(keys[i]);
199 if (rootNode == null) {
200 continue;
201 }
202
203 String query = queryDeclaration
204 + normalizeQueryString(xPath, "$this/" + keys[i]);
205 XmlObject[] tmp = rootNode.selectPath(query);
206 for (int j = 0; j < tmp.length; ++j) {
207 result.add((Object)tmp[j]);
208 }
209 }
210
211 int size = result.size();
212 if (size <= 0) {
213 return null;
214 }
215
216 return (Object[]) result.toArray(new Object[size]);
217 }
218
219 /**
220 * Search XML documents named by "rootName" for the given xPath, using
221 * relative path (starting with '$this')
222 *
223 * @param rootName
224 * The top level element name
225 * @param xPath
226 * The xpath query string array
227 * @returns An array of XmlObject if elements are found at the given xpath
228 * @returns NULL if nothing is found at the given xpath
229 */
230 public static Object[] get(String rootName, String[] xPath) {
231 if (map == null) {
232 return null;
233 }
234
235 XmlObject root = (XmlObject) map.get(rootName);
236 if (root == null) {
237 return null;
238 }
239
240 String query = queryDeclaration
241 + normalizeQueryString(xPath, "$this/" + rootName);
242 XmlObject[] result = root.selectPath(query);
243 if (result.length > 0) {
244 return (Object[])result;
245 }
246
247 query = queryDeclaration + normalizeQueryString(xPath, "/" + rootName);
248 result = root.selectPath(query);
249 if (result.length > 0) {
250 return (Object[])result;
251 }
252
253 return null;
254 }
255
256 /**
257 * Retrieve SourceFiles/Filename for specified ARCH type
258 *
259 * @param arch
260 * architecture name
261 * @returns An 2 dimension string array if elements are found at the known
262 * xpath
263 * @returns NULL if nothing is found at the known xpath
264 */
265 public static String[][] getSourceFiles(String arch) {
266 String[] xPath;
267 Object[] returns;
268
269 xPath = new String[] { "/Filename" };
270
271 returns = get("SourceFiles", xPath);
272
273 if (returns == null || returns.length == 0) {
274 return new String[0][0];
275 }
276
277 Filename[] sourceFileNames = (Filename[]) returns;
278 List<String[]> outputList = new ArrayList<String[]>();
279 for (int i = 0; i < sourceFileNames.length; i++) {
280 List archList = sourceFileNames[i].getSupArchList();
281 if (arch == null || arch.equalsIgnoreCase("") || archList == null || contains(archList, arch)) {
282 outputList.add(new String[] {sourceFileNames[i].getToolCode(),sourceFileNames[i].getStringValue()});
283 }
284 }
285
286 String[][] outputString = new String[outputList.size()][2];
287 for (int index = 0; index < outputList.size(); index++) {
288 outputString[index][0] = outputList.get(index)[0];
289 outputString[index][1] = outputList.get(index)[1];
290 }
291 return outputString;
292 }
293
294 /**
295 * Retrieve /PlatformDefinitions/OutputDirectory from FPD
296 *
297 * @returns Directory names array if elements are found at the known xpath
298 * @returns Empty if nothing is found at the known xpath
299 */
300 public static String getFpdOutputDirectory() {
301 String[] xPath = new String[] { "/PlatformDefinitions" };
302
303 Object[] returns = get("PlatformSurfaceArea", xPath);
304 if (returns == null || returns.length == 0) {
305 return null;
306 }
307 PlatformDefinitionsDocument.PlatformDefinitions item = (PlatformDefinitionsDocument.PlatformDefinitions)returns[0];
308 return item.getOutputDirectory();
309 }
310
311 public static String getFpdIntermediateDirectories() {
312 String[] xPath = new String[] { "/PlatformDefinitions" };
313
314 Object[] returns = get("PlatformSurfaceArea", xPath);
315 if (returns == null || returns.length == 0) {
316 return "UNIFIED";
317 }
318 PlatformDefinitionsDocument.PlatformDefinitions item = (PlatformDefinitionsDocument.PlatformDefinitions)returns[0];
319 if(item.getIntermediateDirectories() == null) {
320 return null;
321 }
322 else {
323 return item.getIntermediateDirectories().toString();
324 }
325 }
326
327 public static String getModuleFfsKeyword() {
328 String[] xPath = new String[] { "/" };
329
330 Object[] returns = get("ModuleSaBuildOptions", xPath);
331 if (returns == null || returns.length == 0) {
332 return null;
333 }
334 ModuleSaBuildOptionsDocument.ModuleSaBuildOptions item = (ModuleSaBuildOptionsDocument.ModuleSaBuildOptions)returns[0];
335 return item.getFfsFormatKey();
336 }
337
338 public static String getModuleFvBindingKeyword() {
339 String[] xPath = new String[] { "/" };
340
341 Object[] returns = get("ModuleSaBuildOptions", xPath);
342 if (returns == null || returns.length == 0) {
343 return null;
344 }
345 ModuleSaBuildOptionsDocument.ModuleSaBuildOptions item = (ModuleSaBuildOptionsDocument.ModuleSaBuildOptions)returns[0];
346 return item.getFvBinding();
347 }
348
349 public static List getModuleSupportedArchs() {
350 String[] xPath = new String[] { "/" };
351
352 Object[] returns = get("ModuleDefinitions", xPath);
353 if (returns == null || returns.length == 0) {
354 return null;
355 }
356 ModuleDefinitionsDocument.ModuleDefinitions item = (ModuleDefinitionsDocument.ModuleDefinitions)returns[0];
357 return item.getSupportedArchitectures();
358 }
359
360 public static BuildOptionsDocument.BuildOptions.Ffs[] getFpdFfs() {
361 String[] xPath = new String[] {"/Ffs"};
362
363 Object[] returns = get("BuildOptions", xPath);
364 if (returns == null || returns.length == 0) {
365 return new BuildOptionsDocument.BuildOptions.Ffs[0];
366 }
367 return (BuildOptionsDocument.BuildOptions.Ffs[])returns;
368 }
369
370 public static String getModuleOutputFileBasename() {
371 String[] xPath = new String[] { "/" };
372
373 Object[] returns = get("ModuleDefinitions", xPath);
374 if (returns == null || returns.length == 0) {
375 return null;
376 }
377 ModuleDefinitionsDocument.ModuleDefinitions item = (ModuleDefinitionsDocument.ModuleDefinitions)returns[0];
378 return item.getOutputFileBasename();
379 }
380
381 /**
382 * Retrieve BuildOptions/Option or Arch/Option
383 *
384 * @param toolChainFamilyFlag
385 * if true, retrieve options for toolchain family; otherwise for
386 * toolchain
387 *
388 * @returns String[][5] name, target, toolchain, arch, coommand of options
389 * if elements are found at the known xpath. String[0][] if dont
390 * find element.
391 *
392 * @returns Empty array if nothing is there
393 */
394 public static String[][] getOptions(String from, String[] xPath, boolean toolChainFamilyFlag) {
395 String target = null;
396 String toolchain = null;
397 String toolchainFamily = null;
398 List<String> archList = null;
399 String cmd = null;
400 String targetName = null;
401 String optionName = null;
402
403 Object[] returns = get(from, xPath);
404 if (returns == null) {
405 return new String[0][5];
406 }
407
408 List<String[]> optionList = new ArrayList<String[]>();
409 OptionDocument.Option option;
410
411 for (int i = 0; i < returns.length; i++) {
412 option = (OptionDocument.Option) returns[i];
413
414 //
415 // Get Target, ToolChain(Family), Arch, Cmd, and Option from Option,
416 // then
417 // put to result[][5] array in above order.
418 //
419 String[] targetList;
420 if (option.getBuildTargets() == null) {
421 target = null;
422 }
423 else {
424 target = option.getBuildTargets().toString();
425 }
426 if (target != null) {
427 targetList = target.split(" ");
428 } else {
429 targetList = new String[1];
430 targetList[0] = null;
431 }
432
433 if (toolChainFamilyFlag) {
434 toolchainFamily = option.getToolChainFamily();
435 if (toolchainFamily != null) {
436 toolchain = toolchainFamily.toString();
437 } else {
438 toolchain = null;
439 }
440 } else {
441 toolchain = option.getTagName();
442 }
443
444 archList = new ArrayList<String>();
445 List archEnumList = option.getSupArchList();
446 if (archEnumList == null) {
447 archList.add(null);
448 } else {
449 //archList.addAll(archEnumList);
450 Iterator it = archEnumList.iterator();
451 while (it.hasNext()) {
452 String archType = (String)it.next();
453 archList.add(archType);
454 }
455 }
456
457 cmd = option.getToolCode();
458
459 optionName = option.getStringValue();
460 for (int t = 0; t < targetList.length; t++) {
461 for (int j = 0; j < archList.size(); j++) {
462 optionList.add(new String[] { targetList[t],
463 toolchain, archList.get(j), cmd, optionName});
464 }
465 }
466 }
467
468 String[][] result = new String[optionList.size()][5];
469 for (int i = 0; i < optionList.size(); i++) {
470 result[i][0] = optionList.get(i)[0];
471 result[i][1] = optionList.get(i)[1];
472 result[i][2] = optionList.get(i)[2];
473 result[i][3] = optionList.get(i)[3];
474 result[i][4] = optionList.get(i)[4];
475 }
476 return result;
477 }
478
479 public static String[][] getModuleBuildOptions(boolean toolChainFamilyFlag) {
480 String[] xPath;
481
482 if (toolChainFamilyFlag == true) {
483 xPath = new String[] {
484 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
485 "/Options/Option[@ToolChainFamily]", };
486 } else {
487 xPath = new String[] {
488 "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
489 "/Options/Option[@TagName]", };
490 }
491 return getOptions("ModuleSaBuildOptions", xPath, toolChainFamilyFlag);
492 }
493
494 public static String[][] getPlatformBuildOptions(boolean toolChainFamilyFlag) {
495 String[] xPath;
496
497 if (toolChainFamilyFlag == true) {
498 xPath = new String[] {
499 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
500 "/BuildOptions/Options/Option[@ToolChainFamily]", };
501 } else {
502 xPath = new String[] {
503 "/BuildOptions/Options/Option[not(@ToolChainFamily) and not(@TagName)]",
504 "/BuildOptions/Options/Option[@TagName]", };
505 }
506
507 return getOptions("PlatformSurfaceArea", xPath, toolChainFamilyFlag);
508 }
509
510 public static ToolChainInfo getFpdToolChainInfo() {
511 String[] xPath = new String[] { "/PlatformDefinitions" };
512
513 Object[] returns = get("PlatformSurfaceArea", xPath);
514 if (returns == null || returns.length == 0) {
515 return null;
516 }
517
518 PlatformDefinitionsDocument.PlatformDefinitions item = (PlatformDefinitionsDocument.PlatformDefinitions)returns[0];
519 ToolChainInfo toolChainInfo = new ToolChainInfo();
520 toolChainInfo.addTargets(item.getBuildTargets().toString());
521 toolChainInfo.addArchs(item.getSupportedArchitectures().toString());
522 toolChainInfo.addTagnames((String)null);
523 return toolChainInfo;
524 }
525
526 /**
527 * Retrieve <xxxHeader>/ModuleType
528 *
529 * @returns The module type name if elements are found at the known xpath
530 * @returns null if nothing is there
531 */
532 public static String getModuleType() {
533 String[] xPath = new String[] { "/ModuleType" };
534
535 Object[] returns = get(xPath);
536 if (returns != null && returns.length > 0) {
537 ModuleTypeDef type = (ModuleTypeDef) returns[0];
538 return type.enumValue().toString();
539 }
540
541 return null;
542 }
543
544 /**
545 * Retrieve PackageDependencies/Package
546 *
547 * @param arch
548 * Architecture name
549 *
550 * @returns package name list if elements are found at the known xpath
551 * @returns null if nothing is there
552 */
553 public static PackageIdentification[] getDependencePkg(String arch) {
554 String[] xPath;
555 String packageGuid = null;
556 String packageVersion = null;
557
558
559 xPath = new String[] { "/Package" };
560
561 Object[] returns = get("PackageDependencies", xPath);
562 if (returns == null) {
563 return new PackageIdentification[0];
564 }
565
566 //
567 // Get packageIdentification
568 //
569 List<PackageIdentification> packageIdList = new ArrayList<PackageIdentification>();
570 for (int i = 0; i < returns.length; i++) {
571 PackageDependenciesDocument.PackageDependencies.Package item = (PackageDependenciesDocument.PackageDependencies.Package) returns[i];
572 List archList = item.getSupArchList();
573 if (arch == null || archList == null || contains(archList, arch)) {
574 packageGuid = item.getPackageGuid();
575 packageVersion = item.getPackageVersion();
576 packageIdList.add(new PackageIdentification(null, packageGuid,
577 packageVersion));
578 }
579 }
580
581 //
582 // transfer packageIdentification list to array.
583 //
584 PackageIdentification[] packageIdArray = new PackageIdentification[packageIdList.size()];
585 for (int i = 0; i < packageIdList.size(); i++) {
586 packageIdArray[i] = new PackageIdentification(null, packageIdList.get(i).getGuid(),packageIdList.get(i).getVersion());
587 }
588 return packageIdArray;
589 }
590
591 /**
592 * Retrieve LibraryClassDefinitions/LibraryClass for specified usage
593 *
594 * @param usage
595 * Library class usage
596 *
597 * @returns LibraryClass objects list if elements are found at the known
598 * xpath
599 * @returns null if nothing is there
600 */
601 public static String[] getLibraryClasses(String usage) {
602 String[] xPath;
603
604 if (usage == null || usage.equals("")) {
605 xPath = new String[] { "/LibraryClass" };
606 } else {
607 xPath = new String[] { "/LibraryClass[@Usage='" + usage + "']" };
608 }
609
610 Object[] returns = get("LibraryClassDefinitions", xPath);
611 if (returns == null || returns.length == 0) {
612 return new String[0];
613 }
614
615 LibraryClassDocument.LibraryClass[] libraryClassList = (LibraryClassDocument.LibraryClass[]) returns;
616 String[] libraryClassName = new String[libraryClassList.length];
617 for (int i = 0; i < libraryClassList.length; i++) {
618 libraryClassName[i] = libraryClassList[i].getKeyword();
619 }
620 return libraryClassName;
621 }
622
623 /**
624 * Retrieve ModuleEntryPoint names
625 *
626 * @returns ModuleEntryPoint name list if elements are found at the known
627 * xpath
628 * @returns null if nothing is there
629 */
630 public static String[] getModuleEntryPointArray() {
631 String[] xPath = new String[] { "/Extern/ModuleEntryPoint" };
632
633 Object[] returns = get("Externs", xPath);
634
635 if (returns != null && returns.length > 0) {
636 String[] entryPoints = new String[returns.length];
637
638 for (int i = 0; i < returns.length; ++i) {
639 entryPoints[i] = ((CNameType) returns[i]).getStringValue();
640 }
641
642 return entryPoints;
643 }
644
645 return null;
646 }
647
648 /**
649 * retrieve Protocol for specified usage
650 *
651 * @param usage
652 * Protocol usage arch Architecture
653 *
654 * @returns Protocol String list if elements are found at the known xpath
655 * @returns String[0] if nothing is there
656 */
657 public static String[] getProtocolArray(String arch, String usage) {
658 String[] xPath;
659 String usageXpath = "";
660 String archXpath = "";
661
662 if (arch == null || arch.equals("")) {
663 return new String[0];
664 } else {
665 archXpath = "/Protocol";
666 if (usage != null && !usage.equals("")) {
667 usageXpath = "/Protocol[@Usage='" + usage + "']";
668 xPath = new String[] { usageXpath, archXpath };
669 } else {
670 return getProtocolArray(arch);
671 }
672
673 }
674
675 Object[] returns = get("Protocols", xPath);
676 if (returns == null) {
677 return new String[0];
678 }
679 Protocol[] protocolList = (Protocol[]) returns;
680
681 String[] protocolArray = new String[returns.length];
682 for (int i = 0; i < returns.length; i++) {
683 protocolArray[i] = protocolList[i].getProtocolCName();
684 }
685 return protocolArray;
686 }
687
688 /**
689 * retrieve Protocol for specified usage
690 *
691 * @param arch
692 * Architecture
693 *
694 * @returns Protocol String list if elements are found at the known xpath
695 * @returns String[0] if nothing is there
696 */
697 public static String[] getProtocolArray(String arch) {
698 String[] xPath;
699
700 if (arch == null || arch.equals("")) {
701 return new String[0];
702 } else {
703 xPath = new String[] { "/Protocol" };
704 }
705
706 Object[] returns = get("Protocols", xPath);
707 if (returns == null) {
708 return new String[0];
709 }
710 Protocol[] returnlList = (Protocol[]) returns;
711
712 List<String> protocolList = new ArrayList<String>();
713
714 for (int i = 0; i < returns.length; i++) {
715 List archList = returnlList[i].getSupArchList();
716 if (archList == null || contains(archList, arch)){
717 protocolList.add(returnlList[i].getProtocolCName());
718 }
719 }
720 String[] protocolArray = new String[protocolList.size()];
721 for (int i = 0; i < protocolList.size(); i++) {
722 protocolArray[i] = protocolList.get(i);
723 }
724 return protocolArray;
725 }
726
727 /**
728 * Retrieve ProtocolNotify for specified usage
729 *
730 * @param usage
731 * ProtocolNotify usage
732 *
733 * @returns String[] if elements are found at the known xpath
734 * @returns String[0] if nothing is there
735 */
736 public static String[] getProtocolNotifyArray(String arch) {
737 String[] xPath;
738
739 if (arch == null || arch.equals("")) {
740 return new String[0];
741 } else {
742 xPath = new String[] { "/ProtocolNotify" };
743 }
744
745 Object[] returns = get("Protocols", xPath);
746 if (returns == null) {
747 return new String[0];
748 }
749
750 List<String> protocolNotifyList = new ArrayList<String>();
751
752 for (int i = 0; i < returns.length; i++) {
753 List archList = ((ProtocolNotify) returns[i]).getSupArchList();
754 if (archList == null || contains(archList, arch)){
755 protocolNotifyList.add(((ProtocolNotify) returns[i]).getProtocolNotifyCName());
756 }
757
758 }
759 String[] protocolNotifyArray = new String[protocolNotifyList.size()];
760 for (int i = 0; i < protocolNotifyList.size(); i++) {
761 protocolNotifyArray[i] = protocolNotifyList.get(i);
762 }
763 return protocolNotifyArray;
764 }
765
766 /**
767 * Retrieve ProtocolNotify for specified usage
768 *
769 * @param usage
770 * ProtocolNotify usage
771 *
772 * @returns String[] if elements are found at the known xpath
773 * @returns String[0] if nothing is there
774 */
775 public static String[] getProtocolNotifyArray(String arch, String usage) {
776
777 String[] xPath;
778 String usageXpath;
779 String archXpath;
780
781 if (arch == null || arch.equals("")) {
782 return new String[0];
783 } else {
784 archXpath = "/ProtocolNotify";
785 if (usage != null && !usage.equals("")) {
786 usageXpath = "/ProtocolNotify[@Usage='" + arch + "']";
787 xPath = new String[] { archXpath, usageXpath };
788 } else {
789 return getProtocolNotifyArray(arch);
790 }
791 }
792
793 Object[] returns = get("Protocols", xPath);
794 if (returns == null) {
795 return new String[0];
796 }
797
798 String[] protocolNotifyList = new String[returns.length];
799
800 for (int i = 0; i < returns.length; i++) {
801 protocolNotifyList[i] = ((ProtocolNotify) returns[i]).getProtocolNotifyCName();
802 }
803 return protocolNotifyList;
804 }
805
806 /**
807 * Retrieve ModuleUnloadImage names
808 *
809 * @returns ModuleUnloadImage name list if elements are found at the known
810 * xpath
811 * @returns null if nothing is there
812 */
813 public static String[] getModuleUnloadImageArray() {
814 String[] xPath = new String[] { "/Extern/ModuleUnloadImage" };
815
816 Object[] returns = get("Externs", xPath);
817 if (returns != null && returns.length > 0) {
818 String[] stringArray = new String[returns.length];
819 CNameType[] doc = (CNameType[]) returns;
820
821 for (int i = 0; i < returns.length; ++i) {
822 stringArray[i] = doc[i].getStringValue();
823 }
824
825 return stringArray;
826 }
827
828 return null;
829 }
830
831 /**
832 * Retrieve Extern
833 *
834 * @returns Extern objects list if elements are found at the known xpath
835 * @returns null if nothing is there
836 */
837 public static ExternsDocument.Externs.Extern[] getExternArray() {
838 String[] xPath = new String[] { "/Extern" };
839
840 Object[] returns = get("Externs", xPath);
841 if (returns != null && returns.length > 0) {
842 return (ExternsDocument.Externs.Extern[]) returns;
843 }
844
845 return null;
846 }
847
848 /**
849 * Retrieve PpiNotify for specified arch
850 *
851 * @param arch
852 * PpiNotify arch
853 *
854 * @returns String[] if elements are found at the known xpath
855 * @returns String[0] if nothing is there
856 */
857 public static String[] getPpiNotifyArray(String arch) {
858 String[] xPath;
859
860 if (arch == null || arch.equals("")) {
861 return new String[0];
862 } else {
863 xPath = new String[] { "/PpiNotify" };
864 }
865
866 Object[] returns = get("PPIs", xPath);
867 if (returns == null) {
868 return new String[0];
869 }
870
871
872 List<String> ppiNotifyList = new ArrayList<String>();
873 for (int i = 0; i < returns.length; i++) {
874 List archList = ((PPIsDocument.PPIs.PpiNotify) returns[i]).getSupArchList();
875 if (archList == null || contains(archList, arch)){
876 ppiNotifyList.add(((PPIsDocument.PPIs.PpiNotify) returns[i]).getPpiNotifyCName());
877 }
878
879 }
880 String[] ppiNotifyArray = new String[ppiNotifyList.size()];
881 for (int i = 0; i < ppiNotifyList.size(); i++) {
882 ppiNotifyArray[i] = ppiNotifyList.get(i);
883 }
884
885 return ppiNotifyArray;
886 }
887
888 /**
889 * Retrieve PpiNotify for specified usage and arch
890 *
891 * @param arch
892 * PpiNotify arch usage PpiNotify usage
893 *
894 *
895 * @returns String[] if elements are found at the known xpath
896 * @returns String[0] if nothing is there
897 */
898 public static String[] getPpiNotifyArray(String arch, String usage) {
899
900 String[] xPath;
901 String usageXpath;
902 String archXpath;
903
904 if (arch == null || arch.equals("")) {
905 return new String[0];
906 } else {
907 archXpath = "/PpiNotify";
908 if (usage != null && !usage.equals("")) {
909 usageXpath = "/PpiNotify[@Usage='" + arch + "']";
910 xPath = new String[] { archXpath, usageXpath };
911 } else {
912 return getProtocolNotifyArray(arch);
913 }
914 }
915
916 Object[] returns = get("PPIs", xPath);
917 if (returns == null) {
918 return new String[0];
919 }
920
921 String[] ppiNotifyList = new String[returns.length];
922
923 for (int i = 0; i < returns.length; i++) {
924 ppiNotifyList[i] = ((PPIsDocument.PPIs.PpiNotify) returns[i]).getPpiNotifyCName();
925 }
926 return ppiNotifyList;
927 }
928
929 /**
930 * Retrieve Ppi for specified arch
931 *
932 * @param arch
933 * Ppi arch
934 *
935 * @returns String[] if elements are found at the known xpath
936 * @returns String[0] if nothing is there
937 */
938 public static String[] getPpiArray(String arch) {
939 String[] xPath;
940
941 if (arch == null || arch.equals("")) {
942 return new String[0];
943 } else {
944 xPath = new String[] { "/Ppi" };
945 }
946
947 Object[] returns = get("PPIs", xPath);
948 if (returns == null) {
949 return new String[0];
950 }
951
952 List<String> ppiList = new ArrayList<String>();
953 for (int i = 0; i < returns.length; i++) {
954 List archList = ((PPIsDocument.PPIs.Ppi) returns[i]).getSupArchList();
955 if (archList == null || contains(archList, arch)){
956 ppiList.add(((PPIsDocument.PPIs.Ppi) returns[i]).getPpiCName());
957 }
958
959 }
960 String[] ppiArray = new String[ppiList.size()];
961 for (int i = 0; i < ppiList.size(); i++) {
962 ppiArray[i] = ppiList.get(i);
963 }
964 return ppiArray;
965 }
966
967 /**
968 * Retrieve PpiNotify for specified usage and arch
969 *
970 * @param arch
971 * PpiNotify arch usage PpiNotify usage
972 *
973 *
974 * @returns String[] if elements are found at the known xpath
975 * @returns String[0] if nothing is there
976 */
977 public static String[] getPpiArray(String arch, String usage) {
978
979 String[] xPath;
980 String usageXpath;
981 String archXpath;
982
983 if (arch == null || arch.equals("")) {
984 return new String[0];
985 } else {
986 archXpath = "/Ppi";
987 if (usage != null && !usage.equals("")) {
988 usageXpath = "/Ppi[@Usage='" + arch + "']";
989 xPath = new String[] { archXpath, usageXpath };
990 } else {
991 return getProtocolNotifyArray(arch);
992 }
993 }
994
995 Object[] returns = get("PPIs", xPath);
996 if (returns == null) {
997 return new String[0];
998 }
999
1000 String[] ppiList = new String[returns.length];
1001
1002 for (int i = 0; i < returns.length; i++) {
1003 ppiList[i] = ((PPIsDocument.PPIs.Ppi) returns[i]).getPpiCName();
1004 }
1005 return ppiList;
1006 }
1007
1008 /**
1009 * Retrieve GuidEntry information for specified usage
1010 *
1011 * @param arch
1012 * GuidEntry arch
1013 *
1014 * @returns GuidEntry objects list if elements are found at the known xpath
1015 * @returns null if nothing is there
1016 */
1017 public static String[] getGuidEntryArray(String arch) {
1018 String[] xPath;
1019
1020 if (arch == null || arch.equals("")) {
1021 xPath = new String[] { "/GuidCNames" };
1022 } else {
1023 xPath = new String[] { "/GuidCNames" };
1024 }
1025
1026 Object[] returns = get("Guids", xPath);
1027 if (returns == null) {
1028 return new String[0];
1029 }
1030
1031 List<String> guidList = new ArrayList<String>();
1032 for (int i = 0; i < returns.length; i++) {
1033 List archList = ((GuidsDocument.Guids.GuidCNames) returns[i]).getSupArchList();
1034 if (archList == null || contains(archList, arch)){
1035 guidList.add(((GuidsDocument.Guids.GuidCNames) returns[i]).getGuidCName());
1036 }
1037
1038 }
1039 String[] guidArray = new String[guidList.size()];
1040 for (int i = 0; i < guidList.size(); i++) {
1041 guidArray[i] = guidList.get(i);
1042 }
1043 return guidArray;
1044
1045 }
1046
1047 /**
1048 * Retrieve GuidEntry information for specified usage
1049 *
1050 * @param arch
1051 * GuidEntry arch usage GuidEntry usage
1052 *
1053 * @returns GuidEntry objects list if elements are found at the known xpath
1054 * @returns null if nothing is there
1055 */
1056 public static String[] getGuidEntryArray(String arch, String usage) {
1057 String[] xPath;
1058 String archXpath;
1059 String usageXpath;
1060
1061 if (arch == null || arch.equals("")) {
1062 return new String[0];
1063 } else {
1064 archXpath = "/GuidEntry";
1065 if (usage != null && !usage.equals("")) {
1066 usageXpath = "/GuidEntry[@Usage='" + arch + "']";
1067 xPath = new String[] { archXpath, usageXpath };
1068 } else {
1069 return getProtocolNotifyArray(arch);
1070 }
1071 }
1072
1073 Object[] returns = get("Guids", xPath);
1074 if (returns == null) {
1075 return new String[0];
1076 }
1077
1078 String[] guidList = new String[returns.length];
1079
1080 for (int i = 0; i < returns.length; i++) {
1081 guidList[i] = ((GuidsDocument.Guids.GuidCNames) returns[i]).getGuidCName();
1082 }
1083 return guidList;
1084 }
1085
1086 /**
1087 * Retrieve Library instance information
1088 *
1089 * @param arch
1090 * Architecture name
1091 * @param usage
1092 * Library instance usage
1093 *
1094 * @returns library instance name list if elements are found at the known
1095 * xpath
1096 * @returns null if nothing is there
1097 */
1098 public static ModuleIdentification[] getLibraryInstance(String arch) {
1099 String[] xPath;
1100 String saGuid = null;
1101 String saVersion = null;
1102 String pkgGuid = null;
1103 String pkgVersion = null;
1104
1105 if (arch == null || arch.equalsIgnoreCase("")) {
1106 xPath = new String[] { "/Instance" };
1107 } else {
1108 //
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.
1112 //
1113 xPath = new String[] { "/Instance[not(@SupArchList) or @SupArchList='"
1114 + arch + "']" };
1115 }
1116
1117 Object[] returns = get("Libraries", xPath);
1118 if (returns == null || returns.length == 0) {
1119 return new ModuleIdentification[0];
1120 }
1121
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();
1127
1128 pkgGuid = library.getPackageGuid();
1129 pkgVersion = library.getPackageVersion();
1130
1131 ModuleIdentification saId = new ModuleIdentification(null, saGuid,
1132 saVersion);
1133 PackageIdentification pkgId = new PackageIdentification(null,
1134 pkgGuid, pkgVersion);
1135 saId.setPackage(pkgId);
1136
1137 saIdList[i] = saId;
1138
1139 }
1140 return saIdList;
1141 }
1142
1143 // /
1144 // / This method is used for retrieving the elements information which has
1145 // / CName sub-element
1146 // /
1147 private static String[] getCNames(String from, String xPath[]) {
1148 Object[] returns = get(from, xPath);
1149 if (returns == null || returns.length == 0) {
1150 return null;
1151 }
1152
1153 String[] strings = new String[returns.length];
1154 for (int i = 0; i < returns.length; ++i) {
1155 // TBD
1156 strings[i] = ((CNameType) returns[i]).getStringValue();
1157 }
1158
1159 return strings;
1160 }
1161
1162 /**
1163 * Retrive library's constructor name
1164 *
1165 * @returns constructor name list if elements are found at the known xpath
1166 * @returns null if nothing is there
1167 */
1168 public static String getLibConstructorName() {
1169 String[] xPath = new String[] { "/Extern/Constructor" };
1170
1171 Object[] returns = get("Externs", xPath);
1172 if (returns != null && returns.length > 0) {
1173 CNameType constructor = ((CNameType) returns[0]);
1174 return constructor.getStringValue();
1175 }
1176
1177 return null;
1178 }
1179
1180 /**
1181 * Retrive library's destructor name
1182 *
1183 * @returns destructor name list if elements are found at the known xpath
1184 * @returns null if nothing is there
1185 */
1186 public static String getLibDestructorName() {
1187 String[] xPath = new String[] { "/Extern/Destructor" };
1188
1189 Object[] returns = get("Externs", xPath);
1190 if (returns != null && returns.length > 0) {
1191 //
1192 // Only support one Destructor function.
1193 //
1194 CNameType destructor = (CNameType) returns[0];
1195 return destructor.getStringValue();
1196 }
1197
1198 return null;
1199 }
1200
1201 /**
1202 * Retrive DriverBinding names
1203 *
1204 * @returns DriverBinding name list if elements are found at the known xpath
1205 * @returns null if nothing is there
1206 */
1207 public static String[] getDriverBindingArray() {
1208 String[] xPath = new String[] { "/Extern/DriverBinding" };
1209 return getCNames("Externs", xPath);
1210 }
1211
1212 /**
1213 * Retrive ComponentName names
1214 *
1215 * @returns ComponentName name list if elements are found at the known xpath
1216 * @returns null if nothing is there
1217 */
1218 public static String[] getComponentNameArray() {
1219 String[] xPath = new String[] { "/Extern/ComponentName" };
1220 return getCNames("Externs", xPath);
1221 }
1222
1223 /**
1224 * Retrive DriverConfig names
1225 *
1226 * @returns DriverConfig name list if elements are found at the known xpath
1227 * @returns null if nothing is there
1228 */
1229 public static String[] getDriverConfigArray() {
1230 String[] xPath = new String[] { "/Extern/DriverConfig" };
1231 return getCNames("Externs", xPath);
1232 }
1233
1234 /**
1235 * Retrive DriverDiag names
1236 *
1237 * @returns DriverDiag name list if elements are found at the known xpath
1238 * @returns null if nothing is there
1239 */
1240 public static String[] getDriverDiagArray() {
1241 String[] xPath = new String[] { "/Extern/DriverDiag" };
1242 return getCNames("Externs", xPath);
1243 }
1244
1245 /**
1246 * Retrive SetVirtualAddressMapCallBack names
1247 *
1248 * @returns SetVirtualAddressMapCallBack name list if elements are found at
1249 * the known xpath
1250 * @returns null if nothing is there
1251 */
1252 public static String[] getSetVirtualAddressMapCallBackArray() {
1253 String[] xPath = new String[] { "/Extern/SetVirtualAddressMapCallBack" };
1254 return getCNames("Externs", xPath);
1255 }
1256
1257 /**
1258 * Retrive ExitBootServicesCallBack names
1259 *
1260 * @returns ExitBootServicesCallBack name list if elements are found at the
1261 * known xpath
1262 * @returns null if nothing is there
1263 */
1264 public static String[] getExitBootServicesCallBackArray() {
1265 String[] xPath = new String[] { "/Extern/ExitBootServicesCallBack" };
1266 return getCNames("Externs", xPath);
1267 }
1268
1269 /**
1270 * Retrieve module surface area file information
1271 *
1272 * @returns ModuleSA objects list if elements are found at the known xpath
1273 * @returns Empty ModuleSA list if nothing is there
1274 */
1275 public static Map<FpdModuleIdentification, Map<String, XmlObject>> getFpdModules() {
1276 String[] xPath = new String[] { "/FrameworkModules/ModuleSA" };
1277 Object[] result = get("PlatformSurfaceArea", xPath);
1278 String arch = null;
1279 String fvBinding = null;
1280 String saGuid = null;
1281 String saVersion = null;
1282 String pkgGuid = null;
1283 String pkgVersion = null;
1284
1285 Map<FpdModuleIdentification, Map<String, XmlObject>> fpdModuleMap = new LinkedHashMap<FpdModuleIdentification, Map<String, XmlObject>>();
1286
1287 if (result == null) {
1288 return fpdModuleMap;
1289 }
1290
1291 for (int i = 0; i < result.length; i++) {
1292 //
1293 // Get Fpd SA Module element node and add to ObjectMap.
1294 //
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());
1299 }
1300 if (((ModuleSADocument.ModuleSA) result[i]).getPcdBuildDefinition() != null) {
1301 ObjectMap.put("PcdBuildDefinition", moduleSA
1302 .getPcdBuildDefinition());
1303 }
1304 if (((ModuleSADocument.ModuleSA) result[i])
1305 .getModuleSaBuildOptions() != null) {
1306 ObjectMap.put("ModuleSaBuildOptions", moduleSA
1307 .getModuleSaBuildOptions());
1308 }
1309
1310 //
1311 // Get Fpd SA Module attribute and create FpdMoudleIdentification.
1312 //
1313 arch = moduleSA.getSupArchList().toString();
1314
1315 // TBD
1316 fvBinding = null;
1317 saVersion = ((ModuleSADocument.ModuleSA) result[i])
1318 .getModuleVersion();
1319
1320 saGuid = moduleSA.getModuleGuid();
1321 pkgGuid = moduleSA.getPackageGuid();
1322 pkgVersion = moduleSA.getPackageVersion();
1323
1324 //
1325 // Create Module Identification which have class member of package
1326 // identification.
1327 //
1328 PackageIdentification pkgId = new PackageIdentification(null,
1329 pkgGuid, pkgVersion);
1330 ModuleIdentification saId = new ModuleIdentification(null, saGuid,
1331 saVersion);
1332
1333 saId.setPackage(pkgId);
1334
1335 //
1336 // Create FpdModule Identification which have class member of module
1337 // identification
1338 //
1339 if (arch != null) {
1340 String[] archList = arch.split(" ");
1341 for (int j = 0; j < archList.length; j++) {
1342 FpdModuleIdentification fpdSaId = new FpdModuleIdentification(saId, archList[j]);
1343
1344 if (fvBinding != null) {
1345 fpdSaId.setFvBinding(fvBinding);
1346 }
1347
1348 //
1349 // Put element to Map<FpdModuleIdentification, Map<String,
1350 // Object>>.
1351 //
1352 fpdModuleMap.put(fpdSaId, ObjectMap);
1353 }
1354 }
1355 }
1356 return fpdModuleMap;
1357 }
1358
1359 /**
1360 * Retrieve valid image names
1361 *
1362 * @returns valid iamges name list if elements are found at the known xpath
1363 * @returns empty list if nothing is there
1364 */
1365 public static String[] getFpdValidImageNames() {
1366 String[] xPath = new String[] { "/Flash/FvImages/FvImage[@Type='ImageName']/FvImageNames" };
1367
1368 Object[] queryResult = get("PlatformSurfaceArea", xPath);
1369 if (queryResult == null) {
1370 return new String[0];
1371 }
1372
1373 String[] result = new String[queryResult.length];
1374 for (int i = 0; i < queryResult.length; i++) {
1375 result[i] = ((XmlString) queryResult[i]).getStringValue();
1376 }
1377
1378 return result;
1379 }
1380
1381 public static Node getFpdUserExtension() {
1382 String[] xPath = new String[] { "/UserExtensions[@UserID='TianoCore']" };
1383
1384 Object[] queryResult = get("PlatformSurfaceArea", xPath);
1385 if (queryResult == null || queryResult.length == 0) {
1386 return null;
1387 }
1388 UserExtensionsDocument.UserExtensions a = (UserExtensionsDocument.UserExtensions)queryResult[0];
1389
1390 return a.getDomNode();
1391 }
1392
1393 /**
1394 * Retrieve FV image option information
1395 *
1396 * @param fvName
1397 * FV image name
1398 *
1399 * @returns option name/value list if elements are found at the known xpath
1400 * @returns empty list if nothing is there
1401 */
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][];
1408 }
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
1417 .next();
1418 list.add(new String[] { nvItem.getName(), nvItem.getValue() });
1419 }
1420 }
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];
1425 }
1426 return result;
1427
1428 }
1429
1430 public static XmlObject getFpdBuildOptions() {
1431 String[] xPath = new String[] { "/BuildOptions" };
1432
1433 Object[] queryResult = get("PlatformSurfaceArea", xPath);
1434
1435 if (queryResult == null || queryResult.length == 0) {
1436 return null;
1437 }
1438 return (XmlObject)queryResult[0];
1439 }
1440
1441 public static PlatformIdentification getFpdHeader() {
1442 String[] xPath = new String[] { "/PlatformHeader" };
1443
1444 Object[] returns = get("PlatformSurfaceArea", xPath);
1445
1446 if (returns == null || returns.length == 0) {
1447 return null;
1448 }
1449 PlatformHeaderDocument.PlatformHeader header = (PlatformHeaderDocument.PlatformHeader) returns[0];
1450
1451 String name = header.getPlatformName();
1452
1453 String guid = header.getGuidValue();
1454
1455 String version = header.getVersion();
1456
1457 return new PlatformIdentification(name, guid, version);
1458 }
1459
1460 /**
1461 * Retrieve FV image attributes information
1462 *
1463 * @param fvName
1464 * FV image name
1465 *
1466 * @returns attribute name/value list if elements are found at the known
1467 * xpath
1468 * @returns empty list if nothing is there
1469 */
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][];
1476 }
1477 ArrayList<String[]> list = new ArrayList<String[]>();
1478 for (int i = 0; i < queryResult.length; i++) {
1479
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
1485 .next();
1486 list.add(new String[] { nvItem.getName(), nvItem.getValue() });
1487 }
1488 }
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];
1493 }
1494 return result;
1495 }
1496
1497 /**
1498 * Retrieve flash definition file name
1499 *
1500 * @returns file name if elements are found at the known xpath
1501 * @returns null if nothing is there
1502 */
1503 public static String getFlashDefinitionFile() {
1504 String[] xPath = new String[] { "/PlatformDefinitions/FlashDeviceDefinitions/FlashDefinitionFile" };
1505
1506 Object[] queryResult = get("PlatformSurfaceArea", xPath);
1507 if (queryResult == null || queryResult.length == 0) {
1508 return null;
1509 }
1510
1511 FileNameConvention filename = (FileNameConvention) queryResult[queryResult.length - 1];
1512 return filename.getStringValue();
1513 }
1514
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][];
1520 }
1521
1522 String[][] result = new String[queryResult.length][2];
1523
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();
1528 }
1529 return result;
1530 }
1531
1532 /**
1533 * Retrieve FV image component options
1534 *
1535 * @param fvName
1536 * FV image name
1537 *
1538 * @returns name/value pairs list if elements are found at the known xpath
1539 * @returns empty list if nothing is there
1540 */
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][];
1546 }
1547
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
1555 .next();
1556 list.add(new String[] { nvItem.getName(), nvItem.getValue() });
1557 }
1558 }
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];
1563 }
1564 return result;
1565 }
1566
1567 /**
1568 * Retrieve PCD tokens
1569 *
1570 * @returns CName/ItemType pairs list if elements are found at the known
1571 * xpath
1572 * @returns null if nothing is there
1573 */
1574 public static String[][] getPcdTokenArray() {
1575 String[] xPath = new String[] { "/PcdData" };
1576
1577 Object[] returns = get("PCDs", xPath);
1578 if (returns == null || returns.length == 0) {
1579 return null;
1580 }
1581
1582 return null;
1583 }
1584
1585 /**
1586 * Retrieve MAS header
1587 *
1588 * @return
1589 * @return
1590 */
1591 public static ModuleIdentification getMsaHeader() {
1592 String[] xPath = new String[] { "/" };
1593 Object[] returns = get("MsaHeader", xPath);
1594
1595 if (returns == null || returns.length == 0) {
1596 return null;
1597 }
1598
1599 MsaHeader msaHeader = (MsaHeader) returns[0];
1600 //
1601 // Get BaseName, ModuleType, GuidValue, Version
1602 // which in MsaHeader.
1603 //
1604 String name = msaHeader.getModuleName();
1605 String moduleType = msaHeader.getModuleType().toString();
1606 String guid = msaHeader.getGuidValue();
1607 String version = msaHeader.getVersion();
1608
1609 ModuleIdentification moduleId = new ModuleIdentification(name, guid,
1610 version);
1611
1612 moduleId.setModuleType(moduleType);
1613
1614 return moduleId;
1615 }
1616
1617 /**
1618 * Retrieve Extern Specification
1619 *
1620 * @param
1621 *
1622 * @return String[] If have specification element in the <extern> String[0]
1623 * If no specification element in the <extern>
1624 *
1625 */
1626
1627 public static String[] getExternSpecificaiton() {
1628 String[] xPath = new String[] { "/Specification" };
1629
1630 Object[] queryResult = get("Externs", xPath);
1631 if (queryResult == null) {
1632 return new String[0];
1633 }
1634
1635 String[] specificationList = new String[queryResult.length];
1636 for (int i = 0; i < queryResult.length; i++) {
1637 specificationList[i] = ((Sentence)queryResult[i])
1638 .getStringValue();
1639 }
1640 return specificationList;
1641 }
1642
1643 /**
1644 * Retreive MsaFile which in SPD
1645 *
1646 * @param
1647 * @return String[][3] The string sequence is ModuleName, ModuleGuid,
1648 * ModuleVersion, MsaFile String[0][] If no msafile in SPD
1649 */
1650 public static String[] getSpdMsaFile() {
1651 String[] xPath = new String[] { "/MsaFiles" };
1652
1653 Object[] returns = get("PackageSurfaceArea", xPath);
1654 if (returns == null) {
1655 return new String[0];
1656 }
1657
1658 List<String> filenameList = ((MsaFilesDocument.MsaFiles) returns[0])
1659 .getFilenameList();
1660 return filenameList.toArray(new String[filenameList.size()]);
1661 }
1662
1663 /**
1664 * Reteive
1665 */
1666 public static Map<String, String[]> getSpdLibraryClasses() {
1667 String[] xPath = new String[] { "/LibraryClassDeclarations/LibraryClass" };
1668
1669 Object[] returns = get("PackageSurfaceArea", xPath);
1670
1671 //
1672 // Create Map, Key - LibraryClass, String[] - LibraryClass Header file.
1673 //
1674 Map<String, String[]> libClassHeaderMap = new HashMap<String, String[]>();
1675
1676 if (returns == null) {
1677 return libClassHeaderMap;
1678 }
1679
1680 for (int i = 0; i < returns.length; i++) {
1681 LibraryClassDeclarationsDocument.LibraryClassDeclarations.LibraryClass library = (LibraryClassDeclarationsDocument.LibraryClassDeclarations.LibraryClass) returns[i];
1682 libClassHeaderMap.put(library.getName(), new String[] { library
1683 .getIncludeHeader() });
1684 }
1685 return libClassHeaderMap;
1686 }
1687
1688 /**
1689 * Reteive
1690 */
1691 public static Map<String, String> getSpdPackageHeaderFiles() {
1692 String[] xPath = new String[] { "/PackageHeaders/IncludePkgHeader" };
1693
1694 Object[] returns = get("PackageSurfaceArea", xPath);
1695
1696 //
1697 // Create Map, Key - ModuleType, String - PackageInclude Header file.
1698 //
1699 Map<String, String> packageIncludeMap = new HashMap<String, String>();
1700
1701 if (returns == null) {
1702 return packageIncludeMap;
1703 }
1704
1705 for (int i = 0; i < returns.length; i++) {
1706 PackageHeadersDocument.PackageHeaders.IncludePkgHeader includeHeader = (PackageHeadersDocument.PackageHeaders.IncludePkgHeader) returns[i];
1707 packageIncludeMap.put(includeHeader.getModuleType().toString(),
1708 includeHeader.getStringValue());
1709 }
1710 return packageIncludeMap;
1711 }
1712
1713 public static PackageIdentification getSpdHeader() {
1714 String[] xPath = new String[] { "/SpdHeader" };
1715
1716 Object[] returns = get("PackageSurfaceArea", xPath);
1717
1718 if (returns == null || returns.length == 0) {
1719 return null;
1720 }
1721
1722 SpdHeaderDocument.SpdHeader header = (SpdHeaderDocument.SpdHeader) returns[0];
1723
1724 String name = header.getPackageName();
1725
1726 String guid = header.getGuidValue();
1727
1728 String version = header.getVersion();
1729
1730 return new PackageIdentification(name, guid, version);
1731 }
1732
1733 /**
1734 * Reteive
1735 */
1736 public static Map<String, String[]> getSpdGuid() {
1737 String[] xPath = new String[] { "/GuidDeclarations/Entry" };
1738
1739 Object[] returns = get("PackageSurfaceArea", xPath);
1740
1741 //
1742 // Create Map, Key - GuidName, String[] - C_NAME & GUID value.
1743 //
1744 Map<String, String[]> guidDeclMap = new HashMap<String, String[]>();
1745 if (returns == null) {
1746 return guidDeclMap;
1747 }
1748
1749 for (int i = 0; i < returns.length; i++) {
1750 GuidDeclarationsDocument.GuidDeclarations.Entry entry = (GuidDeclarationsDocument.GuidDeclarations.Entry) returns[i];
1751 String[] guidPair = new String[2];
1752 guidPair[0] = entry.getCName();
1753 guidPair[1] = entry.getGuidValue();
1754 guidDeclMap.put(entry.getName(), guidPair);
1755 EdkLog.log(EdkLog.EDK_VERBOSE, entry.getName());
1756 EdkLog.log(EdkLog.EDK_VERBOSE, guidPair[0]);
1757 EdkLog.log(EdkLog.EDK_VERBOSE, guidPair[1]);
1758 }
1759 return guidDeclMap;
1760 }
1761
1762 /**
1763 * Reteive
1764 */
1765 public static Map<String, String[]> getSpdProtocol() {
1766 String[] xPath = new String[] { "/ProtocolDeclarations/Entry" };
1767
1768 Object[] returns = get("PackageSurfaceArea", xPath);
1769
1770 //
1771 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1772 //
1773 Map<String, String[]> protoclMap = new HashMap<String, String[]>();
1774
1775 if (returns == null) {
1776 return protoclMap;
1777 }
1778
1779 for (int i = 0; i < returns.length; i++) {
1780 ProtocolDeclarationsDocument.ProtocolDeclarations.Entry entry = (ProtocolDeclarationsDocument.ProtocolDeclarations.Entry) returns[i];
1781 String[] protocolPair = new String[2];
1782
1783 protocolPair[0] = entry.getCName();
1784 protocolPair[1] = entry.getGuidValue();
1785 protoclMap.put(entry.getName(), protocolPair);
1786 EdkLog.log(EdkLog.EDK_VERBOSE, entry.getName());
1787 EdkLog.log(EdkLog.EDK_VERBOSE, protocolPair[0]);
1788 EdkLog.log(EdkLog.EDK_VERBOSE, protocolPair[1]);
1789 }
1790 return protoclMap;
1791 }
1792
1793 /**
1794 * getSpdPpi() Retrieve the SPD PPI Entry
1795 *
1796 * @param
1797 * @return Map<String, String[2]> if get the PPI entry from SPD. Key - PPI
1798 * Name String[0] - PPI CNAME String[1] - PPI Guid Null if no PPI
1799 * entry in SPD.
1800 */
1801 public static Map<String, String[]> getSpdPpi() {
1802 String[] xPath = new String[] { "/PpiDeclarations/Entry" };
1803
1804 Object[] returns = get("PackageSurfaceArea", xPath);
1805
1806 //
1807 // Create Map, Key - protocolName, String[] - C_NAME & GUID value.
1808 //
1809 Map<String, String[]> ppiMap = new HashMap<String, String[]>();
1810
1811 if (returns == null) {
1812 return ppiMap;
1813 }
1814
1815 for (int i = 0; i < returns.length; i++) {
1816 PpiDeclarationsDocument.PpiDeclarations.Entry entry = (PpiDeclarationsDocument.PpiDeclarations.Entry) returns[i];
1817 String[] ppiPair = new String[2];
1818 ppiPair[0] = entry.getCName();
1819 ppiPair[1] = entry.getGuidValue();
1820 ppiMap.put(entry.getName(), ppiPair);
1821 }
1822 return ppiMap;
1823 }
1824
1825 /**
1826 * Retrieve module Guid string
1827 *
1828 * @returns GUILD string if elements are found at the known xpath
1829 * @returns null if nothing is there
1830 */
1831 public static String getModuleGuid() {
1832 String[] xPath = new String[] { "" };
1833
1834 Object[] returns = get("MsaHeader", xPath);
1835 if (returns != null && returns.length > 0) {
1836 String guid = ((MsaHeaderDocument.MsaHeader) returns[0])
1837 .getGuidValue();
1838 return guid;
1839 }
1840
1841 return null;
1842 }
1843
1844 //
1845 // For new Pcd
1846 //
1847 public static ModuleSADocument.ModuleSA[] getFpdModuleSAs() {
1848 String[] xPath = new String[] { "/FrameworkModules/ModuleSA" };
1849 Object[] result = get("PlatformSurfaceArea", xPath);
1850 if (result != null) {
1851 return (ModuleSADocument.ModuleSA[]) result;
1852 }
1853 return new ModuleSADocument.ModuleSA[0];
1854
1855 }
1856 /**
1857 Get name array of PCD in a module. In one module, token space
1858 is same, and token name should not be conflicted.
1859
1860 @return String[]
1861 **/
1862 public static String[] getModulePcdEntryNameArray() {
1863 PcdCodedDocument.PcdCoded.PcdEntry[] pcdEntries = null;
1864 String[] results;
1865 int index;
1866 String[] xPath = new String[] {"/PcdEntry"};
1867 Object[] returns = get ("PcdCoded", xPath);
1868
1869 if (returns == null) {
1870 return new String[0];
1871 }
1872
1873 pcdEntries = (PcdCodedDocument.PcdCoded.PcdEntry[])returns;
1874 results = new String[pcdEntries.length];
1875
1876 for (index = 0; index < pcdEntries.length; index ++) {
1877 results[index] = pcdEntries[index].getCName();
1878 }
1879 return results;
1880 }
1881
1882 /**
1883 Search in a List for a given string
1884
1885 @return boolean
1886 **/
1887 public static boolean contains(List list, String str) {
1888 Iterator it = list.iterator();
1889 while (it.hasNext()) {
1890 String s = (String)it.next();
1891 if (s.equalsIgnoreCase(str)) {
1892 return true;
1893 }
1894 }
1895
1896 return false;
1897 }
1898 }