2 * Copyright (C) 2001, 2002 The Mir-coders group
4 * This file is part of Mir.
6 * Mir is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Mir is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Mir; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * In addition, as a special exception, The Mir-coders gives permission to link
21 * the code of this program with any library licensed under the Apache Software License,
22 * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23 * (or with modified versions of the above that use the same license as the above),
24 * and distribute linked combinations including the two. You must obey the
25 * GNU General Public License in all respects for all of the code used other than
26 * the above mentioned libraries. If you modify this file, you may extend this
27 * exception to your version of the file, but you are not obligated to do so.
28 * If you do not wish to do so, delete this exception statement from your version.
30 package mircoders.media;
32 import mir.config.MirPropertiesConfiguration;
33 import mir.entity.Entity;
34 import mir.log.LoggerWrapper;
35 import mir.media.MediaExc;
36 import mir.media.MediaFailure;
37 import mir.media.MediaHandler;
38 import mir.misc.StringUtil;
39 import mir.session.SessionExc;
40 import mir.session.UploadedFile;
41 import mir.util.IORoutines;
42 import mir.util.FileRoutines;
43 import mircoders.entity.EntityImages;
48 * This class handles saving, fetching creating representations
49 * for all images. The image content is stored in the DB. The content is
50 * written out to a file at the ProducerImages level.
51 * Remember that Handlers for specific image types, Gif, Jpeg, etc..
53 * It implements the MirMediaHandler interface.
55 * slowly starting to look better, a next step would be to have the
56 * representation stuff (WebdbImage) happen here.
59 * @see mir.media.MediaHandler
61 * @version $Id: MediaHandlerImages.java,v 1.23.2.9 2005/08/21 17:09:23 zapata Exp $
65 public abstract class MediaHandlerImages extends AbstractMediaHandler implements MediaHandler {
66 protected static MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance();
67 protected static final String PNG = "PNG";
68 protected static final String JPEG = "JPEG";
70 protected LoggerWrapper logger;
72 abstract String getType();
74 public MediaHandlerImages() {
75 logger = new LoggerWrapper("Media.Images");
78 public InputStream getMedia(Entity ent, Entity mediaTypeEnt) throws MediaExc, MediaFailure {
80 return new ByteArrayInputStream(((EntityImages) ent).getImage());
83 logger.error("MediaHandlerImages.getImage: " + e.toString());
85 throw new MediaFailure(e);
89 public void store(UploadedFile anUploadedFile, Entity aMedia, Entity aMediaType) throws MediaExc, MediaFailure {
91 store(anUploadedFile.getInputStream(), aMedia, aMediaType);
93 catch (SessionExc e) {
94 throw new MediaFailure(e);
98 public void store(InputStream in, Entity ent, Entity mediaTypeEnt) throws MediaExc, MediaFailure {
100 ((EntityImages) ent).setImage(in, getType());
102 catch (Throwable e) {
103 logger.error("MediaHandlerImages.store", e);
105 throw new MediaFailure("A problem has occurred processing the media file", e);
109 public void produce(Entity ent, Entity mediaTypeEnt) throws MediaExc, MediaFailure {
110 String date = ent.getFieldValue("date");
111 String datePath = StringUtil.webdbDate2path(date);
112 String ext = "."+mediaTypeEnt.getFieldValue("name");
113 String filepath = datePath+ent.getId()+ext;
114 String iconFilePath = configuration.getString("Producer.StorageRoot") + getBaseIconStoragePath() + filepath;
115 String productionFilePath = getBaseStoragePath() + File.separator + filepath;
118 if (ent.getFieldValue("icon_data")!= null &&
119 ent.getFieldValue("image_data")!= null) {
123 InputStream in = new ByteArrayInputStream(((EntityImages) ent).getIcon());
125 File iconFile = new File(iconFilePath);
127 FileRoutines.createParentDirectories(iconFile);
129 out = new FileOutputStream(iconFile);
131 IORoutines.copyStream(in, out);
141 in = new ByteArrayInputStream(((EntityImages) ent).getImage());
143 File imageFile = new File(productionFilePath);
145 FileRoutines.createParentDirectories(imageFile);
147 out = new FileOutputStream(imageFile);
149 IORoutines.copyStream(in, out);
159 ent.setFieldValue("icon_path", getBaseIconStoragePath() + filepath);
160 ent.setFieldValue("publish_path", filepath);
163 catch (Throwable e) {
164 logger.error("Error producing image", e);
166 throw new MediaFailure("Error producing image", e);
172 logger.error("Can't produce image " + ent.getId() + ": missing image or icon OID");
174 throw new MediaExc("Can't produce image " + ent.getId() + ": missing image or icon OID");
178 public InputStream getThumbnail(Entity ent) throws MediaExc, MediaFailure {
180 return new ByteArrayInputStream(((EntityImages) ent).getIcon());
182 catch (Throwable e) {
183 logger.error("MediaHandlerImages.getIcon: " + e.toString());
184 throw new MediaFailure(e);
188 public String getBaseStoragePath() {
189 return configuration.getString("Producer.Image.Path");
192 public String getBaseIconStoragePath() {
193 return configuration.getString("Producer.Image.IconPath");
196 public String getPublishHost() {
197 return StringUtil.removeSlash(configuration.getString("Producer.Image.Host"));
200 public String getTinyIconName() {
201 return configuration.getString("Producer.Icon.TinyImage");
204 public String getBigIconName() {
205 return configuration.getString("Producer.Icon.BigImage");
208 public String getIconAltName() {
212 public String getDescr(Entity mediaType) {