1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.commons.compress.compressors.lzma;
20
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.commons.compress.compressors.FileNameUtil;
25 import org.apache.commons.compress.utils.OsgiUtils;
26
27
28
29
30
31
32
33 public class LZMAUtils {
34
35 enum CachedAvailability {
36 DONT_CACHE, CACHED_AVAILABLE, CACHED_UNAVAILABLE
37 }
38
39 private static final FileNameUtil fileNameUtil;
40
41
42
43
44 private static final byte[] HEADER_MAGIC = { (byte) 0x5D, 0, 0 };
45
46 private static volatile CachedAvailability cachedLZMAAvailability;
47
48 static {
49 final Map<String, String> uncompressSuffix = new HashMap<>();
50 uncompressSuffix.put(".lzma", "");
51 uncompressSuffix.put("-lzma", "");
52 fileNameUtil = new FileNameUtil(uncompressSuffix, ".lzma");
53 cachedLZMAAvailability = CachedAvailability.DONT_CACHE;
54 setCacheLZMAAvailablity(!OsgiUtils.isRunningInOsgiEnvironment());
55 }
56
57
58 static CachedAvailability getCachedLZMAAvailability() {
59 return cachedLZMAAvailability;
60 }
61
62
63
64
65
66
67
68
69 @Deprecated
70 public static String getCompressedFilename(final String fileName) {
71 return fileNameUtil.getCompressedFileName(fileName);
72 }
73
74
75
76
77
78
79
80
81 public static String getCompressedFileName(final String fileName) {
82 return fileNameUtil.getCompressedFileName(fileName);
83 }
84
85
86
87
88
89
90
91
92
93 @Deprecated
94 public static String getUncompressedFilename(final String fileName) {
95 return fileNameUtil.getUncompressedFileName(fileName);
96 }
97
98
99
100
101
102
103
104
105
106 public static String getUncompressedFileName(final String fileName) {
107 return fileNameUtil.getUncompressedFileName(fileName);
108 }
109
110 private static boolean internalIsLZMACompressionAvailable() {
111 try {
112 LZMACompressorInputStream.matches(null, 0);
113 return true;
114 } catch (final NoClassDefFoundError error) {
115 return false;
116 }
117 }
118
119
120
121
122
123
124
125
126 @Deprecated
127 public static boolean isCompressedFilename(final String fileName) {
128 return fileNameUtil.isCompressedFileName(fileName);
129 }
130
131
132
133
134
135
136
137
138 public static boolean isCompressedFileName(final String fileName) {
139 return fileNameUtil.isCompressedFileName(fileName);
140 }
141
142
143
144
145
146
147 public static boolean isLZMACompressionAvailable() {
148 final CachedAvailability cachedResult = cachedLZMAAvailability;
149 if (cachedResult != CachedAvailability.DONT_CACHE) {
150 return cachedResult == CachedAvailability.CACHED_AVAILABLE;
151 }
152 return internalIsLZMACompressionAvailable();
153 }
154
155
156
157
158
159
160
161
162 public static boolean matches(final byte[] signature, final int length) {
163 if (length < HEADER_MAGIC.length) {
164 return false;
165 }
166
167 for (int i = 0; i < HEADER_MAGIC.length; ++i) {
168 if (signature[i] != HEADER_MAGIC[i]) {
169 return false;
170 }
171 }
172
173 return true;
174 }
175
176
177
178
179
180
181
182
183
184
185 public static void setCacheLZMAAvailablity(final boolean doCache) {
186 if (!doCache) {
187 cachedLZMAAvailability = CachedAvailability.DONT_CACHE;
188 } else if (cachedLZMAAvailability == CachedAvailability.DONT_CACHE) {
189 final boolean hasLzma = internalIsLZMACompressionAvailable();
190 cachedLZMAAvailability = hasLzma ? CachedAvailability.CACHED_AVAILABLE
191 : CachedAvailability.CACHED_UNAVAILABLE;
192 }
193 }
194
195
196 private LZMAUtils() {
197 }
198 }