1 /*
   2  * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.xml.internal.org.jvnet.mimepull;
  27 
  28 import java.io.File;
  29 import java.util.logging.Level;
  30 import java.util.logging.Logger;
  31 
  32 /**
  33  * Configuration for MIME message parsing and storing.
  34  *
  35  * @author Jitendra Kotamraju
  36  */
  37 public class MIMEConfig {
  38 
  39     private static final int DEFAULT_CHUNK_SIZE = 8192;
  40     private static final long DEFAULT_MEMORY_THRESHOLD = 1048576L;
  41     private static final String DEFAULT_FILE_PREFIX = "MIME";
  42 
  43     private static final Logger LOGGER = Logger.getLogger(MIMEConfig.class.getName());
  44 
  45     // Parses the entire message eagerly
  46     boolean parseEagerly;
  47 
  48     // Approximate Chunk size
  49     int chunkSize;
  50 
  51     // Maximum in-memory data per attachment
  52     long memoryThreshold;
  53 
  54     // temp Dir to store large files
  55     File tempDir;
  56     String prefix;
  57     String suffix;
  58 
  59     private MIMEConfig(boolean parseEagerly, int chunkSize,
  60                        long inMemoryThreshold, String dir, String prefix, String suffix) {
  61         this.parseEagerly = parseEagerly;
  62         this.chunkSize = chunkSize;
  63         this.memoryThreshold = inMemoryThreshold;
  64         this.prefix = prefix;
  65         this.suffix = suffix;
  66         setDir(dir);
  67     }
  68 
  69     public MIMEConfig() {
  70         this(false, DEFAULT_CHUNK_SIZE, DEFAULT_MEMORY_THRESHOLD, null,
  71                 DEFAULT_FILE_PREFIX, null);
  72     }
  73 
  74     boolean isParseEagerly() {
  75         return parseEagerly;
  76     }
  77 
  78     public void setParseEagerly(boolean parseEagerly) {
  79         this.parseEagerly = parseEagerly;
  80     }
  81 
  82     int getChunkSize() {
  83         return chunkSize;
  84     }
  85 
  86     void setChunkSize(int chunkSize) {
  87         this.chunkSize = chunkSize;
  88     }
  89 
  90     long getMemoryThreshold() {
  91         return memoryThreshold;
  92     }
  93 
  94     /**
  95      * If the attachment is greater than the threshold, it is
  96      * written to the disk.
  97      *
  98      * @param memoryThreshold no of bytes per attachment
  99      *        if -1, then the whole attachment is kept in memory
 100      */
 101     public void setMemoryThreshold(long memoryThreshold) {
 102         this.memoryThreshold = memoryThreshold;
 103     }
 104 
 105     boolean isOnlyMemory() {
 106         return memoryThreshold == -1L;
 107     }
 108 
 109     File getTempDir() {
 110         return tempDir;
 111     }
 112 
 113     String getTempFilePrefix() {
 114         return prefix;
 115     }
 116 
 117     String getTempFileSuffix() {
 118         return suffix;
 119     }
 120 
 121     /**
 122      * @param directory
 123      *          temp directory
 124      */
 125     public final void setDir(String directory) {
 126         if (tempDir == null && directory != null && !directory.equals("")) {
 127             tempDir = new File(directory);
 128         }
 129     }
 130 
 131     /**
 132      * Validates if it can create temporary files. Otherwise, it stores
 133      * attachment contents in memory.
 134      */
 135     public void validate() {
 136         if (!isOnlyMemory()) {
 137             try {
 138                 File tempFile = (tempDir == null)
 139                         ? File.createTempFile(prefix, suffix)
 140                         : File.createTempFile(prefix, suffix, tempDir);
 141                 boolean deleted = tempFile.delete();
 142                 if (!deleted) {
 143                     if (LOGGER.isLoggable(Level.INFO)) {
 144                         LOGGER.log(Level.INFO, "File {0} was not deleted", tempFile.getAbsolutePath());
 145                     }
 146                 }
 147             } catch(RuntimeException e) {
 148                 memoryThreshold = -1L;      // whole attachment will be in-memory
 149             } catch(Exception e) {
 150                 memoryThreshold = -1L;      // whole attachment will be in-memory
 151             }
 152         }
 153     }
 154 
 155 }