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