]>
Commit | Line | Data |
---|---|---|
878ddf1f | 1 | /** @file\r |
2 | Java class DbFileContents is used to deal with FrameworkDatabase.db file cotents.\r | |
3 | \r | |
4 | Copyright (c) 2006, Intel Corporation\r | |
5 | All rights reserved. This program and the accompanying materials\r | |
6 | are licensed and made available under the terms and conditions of the BSD License\r | |
7 | which accompanies this distribution. The full text of the license may be found at\r | |
8 | http://opensource.org/licenses/bsd-license.php\r | |
9 | \r | |
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
12 | **/\r | |
13 | package org.tianocore.packaging;\r | |
14 | \r | |
15 | import java.io.File;\r | |
16 | import java.io.IOException;\r | |
17 | import java.util.LinkedList;\r | |
18 | import java.util.List;\r | |
19 | import java.util.ListIterator;\r | |
20 | import java.util.Date;\r | |
21 | import java.text.SimpleDateFormat;\r | |
22 | \r | |
23 | import org.apache.xmlbeans.XmlCursor;\r | |
24 | import org.apache.xmlbeans.XmlObject;\r | |
25 | import org.apache.xmlbeans.XmlOptions;\r | |
26 | \r | |
27 | import 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 | |
34 | public 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 |