]>
Commit | Line | Data |
---|---|---|
b0282412 | 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 | |
12 | **/\r | |
0dc8c589 | 13 | package org.tianocore.migration;\r |
14 | \r | |
15 | import java.io.*;\r | |
16 | import java.util.*;\r | |
eee63a7b | 17 | import java.util.regex.*;\r |
0dc8c589 | 18 | \r |
e83a1d9a | 19 | import org.apache.xmlbeans.XmlObject;\r |
20 | import org.apache.xmlbeans.XmlObject.Factory;\r | |
21 | import org.tianocore.DbPathAndFilename;\r | |
22 | import org.tianocore.FrameworkDatabaseDocument;\r | |
23 | import org.tianocore.FrameworkDatabaseDocument.FrameworkDatabase;\r | |
24 | import org.tianocore.GuidDeclarationsDocument.GuidDeclarations;\r | |
e83a1d9a | 25 | import org.tianocore.PackageListDocument.PackageList;\r |
26 | import org.tianocore.PackageSurfaceAreaDocument;\r | |
27 | import org.tianocore.PackageSurfaceAreaDocument.PackageSurfaceArea;\r | |
99f757db | 28 | import org.tianocore.PpiDeclarationsDocument.PpiDeclarations;\r |
29 | import org.tianocore.ProtocolDeclarationsDocument.ProtocolDeclarations;\r | |
30 | import org.tianocore.LibraryClassDeclarationsDocument.LibraryClassDeclarations;\r | |
31 | import org.tianocore.LibraryClassDeclarationsDocument.LibraryClassDeclarations.LibraryClass;\r | |
e83a1d9a | 32 | \r |
7bcb8d17 | 33 | public final class Database {\r |
8de9f9e1 | 34 | private static final Database INSTANCE = Database.init();;\r |
27e0221a | 35 | \r |
36 | Database(String path) {\r | |
37 | DatabasePath = path;\r | |
4f60c26f | 38 | \r |
27e0221a | 39 | try {\r |
76734b24 | 40 | //collectWorkSpaceDatabase();\r |
9c0e70cb | 41 | importPkgGuid("PkgGuid.csv");\r |
27e0221a | 42 | importDBLib("Library.csv");\r |
43 | importDBGuid("Guid.csv", "Guid");\r | |
44 | importDBGuid("Ppi.csv", "Ppi");\r | |
45 | importDBGuid("Protocol.csv", "Protocol");\r | |
46 | importDBMacro("Macro.csv");\r | |
47 | importListR8Only();\r | |
48 | } catch (Exception e) {\r | |
49 | System.out.println(e.getMessage());\r | |
50 | }\r | |
51 | }\r | |
52 | \r | |
53 | public String DatabasePath;\r | |
54 | public Set<String> error = new HashSet<String>();\r | |
55 | public Set<String> r8only = new HashSet<String>();\r | |
56 | \r | |
57 | private Map<String,Guid> hashguid = new HashMap<String,Guid>();\r | |
58 | private Map<String,Func> hashfunc = new HashMap<String,Func>();\r | |
59 | private Map<String,Macro> hashmacro = new HashMap<String,Macro>();\r | |
9c0e70cb | 60 | private Map<String,String> hashPkgGuid = new HashMap<String,String>();\r |
e83a1d9a | 61 | \r |
27e0221a | 62 | \r |
63 | //-------------------------------------import------------------------------------------//\r | |
9c0e70cb | 64 | private void importPkgGuid(String filename) throws Exception {\r |
65 | BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r | |
66 | String line;\r | |
67 | String[] linecontext;\r | |
9c0e70cb | 68 | \r |
69 | if (rd.ready()) {\r | |
70 | System.out.println("Found " + filename + ", Importing Package Guid Database.");\r | |
71 | //\r | |
72 | // Skip the title row.\r | |
73 | // \r | |
74 | line = rd.readLine();\r | |
75 | while ((line = rd.readLine()) != null) {\r | |
76 | if (line.length() != 0) {\r | |
77 | linecontext = line.split(",");\r | |
78 | hashPkgGuid.put(linecontext[0], linecontext[1]);\r | |
79 | }\r | |
80 | }\r | |
81 | }\r | |
82 | }\r | |
83 | public Iterator<String> dumpAllPkgGuid() {\r | |
84 | return hashPkgGuid.values().iterator();\r | |
85 | }\r | |
27e0221a | 86 | private void importDBLib(String filename) throws Exception {\r |
87 | BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r | |
88 | String line;\r | |
89 | String[] linecontext;\r | |
90 | Func lf;\r | |
91 | \r | |
92 | if (rd.ready()) {\r | |
93 | System.out.println("Found " + filename + ", Importing Library Database.");\r | |
94 | while ((line = rd.readLine()) != null) {\r | |
95 | if (line.length() != 0) {\r | |
96 | linecontext = line.split(",");\r | |
97 | lf = new Func(linecontext);\r | |
98 | hashfunc.put(lf.r8funcname,lf);\r | |
99 | }\r | |
100 | }\r | |
101 | }\r | |
102 | }\r | |
103 | \r | |
104 | private void importDBGuid(String filename, String type) throws Exception {\r | |
105 | BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r | |
106 | String line;\r | |
107 | String[] linecontext;\r | |
108 | Guid gu;\r | |
109 | \r | |
110 | if (rd.ready()) {\r | |
111 | System.out.println("Found " + filename + ", Importing " + type + " Database.");\r | |
112 | while ((line = rd.readLine()) != null) {\r | |
113 | if (line.length() != 0) {\r | |
114 | linecontext = line.split(",");\r | |
115 | gu = new Guid(linecontext, type);\r | |
116 | hashguid.put(gu.r8name,gu);\r | |
117 | }\r | |
118 | }\r | |
119 | }\r | |
120 | }\r | |
121 | \r | |
122 | private void importDBMacro(String filename) throws Exception {\r | |
123 | BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename));\r | |
124 | String line;\r | |
125 | String[] linecontext;\r | |
126 | Macro mc;\r | |
127 | \r | |
128 | if (rd.ready()) {\r | |
129 | System.out.println("Found " + filename + ", Importing Macro Database.");\r | |
130 | while ((line = rd.readLine()) != null) {\r | |
131 | if (line.length() != 0) {\r | |
132 | linecontext = line.split(",");\r | |
133 | mc = new Macro(linecontext);\r | |
134 | hashmacro.put(mc.r8name,mc);\r | |
135 | }\r | |
136 | }\r | |
137 | }\r | |
138 | }\r | |
eee63a7b | 139 | \r |
27e0221a | 140 | private void importListR8Only() throws Exception {\r |
141 | Pattern ptnr8only = Pattern.compile("////#?(\\w*)?.*?R8_(.*?)\\s*\\(.*?////~", Pattern.DOTALL);\r | |
142 | String wholeline = Common.file2string(DatabasePath + File.separator + "R8Lib.c");\r | |
143 | System.out.println("Found " + "R8Lib.c" + ", Importing R8Lib Database.");\r | |
144 | Matcher mtrr8only = ptnr8only.matcher(wholeline);\r | |
145 | while (mtrr8only.find()) {\r | |
146 | r8only.add(mtrr8only.group(2));\r | |
147 | }\r | |
148 | }\r | |
149 | \r | |
150 | //-------------------------------------import------------------------------------------//\r | |
eee63a7b | 151 | \r |
27e0221a | 152 | //-------------------------------------get------------------------------------------//\r |
eee63a7b | 153 | \r |
27e0221a | 154 | public String getR9Lib(String r8funcname) {\r |
155 | String temp = null;\r | |
156 | if (hashfunc.containsKey(r8funcname)) {\r | |
157 | temp = hashfunc.get(r8funcname).r9libname;\r | |
158 | }\r | |
159 | return temp;\r | |
160 | }\r | |
161 | \r | |
162 | public String getR9Func(String r8funcname) {\r | |
163 | String temp = null;\r | |
164 | if (hashfunc.containsKey(r8funcname)) {\r | |
165 | temp = hashfunc.get(r8funcname).r9funcname;\r | |
166 | }\r | |
167 | return temp;\r | |
168 | }\r | |
169 | \r | |
170 | public String getR9Macro(String r8macro) {\r | |
171 | return hashmacro.get(r8macro).r9name; // the verification job of if the macro exists in the database is done when registering it\r | |
172 | }\r | |
7bcb8d17 | 173 | \r |
27e0221a | 174 | public String getR9Guidname(String r8Guid) {\r |
175 | String temp = null;\r | |
176 | try {\r | |
177 | temp = hashguid.get(r8Guid).r9name;\r | |
178 | } catch (NullPointerException e) {\r | |
179 | error.add("getR9Guidname :" + r8Guid);\r | |
180 | }\r | |
181 | return temp;\r | |
182 | }\r | |
7bcb8d17 | 183 | \r |
27e0221a | 184 | public String getGuidType(String r8Guid) {\r |
185 | String temp = null;\r | |
186 | try {\r | |
187 | temp = hashguid.get(r8Guid).type;\r | |
188 | } catch (NullPointerException e) {\r | |
189 | error.add("getR9Guidname :" + r8Guid);\r | |
190 | }\r | |
191 | return temp;\r | |
192 | }\r | |
7bcb8d17 | 193 | \r |
27e0221a | 194 | //-------------------------------------get------------------------------------------//\r |
eee63a7b | 195 | \r |
27e0221a | 196 | //-------------------------------------has------------------------------------------//\r |
eee63a7b | 197 | \r |
27e0221a | 198 | public boolean hasFunc(String r8lib) {\r |
199 | return hashfunc.containsKey(r8lib);\r | |
200 | }\r | |
eee63a7b | 201 | \r |
27e0221a | 202 | public boolean hasGuid(String r8guid) {\r |
203 | return hashguid.containsKey(r8guid);\r | |
204 | }\r | |
eee63a7b | 205 | \r |
27e0221a | 206 | public boolean hasMacro(String r8macro) {\r |
207 | return hashmacro.containsKey(r8macro);\r | |
208 | }\r | |
209 | \r | |
210 | //-------------------------------------has------------------------------------------//\r | |
211 | \r | |
212 | //-------------------------------------init------------------------------------------//\r | |
4f60c26f | 213 | \r |
27e0221a | 214 | private static final Database init() {\r |
215 | if (System.getenv("WORKSPACE") == null) {\r | |
216 | return new Database("C:" + File.separator + "tianocore" + File.separator + "edk2" + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration");\r | |
217 | } else {\r | |
218 | return new Database(System.getenv("WORKSPACE") + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration");\r | |
219 | }\r | |
220 | }\r | |
221 | \r | |
222 | public static final Database getInstance() {\r | |
223 | return INSTANCE;\r | |
224 | }\r | |
e83a1d9a | 225 | \r |
e83a1d9a | 226 | \r |
99f757db | 227 | \r |
8de9f9e1 | 228 | private String workspacePath;\r |
229 | private HashMap<String, String> hashDbGuids = new HashMap<String, String>();\r | |
230 | private HashMap<String, String> hashDbPpis = new HashMap<String, String>();\r | |
231 | private HashMap<String, String> hashDbProtocols = new HashMap<String, String>();\r | |
232 | private HashMap<String, String> hashDbLibSymbols = new HashMap<String, String>();\r | |
233 | private HashMap<String, String> hashDbLibFunctions = new HashMap<String, String>();\r | |
234 | private HashMap<String, String> hashDbLibExterns = new HashMap<String, String>();\r | |
99f757db | 235 | \r |
8de9f9e1 | 236 | private final String regLibClassName = ".*\\W(\\w[\\w\\d]*)\\.h";\r |
237 | private final Pattern ptnLibClassName = Pattern.compile(regLibClassName);\r | |
99f757db | 238 | \r |
8de9f9e1 | 239 | private final String regLibSymbol = "#define\\s+(\\w[\\w\\d]*)";\r |
240 | private final Pattern ptnLibSymbol = Pattern.compile(regLibSymbol);\r | |
99f757db | 241 | \r |
8de9f9e1 | 242 | private final String regLibDataType = "[A-Z][A-Z0-9_]*\\s*\\**";\r |
243 | private final String regLibFunction = regLibDataType + "\\s*(?:EFIAPI)?\\s+" + \r | |
99f757db | 244 | "(\\w[\\w\\d]*)\\s*\\([^)]*\\)\\s*;";\r |
8de9f9e1 | 245 | private Pattern ptnLibFunction = Pattern.compile(regLibFunction);\r |
99f757db | 246 | \r |
8de9f9e1 | 247 | private final String regLibExtern = "extern\\s+" + regLibDataType + \r |
76734b24 | 248 | "\\s*(\\w[\\w\\d]*)";\r |
8de9f9e1 | 249 | private final Pattern ptnLibExtern = Pattern.compile(regLibExtern);\r |
99f757db | 250 | \r |
8de9f9e1 | 251 | private final String convertToOsFilePath(String filePath) {\r |
99f757db | 252 | return filePath.replace("/", File.separator).replace("\\", File.separator);\r |
253 | }\r | |
8de9f9e1 | 254 | private final void collectLibHeaderFileInfo(String libHeaderFile, String pkgGuid) throws Exception {\r |
99f757db | 255 | String fileContents;\r |
256 | String libClassName;\r | |
257 | String libContainer;\r | |
258 | Matcher mtrLibClass;\r | |
259 | Matcher mtrLibSymbol;\r | |
260 | Matcher mtrLibFunction;\r | |
261 | Matcher mtrLibExtern;\r | |
262 | \r | |
263 | System.out.println ("Parsing: " + libHeaderFile);\r | |
264 | mtrLibClass = ptnLibClassName.matcher(libHeaderFile);\r | |
265 | if (!mtrLibClass.matches()) {\r | |
266 | throw new Exception("Illegal libary header file");\r | |
267 | }\r | |
268 | libClassName = mtrLibClass.group(1);\r | |
269 | libContainer = libClassName + "@" + pkgGuid;\r | |
270 | \r | |
271 | fileContents = Common.file2string(libHeaderFile);\r | |
272 | mtrLibSymbol = ptnLibSymbol.matcher(fileContents);\r | |
273 | while (mtrLibSymbol.find()) {\r | |
274 | String libSymbol;\r | |
275 | String oldLibContainer;\r | |
276 | \r | |
277 | libSymbol = mtrLibSymbol.group(1);\r | |
278 | oldLibContainer = hashDbLibSymbols.put(libSymbol, libContainer);\r | |
279 | if (oldLibContainer != null) {\r | |
280 | String warnMessage;\r | |
281 | \r | |
282 | warnMessage = "Duplicated Lib Symbol:" + libSymbol + " Found. " +\r | |
283 | "Later package will overide the previous one"; \r | |
284 | System.out.println(warnMessage);\r | |
285 | }\r | |
286 | }\r | |
287 | \r | |
288 | mtrLibFunction = ptnLibFunction.matcher(fileContents);\r | |
289 | while (mtrLibFunction.find()) {\r | |
290 | String libFunction;\r | |
291 | String oldLibContainer;\r | |
292 | \r | |
293 | libFunction = mtrLibFunction.group(1);\r | |
294 | oldLibContainer = hashDbLibFunctions.put(libFunction, libContainer);\r | |
295 | if (oldLibContainer != null) {\r | |
296 | String warnMessage;\r | |
297 | \r | |
298 | warnMessage = "Duplicated Lib Function:" + libFunction + " Found. " +\r | |
299 | "Later package will overide the previous one"; \r | |
300 | System.out.println(warnMessage);\r | |
301 | }\r | |
302 | }\r | |
303 | \r | |
304 | mtrLibExtern = ptnLibExtern.matcher(fileContents);\r | |
305 | while (mtrLibExtern.find()) {\r | |
306 | String libExtern;\r | |
307 | String oldLibContainer;\r | |
308 | \r | |
309 | libExtern = mtrLibExtern.group(1);\r | |
310 | oldLibContainer = hashDbLibExterns.put(libExtern, libContainer);\r | |
311 | if (oldLibContainer != null) {\r | |
312 | String warnMessage;\r | |
313 | \r | |
314 | warnMessage = "Duplicated Lib Extern:" + libExtern + " Found. " +\r | |
315 | "Later package will overide the previous one"; \r | |
316 | System.out.println(warnMessage);\r | |
317 | }\r | |
318 | }\r | |
319 | }\r | |
8de9f9e1 | 320 | private final void collectLibDataBase(PackageSurfaceArea spdDatabase, String pkgDirectory) throws Exception {\r |
99f757db | 321 | String pkgGuid;\r |
322 | LibraryClassDeclarations libClassDeclarations;\r | |
323 | \r | |
324 | pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r | |
325 | libClassDeclarations = spdDatabase.getLibraryClassDeclarations();\r | |
326 | if (libClassDeclarations != null) {\r | |
327 | Iterator<LibraryClass> itLibClass;\r | |
328 | \r | |
329 | itLibClass = libClassDeclarations.getLibraryClassList().iterator();\r | |
330 | while (itLibClass.hasNext()) {\r | |
331 | String libHeaderFile;\r | |
332 | \r | |
333 | libHeaderFile = pkgDirectory + File.separator +\r | |
334 | itLibClass.next().getIncludeHeader(); \r | |
335 | libHeaderFile = convertToOsFilePath (libHeaderFile);\r | |
336 | try {\r | |
337 | collectLibHeaderFileInfo(libHeaderFile, pkgGuid);\r | |
338 | } catch (Exception e) {\r | |
339 | String errorMessage;\r | |
340 | \r | |
341 | errorMessage = "Error (" + e.getMessage() + ")occurs when parsing " +\r | |
342 | libHeaderFile;\r | |
343 | System.out.println(errorMessage);\r | |
344 | }\r | |
345 | }\r | |
346 | }\r | |
347 | }\r | |
8de9f9e1 | 348 | private final void collectGuidDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r |
e83a1d9a | 349 | String pkgGuid;\r |
99f757db | 350 | GuidDeclarations guidDeclarations;\r |
e83a1d9a | 351 | \r |
352 | pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r | |
99f757db | 353 | guidDeclarations = spdDatabase.getGuidDeclarations();\r |
354 | if (guidDeclarations != null) {\r | |
355 | Iterator<GuidDeclarations.Entry> itGuids;\r | |
e83a1d9a | 356 | \r |
99f757db | 357 | itGuids = guidDeclarations.getEntryList().iterator();\r |
358 | while (itGuids.hasNext()) {\r | |
359 | hashDbGuids.put(itGuids.next().getCName(), pkgGuid); \r | |
360 | }\r | |
e83a1d9a | 361 | }\r |
99f757db | 362 | \r |
e83a1d9a | 363 | }\r |
364 | \r | |
8de9f9e1 | 365 | private final void collectPpiDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r |
e83a1d9a | 366 | String pkgGuid;\r |
99f757db | 367 | PpiDeclarations ppiDeclarations;\r |
e83a1d9a | 368 | \r |
369 | pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r | |
99f757db | 370 | ppiDeclarations = spdDatabase.getPpiDeclarations();\r |
e83a1d9a | 371 | \r |
99f757db | 372 | if (ppiDeclarations != null) {\r |
373 | Iterator<PpiDeclarations.Entry> itPpis;\r | |
374 | \r | |
375 | itPpis = ppiDeclarations.getEntryList().iterator();\r | |
376 | while (itPpis.hasNext()) {\r | |
377 | hashDbPpis.put(itPpis.next().getCName(), pkgGuid); \r | |
378 | }\r | |
e83a1d9a | 379 | }\r |
99f757db | 380 | \r |
e83a1d9a | 381 | }\r |
382 | \r | |
8de9f9e1 | 383 | private final void collectProtocolDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r |
e83a1d9a | 384 | String pkgGuid;\r |
99f757db | 385 | ProtocolDeclarations protocolDeclarations;\r |
e83a1d9a | 386 | \r |
387 | pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r | |
99f757db | 388 | protocolDeclarations = spdDatabase.getProtocolDeclarations();\r |
e83a1d9a | 389 | \r |
99f757db | 390 | if (protocolDeclarations != null) {\r |
391 | Iterator<ProtocolDeclarations.Entry> itProtocols;\r | |
392 | \r | |
393 | itProtocols = protocolDeclarations.getEntryList().iterator();\r | |
394 | while (itProtocols.hasNext()) {\r | |
395 | hashDbGuids.put(itProtocols.next().getCName(), pkgGuid); \r | |
396 | }\r | |
e83a1d9a | 397 | }\r |
99f757db | 398 | \r |
e83a1d9a | 399 | }\r |
400 | \r | |
8de9f9e1 | 401 | private final void collectPackageDatabase(String packageFileName) throws Exception {\r |
e83a1d9a | 402 | XmlObject xmlPackage;\r |
403 | PackageSurfaceArea spdDatabase;\r | |
99f757db | 404 | File pkgFile;\r |
405 | \r | |
406 | pkgFile = new File(packageFileName);\r | |
407 | xmlPackage = XmlObject.Factory.parse(pkgFile);\r | |
e83a1d9a | 408 | spdDatabase = ((PackageSurfaceAreaDocument) xmlPackage).getPackageSurfaceArea();\r |
99f757db | 409 | \r |
e83a1d9a | 410 | collectGuidDatabase(spdDatabase);\r |
411 | collectProtocolDatabase(spdDatabase);\r | |
412 | collectPpiDatabase(spdDatabase);\r | |
99f757db | 413 | collectLibDataBase(spdDatabase, pkgFile.getParent());\r |
e83a1d9a | 414 | \r |
415 | \r | |
416 | }\r | |
8de9f9e1 | 417 | public final void collectWorkSpaceDatabase() throws Exception {\r |
e83a1d9a | 418 | String databaseFileName;\r |
419 | File databaseFile;\r | |
420 | XmlObject xmlDatabase;\r | |
421 | FrameworkDatabase frameworkDatabase;\r | |
422 | Iterator<DbPathAndFilename> packageFile;\r | |
423 | \r | |
424 | workspacePath = System.getenv("WORKSPACE");\r | |
425 | \r | |
426 | if (workspacePath == null) {\r | |
427 | String errorMessage = "Envivornment variable \"WORKSPACE\" is not set!";\r | |
428 | throw new Exception(errorMessage);\r | |
429 | }\r | |
430 | databaseFileName = workspacePath + File.separator + \r | |
431 | "Tools" + File.separator +\r | |
432 | "Conf" + File.separator + \r | |
433 | "FrameworkDatabase.db";\r | |
434 | System.out.println("Open " + databaseFileName);\r | |
435 | databaseFile = new File(databaseFileName);\r | |
436 | xmlDatabase = XmlObject.Factory.parse(databaseFile);\r | |
437 | frameworkDatabase = ((FrameworkDatabaseDocument) xmlDatabase).getFrameworkDatabase();\r | |
438 | packageFile = frameworkDatabase.getPackageList().getFilenameList().iterator();\r | |
439 | \r | |
440 | while (packageFile.hasNext()) {\r | |
441 | String packageFileName = packageFile.next().getStringValue();\r | |
442 | packageFileName = workspacePath + File.separator + packageFileName;\r | |
99f757db | 443 | packageFileName = convertToOsFilePath(packageFileName);\r |
e83a1d9a | 444 | \r |
99f757db | 445 | System.out.println("Parsing: " + packageFileName);\r |
e83a1d9a | 446 | try {\r |
447 | collectPackageDatabase(packageFileName);\r | |
448 | } catch (Exception e) {\r | |
449 | System.out.println("Error occured when opening " + packageFileName + e.getMessage());\r | |
450 | }\r | |
451 | }\r | |
e83a1d9a | 452 | }\r |
0dc8c589 | 453 | }\r |