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
26package com.sun.xml.internal.org.jvnet.mimepull;
27
28import java.io.File;
29import java.util.logging.Level;
30import java.util.logging.Logger;
31
32/**
33 * Configuration for MIME message parsing and storing.
34 *
35 * @author Jitendra Kotamraju
36 */
37public 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}
156