]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/far/Mainfest.java
1. Support to Create/Update/Delete/Install far file
[mirror_edk2.git] / Tools / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / far / Mainfest.java
CommitLineData
5a24e806 1/** @file\r
2 \r
3 The file is used to create Far's mainfest file\r
4 \r
5 Copyright (c) 2006, Intel Corporation\r
6 All rights reserved. This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10 \r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13 \r
14 **/\r
15package org.tianocore.frameworkwizard.far;\r
16\r
17import java.io.File;\r
18import java.io.FileInputStream;\r
19import java.io.IOException;\r
20import java.io.InputStream;\r
21import java.util.ArrayList;\r
22import java.util.Iterator;\r
23import java.util.LinkedHashSet;\r
24import java.util.List;\r
25import java.util.Set;\r
26import java.util.regex.Matcher;\r
27import java.util.regex.Pattern;\r
28\r
29import javax.xml.parsers.DocumentBuilder;\r
30import javax.xml.parsers.DocumentBuilderFactory;\r
31import javax.xml.transform.OutputKeys;\r
32import javax.xml.transform.Result;\r
33import javax.xml.transform.Source;\r
34import javax.xml.transform.Transformer;\r
35import javax.xml.transform.TransformerFactory;\r
36import javax.xml.transform.dom.DOMSource;\r
37import javax.xml.transform.stream.StreamResult;\r
38\r
39import org.apache.xmlbeans.XmlException;\r
40import org.tianocore.frameworkwizard.common.Tools;\r
41import org.tianocore.frameworkwizard.packaging.PackageIdentification;\r
42import org.tianocore.frameworkwizard.platform.PlatformIdentification;\r
43import org.tianocore.frameworkwizard.workspace.Workspace;\r
44import org.w3c.dom.Document;\r
45import org.w3c.dom.Element;\r
46import org.w3c.dom.NamedNodeMap;\r
47import org.w3c.dom.Node;\r
48import org.w3c.dom.NodeList;\r
49\r
50public class Mainfest implements ManifestInterface {\r
51 // /\r
52 // / mainfest document\r
53 // /\r
54 Document mainfestDoc = null;\r
55\r
56 // /\r
57 // / Mainfest file element name\r
58 // /\r
59 final static String mfFileName = "FarMainfest.MF";\r
60\r
61 //\r
62 // Header\r
63 //\r
64 final static String farHeader = "FarHeader";\r
65\r
66 final static String farHeader_FarName = "FarName";\r
67\r
68 final static String farHeader_Abstract = "Abstract";\r
69\r
70 final static String farHeader_Description = "Description";\r
71\r
72 final static String farHeader_CopyRight = "CopyRight";\r
73\r
74 final static String farHeader_License = "Licese";\r
75\r
76 final static String farHeader_Specification = "Specification";\r
77\r
78 //\r
79 // Package list\r
80 //\r
81 final static String farPackageList = "FarPackageList";\r
82\r
83 final static String farPlatformList = "FarPlatformList";\r
84\r
85 final static String contents = "Contents";\r
86\r
87 final static String userExtensions = "UserExtensions";\r
88\r
89 //\r
90 // Common node name\r
91 //\r
92\r
93 final static String guidValue = "GuidValue";\r
94\r
95 final static String version = "Version";\r
96\r
97 //\r
98 // FarPackage node name\r
99 //\r
100 final static String farPackageList_FarPackage = "FarPackage";\r
101\r
102 final static String farPackage_FarfileName = "FarFileName";\r
103\r
104 final static String farPackage_DefaultPath = "DefaultPath";\r
105\r
106 final static String farPlatformList_FarPlatform = "FarPlatform";\r
107\r
108 final static String farFileName_FarGuid = "FarGuid";\r
109\r
110 final static String farFileName_Md5sum = "Md5sum";\r
111\r
112 //\r
113 // mainfest header information.\r
114 //\r
115 FarHeader fhInfo = new FarHeader();\r
116\r
117 //\r
118 // FarPackage list\r
119 //\r
120 List<FarPackage> fPkgList = new ArrayList<FarPackage>();\r
121\r
122 //\r
123 // FarPlatform list\r
124 //\r
125 List<FarPlatformItem> fPlfList = new ArrayList<FarPlatformItem>();\r
126\r
127 Set<File> files = new LinkedHashSet<File>();\r
128\r
129 //\r
130 // Mainfest file\r
131 //\r
132 File mfFile = null;\r
133\r
134 public FarHeader getHeader() {\r
135 return fhInfo;\r
136 }\r
137\r
138 public Mainfest() throws Exception {\r
139 DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
140 DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
141 Document document = dombuilder.newDocument();\r
142 this.mainfestDoc = document;\r
143\r
144 }\r
145\r
146 public Mainfest(InputStream mainfestInputStream) throws Exception {\r
147 DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
148 try {\r
149 if (mainfestInputStream != null) {\r
150 DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
151 this.mainfestDoc = dombuilder.parse(mainfestInputStream);\r
152 parseMainfest();\r
153 }\r
154\r
155 } catch (Exception e) {\r
156 //\r
157 // Will change to throw Wizader exception.\r
158 //\r
159 throw new Exception(e.getMessage());\r
160 }\r
161 }\r
162\r
163 public void setFarHeader(FarHeader fHeader) {\r
164 this.fhInfo = fHeader;\r
165 }\r
166\r
167 public void createManifest(List<PackageIdentification> pkgList, List<PlatformIdentification> plfList,\r
168 Set<String> fileFilter) throws Exception {\r
169\r
170 //\r
171 // Add Package and it's contents to FarPackageList.\r
172 //\r
173 Iterator<PackageIdentification> pkgItem = pkgList.iterator();\r
174 while (pkgItem.hasNext()) {\r
175 PackageIdentification pkgId = pkgItem.next();\r
176\r
177 //\r
178 // Add package and it's contents to <FarPackageList>.\r
179 //\r
180 addPkgToPkgList(pkgId, fileFilter);\r
181 }\r
182\r
183 //\r
184 // Add FarPlatform to this.farPlatformList.\r
185 //\r
186 Iterator<PlatformIdentification> plfItem = plfList.iterator();\r
187 while (plfItem.hasNext()) {\r
188 PlatformIdentification plfId = plfItem.next();\r
189\r
190 //\r
191 // Add platform to Mainifest.\r
192 //\r
193 addPlatformIdToFarPlatformItemList(plfId);\r
194 }\r
195 }\r
196\r
197 public void setManifestFile(File mainfestFile) throws Exception {\r
198 DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
199 DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
200 InputStream is = new FileInputStream(mainfestFile);\r
201 this.mainfestDoc = dombuilder.parse(is);\r
202 }\r
203\r
204 public void addPkgToPkgList(PackageIdentification packageId, Set<String> fileFilter) throws Exception {\r
205 files.add(packageId.getSpdFile());\r
206\r
207 FarPackage farPackage = new FarPackage();\r
208 //\r
209 // Add SPD file to FarPackage\r
210 //\r
211 File spdFile = new File(packageId.getPath());\r
212\r
213 FarFileItem ffItem = new FarFileItem(spdFile.getName(), FarMd5.md5(spdFile));\r
214 farPackage.setFarFile(ffItem);\r
215\r
216 //\r
217 // Add package guid value.\r
218 //\r
219 farPackage.setGuidValue(packageId.getGuid());\r
220\r
221 //\r
222 // Add package version\r
223 //\r
224 farPackage.setVersion(packageId.getVersion());\r
225\r
226 //\r
227 // Add DefaultPat: Package absoulte path - Workspace absolut\r
228 // path.\r
229 //\r
230 String pkgDir = Tools.getFilePathOnly(packageId.getPath());\r
231 File rootDir = new File(pkgDir);\r
232 farPackage.setDefaultPath(Tools.getRelativePath(rootDir.getPath(), Workspace.getCurrentWorkspace()));\r
233\r
234 //\r
235 // Get package root dir contains.\r
236 //\r
237 Set<File> fileSet = new LinkedHashSet<File>();\r
238 Set<File> fpdFileSet = new LinkedHashSet<File>();\r
239\r
240 //\r
241 // Get all files and fpd files\r
242 //\r
243 recursiveDirectory(fileSet, fpdFileSet, rootDir, fileFilter);\r
244\r
245 //\r
246 // Remove current package's SPD file\r
247 //\r
248 fileSet.remove(packageId.getSpdFile());\r
249\r
250 files.addAll(fileSet);\r
251\r
252 Iterator<File> iter = fileSet.iterator();\r
253 List<FarFileItem> contents = new ArrayList<FarFileItem>();\r
254 while (iter.hasNext()) {\r
255 File normalFile = iter.next();\r
256 String fileRelativePath = Tools.getRelativePath(normalFile.getPath(), pkgDir);\r
257 ffItem = new FarFileItem(fileRelativePath, FarMd5.md5(normalFile));\r
258 contents.add(ffItem);\r
259 }\r
260\r
261 farPackage.setContentList(contents);\r
262\r
263 // List<FarPlatformItem> fpfList = new ArrayList<FarPlatformItem>();\r
264 //\r
265 // iter = fpdFileSet.iterator();\r
266 //\r
267 // while (iter.hasNext()) {\r
268 // File fpdFile = iter.next();\r
269 // PlatformIdentification platformId = new PlatformIdentification(wsTool\r
270 // .getId(fpdFile.getPath(), OpenFile.openFpdFile(fpdFile\r
271 // .getPath())));\r
272 // addPlatformIdToFarPlatformItemList(fpfList, platformId);\r
273 // }\r
274 // farPackage.setFarPlatformList(fpfList);\r
275 fPkgList.add(farPackage);\r
276 }\r
277\r
278 private void recursiveDirectory(Set<File> files, Set<File> fpds, File dir, Set<String> fileFilter) {\r
279 if (isFilter(dir, fileFilter)) {\r
280 return;\r
281 }\r
282 File[] allFilesInDir = dir.listFiles();\r
283 for (int i = 0; i < allFilesInDir.length; i++) {\r
284 if (allFilesInDir[i].isFile()) {\r
285 if (isFilter(allFilesInDir[i], fileFilter)) {\r
286 continue;\r
287 }\r
288 // if (allFilesInDir[i].getPath().toLowerCase().endsWith(".fpd")) {\r
289 // fpds.add(allFilesInDir[i]);\r
290 // } else {\r
291 files.add(allFilesInDir[i]);\r
292 // }\r
293 } else {\r
294 recursiveDirectory(files, fpds, allFilesInDir[i], fileFilter);\r
295 }\r
296 }\r
297 }\r
298\r
299 public void addPlatformIdToFarPlatformItemList(PlatformIdentification platformId) throws Exception {\r
300 files.add(platformId.getFpdFile());\r
301\r
302 FarPlatformItem fpfItem = new FarPlatformItem();\r
303 FarFileItem ffItem;\r
304 String fpfPath = platformId.getPath();\r
305 File fpfFile = new File(fpfPath);\r
306 //\r
307 // Add farFileName\r
308 //\r
309 ffItem = new FarFileItem(Tools.getRelativePath(fpfFile.getPath(), Workspace.getCurrentWorkspace()),\r
310 FarMd5.md5(fpfFile));\r
311 fpfItem.setFarFile(ffItem);\r
312\r
313 //\r
314 // Add guid value\r
315 //\r
316 fpfItem.setGuidValue(platformId.getGuid());\r
317\r
318 //\r
319 // Add version\r
320 //\r
321 fpfItem.setVersion(platformId.getVersion());\r
322\r
323 fPlfList.add(fpfItem);\r
324 }\r
325\r
326 /**\r
327 * \r
328 * @param\r
329 * @return Set<PackageIdentification> list of PackageIdentification.\r
330 */\r
331 public List<PackageIdentification> getPackageList() throws Exception {\r
332 //\r
333 // PackageIdentification set.\r
334 //\r
335 List<PackageIdentification> pkgList = new ArrayList<PackageIdentification>();\r
336 //\r
337 // \r
338 //\r
339 Iterator pkgItem = this.fPkgList.iterator();\r
340 while (pkgItem.hasNext()) {\r
341 FarPackage fPkg = (FarPackage) pkgItem.next();\r
342 //\r
343 // Get package information from SPD file and create a package\r
344 // identification.\r
345 //\r
346\r
347 PackageIdentification pkgId = new PackageIdentification(fPkg.getFarFile().getRelativeFilename(),\r
348 fPkg.getGuidValue(), fPkg.getVersion());\r
349 pkgId.setPath(Workspace.getCurrentWorkspace() + File.separatorChar + fPkg.getDefaultPath()\r
350 + File.separatorChar + fPkg.getFarFile().getRelativeFilename());\r
351 // wsTool.getId(\r
352 // Workspace.getCurrentWorkspace() + File.separatorChar\r
353 // + fPkg.getDefaultPath(), OpenFile\r
354 // .openFpdFile(Workspace.getCurrentWorkspace()\r
355 // + File.separatorChar\r
356 // + fPkg.getDefaultPath()\r
357 // + File.separatorChar\r
358 // + fPkg.getFarFile().getRelativeFilename()));\r
359 pkgList.add(pkgId);\r
360 }\r
361 return pkgList;\r
362 }\r
363\r
364 /**\r
365 * \r
366 */\r
367 public List<PlatformIdentification> getPlatformList() throws Exception, IOException, XmlException {\r
368 //\r
369 // PlatformIdentification set.\r
370 //\r
371 List<PlatformIdentification> plfList = new ArrayList<PlatformIdentification>();\r
372 Iterator plfItem = this.fPlfList.iterator();\r
373 while (plfItem.hasNext()) {\r
374 FarPlatformItem fpfItem = (FarPlatformItem) plfItem.next();\r
375 File file = new File(Workspace.getCurrentWorkspace() + File.separatorChar\r
376 + fpfItem.getFarFile().getRelativeFilename());\r
377 //\r
378 // Set platformIdentificaiton's path as absolutly path (include\r
379 // workspace and FPD relatively path)\r
380 //\r
381 PlatformIdentification plfId = new PlatformIdentification(fpfItem.getFarFile().getRelativeFilename(),\r
382 fpfItem.getGuidValue(), fpfItem.getVersion(),\r
383 file.getPath());\r
384\r
385 // (PlatformIdentification) wsTool\r
386 // .getId(file.getParent(), OpenFile.openFpdFile(Workspace\r
387 // .getCurrentWorkspace()\r
388 // + File.separatorChar\r
389 // + fpfItem.getFarFile().getRelativeFilename()));\r
390 plfList.add(plfId);\r
391 }\r
392 return plfList;\r
393 }\r
394\r
395 public List<FarFileItem> getPlatformContents(PlatformIdentification platformId) {\r
396 List<FarFileItem> result = new ArrayList<FarFileItem>();\r
397 Iterator<FarPlatformItem> iter = this.fPlfList.iterator();\r
398\r
399 while (iter.hasNext()) {\r
400 FarPlatformItem item = iter.next();\r
401 if (item.isIdentityPlf(platformId)) {\r
402 FarFileItem farFileItem = item.getFarFile();\r
403 farFileItem.setDefaultPath(farFileItem.getRelativeFilename());\r
404 result.add(farFileItem);\r
405 break;\r
406 }\r
407 }\r
408 return result;\r
409 }\r
410\r
411 public List<FarFileItem> getPackageContents(PackageIdentification packageId) {\r
412 List<FarFileItem> farFileList = new ArrayList<FarFileItem>();\r
413 Iterator pkgItem = this.fPkgList.iterator();\r
414 while (pkgItem.hasNext()) {\r
415 FarPackage pkg = (FarPackage) pkgItem.next();\r
416 if (pkg.isIdentityPkg(packageId)) {\r
417 //\r
418 // Add spd far file to list.\r
419 //\r
420 farFileList.add(pkg.getFarFile());\r
421 //\r
422 // Add all files in contents to list.\r
423 //\r
424 farFileList.addAll(pkg.getContentList());\r
425 //\r
426 // Add all farfiles in <FarPlatformList> to list.\r
427 //\r
428 // List<FarPlatformItem> plfList = pkg.getFarPlatformList();\r
429 // Iterator plfItem = plfList.iterator();\r
430 // while (plfItem.hasNext()) {\r
431 // farFileList.add(((FarPlatformItem) plfItem.next())\r
432 // .getFarFile());\r
433 // }\r
434\r
435 Iterator<FarFileItem> ffIter = farFileList.iterator();\r
436 while (ffIter.hasNext()) {\r
437 FarFileItem ffItem = ffIter.next();\r
438 ffItem.setDefaultPath(pkg.getDefaultPath() + File.separatorChar + ffItem.getRelativeFilename());\r
439 }\r
440 break;\r
441 }\r
442 }\r
443\r
444 return farFileList;\r
445 }\r
446\r
447 /**\r
448 * \r
449 * @param pkgId\r
450 * @return String: return string represent jar file entry; \r
451 */\r
452 public String[] getPackgeSpd(PackageIdentification pkgId) {\r
453 Iterator pkgItem = this.fPkgList.iterator();\r
454 String[] entryStr = new String[2];\r
455 while (pkgItem.hasNext()) {\r
456 FarPackage pkg = (FarPackage) pkgItem.next();\r
457 if (pkg.isIdentityPkg(pkgId)) {\r
458 entryStr[0] = pkg.getFarFile().getRelativeFilename();\r
459 entryStr[1] = pkg.getDefaultPath();\r
460 return entryStr;\r
461 }\r
462 }\r
463 return null;\r
464 }\r
465\r
466 public List<FarFileItem> getPackageContents() {\r
467 //\r
468 // In this farFilelist,all FarFileItem's relativeFileName should be\r
469 // set as absolutely path.\r
470 //\r
471 List<FarFileItem> farFileList = new ArrayList<FarFileItem>();\r
472 Iterator pkgItem = this.fPkgList.iterator();\r
473 FarFileItem ffItem = null;\r
474\r
475 while (pkgItem.hasNext()) {\r
476 FarPackage pkg = (FarPackage) pkgItem.next();\r
477\r
478 //\r
479 // Add spd far file to list.\r
480 //\r
481 ffItem = pkg.getFarFile();\r
482 //\r
483 // Set farFileItem relativeFileName = absolutePath + file Name.\r
484 //\r
485 farFileList.add(new FarFileItem(pkg.getDefaultPath() + File.separatorChar + ffItem.getRelativeFilename(),\r
486 ffItem.getMd5Value()));\r
487 //\r
488 // Add all files in contents to list.\r
489 //\r
490 Iterator contentsItem = pkg.getContentList().iterator();\r
491 while (contentsItem.hasNext()) {\r
492 ffItem = (FarFileItem) contentsItem.next();\r
493 farFileList.add(new FarFileItem(pkg.getDefaultPath() + File.separator + ffItem.getRelativeFilename(),\r
494 ffItem.getMd5Value()));\r
495 }\r
496 //\r
497 // Add all farfiles in <FarPlatformList> to list.\r
498 //\r
499 List<FarPlatformItem> plfList = pkg.getFarPlatformList();\r
500 Iterator plfItem = plfList.iterator();\r
501 while (plfItem.hasNext()) {\r
502 ffItem = ((FarPlatformItem) plfItem.next()).getFarFile();\r
503 farFileList.add(new FarFileItem(pkg.getDefaultPath() + File.separator + ffItem.getRelativeFilename(),\r
504 ffItem.getMd5Value()));\r
505 }\r
506 }\r
507 return farFileList;\r
508 }\r
509\r
510 public String getPackageDefaultPath(PackageIdentification packageId) {\r
511 Iterator pkgItr = this.fPkgList.iterator();\r
512 while (pkgItr.hasNext()) {\r
513 FarPackage farPackage = (FarPackage) pkgItr.next();\r
514 if (farPackage.isIdentityPkg(packageId)) {\r
515 return farPackage.getDefaultPath();\r
516 }\r
517 }\r
518 return null;\r
519 }\r
520\r
521 // public void setPackageInstallPath(PackageIdentification packageId, String path) {\r
522 // Iterator<FarPackage> pkgItr = this.fPkgList.iterator();\r
523 // while (pkgItr.hasNext()) {\r
524 // FarPackage farPackage = pkgItr.next();\r
525 // if (farPackage.isIdentityPkg(packageId)) {\r
526 // farPackage.setDefaultPath(path);\r
527 // return ;\r
528 // }\r
529 // }\r
530 // }\r
531 //\r
532 // public void setPlatformInstallPath(PlatformIdentification platformId, String path) {\r
533 // Iterator<FarPlatformItem> plfItr = this.fPlfList.iterator();\r
534 // while (plfItr.hasNext()) {\r
535 // FarPlatformItem farPlatform = plfItr.next();\r
536 // if (farPlatform.i.isIdentity(platformId)) {\r
537 // farPackage.setDefaultPath(path);\r
538 // return ;\r
539 // }\r
540 // }\r
541 // }\r
542\r
543 public List<FarFileItem> getAllFileItem() {\r
544 //\r
545 // The farFileName in this list are all abosulte path.\r
546 //\r
547 List<FarFileItem> ffiList = new ArrayList<FarFileItem>();\r
548 //\r
549 // Add far files in <FarPackageList> to list.\r
550 //\r
551 ffiList = this.getPackageContents();\r
552\r
553 //\r
554 // Add far files in <FarPlatformList> to list\r
555 //\r
556 NodeList elementList = this.mainfestDoc.getElementsByTagName(farPlatformList);\r
557 for (int i = 0; i < elementList.getLength(); i++) {\r
558 //\r
559 // Get <farPlatform> node list.\r
560 //\r
561 Node item = elementList.item(i);\r
562 NodeList plfElements = item.getChildNodes();\r
563 for (int j = 0; j < plfElements.getLength(); j++) {\r
564 //\r
565 // Get each <FarPlatform> content.\r
566 //\r
567 NodeList plfChildNode = plfElements.item(i).getChildNodes();\r
568 Node tempNode = null;\r
569 for (int t = 0; t < plfChildNode.getLength(); t++) {\r
570 tempNode = plfChildNode.item(t);\r
571 //\r
572 // Get child node value and set to platformIdentification.\r
573 //\r
574 if (tempNode.getNodeName().equalsIgnoreCase(farPackage_FarfileName)) {\r
575 NamedNodeMap farAttr = tempNode.getAttributes();\r
576 //\r
577 // Change relative path to absolute one\r
578 //\r
579 FarFileItem farFile = new FarFileItem(tempNode.getTextContent(),\r
580 farAttr.getNamedItem(farFileName_Md5sum).getTextContent());\r
581 ffiList.add(farFile);\r
582 }\r
583 }\r
584 }\r
585 }\r
586 return ffiList;\r
587 }\r
588\r
589 public void hibernateToFile() throws Exception {\r
590 //\r
591 // create mainfest root node\r
592 //\r
593 Element rootNode = this.mainfestDoc.createElement("FrameworkArchiveManifest");\r
594 this.mainfestDoc.appendChild(rootNode);\r
595\r
596 //\r
597 // create mainfest header node\r
598 //\r
599 Element headerNode = this.mainfestDoc.createElement(farHeader);\r
600 rootNode.appendChild(headerNode);\r
601 //\r
602 // Add FarHeader to headerNode.\r
603 //\r
604 Element farName = this.mainfestDoc.createElement(farHeader_FarName);\r
605 farName.setTextContent(this.fhInfo.getFarName());\r
606 headerNode.appendChild(farName);\r
607\r
608 Element gv = this.mainfestDoc.createElement(guidValue);\r
609 gv.setTextContent(this.fhInfo.getGuidValue());\r
610 headerNode.appendChild(gv);\r
611\r
612 Element ver = this.mainfestDoc.createElement(version);\r
613 ver.setTextContent(this.fhInfo.getVersion());\r
614 headerNode.appendChild(ver);\r
615\r
616 Element abstra = this.mainfestDoc.createElement(farHeader_Abstract);\r
617 abstra.setTextContent(this.fhInfo.getAbstractStr());\r
618 headerNode.appendChild(abstra);\r
619\r
620 Element descr = this.mainfestDoc.createElement(farHeader_Description);\r
621 descr.setTextContent(this.fhInfo.getDescription());\r
622 headerNode.appendChild(descr);\r
623\r
624 Element copyright = this.mainfestDoc.createElement(farHeader_CopyRight);\r
625 copyright.setTextContent(this.fhInfo.getCopyright());\r
626 headerNode.appendChild(copyright);\r
627\r
628 Element license = this.mainfestDoc.createElement(farHeader_License);\r
629 license.setTextContent(this.fhInfo.getLicense());\r
630 headerNode.appendChild(license);\r
631\r
632 Element spec = this.mainfestDoc.createElement(farHeader_Specification);\r
633 spec.setTextContent(this.fhInfo.getSpecification());\r
634 System.out.println(this.fhInfo.getSpecification());\r
635 headerNode.appendChild(spec);\r
636\r
637 //\r
638 // create mainfest FarPackageList node\r
639 //\r
640 Element pkgListNode = this.mainfestDoc.createElement(farPackageList);\r
641 rootNode.appendChild(pkgListNode);\r
642\r
643 //\r
644 // Save each item in farPackage list to <FarPackage>.\r
645 //\r
646 Iterator pkgItem = this.fPkgList.iterator();\r
647 while (pkgItem.hasNext()) {\r
648 pkgToFarPkgNode(pkgListNode, (FarPackage) pkgItem.next());\r
649\r
650 }\r
651\r
652 //\r
653 // create mainfest FarPlatformList node\r
654 //\r
655 Element plfListNode = this.mainfestDoc.createElement(farPlatformList);\r
656 rootNode.appendChild(plfListNode);\r
657\r
658 //\r
659 // Save farPakcage list info to <FarPackageList> node\r
660 //\r
661 Iterator plfItem = this.fPlfList.iterator();\r
662 while (plfItem.hasNext()) {\r
663 FarPlatformItem plfIterator = (FarPlatformItem) plfItem.next();\r
664 PlfToPlatformNode(plfListNode, plfIterator);\r
665 }\r
666\r
667 //\r
668 // Write the DOM document to the file\r
669 //\r
670 Transformer xformer = TransformerFactory.newInstance().newTransformer();\r
671 xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");\r
672 xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
673\r
674 //\r
675 // Prepare the DOM document for writing\r
676 //\r
677 Source source = new DOMSource(this.mainfestDoc);\r
678 //\r
679 // Prepare the output file, get the Mainifest file name from <FarHeader>\r
680 // /<FarName>.\r
681 //\r
682 this.mfFile = new File(Workspace.getCurrentWorkspace() + File.separatorChar + mfFileName);\r
683 //\r
684 // generate all directory path\r
685 //\r
686 Result result = new StreamResult(this.mfFile);\r
687 xformer.transform(source, result);\r
688 }\r
689\r
690 public void pkgToFarPkgNode(Element parentNode, FarPackage pkgItem) {\r
691 Element pkgNode = this.mainfestDoc.createElement(farPackageList_FarPackage);\r
692 //\r
693 // Add <FarFileName>\r
694 //\r
695 ffiToFfNode(pkgNode, pkgItem.getFarFile());\r
696 //\r
697 // Add <GuidValue>\r
698 //\r
699 setStrItemToNode(pkgNode, pkgItem.getGuidValue(), guidValue);\r
700 //\r
701 // Add <Version>\r
702 //\r
703 setStrItemToNode(pkgNode, pkgItem.getVersion(), version);\r
704 //\r
705 // Add <DefaultPath>\r
706 //\r
707 setStrItemToNode(pkgNode, pkgItem.getDefaultPath(), farPackage_DefaultPath);\r
708\r
709 //\r
710 // Add <Contents>\r
711 //\r
712 Element contentNode = this.mainfestDoc.createElement(contents);\r
713 Iterator iterator = pkgItem.getContentList().iterator();\r
714 while (iterator.hasNext()) {\r
715 ffiToFfNode(contentNode, (FarFileItem) iterator.next());\r
716 }\r
717 pkgNode.appendChild(contentNode);\r
718 parentNode.appendChild(pkgNode);\r
719 }\r
720\r
721 public void PlfToPlatformNode(Element parentNode, FarPlatformItem fplItem) {\r
722 Element fplNode = this.mainfestDoc.createElement(farPlatformList_FarPlatform);\r
723 //\r
724 // Add <FarFileName>\r
725 //\r
726 ffiToFfNode(fplNode, fplItem.getFarFile());\r
727 //\r
728 // Add <GuidValue>\r
729 //\r
730 setStrItemToNode(fplNode, fplItem.getGuidValue(), guidValue);\r
731 //\r
732 // Add <Version>\r
733 //\r
734 setStrItemToNode(fplNode, fplItem.getVersion(), version);\r
735 //\r
736 // Add to <PlatformList>\r
737 //\r
738 parentNode.appendChild(fplNode);\r
739\r
740 }\r
741\r
742 public void ffiToFfNode(Element parentNode, FarFileItem ffi) {\r
743 Element farFileName = this.mainfestDoc.createElement(farPackage_FarfileName);\r
744 farFileName.setTextContent(ffi.getRelativeFilename());\r
745 System.out.println(farFileName.getTextContent());\r
746 System.out.println(ffi.getRelativeFilename());\r
747 farFileName.setAttribute(farFileName_Md5sum, ffi.getMd5Value());\r
748 parentNode.appendChild(farFileName);\r
749 }\r
750\r
751 public void setStrItemToNode(Element parentNode, String strValue, String strName) {\r
752 Element node = this.mainfestDoc.createElement(strName);\r
753 node.setTextContent(strValue);\r
754 parentNode.appendChild(node);\r
755 }\r
756\r
757 private void parseMainfest() {\r
758\r
759 //\r
760 // Parse header\r
761 //\r
762 parseMfHeader();\r
763 //\r
764 // parse <farPackageList>\r
765 //\r
766 parseHeaderFarPackageList();\r
767\r
768 //\r
769 // parse <farPlatformList>\r
770 //\r
771 NodeList ele = this.mainfestDoc.getElementsByTagName(farPlatformList);\r
772 Node plfNode;\r
773 if (ele.getLength() > 0) {\r
774 //\r
775 // Only have one <FarPlatformList> node under mainfest root node.\r
776 //\r
777 plfNode = ele.item(0);\r
778 parseFarPlatformList(plfNode, this.fPlfList);\r
779 }\r
780 }\r
781\r
782 private void parseMfHeader() {\r
783 Node headerNode;\r
784 NodeList ele = this.mainfestDoc.getElementsByTagName(farHeader);\r
785 if (ele.getLength() > 0) {\r
786 //\r
787 // For mainfest file only have one <FarHeader>\r
788 //\r
789 headerNode = ele.item(0);\r
790 } else {\r
791 return;\r
792 }\r
793 NodeList childList = headerNode.getChildNodes();\r
794 Node node = null;\r
795 String nodeName = null;\r
796 for (int i = 0; i < childList.getLength(); i++) {\r
797 node = childList.item(i);\r
798 nodeName = node.getNodeName();\r
799 if (nodeName.equalsIgnoreCase(farHeader_FarName)) {\r
800 String nodeValue = node.getTextContent();\r
801 this.fhInfo.setFarName(nodeValue);\r
802 } else if (nodeName.equalsIgnoreCase(guidValue)) {\r
803 this.fhInfo.setGuidValue(node.getTextContent());\r
804 } else if (nodeName.equalsIgnoreCase(version)) {\r
805 this.fhInfo.setVersion(node.getTextContent());\r
806 } else if (nodeName.equalsIgnoreCase(farHeader_Abstract)) {\r
807 this.fhInfo.setAbstractStr(node.getTextContent());\r
808 } else if (nodeName.equalsIgnoreCase(farHeader_Description)) {\r
809 this.fhInfo.setDescription(node.getTextContent());\r
810 } else if (nodeName.equalsIgnoreCase(farHeader_CopyRight)) {\r
811 this.fhInfo.setCopyright(node.getTextContent());\r
812 } else if (nodeName.equalsIgnoreCase(farHeader_License)) {\r
813 this.fhInfo.setLicense(node.getTextContent());\r
814 } else if (nodeName.equalsIgnoreCase(farHeader_Specification)) {\r
815 this.fhInfo.setSpecification(node.getTextContent());\r
816 }\r
817 }\r
818 }\r
819\r
820 public void parseHeaderFarPackageList() {\r
821 Node farPkgNode;\r
822 NodeList ele = this.mainfestDoc.getElementsByTagName(farPackageList);\r
823 if (ele.getLength() > 0) {\r
824 //\r
825 // For mainfest file only have one <FarHeader>\r
826 //\r
827 farPkgNode = ele.item(0);\r
828 } else {\r
829 return;\r
830 }\r
831 NodeList fpnList = farPkgNode.getChildNodes();\r
832 for (int i = 0; i < fpnList.getLength(); i++) {\r
833 if (fpnList.item(i).getNodeType() == Node.TEXT_NODE) {\r
834 continue;\r
835 }\r
836 FarPackage fpItem = new FarPackage();\r
837 parseFarPackage(fpnList.item(i), fpItem);\r
838 this.fPkgList.add(fpItem);\r
839 }\r
840 }\r
841\r
842 public void parseFarPackage(Node farPkgNode, FarPackage fpItem) {\r
843 NodeList childList = farPkgNode.getChildNodes();\r
844 Node childNode;\r
845 String childName;\r
846 for (int i = 0; i < childList.getLength(); i++) {\r
847 childNode = childList.item(i);\r
848 childName = childNode.getNodeName();\r
849 if (childName.equalsIgnoreCase(farPackage_FarfileName)) {\r
850 fpItem.setFarFile(parseFarFile(childNode));\r
851 } else if (childName.equalsIgnoreCase(guidValue)) {\r
852 fpItem.setGuidValue(childNode.getTextContent());\r
853 } else if (childName.equalsIgnoreCase(version)) {\r
854 fpItem.setVersion(childNode.getTextContent());\r
855 } else if (childName.equalsIgnoreCase(farPackage_DefaultPath)) {\r
856 fpItem.setDefaultPath(childNode.getTextContent());\r
857 } else if (childName.equalsIgnoreCase(farPlatformList)) {\r
858 List<FarPlatformItem> plfList = new ArrayList<FarPlatformItem>();\r
859 parseFarPlatformList(childNode, plfList);\r
860 fpItem.setFarPlatformList(plfList);\r
861 } else if (childName.equalsIgnoreCase(contents)) {\r
862 List<FarFileItem> ffList = new ArrayList<FarFileItem>();\r
863 parseContents(childNode, ffList);\r
864 fpItem.setContentList(ffList);\r
865 }\r
866 }\r
867 }\r
868\r
869 /**\r
870 * \r
871 * @param fpfListNode\r
872 * @param plfList\r
873 */\r
874 public void parseFarPlatformList(Node fpfListNode, List<FarPlatformItem> plfList) {\r
875 //\r
876 // Get <FarPlatform> list.\r
877 //\r
878 NodeList child = fpfListNode.getChildNodes();\r
879 Node farPlfNode;\r
880 for (int i = 0; i < child.getLength(); i++) {\r
881 if (child.item(i).getNodeType() == Node.TEXT_NODE) {\r
882 continue;\r
883 }\r
884 farPlfNode = child.item(i);\r
885 plfList.add(parseFarPlatform(farPlfNode));\r
886 }\r
887 }\r
888\r
889 /**\r
890 * \r
891 * @param fpfNode\r
892 * @return\r
893 */\r
894 public FarPlatformItem parseFarPlatform(Node fpfNode) {\r
895 //\r
896 // New FarPlatformItem.\r
897 //\r
898 FarPlatformItem fplItem = new FarPlatformItem();\r
899 //\r
900 // Get <FarPlatform> elements;\r
901 //\r
902 NodeList childList = fpfNode.getChildNodes();\r
903 Node child;\r
904 String nodeName;\r
905 for (int i = 0; i < childList.getLength(); i++) {\r
906 child = childList.item(i);\r
907 nodeName = child.getNodeName();\r
908 if (nodeName.equalsIgnoreCase(farPackage_FarfileName)) {\r
909 fplItem.setFarFile(parseFarFile(child));\r
910 } else if (nodeName.equalsIgnoreCase(guidValue)) {\r
911 fplItem.setGuidValue(child.getTextContent());\r
912 } else if (nodeName.equalsIgnoreCase(version)) {\r
913 fplItem.setVersion(child.getTextContent());\r
914 }\r
915 }\r
916\r
917 return fplItem;\r
918 }\r
919\r
920 public void parseContents(Node contentsNode, List<FarFileItem> ffList) {\r
921 NodeList contentList = contentsNode.getChildNodes();\r
922 Node contentNode;\r
923 for (int i = 0; i < contentList.getLength(); i++) {\r
924 if (contentList.item(i).getNodeType() == Node.TEXT_NODE) {\r
925 continue;\r
926 }\r
927 contentNode = contentList.item(i);\r
928 //\r
929 // Parse each <FarFileName>.\r
930 //\r
931 ffList.add(parseFarFile(contentNode));\r
932 }\r
933 }\r
934\r
935 public FarFileItem parseFarFile(Node farFileNode) {\r
936 String ffName = farFileNode.getTextContent();\r
937 NamedNodeMap attr = farFileNode.getAttributes();\r
938 FarFileItem ffItem = new FarFileItem(ffName, attr.getNamedItem(farFileName_Md5sum).getTextContent());\r
939 return ffItem;\r
940 }\r
941\r
942 public boolean isFilter(File file, Set<String> fileter) {\r
943 Iterator<String> iter = fileter.iterator();\r
944 while (iter.hasNext()) {\r
945 Pattern pattern = Pattern.compile(iter.next());\r
946 Matcher matcher = pattern.matcher(file.getName());\r
947\r
948 if (matcher.find()) {\r
949 return true;\r
950 }\r
951 }\r
952 return false;\r
953 }\r
954\r
955}\r