1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.commons.compress.compressors.pack200;
21
22 import java.io.IOException;
23 import java.io.OutputStream;
24 import java.util.Map;
25 import java.util.jar.JarInputStream;
26
27 import org.apache.commons.compress.compressors.CompressorOutputStream;
28 import org.apache.commons.compress.java.util.jar.Pack200;
29
30
31
32
33
34
35
36 public class Pack200CompressorOutputStream extends CompressorOutputStream {
37 private boolean finished;
38 private final OutputStream originalOutput;
39 private final AbstractStreamBridge abstractStreamBridge;
40 private final Map<String, String> properties;
41
42
43
44
45
46
47
48 public Pack200CompressorOutputStream(final OutputStream out) throws IOException {
49 this(out, Pack200Strategy.IN_MEMORY);
50 }
51
52
53
54
55
56
57
58
59 public Pack200CompressorOutputStream(final OutputStream out, final Map<String, String> props) throws IOException {
60 this(out, Pack200Strategy.IN_MEMORY, props);
61 }
62
63
64
65
66
67
68
69
70 public Pack200CompressorOutputStream(final OutputStream out, final Pack200Strategy mode) throws IOException {
71 this(out, mode, null);
72 }
73
74
75
76
77
78
79
80
81
82 public Pack200CompressorOutputStream(final OutputStream out, final Pack200Strategy mode, final Map<String, String> props) throws IOException {
83 originalOutput = out;
84 abstractStreamBridge = mode.newStreamBridge();
85 properties = props;
86 }
87
88 @Override
89 public void close() throws IOException {
90 try {
91 finish();
92 } finally {
93 try {
94 abstractStreamBridge.stop();
95 } finally {
96 originalOutput.close();
97 }
98 }
99 }
100
101 public void finish() throws IOException {
102 if (!finished) {
103 finished = true;
104 final Pack200.Packer p = Pack200.newPacker();
105 if (properties != null) {
106 p.properties().putAll(properties);
107 }
108 try (JarInputStream ji = new JarInputStream(abstractStreamBridge.getInputStream())) {
109 p.pack(ji, originalOutput);
110 }
111 }
112 }
113
114 @Override
115 public void write(final byte[] b) throws IOException {
116 abstractStreamBridge.write(b);
117 }
118
119 @Override
120 public void write(final byte[] b, final int from, final int length) throws IOException {
121 abstractStreamBridge.write(b, from, length);
122 }
123
124 @Override
125 public void write(final int b) throws IOException {
126 abstractStreamBridge.write(b);
127 }
128 }