]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java
add ContextTool to workspace/Tools
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / fpd / PlatformBuildFileGenerator.java
CommitLineData
a29c47e0 1/** @file\r
2 \r
3 Copyright (c) 2006, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 **/\r
12package org.tianocore.build.fpd;\r
13\r
14import java.io.File;\r
4b5f5549 15import java.util.HashMap;\r
a29c47e0 16import java.util.Iterator;\r
17import java.util.Map;\r
18import java.util.Set;\r
19\r
20import javax.xml.parsers.DocumentBuilder;\r
21import javax.xml.parsers.DocumentBuilderFactory;\r
22import javax.xml.transform.OutputKeys;\r
23import javax.xml.transform.Result;\r
24import javax.xml.transform.Source;\r
25import javax.xml.transform.Transformer;\r
26import javax.xml.transform.TransformerFactory;\r
27import javax.xml.transform.dom.DOMSource;\r
28import javax.xml.transform.stream.StreamResult;\r
29\r
30import org.apache.tools.ant.BuildException;\r
31import org.apache.tools.ant.Project;\r
32import org.tianocore.build.global.GlobalData;\r
33import org.tianocore.build.global.SurfaceAreaQuery;\r
34import org.tianocore.build.id.FpdModuleIdentification;\r
35import org.tianocore.build.id.ModuleIdentification;\r
36import org.w3c.dom.Comment;\r
37import org.w3c.dom.Document;\r
38import org.w3c.dom.Element;\r
8031d48d 39import org.w3c.dom.NamedNodeMap;\r
a29c47e0 40import org.w3c.dom.Node;\r
8031d48d 41import org.w3c.dom.NodeList;\r
a29c47e0 42\r
82516887 43/**\r
44 class PlatformBuildFileGenerator is used to generate ${PLATFORM}_build.xml file. \r
45\r
46 @since GenBuild 1.0\r
47**/\r
a29c47e0 48public class PlatformBuildFileGenerator {\r
49\r
50 private String platformName;\r
51 \r
52 ///\r
53 /// Mapping from modules identification to out put file name\r
54 ///\r
55 private Map<FpdModuleIdentification, String> outfiles;\r
4b5f5549 56 \r
57 ///\r
58 /// Mapping from FV name to its modules\r
59 ///\r
60 private Map<String, Set<FpdModuleIdentification>> fvs = new HashMap<String, Set<FpdModuleIdentification>>();\r
61\r
a29c47e0 62\r
a29c47e0 63 private boolean isUnified = true;\r
64 \r
65 private Project project;\r
66 \r
67 private String info = "DO NOT EDIT \n" \r
391dbbb1 68 + "This file is auto-generated by the build utility\n" \r
a29c47e0 69 + "\n" \r
70 + "Abstract:\n"\r
391dbbb1 71 + "Auto-generated ANT build file for building EFI Modules and Platforms\n";\r
a29c47e0 72\r
4b5f5549 73 public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, Map<String, Set<FpdModuleIdentification>> fvs, boolean isUnified){\r
a29c47e0 74 this.project = project;\r
75 this.outfiles = outfiles;\r
a29c47e0 76 this.isUnified = isUnified;\r
4b5f5549 77 this.fvs = fvs;\r
a29c47e0 78 this.platformName = project.getProperty("PLATFORM");\r
79 }\r
80 \r
81 /**\r
82 Generate build.out.xml file.\r
83 \r
84 @throws BuildException\r
85 build.out.xml XML document create error\r
86 **/\r
87 public void genBuildFile() throws BuildException {\r
88 DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
89 try {\r
90 DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
91 Document document = dombuilder.newDocument();\r
92 Comment rootComment = document.createComment(info);\r
93 //\r
94 // create root element and its attributes\r
95 //\r
96 Element root = document.createElement("project");\r
97 root.setAttribute("name", project.getProperty("PLATFORM"));\r
98 root.setAttribute("default", "all");\r
99 root.setAttribute("basedir", ".");\r
100 \r
101 //\r
102 // element for External ANT tasks\r
103 //\r
104 root.appendChild(document.createComment("Apply external ANT tasks"));\r
105 Element ele = document.createElement("taskdef");\r
106 ele.setAttribute("resource", "GenBuild.tasks");\r
107 root.appendChild(ele);\r
108\r
109 ele = document.createElement("taskdef");\r
110 ele.setAttribute("resource", "frameworktasks.tasks");\r
111 root.appendChild(ele);\r
112\r
e1347472 113 ele = document.createElement("taskdef");\r
114 ele.setAttribute("resource", "net/sf/antcontrib/antlib.xml");\r
115 root.appendChild(ele);\r
116 \r
a29c47e0 117 ele = document.createElement("property");\r
118 ele.setAttribute("environment", "env");\r
119 root.appendChild(ele);\r
120 \r
a29c47e0 121 //\r
122 // Default Target\r
123 //\r
124 root.appendChild(document.createComment("Default target"));\r
125 ele = document.createElement("target");\r
126 ele.setAttribute("name", "all");\r
01413f0c 127 ele.setAttribute("depends", "prebuild, modules, fvs, postbuild");\r
a29c47e0 128 root.appendChild(ele);\r
129 \r
130 //\r
131 // Modules and Fvs Target\r
132 //\r
01413f0c 133 applyModules(document, root);\r
134 \r
135 applyFvs(document, root);\r
a29c47e0 136\r
137 //\r
138 // Clean Target\r
139 //\r
140 applyClean(document, root);\r
141 \r
142 //\r
143 // Deep Clean Target\r
144 //\r
145 applyCleanall(document, root);\r
146 \r
147 //\r
8cf5da75 148 // User Extension pre build\r
a29c47e0 149 //\r
8cf5da75 150 applyUserExtensionsPreBuild(document, root);\r
151 \r
152 //\r
153 // User Extension Post build\r
154 //\r
155 applyUserExtensionsPostBuild(document, root);\r
a29c47e0 156 \r
157 document.appendChild(rootComment);\r
158 document.appendChild(root);\r
159 //\r
160 // Prepare the DOM document for writing\r
161 //\r
162 Source source = new DOMSource(document);\r
163 //\r
164 // Prepare the output file\r
165 //\r
166 File file = new File(project.getProperty("PLATFORM_DIR") + File.separatorChar + platformName + "_build.xml");\r
167 //\r
168 // generate all directory path\r
169 //\r
170 (new File(file.getParent())).mkdirs();\r
171 Result result = new StreamResult(file);\r
172 //\r
173 // Write the DOM document to the file\r
174 //\r
175 Transformer xformer = TransformerFactory.newInstance().newTransformer();\r
176 xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");\r
177 xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
178 xformer.transform(source, result);\r
179 } catch (Exception ex) {\r
391dbbb1 180 throw new BuildException("Generation of the " + platformName + "_build.xml failed!\n" + ex.getMessage());\r
a29c47e0 181 }\r
182 }\r
8031d48d 183 \r
4b5f5549 184 /**\r
185 1. Get All valid Fv Image Names in sequence\r
186 2. For each FV, get modules by sequences\r
187 3. Get other modules\r
188 \r
189 @param document XML document\r
190 @param root Node\r
191 **/\r
01413f0c 192 private void applyModules(Document document, Node root) {\r
a29c47e0 193 root.appendChild(document.createComment("Modules target"));\r
194 Element ele = document.createElement("target");\r
01413f0c 195 ele.setAttribute("name", "modules");\r
a29c47e0 196\r
4b5f5549 197 //\r
198 // Get all valid FV name\r
199 //\r
200 String[] validFv = SurfaceAreaQuery.getFpdValidImageNames();\r
201 \r
202 //\r
203 // For each valid FV, get all modules in sequence\r
204 //\r
205 for (int i = 0; i < validFv.length; i++) {\r
206 if (fvs.containsKey(validFv[i])) {\r
207 Set<FpdModuleIdentification> set = fvs.get(validFv[i]);\r
208 Iterator<FpdModuleIdentification> iter = set.iterator();\r
209 while (iter.hasNext()) {\r
210 FpdModuleIdentification fpdModuleId = iter.next();\r
211 applySingleModule(document, ele, fpdModuleId);\r
212 }\r
213 }\r
a29c47e0 214 }\r
4b5f5549 215 \r
216 //\r
217 // Get all other modules\r
218 //\r
219 Iterator<String> fvsNameIter = fvs.keySet().iterator();\r
220 \r
221 while (fvsNameIter.hasNext()) {\r
222 String fvName = fvsNameIter.next();\r
223 if (!isContain(validFv, fvName)) {\r
224 Set<FpdModuleIdentification> set = fvs.get(fvName);\r
225 Iterator iter = set.iterator();\r
226 while (iter.hasNext()) {\r
227 FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
228 applySingleModule(document, ele, fpdModuleId);\r
229 }\r
230 }\r
231 }\r
232\r
a29c47e0 233 root.appendChild(ele);\r
234 }\r
235 \r
4b5f5549 236 private void applySingleModule(Document document, Node root, FpdModuleIdentification fpdModuleId) {\r
237 ModuleIdentification moduleId = fpdModuleId.getModule();\r
238 Element moduleEle = document.createElement("GenBuild");\r
239 moduleEle.setAttribute("type", "build");\r
240 //\r
241 // Inherit Properties.\r
242 //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}\r
243 //\r
244 \r
245 //\r
246 // ARCH\r
247 //\r
248 Element property = document.createElement("property");\r
249 property.setAttribute("name", "ARCH");\r
250 property.setAttribute("value", fpdModuleId.getArch());\r
251 moduleEle.appendChild(property);\r
252\r
253 //\r
254 // MODULE_GUID\r
255 //\r
256 property = document.createElement("property");\r
257 property.setAttribute("name", "MODULE_GUID");\r
258 property.setAttribute("value", moduleId.getGuid());\r
259 moduleEle.appendChild(property);\r
260 \r
261 //\r
262 // MODULE_VERSION\r
263 //\r
264 property = document.createElement("property");\r
265 property.setAttribute("name", "MODULE_VERSION");\r
266 property.setAttribute("value", moduleId.getVersion());\r
267 moduleEle.appendChild(property);\r
268 \r
269 //\r
270 // PACKAGE_GUID\r
271 //\r
272 property = document.createElement("property");\r
273 property.setAttribute("name", "PACKAGE_GUID");\r
274 property.setAttribute("value", moduleId.getPackage().getGuid());\r
275 moduleEle.appendChild(property);\r
276 \r
277 //\r
278 // PACKAGE_VERSION\r
279 //\r
280 property = document.createElement("property");\r
281 property.setAttribute("name", "PACKAGE_VERSION");\r
282 property.setAttribute("value", moduleId.getPackage().getVersion());\r
283 moduleEle.appendChild(property);\r
284 \r
285 root.appendChild(moduleEle);\r
286 }\r
287 \r
288 private boolean isContain(String[] list, String item) {\r
289 for (int i = 0; i < list.length; i++) {\r
290 if (list[i].equalsIgnoreCase(item)) {\r
291 return true;\r
292 }\r
293 }\r
294 return false;\r
295 }\r
296 \r
01413f0c 297 private void applyFvs(Document document, Node root) {\r
a29c47e0 298 //\r
299 // FVS Target\r
300 //\r
301 root.appendChild(document.createComment("FVs target"));\r
302 Element ele = document.createElement("target");\r
01413f0c 303 ele.setAttribute("name", "fvs");\r
a29c47e0 304\r
305 //\r
306 // For every Target and ToolChain\r
307 //\r
308 String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
309 for (int i = 0; i < targetList.length; i++){\r
310 String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
311 for(int j = 0; j < toolchainList.length; j++){\r
312 String fvOutputDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
6ae1510e 313 + targetList[i] + "_" \r
bdaa67b1 314 + toolchainList[j] + File.separatorChar + "FV";\r
a29c47e0 315 String[] validFv = SurfaceAreaQuery.getFpdValidImageNames();\r
316 for (int k = 0; k < validFv.length; k++) {\r
01413f0c 317 String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf";\r
318 Element fvEle = document.createElement("genfvimage");\r
319 fvEle.setAttribute("infFile", inputFile);\r
320 fvEle.setAttribute("outputDir", fvOutputDir);\r
321 ele.appendChild(fvEle);\r
a29c47e0 322 }\r
323 }\r
324 }\r
325 root.appendChild(ele);\r
326 }\r
327 \r
328 private void applyClean(Document document, Node root) {\r
329 //\r
330 // Clean Target\r
331 //\r
332 root.appendChild(document.createComment("Clean target"));\r
333 Element ele = document.createElement("target");\r
334 ele.setAttribute("name", "clean");\r
335\r
336 if (isUnified) {\r
337 Element cleanEle = document.createElement("delete");\r
338 cleanEle.setAttribute("includeemptydirs", "true");\r
339 Element filesetEle = document.createElement("fileset");\r
340 filesetEle.setAttribute("dir", project.getProperty("BUILD_DIR"));\r
341 filesetEle.setAttribute("includes", "**\\OUTPUT\\**");\r
342 cleanEle.appendChild(filesetEle);\r
343 ele.appendChild(cleanEle);\r
344 } else {\r
345 Set set = outfiles.keySet();\r
346 Iterator iter = set.iterator();\r
347 while (iter.hasNext()) {\r
348 FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
349 ModuleIdentification moduleId = fpdModuleId.getModule();\r
350\r
351 Element ifEle = document.createElement("if");\r
352 Element availableEle = document.createElement("available");\r
353 availableEle.setAttribute("file", moduleId.getMsaFile().getParent() + File.separatorChar\r
354 + "build.xml");\r
355 ifEle.appendChild(availableEle);\r
356 Element elseEle = document.createElement("then");\r
357\r
358 Element moduleEle = document.createElement("ant");\r
359 moduleEle.setAttribute("antfile", moduleId.getMsaFile().getParent() + File.separatorChar\r
360 + "build.xml");\r
361 moduleEle.setAttribute("target", "clean");\r
362 //\r
363 // Inherit Properties.\r
364 //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}\r
365 //\r
366 \r
367 //\r
368 // ARCH\r
369 //\r
370 Element property = document.createElement("property");\r
371 property.setAttribute("name", "ARCH");\r
372 property.setAttribute("value", fpdModuleId.getArch());\r
373 moduleEle.appendChild(property);\r
374\r
375 //\r
376 // PACKAGE\r
377 //\r
378 property = document.createElement("property");\r
379 property.setAttribute("name", "PACKAGE");\r
380 property.setAttribute("value", moduleId.getPackage().getName());\r
381 moduleEle.appendChild(property);\r
382 \r
383 //\r
384 // PACKAGE_GUID\r
385 //\r
386 property = document.createElement("property");\r
387 property.setAttribute("name", "PACKAGE_GUID");\r
388 property.setAttribute("value", moduleId.getPackage().getGuid());\r
389 moduleEle.appendChild(property);\r
390 \r
391 //\r
392 // PACKAGE_VERSION\r
393 //\r
394 property = document.createElement("property");\r
395 property.setAttribute("name", "PACKAGE_VERSION");\r
396 property.setAttribute("value", moduleId.getPackage().getVersion());\r
397 moduleEle.appendChild(property);\r
398 \r
399 //\r
400 // MODULE_DIR\r
401 //\r
402 property = document.createElement("property");\r
403 property.setAttribute("name", "MODULE_DIR");\r
404 property.setAttribute("value", moduleId.getMsaFile().getParent());\r
405 moduleEle.appendChild(property);\r
406 elseEle.appendChild(moduleEle);\r
407 ifEle.appendChild(elseEle);\r
408 ele.appendChild(ifEle);\r
409 }\r
410 }\r
411 root.appendChild(ele);\r
412 }\r
413 \r
414 private void applyCleanall(Document document, Node root) {\r
415 //\r
416 // Deep Clean Target\r
417 //\r
391dbbb1 418 root.appendChild(document.createComment("Target: cleanall"));\r
a29c47e0 419 Element ele = document.createElement("target");\r
420 ele.setAttribute("name", "cleanall");\r
421\r
422 if (isUnified) {\r
d3dfaf4b 423 String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
424 for (int i = 0; i < targetList.length; ++i) {\r
6ae1510e 425 String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
426 for(int j = 0; j < toolchainList.length; j++) {\r
427 Element cleanAllEle = document.createElement("delete");\r
428 cleanAllEle.setAttribute("dir", project.getProperty("BUILD_DIR") + File.separatorChar + targetList[i] + "_" + toolchainList[j]);\r
429 ele.appendChild(cleanAllEle);\r
430 }\r
d3dfaf4b 431 }\r
a29c47e0 432 } else {\r
433 Set set = outfiles.keySet();\r
434 Iterator iter = set.iterator();\r
435 while (iter.hasNext()) {\r
436 FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
437 ModuleIdentification moduleId = fpdModuleId.getModule();\r
438\r
439 Element ifEle = document.createElement("if");\r
440 Element availableEle = document.createElement("available");\r
441 availableEle.setAttribute("file", moduleId.getMsaFile().getParent() + File.separatorChar\r
442 + "build.xml");\r
443 ifEle.appendChild(availableEle);\r
444 Element elseEle = document.createElement("then");\r
445\r
446 Element moduleEle = document.createElement("ant");\r
447 moduleEle.setAttribute("antfile", moduleId.getMsaFile().getParent() + File.separatorChar\r
448 + "build.xml");\r
449 moduleEle.setAttribute("target", "cleanall");\r
450 //\r
451 // Inherit Properties.\r
452 //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}\r
453 //\r
454 \r
455 //\r
456 // ARCH\r
457 //\r
458 Element property = document.createElement("property");\r
459 property.setAttribute("name", "ARCH");\r
460 property.setAttribute("value", fpdModuleId.getArch());\r
461 moduleEle.appendChild(property);\r
462\r
463 //\r
464 // PACKAGE\r
465 //\r
466 property = document.createElement("property");\r
467 property.setAttribute("name", "PACKAGE");\r
468 property.setAttribute("value", moduleId.getPackage().getName());\r
469 moduleEle.appendChild(property);\r
470 \r
471 //\r
472 // PACKAGE_GUID\r
473 //\r
474 property = document.createElement("property");\r
475 property.setAttribute("name", "PACKAGE_GUID");\r
476 property.setAttribute("value", moduleId.getPackage().getGuid());\r
477 moduleEle.appendChild(property);\r
478 \r
479 //\r
480 // PACKAGE_VERSION\r
481 //\r
482 property = document.createElement("property");\r
483 property.setAttribute("name", "PACKAGE_VERSION");\r
484 property.setAttribute("value", moduleId.getPackage().getVersion());\r
485 moduleEle.appendChild(property);\r
486 \r
487 //\r
488 // MODULE_DIR\r
489 //\r
490 property = document.createElement("property");\r
491 property.setAttribute("name", "MODULE_DIR");\r
492 property.setAttribute("value", moduleId.getMsaFile().getParent());\r
493 moduleEle.appendChild(property);\r
494 elseEle.appendChild(moduleEle);\r
495 ifEle.appendChild(elseEle);\r
496 ele.appendChild(ifEle);\r
497 }\r
498 }\r
499 root.appendChild(ele);\r
500 }\r
501 \r
8cf5da75 502 private void applyUserExtensionsPreBuild(Document document, Node root) {\r
503 //\r
504 // User Extensions\r
505 //\r
391dbbb1 506 root.appendChild(document.createComment("Pre-Build Processing"));\r
8cf5da75 507 Element ele = document.createElement("target");\r
508 ele.setAttribute("name", "prebuild");\r
509 \r
510 Node node = SurfaceAreaQuery.getFpdUserExtensionPreBuild();\r
511 if (node != null) {\r
512 //\r
513 // For every Target and ToolChain\r
514 //\r
515 String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
516 for (int i = 0; i < targetList.length; i++){\r
517 String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
518 for(int j = 0; j < toolchainList.length; j++){\r
519 //\r
520 // Prepare FV_DIR\r
521 //\r
522 String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
6ae1510e 523 + targetList[i] + "_" \r
8cf5da75 524 + toolchainList[j];\r
525 File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");\r
526 Element fvEle = document.createElement("var");\r
527 fvEle.setAttribute("name", "FV_DIR");\r
528 fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));\r
529 ele.appendChild(fvEle);\r
530 \r
531 NodeList childNodes = node.getChildNodes();\r
532 for (int k = 0; k < childNodes.getLength(); k++) {\r
533 Node childItem = childNodes.item(k);\r
534 if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
535 ele.appendChild(recursiveNode(childItem, document));\r
536 }\r
537 }\r
538 \r
539 }\r
540 }\r
541 }\r
542 \r
543 root.appendChild(ele);\r
544 }\r
545 \r
546 private void applyUserExtensionsPostBuild(Document document, Node root) {\r
a29c47e0 547 //\r
548 // User Extensions\r
549 //\r
391dbbb1 550 root.appendChild(document.createComment("Post-Build Processing"));\r
a29c47e0 551 Element ele = document.createElement("target");\r
8cf5da75 552 ele.setAttribute("name", "postbuild");\r
a29c47e0 553 \r
8cf5da75 554 Node node = SurfaceAreaQuery.getFpdUserExtensionPostBuild();\r
8031d48d 555 if (node != null) {\r
556 //\r
557 // For every Target and ToolChain\r
558 //\r
559 String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
560 for (int i = 0; i < targetList.length; i++){\r
561 String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
562 for(int j = 0; j < toolchainList.length; j++){\r
563 //\r
564 // Prepare FV_DIR\r
565 //\r
566 String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
6ae1510e 567 + targetList[i] + "_" \r
8031d48d 568 + toolchainList[j];\r
569 File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");\r
570 Element fvEle = document.createElement("var");\r
571 fvEle.setAttribute("name", "FV_DIR");\r
572 fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));\r
573 ele.appendChild(fvEle);\r
574 \r
575 NodeList childNodes = node.getChildNodes();\r
576 for (int k = 0; k < childNodes.getLength(); k++) {\r
577 Node childItem = childNodes.item(k);\r
578 if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
579 ele.appendChild(recursiveNode(childItem, document));\r
580 }\r
581 }\r
582 \r
583 }\r
584 }\r
585 }\r
586 \r
a29c47e0 587 root.appendChild(ele);\r
588 }\r
589 \r
8031d48d 590 private Element recursiveNode(Node node, Document document) {\r
591 Element root = document.createElement(node.getNodeName());\r
592 NamedNodeMap attr = node.getAttributes();\r
593 for (int i = 0; i < attr.getLength(); i++) {\r
594 Node attrItem = attr.item(i);\r
595 root.setAttribute(attrItem.getNodeName(), attrItem.getNodeValue());\r
596 }\r
597 NodeList childNodes = node.getChildNodes();\r
598 for (int i = 0; i < childNodes.getLength(); i++) {\r
599 Node childItem = childNodes.item(i);\r
600 if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
601 root.appendChild(recursiveNode(childItem, document));\r
602 }\r
603 else if (childItem.getNodeType() == Node.TEXT_NODE){\r
604 if ( ! childItem.getNodeValue().trim().equalsIgnoreCase("")) {\r
605 root.setTextContent(childItem.getNodeValue());\r
606 }\r
607 }\r
608 }\r
609 return root;\r
610 }\r
a29c47e0 611}\r