View Javadoc
1   package nom.tam.fits.compress;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.util.logging.Level;
6   import java.util.logging.Logger;
7   
8   import nom.tam.fits.FitsException;
9   
10  /*
11   * #%L
12   * nom.tam FITS library
13   * %%
14   * Copyright (C) 1996 - 2024 nom-tam-fits
15   * %%
16   * This is free and unencumbered software released into the public domain.
17   *
18   * Anyone is free to copy, modify, publish, use, compile, sell, or
19   * distribute this software, either in source code form or as a compiled
20   * binary, for any purpose, commercial or non-commercial, and by any
21   * means.
22   *
23   * In jurisdictions that recognize copyright laws, the author or authors
24   * of this software dedicate any and all copyright interest in the
25   * software to the public domain. We make this dedication for the benefit
26   * of the public at large and to the detriment of our heirs and
27   * successors. We intend this dedication to be an overt act of
28   * relinquishment in perpetuity of all present and future rights to this
29   * software under copyright law.
30   *
31   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
34   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
35   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
36   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
37   * OTHER DEALINGS IN THE SOFTWARE.
38   * #L%
39   */
40  
41  import static nom.tam.util.LoggerHelper.getLogger;
42  
43  /**
44   * (<i>for internal use</i>) UNIX compressed (<code>.Z</code>) input stream decompression with a preference for using an
45   * external system command. You can use this class to decompress files that have been compressed with the UNIX
46   * <b>compress</b> tool (or via <b>gzip</b>) and have the characteristic <code>.Z</code> file name extension. It
47   * effectively provides the same functionality as {@link ZCompressionProvider}, but has a preference for calling on the
48   * system <b>uncompress</b> command first to do the lifting. If that fails it will call on {@link CompressionManager} to
49   * provide a suitable decompressor (which will give it {@link ZCompressionProvider}). Since the <b>compress</b> tool is
50   * UNIX-specific, it is not entirely portable. As a result, you are probably better off relying on those other classes
51   * directly.
52   * 
53   * @see        CompressionManager
54   * 
55   * @deprecated Use {@link ZCompressionProvider}. or the more generic {@link CompressionManager} with a preference toward
56   *                 using the system command if possible. instead.
57   */
58  @Deprecated
59  public class BasicCompressProvider implements ICompressProvider {
60  
61      private static final int PRIORITY = 10;
62  
63      private static final int COMPRESS_MAGIC_BYTE1 = 0x1f;
64  
65      private static final int COMPRESS_MAGIC_BYTE2 = 0x9d;
66  
67      private static final Logger LOG = getLogger(BasicCompressProvider.class);
68  
69      private InputStream compressInputStream(final InputStream compressed) throws IOException, FitsException {
70          try {
71              Process proc = new ProcessBuilder("uncompress", "-c").start();
72              return new CloseIS(proc, compressed);
73          } catch (Exception e) {
74              ICompressProvider next = CompressionManager.nextCompressionProvider(COMPRESS_MAGIC_BYTE1, COMPRESS_MAGIC_BYTE2,
75                      this);
76              if (next != null) {
77                  LOG.log(Level.WARNING,
78                          "Error initiating .Z decompression: " + e.getMessage() + " trying alternative decompressor", e);
79                  return next.decompress(compressed);
80              }
81              throw new FitsException("Unable to read .Z compressed stream.\nIs 'uncompress' in the path?", e);
82          }
83      }
84  
85      @Override
86      public InputStream decompress(InputStream in) throws IOException, FitsException {
87          return compressInputStream(in);
88      }
89  
90      @Override
91      public int priority() {
92          return PRIORITY;
93      }
94  
95      @Override
96      public boolean provides(int mag1, int mag2) {
97          return mag1 == COMPRESS_MAGIC_BYTE1 && mag2 == COMPRESS_MAGIC_BYTE2;
98      }
99  }