001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: package org.jaffa.presentation.portlet.widgets.model;
051:
052: import org.apache.log4j.*;
053: import java.util.*;
054: import java.io.*;
055: import org.jaffa.presentation.portlet.widgets.model.exceptions.IllegalExtensionRuntimeException;
056: import org.jaffa.config.Config;
057:
058: /** Model for the Image widget. This will keep the image in memory by default.
059: * This can however be modified to store the image in a temporary folder on the filesystem.
060: */
061: public class ImageModel extends WidgetModel {
062:
063: private static Logger log = Logger.getLogger(ImageModel.class);
064:
065: private static final boolean KEEP_IN_MEMORY = true;
066: private static final String WEB_SERVER_ROOT = (String) Config
067: .getProperty(Config.PROP_WEB_SERVER_ROOT);
068: private static final String WEB_TEMP_DIR = "jaffa/imgs/temp/";
069: private static final HashMap MIME_TYPES = new HashMap();
070: static {
071: MIME_TYPES.put("gif", "image/gif");
072: MIME_TYPES.put("png", "image/x-png");
073: MIME_TYPES.put("jpeg", "image/jpeg");
074: MIME_TYPES.put("jpg", "image/jpeg");
075: MIME_TYPES.put("jpe", "image/jpeg");
076: MIME_TYPES.put("bmp", "image/x-ms-bmp");
077: MIME_TYPES.put("tif", "image/tiff");
078: MIME_TYPES.put("tiff", "image/tiff");
079: }
080: private static final String DEFAULT_EXTENTION = "gif";
081:
082: private String m_extention = null;
083: private byte[] m_image = null; // Image data if kept in memory
084: private File m_file = null; // Image file if stored on disk
085:
086: /** Create a new image model. The default image type is GIF.
087: * @param image The image.
088: */
089: public ImageModel(byte[] image) {
090: this (image, null);
091: }
092:
093: /** Create a new Image Model specifying the image type (if null, GIF is assumed).
094: * Currently suppoted image types are : gif,png,jpeg,jpg,jpe,bmp,tif,tiff.
095: * This will throw an IllegalExtensionRuntimeException if any other extention is passed.
096: * @param image The image.
097: * @param extention The image type.
098: */
099: public ImageModel(byte[] image, String extention) {
100:
101: // ensure a valid extension
102: if (extention != null) {
103: // Convert to lower case
104: extention = extention.toLowerCase();
105:
106: // Look up extention and see if it is supported
107: if (MIME_TYPES.get(extention) == null) {
108: String str = "Image Type Not Supported : " + extention;
109: log.error(str);
110: throw new IllegalExtensionRuntimeException(str);
111: }
112: m_extention = extention;
113: } else {
114: m_extention = DEFAULT_EXTENTION;
115: }
116:
117: // Store image based on storage method (Memory / Disk)
118: if (KEEP_IN_MEMORY) {
119: m_image = image;
120: } else {
121: try {
122: String dirName = null;
123: if (WEB_SERVER_ROOT.endsWith(File.separator))
124: dirName = WEB_SERVER_ROOT + WEB_TEMP_DIR;
125: else
126: dirName = WEB_SERVER_ROOT + File.separatorChar
127: + WEB_TEMP_DIR;
128:
129: m_file = File.createTempFile("img_", "." + m_extention,
130: new File(dirName));
131: if (log.isDebugEnabled())
132: log.debug("Temp Img File : " + m_file.toString());
133:
134: // Set this incase the finalize block doesn't get executed.
135: m_file.deleteOnExit();
136:
137: OutputStream out = new BufferedOutputStream(
138: new FileOutputStream(m_file));
139: out.write(image);
140: out.close();
141: } catch (IOException e) {
142: // log the error & continue as if InMemory is true
143: log
144: .warn(
145: "Can't Write Out Image : "
146: + e.getMessage()
147: + "\n Temp Dir :"
148: + WEB_SERVER_ROOT
149: + WEB_TEMP_DIR
150: + "\nContinued execution, with the image kept in memory",
151: e);
152:
153: // delete the file
154: if (m_file != null) {
155: m_file.delete();
156: m_file = null;
157: }
158: m_image = image;
159: }
160: }
161: }
162:
163: /** Getter for property mimeType.
164: * @return Value of property mimeType.
165: */
166: public String getMimeType() {
167: return (String) MIME_TYPES.get(m_extention);
168: }
169:
170: /** Getter for property extension (image type).
171: * @return Value of property extension (image type).
172: */
173: public String getExtention() {
174: return m_extention;
175: }
176:
177: /** Returns the URL to access the image relative of the web server.
178: * @return the URL to access the image relative of the web server.
179: */
180: public String getImageUrl() {
181: if (m_file != null)
182: return WEB_TEMP_DIR + m_file.getName();
183: else
184: return null;
185: }
186:
187: /** Get the byte array for the image.
188: * This may be in-memory, or read in from disk.
189: * @throws IOException if any error occurs in reading the image from the filesystem.
190: * @return the byte array for the image.
191: */
192: public byte[] getImage() throws IOException {
193: byte[] image = null;
194:
195: if (m_image != null) {
196: // Return In-Memory Image
197: image = m_image;
198: } else {
199: if (m_file != null) {
200: // Read from file
201: InputStream stream = new BufferedInputStream(
202: new FileInputStream(m_file));
203: image = new byte[stream.available()];
204: stream.read(image);
205: stream.close();
206: }
207: }
208: return image;
209: }
210:
211: /** This will ensure that the temporary file (if created) gets deleted.
212: */
213: public void finalize() {
214: if (m_file != null) {
215: try {
216: m_file.delete();
217: } catch (SecurityException e) {
218: // do nothing
219: }
220: }
221: }
222:
223: }
|