1
22
23 package com.liferay.portal.kernel.zip;
24
25 import com.liferay.portal.kernel.io.FileCacheOutputStream;
26 import com.liferay.portal.kernel.log.Log;
27 import com.liferay.portal.kernel.log.LogFactoryUtil;
28 import com.liferay.portal.kernel.util.StringPool;
29
30 import java.io.BufferedInputStream;
31 import java.io.ByteArrayInputStream;
32 import java.io.IOException;
33 import java.io.InputStream;
34 import java.io.Serializable;
35
36 import java.util.zip.ZipEntry;
37 import java.util.zip.ZipOutputStream;
38
39
45 public class ZipWriter implements Serializable {
46
47 public ZipWriter() throws IOException {
48 _fcos = new FileCacheOutputStream();
49 _zos = new ZipOutputStream(_fcos);
50 }
51
52 public void addEntry(String name, byte[] bytes) throws IOException {
53 addEntry(name, new ByteArrayInputStream(bytes));
54 }
55
56 public void addEntry(String name, InputStream is) throws IOException {
57 if (name.startsWith(StringPool.SLASH)) {
58 name = name.substring(1);
59 }
60
61 if (is == null) {
62 return;
63 }
64
65 if (_log.isDebugEnabled()) {
66 _log.debug("Adding " + name);
67 }
68
69 ZipEntry entry = new ZipEntry(name);
70
71 _zos.putNextEntry(entry);
72
73 BufferedInputStream bis = new BufferedInputStream(is, _BUFFER);
74
75 int count;
76
77 while ((count = bis.read(_data, 0, _BUFFER)) != -1) {
78 _zos.write(_data, 0, count);
79 }
80
81 bis.close();
82
83 _zos.closeEntry();
84 }
85
86 public void addEntry(String name, String s) throws IOException {
87 addEntry(name, s.getBytes());
88 }
89
90 public void addEntry(String name, StringBuilder sb) throws IOException {
91 addEntry(name, sb.toString());
92 }
93
94 public byte[] finish() throws IOException {
95 _zos.close();
96
97 return _fcos.getBytes();
98 }
99
100 public FileCacheOutputStream finishWithStream() throws IOException {
101 _zos.close();
102
103 return _fcos;
104 }
105
106 private static final Log _log = LogFactoryUtil.getLog(ZipWriter.class);
107
108 private static final int _BUFFER = 2048;
109
110 private FileCacheOutputStream _fcos;
111 private ZipOutputStream _zos;
112 private byte[] _data = new byte[_BUFFER];
113
114 }