]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/PackageEditor/src/org/tianocore/packaging/DbFileContents.java
Remove the assumption of package location under workspace and prompt user to specify...
[mirror_edk2.git] / Tools / Source / PackageEditor / src / org / tianocore / packaging / DbFileContents.java
CommitLineData
878ddf1f 1/** @file\r
2 Java class DbFileContents is used to deal with FrameworkDatabase.db file cotents.\r
3 \r
4Copyright (c) 2006, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12**/\r
13package org.tianocore.packaging;\r
14\r
15import java.io.File;\r
16import java.io.IOException;\r
17import java.util.LinkedList;\r
18import java.util.List;\r
19import java.util.ListIterator;\r
20import java.util.Date;\r
21import java.text.SimpleDateFormat;\r
22\r
23import org.apache.xmlbeans.XmlCursor;\r
24import org.apache.xmlbeans.XmlObject;\r
25import org.apache.xmlbeans.XmlOptions;\r
26\r
27import org.tianocore.*;\r
28\r
29/**\r
30 This class provides methods for add, remove, query FrameworkDatabase.db file.\r
31 \r
32 @since PackageEditor 1.0\r
33**/\r
34public class DbFileContents {\r
35\r
36 ///\r
37 /// return values for various conditions. \r
38 ///\r
39 static final int BASE_PACKAGE_NOT_INSTALLED = 1;\r
40\r
41 static final int VERSION_NOT_EQUAL = 2;\r
42\r
43 static final int GUID_NOT_EQUAL = 3;\r
44\r
45 static final int SAME_ALL = 4;\r
46\r
47 private File dbFile = null;\r
48\r
49 private FrameworkDatabaseDocument fdd = null;\r
50\r
51 private FrameworkDatabaseDocument.FrameworkDatabase fddRoot = null;\r
52 \r
53 private PackageListDocument.PackageList pkgList = null;\r
54\r
55 public DbFileContents() {\r
56 super();\r
57 // TODO Auto-generated constructor stub\r
58 }\r
59\r
60 /**\r
61 Parse file f, store its xml data in fdd, store root xml element in fddRoot.\r
62 \r
63 @param f DB file to parse\r
64 **/\r
65 public DbFileContents(File f) {\r
66 try {\r
67 dbFile = f;\r
68 if (fdd == null) {\r
69 fdd = ((FrameworkDatabaseDocument) XmlObject.Factory.parse(dbFile));\r
70 }\r
71 fddRoot = fdd.getFrameworkDatabase();\r
72 } catch (Exception e) {\r
73 System.out.println(e.toString());\r
74 }\r
75 }\r
76 \r
77 /**\r
78 Generate the Package element in FrameworkDatabase.db\r
79 \r
80 @param baseName Base name of package\r
81 @param ver Version of package\r
82 @param guid GUID of package\r
83 @param path Where the package installed\r
84 @param installDate When the package installed\r
85 **/\r
86 public void genPackage (String baseName, String ver, String guid, String path, String installDate) {\r
87 if (getPkgList() == null) {\r
88 pkgList = fddRoot.addNewPackageList();\r
89 }\r
90 PackageListDocument.PackageList.Package p = pkgList.addNewPackage();\r
91 p.addNewPackageName().setStringValue(baseName);\r
92 p.addNewGuid().setStringValue(guid);\r
93 p.addVersion(ver);\r
94 p.addNewPath().setStringValue(path);\r
95 p.addNewInstalledDate().setStringValue(installDate);\r
96 }\r
97 \r
98 /**\r
99 Get PackageList\r
100 \r
101 @return PackageListDocument.PackageList\r
102 **/\r
103 public PackageListDocument.PackageList getPkgList() {\r
104 if (pkgList == null) {\r
105 pkgList = fddRoot.getPackageList();\r
106 }\r
107 return pkgList;\r
108 }\r
109 \r
110 /**\r
111 Remove PackageList and all elements under it.\r
112 **/\r
113 public void removePackageList() {\r
114 XmlObject o = fddRoot.getPackageList();\r
115 if (o == null)\r
116 return;\r
117 XmlCursor cursor = o.newCursor();\r
118 cursor.removeXml();\r
119 }\r
120 /**\r
121 Get the number of Package elements.\r
122 \r
123 @return int\r
124 **/\r
125 public int getPackageCount () {\r
126 return fddRoot.getPackageList().getPackageList().size();\r
127 }\r
128 \r
129 /**\r
130 Get all Package contents into String array\r
131 \r
132 @param pkg Two dimentional array to store Package info.\r
133 **/\r
134 public void getPackageList(String[][] pkg) {\r
135 List<PackageListDocument.PackageList.Package> l = fddRoot.getPackageList().getPackageList();\r
136 int i = 0;\r
137 ListIterator li = l.listIterator();\r
138 while (li.hasNext()) {\r
139 PackageListDocument.PackageList.Package p = (PackageListDocument.PackageList.Package) li\r
140 .next();\r
141 if (p.getPackageNameArray(0)!= null) {\r
142 pkg[i][0] = p.getPackageNameArray(0).getStringValue();\r
143 }\r
144 \r
145 pkg[i][1] = p.getVersionArray(0);\r
146 \r
147 if (p.getGuidArray(0) != null) {\r
148 pkg[i][2] = p.getGuidArray(0).getStringValue();\r
149 }\r
150 if (p.getPathArray(0) != null) {\r
151 pkg[i][3] = p.getPathArray(0).getStringValue();\r
152 }\r
153 if (p.getInstalledDateArray(0) != null) {\r
154 pkg[i][4] = p.getInstalledDateArray(0);\r
155 }\r
156 i++;\r
157 }\r
158 }\r
159 /**\r
160 Check whether destDir has been used by one Package\r
161 \r
162 @param destDir The directory to check.\r
163 @retval <1> destDir has been used\r
164 @retval <0> destDir has not been used\r
165 @return int\r
166 **/\r
167 public int checkDir(String destDir) {\r
168 List<PackageListDocument.PackageList.Package> lp = fddRoot.getPackageList().getPackageList();\r
169\r
170 ListIterator lpi = lp.listIterator();\r
171 while (lpi.hasNext()) {\r
172 PackageListDocument.PackageList.Package p = (PackageListDocument.PackageList.Package) lpi.next();\r
173 if (p.getPathArray(0).getStringValue().equals(destDir)) {\r
174 return 1;\r
175 }\r
176 }\r
177 return 0;\r
178 }\r
179\r
180 /**\r
181 Find the package info. and store results into list of same base name or list\r
182 of same version.\r
183 \r
184 @param base The base name of package\r
185 @param version The version of package\r
186 @param guid the GUID of package\r
187 @param lpSameBase The list to store package info with the same base name with "base"\r
188 @param lpSameVersion The list to store package info from lpSameBase and same version\r
189 with "version"\r
190 @retval <0> No package installed has base name "base"\r
191 @retval <VERSION_NOT_EQUAL> At least one package installed with "base" but no "version"\r
192 @retval <GUID_NOT_EQUAL> At least one package installed with "base" and "version" but no "guid"\r
193 @retval <SAME_ALL> One installed package has the same base, version and guid\r
194 @return int\r
195 **/\r
196 public int query(String base, String version, String guid,\r
197 List<PackageListDocument.PackageList.Package> lpSameBase,\r
198 List<PackageListDocument.PackageList.Package> lpSameVersion) {\r
199\r
200 List<PackageListDocument.PackageList.Package> lp = fddRoot.getPackageList().getPackageList();\r
201\r
202 ListIterator lpi = lp.listIterator();\r
203 while (lpi.hasNext()) {\r
204 PackageListDocument.PackageList.Package p = (PackageListDocument.PackageList.Package) lpi.next();\r
205 if (p.getPackageNameArray(0).getStringValue().equals(base)) {\r
206 lpSameBase.add(p);\r
207 }\r
208 }\r
209\r
210 if (lpSameBase.size() == 0) {\r
211 return 0;\r
212 }\r
213\r
214 for (ListIterator li = lpSameBase.listIterator(); li.hasNext();) {\r
215 PackageListDocument.PackageList.Package p = (PackageListDocument.PackageList.Package) li.next();\r
216 if (p.getVersionArray(0).equals(version)) {\r
217 lpSameVersion.add(p);\r
218 }\r
219 }\r
220\r
221 if (lpSameVersion.size() == 0) {\r
222 return VERSION_NOT_EQUAL;\r
223 }\r
224\r
225 for (ListIterator li = lpSameVersion.listIterator(); li.hasNext();) {\r
226 PackageListDocument.PackageList.Package p = (PackageListDocument.PackageList.Package) li.next();\r
227 if (!p.getGuidArray(0).getStringValue().equals(guid)) {\r
228 return GUID_NOT_EQUAL;\r
229 }\r
230 }\r
231\r
232 return SAME_ALL;\r
233\r
234 }\r
235\r
236 /**\r
237 Update package info (name, version, guid) with installDir, newVer, newGuid.\r
238 And update install date with current date. if no package info available, add \r
239 a new entry.\r
240 \r
241 @param name Original base name\r
242 @param version Original version\r
243 @param guid Original GUID\r
244 @param installDir original path\r
245 @param newVer Version value of package to be installed\r
246 @param newGuid GUID value of package to be installed\r
247 @throws IOException Exception during file operation\r
248 **/\r
249 public void updatePkgInfo(String name, String version, String guid, String installDir, String newVer, String newGuid)\r
250 throws IOException {\r
251 List<PackageListDocument.PackageList.Package> lp = fddRoot.getPackageList().getPackageList();\r
252\r
253 ListIterator lpi = lp.listIterator();\r
254 while (lpi.hasNext()) {\r
255 PackageListDocument.PackageList.Package p = (PackageListDocument.PackageList.Package) lpi.next();\r
256 if (p.getPackageNameArray(0).getStringValue().equals(name)) {\r
257 if (p.getVersionArray(0).equals(version)) {\r
258 if (p.getGuidArray(0).getStringValue().equals(guid)) {\r
259 p.setVersionArray(0, newVer);\r
260 p.getGuidArray(0).setStringValue(newGuid);\r
261 p.getPathArray(0).setStringValue(installDir);\r
262 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");\r
263 Date date = new Date();\r
264 p.setInstalledDateArray(0, format.format(date));\r
265 saveAs();\r
266 return;\r
267\r
268 }\r
269 }\r
270 }\r
271 }\r
272\r
273 addNewPkgInfo(name, newVer, newGuid, installDir);\r
274 }\r
275\r
276 /**\r
277 Add one new package entry.\r
278 \r
279 @param name Package base name\r
280 @param version Package version\r
281 @param guid Package Guid\r
282 @param installDir Package path\r
283 @throws IOException Exception during file operation\r
284 **/\r
285 public void addNewPkgInfo(String name, String version, String guid, String installDir) throws IOException {\r
286\r
287 PackageListDocument.PackageList.Package p = fddRoot.getPackageList().addNewPackage();\r
288 p.addNewPackageName().setStringValue(name);\r
289 p.addNewGuid().setStringValue(guid);\r
290 p.addNewVersion().setStringValue(version);\r
33f1b485 291 p.addNewPath().setStringValue(installDir + "/");\r
878ddf1f 292\r
293 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");\r
294 Date date = new Date();\r
295 p.addNewInstalledDate().setStringValue(format.format(date));\r
296 saveAs();\r
297 }\r
298\r
299 /**\r
300 Save the fdd into file with format options\r
301 **/\r
302 public void saveAs() {\r
303 XmlOptions options = new XmlOptions();\r
304\r
305 options.setCharacterEncoding("UTF-8");\r
306 options.setSavePrettyPrint();\r
307 options.setSavePrettyPrintIndent(2);\r
308 try {\r
309 fdd.save(dbFile, options);\r
310 } catch (IOException e) {\r
311 e.printStackTrace();\r
312 }\r
313 }\r
314\r
315}\r