JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / JU / ZipTools.js
1 Clazz.declarePackage ("JU");\r
2 Clazz.load (["javajs.api.GenericZipTools"], "JU.ZipTools", ["java.io.BufferedInputStream", "$.IOException", "java.lang.Boolean", "java.util.zip.CRC32", "$.GZIPInputStream", "$.ZipEntry", "$.ZipInputStream", "javajs.api.GenericZipInputStream", "$.ZInputStream", "JU.BArray", "$.Lst", "$.PT", "$.Rdr", "$.SB"], function () {\r
3 c$ = Clazz.declareType (JU, "ZipTools", null, javajs.api.GenericZipTools);\r
4 Clazz.makeConstructor (c$, \r
5 function () {\r
6 });\r
7 Clazz.overrideMethod (c$, "newZipInputStream", \r
8 function (is) {\r
9 return JU.ZipTools.newZIS (is);\r
10 }, "java.io.InputStream");\r
11 c$.newZIS = Clazz.defineMethod (c$, "newZIS", \r
12  function (is) {\r
13 return (Clazz.instanceOf (is, javajs.api.ZInputStream) ? is : Clazz.instanceOf (is, java.io.BufferedInputStream) ?  new javajs.api.GenericZipInputStream (is) :  new javajs.api.GenericZipInputStream ( new java.io.BufferedInputStream (is)));\r
14 }, "java.io.InputStream");\r
15 Clazz.overrideMethod (c$, "getAllZipData", \r
16 function (is, subfileList, name0, binaryFileList, fileData) {\r
17 var zis = JU.ZipTools.newZIS (is);\r
18 var ze;\r
19 var listing =  new JU.SB ();\r
20 binaryFileList = "|" + binaryFileList + "|";\r
21 var prefix = JU.PT.join (subfileList, '/', 1);\r
22 var prefixd = null;\r
23 if (prefix != null) {\r
24 prefixd = prefix.substring (0, prefix.indexOf ("/") + 1);\r
25 if (prefixd.length == 0) prefixd = null;\r
26 }try {\r
27 while ((ze = zis.getNextEntry ()) != null) {\r
28 var name = ze.getName ();\r
29 if (prefix != null && prefixd != null && !(name.equals (prefix) || name.startsWith (prefixd))) continue;\r
30 listing.append (name).appendC ('\n');\r
31 var sname = "|" + name.substring (name.lastIndexOf ("/") + 1) + "|";\r
32 var asBinaryString = (binaryFileList.indexOf (sname) >= 0);\r
33 var bytes = JU.Rdr.getLimitedStreamBytes (zis, ze.getSize ());\r
34 var str;\r
35 if (asBinaryString) {\r
36 str = this.getBinaryStringForBytes (bytes);\r
37 name += ":asBinaryString";\r
38 } else {\r
39 str = JU.Rdr.fixUTF (bytes);\r
40 }str = "BEGIN Directory Entry " + name + "\n" + str + "\nEND Directory Entry " + name + "\n";\r
41 fileData.put (name0 + "|" + name, str);\r
42 }\r
43 } catch (e) {\r
44 if (Clazz.exceptionOf (e, Exception)) {\r
45 } else {\r
46 throw e;\r
47 }\r
48 }\r
49 fileData.put ("#Directory_Listing", listing.toString ());\r
50 }, "java.io.InputStream,~A,~S,~S,java.util.Map");\r
51 Clazz.defineMethod (c$, "getBinaryStringForBytes", \r
52  function (bytes) {\r
53 var ret =  new JU.SB ();\r
54 for (var i = 0; i < bytes.length; i++) ret.append (Integer.toHexString (bytes[i] & 0xFF)).appendC (' ');\r
55 \r
56 return ret.toString ();\r
57 }, "~A");\r
58 Clazz.overrideMethod (c$, "getZipFileDirectory", \r
59 function (jzt, bis, list, listPtr, asBufferedInputStream) {\r
60 var ret;\r
61 if (list == null || listPtr >= list.length) return this.getZipDirectoryAsStringAndClose (bis);\r
62 bis = JU.Rdr.getPngZipStream (bis, true);\r
63 var fileName = list[listPtr];\r
64 var zis =  new java.util.zip.ZipInputStream (bis);\r
65 var ze;\r
66 try {\r
67 var isAll = (fileName.equals ("."));\r
68 if (isAll || fileName.lastIndexOf ("/") == fileName.length - 1) {\r
69 ret =  new JU.SB ();\r
70 while ((ze = zis.getNextEntry ()) != null) {\r
71 var name = ze.getName ();\r
72 if (isAll || name.startsWith (fileName)) ret.append (name).appendC ('\n');\r
73 }\r
74 var str = ret.toString ();\r
75 return (asBufferedInputStream ? JU.Rdr.getBIS (str.getBytes ()) : str);\r
76 }var pt = fileName.indexOf (":asBinaryString");\r
77 var asBinaryString = (pt > 0);\r
78 if (asBinaryString) fileName = fileName.substring (0, pt);\r
79 fileName = fileName.$replace ('\\', '/');\r
80 while ((ze = zis.getNextEntry ()) != null && !fileName.equals (ze.getName ())) {\r
81 }\r
82 var bytes = (ze == null ? null : JU.Rdr.getLimitedStreamBytes (zis, ze.getSize ()));\r
83 ze = null;\r
84 zis.close ();\r
85 if (bytes == null) return "";\r
86 if (JU.Rdr.isZipB (bytes) || JU.Rdr.isPngZipB (bytes)) return this.getZipFileDirectory (jzt, JU.Rdr.getBIS (bytes), list, ++listPtr, asBufferedInputStream);\r
87 if (asBufferedInputStream) return JU.Rdr.getBIS (bytes);\r
88 if (asBinaryString) {\r
89 ret =  new JU.SB ();\r
90 for (var i = 0; i < bytes.length; i++) ret.append (Integer.toHexString (bytes[i] & 0xFF)).appendC (' ');\r
91 \r
92 return ret.toString ();\r
93 }if (JU.Rdr.isGzipB (bytes)) bytes = JU.Rdr.getLimitedStreamBytes (this.getUnGzippedInputStream (bytes), -1);\r
94 return JU.Rdr.fixUTF (bytes);\r
95 } catch (e) {\r
96 if (Clazz.exceptionOf (e, Exception)) {\r
97 return "";\r
98 } else {\r
99 throw e;\r
100 }\r
101 }\r
102 }, "javajs.api.GenericZipTools,java.io.BufferedInputStream,~A,~N,~B");\r
103 Clazz.overrideMethod (c$, "getZipFileContentsAsBytes", \r
104 function (bis, list, listPtr) {\r
105 var ret =  Clazz.newByteArray (0, 0);\r
106 var fileName = list[listPtr];\r
107 if (fileName.lastIndexOf ("/") == fileName.length - 1) return ret;\r
108 try {\r
109 bis = JU.Rdr.getPngZipStream (bis, true);\r
110 var zis =  new java.util.zip.ZipInputStream (bis);\r
111 var ze;\r
112 while ((ze = zis.getNextEntry ()) != null) {\r
113 if (!fileName.equals (ze.getName ())) continue;\r
114 var bytes = JU.Rdr.getLimitedStreamBytes (zis, ze.getSize ());\r
115 return ((JU.Rdr.isZipB (bytes) || JU.Rdr.isPngZipB (bytes)) && ++listPtr < list.length ? this.getZipFileContentsAsBytes (JU.Rdr.getBIS (bytes), list, listPtr) : bytes);\r
116 }\r
117 } catch (e) {\r
118 if (Clazz.exceptionOf (e, Exception)) {\r
119 } else {\r
120 throw e;\r
121 }\r
122 }\r
123 return ret;\r
124 }, "java.io.BufferedInputStream,~A,~N");\r
125 Clazz.overrideMethod (c$, "getZipDirectoryAsStringAndClose", \r
126 function (bis) {\r
127 var sb =  new JU.SB ();\r
128 var s =  new Array (0);\r
129 try {\r
130 s = this.getZipDirectoryOrErrorAndClose (bis, null);\r
131 bis.close ();\r
132 } catch (e) {\r
133 if (Clazz.exceptionOf (e, Exception)) {\r
134 System.out.println (e.toString ());\r
135 } else {\r
136 throw e;\r
137 }\r
138 }\r
139 for (var i = 0; i < s.length; i++) sb.append (s[i]).appendC ('\n');\r
140 \r
141 return sb.toString ();\r
142 }, "java.io.BufferedInputStream");\r
143 Clazz.overrideMethod (c$, "getZipDirectoryAndClose", \r
144 function (bis, manifestID) {\r
145 var s =  new Array (0);\r
146 try {\r
147 s = this.getZipDirectoryOrErrorAndClose (bis, manifestID);\r
148 bis.close ();\r
149 } catch (e) {\r
150 if (Clazz.exceptionOf (e, Exception)) {\r
151 System.out.println (e.toString ());\r
152 } else {\r
153 throw e;\r
154 }\r
155 }\r
156 return s;\r
157 }, "java.io.BufferedInputStream,~S");\r
158 Clazz.defineMethod (c$, "getZipDirectoryOrErrorAndClose", \r
159  function (bis, manifestID) {\r
160 bis = JU.Rdr.getPngZipStream (bis, true);\r
161 var v =  new JU.Lst ();\r
162 var zis =  new java.util.zip.ZipInputStream (bis);\r
163 var ze;\r
164 var manifest = null;\r
165 while ((ze = zis.getNextEntry ()) != null) {\r
166 var fileName = ze.getName ();\r
167 if (manifestID != null && fileName.startsWith (manifestID)) manifest = JU.ZipTools.getStreamAsString (zis);\r
168  else if (!fileName.startsWith ("__MACOS")) v.addLast (fileName);\r
169 }\r
170 zis.close ();\r
171 if (manifestID != null) v.add (0, manifest == null ? "" : manifest + "\n############\n");\r
172 return v.toArray ( new Array (v.size ()));\r
173 }, "java.io.BufferedInputStream,~S");\r
174 c$.getStreamAsString = Clazz.defineMethod (c$, "getStreamAsString", \r
175 function (is) {\r
176 return JU.Rdr.fixUTF (JU.Rdr.getLimitedStreamBytes (is, -1));\r
177 }, "java.io.InputStream");\r
178 Clazz.overrideMethod (c$, "newGZIPInputStream", \r
179 function (is) {\r
180 return  new java.io.BufferedInputStream ( new java.util.zip.GZIPInputStream (is, 512));\r
181 }, "java.io.InputStream");\r
182 Clazz.overrideMethod (c$, "getUnGzippedInputStream", \r
183 function (bytes) {\r
184 try {\r
185 return JU.Rdr.getUnzippedInputStream (this, JU.Rdr.getBIS (bytes));\r
186 } catch (e) {\r
187 if (Clazz.exceptionOf (e, Exception)) {\r
188 return null;\r
189 } else {\r
190 throw e;\r
191 }\r
192 }\r
193 }, "~A");\r
194 Clazz.overrideMethod (c$, "addZipEntry", \r
195 function (zos, fileName) {\r
196 (zos).putNextEntry ( new java.util.zip.ZipEntry (fileName));\r
197 }, "~O,~S");\r
198 Clazz.overrideMethod (c$, "closeZipEntry", \r
199 function (zos) {\r
200 (zos).closeEntry ();\r
201 }, "~O");\r
202 Clazz.overrideMethod (c$, "getZipOutputStream", \r
203 function (bos) {\r
204 {\r
205 return javajs.api.Interface.getInterface(\r
206 "java.util.zip.ZipOutputStream").setZOS(bos);\r
207 }}, "~O");\r
208 Clazz.overrideMethod (c$, "getCrcValue", \r
209 function (bytes) {\r
210 var crc =  new java.util.zip.CRC32 ();\r
211 crc.update (bytes, 0, bytes.length);\r
212 return crc.getValue ();\r
213 }, "~A");\r
214 Clazz.overrideMethod (c$, "readFileAsMap", \r
215 function (bis, bdata, name) {\r
216 var pt = (name == null ? -1 : name.indexOf ("|"));\r
217 name = (pt >= 0 ? name.substring (pt + 1) : null);\r
218 try {\r
219 if (JU.Rdr.isPngZipStream (bis)) {\r
220 var isImage = "_IMAGE_".equals (name);\r
221 if (name == null || isImage) bdata.put ((isImage ? "_DATA_" : "_IMAGE_"),  new JU.BArray (JU.ZipTools.getPngImageBytes (bis)));\r
222 if (!isImage) this.cacheZipContents (bis, name, bdata, true);\r
223 } else if (JU.Rdr.isZipS (bis)) {\r
224 this.cacheZipContents (bis, name, bdata, true);\r
225 } else if (name == null) {\r
226 bdata.put ("_DATA_",  new JU.BArray (JU.Rdr.getLimitedStreamBytes (bis, -1)));\r
227 } else {\r
228 throw  new java.io.IOException ("ZIP file " + name + " not found");\r
229 }bdata.put ("$_BINARY_$", Boolean.TRUE);\r
230 } catch (e) {\r
231 if (Clazz.exceptionOf (e, java.io.IOException)) {\r
232 bdata.clear ();\r
233 bdata.put ("_ERROR_", e.getMessage ());\r
234 } else {\r
235 throw e;\r
236 }\r
237 }\r
238 }, "java.io.BufferedInputStream,java.util.Map,~S");\r
239 Clazz.overrideMethod (c$, "cacheZipContents", \r
240 function (bis, fileName, cache, asByteArray) {\r
241 var zis = JU.ZipTools.newZIS (bis);\r
242 var ze;\r
243 var listing =  new JU.SB ();\r
244 var n = 0;\r
245 var oneFile = (asByteArray && fileName != null);\r
246 var pt = (oneFile ? fileName.indexOf ("|") : -1);\r
247 var file0 = (pt >= 0 ? fileName : null);\r
248 if (pt >= 0) fileName = fileName.substring (0, pt);\r
249 try {\r
250 while ((ze = zis.getNextEntry ()) != null) {\r
251 var name = ze.getName ();\r
252 if (fileName != null) {\r
253 if (oneFile) {\r
254 if (!name.equalsIgnoreCase (fileName)) continue;\r
255 } else {\r
256 listing.append (name).appendC ('\n');\r
257 }}var nBytes = ze.getSize ();\r
258 var bytes = JU.Rdr.getLimitedStreamBytes (zis, nBytes);\r
259 if (file0 != null) {\r
260 this.readFileAsMap (JU.Rdr.getBIS (bytes), cache, file0);\r
261 return null;\r
262 }n += bytes.length;\r
263 var o = (asByteArray ?  new JU.BArray (bytes) : bytes);\r
264 cache.put ((oneFile ? "_DATA_" : (fileName == null ? "" : fileName + "|") + name), o);\r
265 if (oneFile) break;\r
266 }\r
267 zis.close ();\r
268 } catch (e) {\r
269 if (Clazz.exceptionOf (e, Exception)) {\r
270 try {\r
271 zis.close ();\r
272 } catch (e1) {\r
273 if (Clazz.exceptionOf (e1, java.io.IOException)) {\r
274 } else {\r
275 throw e1;\r
276 }\r
277 }\r
278 return null;\r
279 } else {\r
280 throw e;\r
281 }\r
282 }\r
283 if (n == 0 || fileName == null) return null;\r
284 System.out.println ("ZipTools cached " + n + " bytes from " + fileName);\r
285 return listing.toString ();\r
286 }, "java.io.BufferedInputStream,~S,java.util.Map,~B");\r
287 c$.getPngImageBytes = Clazz.defineMethod (c$, "getPngImageBytes", \r
288  function (bis) {\r
289 try {\r
290 if (JU.Rdr.isPngZipStream (bis)) {\r
291 var pt_count =  Clazz.newIntArray (2, 0);\r
292 JU.Rdr.getPngZipPointAndCount (bis, pt_count);\r
293 if (pt_count[1] != 0) return JU.ZipTools.deActivatePngZipB (JU.Rdr.getLimitedStreamBytes (bis, pt_count[0]));\r
294 }return JU.Rdr.getLimitedStreamBytes (bis, -1);\r
295 } catch (e) {\r
296 if (Clazz.exceptionOf (e, java.io.IOException)) {\r
297 return null;\r
298 } else {\r
299 throw e;\r
300 }\r
301 }\r
302 }, "java.io.BufferedInputStream");\r
303 c$.deActivatePngZipB = Clazz.defineMethod (c$, "deActivatePngZipB", \r
304  function (bytes) {\r
305 if (JU.Rdr.isPngZipB (bytes)) bytes[51] = 32;\r
306 return bytes;\r
307 }, "~A");\r
308 });\r