X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fmedia%2FMediaHandlerImagesExtern.java;h=b498aa42d30a7e25ae87c9a4489f38def9add730;hb=58e3b12befc2aa4b5f64885ddc163d99afddb8fd;hp=5f17d18a656dac064c3839f52a60b4406bde0177;hpb=0bae3282355557eb9f6869eb266de9947b728d09;p=mir.git diff --git a/source/mircoders/media/MediaHandlerImagesExtern.java b/source/mircoders/media/MediaHandlerImagesExtern.java index 5f17d18a..b498aa42 100755 --- a/source/mircoders/media/MediaHandlerImagesExtern.java +++ b/source/mircoders/media/MediaHandlerImagesExtern.java @@ -33,65 +33,80 @@ package mircoders.media; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.InputStream; +import java.io.OutputStream; -import mir.config.MirPropertiesConfiguration; +import mir.util.StreamCopier; import mir.entity.Entity; import mir.log.LoggerWrapper; import mir.media.MediaExc; import mir.media.MediaFailure; +import mir.media.image.ImageProcessor; +import mir.media.image.ImageMagickImageProcessor; import mir.misc.StringUtil; - /** - * Image handler that stores images outside of the database. Will be replaced by the new - * media handling system. + * Image handler that stores images outside of the database. + * * @author Zapata * @version 1.0 */ public class MediaHandlerImagesExtern extends MediaHandlerGeneric { + private int maxSize; private int maxIconSize; private float minDescaleRatio; private int minDescaleReduction; - + private boolean scaleImages; + private String imagesOriginalDir; + private String imagesOriginalDirRelPath; + private String imageOriginalFilePath; + private String imageOriginalRelPath; + public MediaHandlerImagesExtern() { - logger = new LoggerWrapper("Media.Images.Extern"); - try { - MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance(); - } - catch (Throwable t) { - logger.fatal("MediaHandlerImagesExtern: can't get configuration"); - - throw new RuntimeException(t.toString()); - } - + maxSize = configuration.getInt("Producer.Image.MaxSize"); maxIconSize = configuration.getInt("Producer.Image.MaxIconSize"); minDescaleRatio = configuration.getFloat("Producer.Image.MinDescalePercentage")/100; minDescaleReduction = configuration.getInt("Producer.Image.MinDescaleReduction"); + scaleImages = configuration.getBoolean("Producer.Image.ScaleImages"); + imagesOriginalDir = configuration.getString("Producer.ImagesOriginalDir.Path"); + imagesOriginalDirRelPath = configuration.getString("Producer.ImagesOriginalDir.RelPath"); } public void produce(Entity anImageEntity, Entity mediaTypeEnt) throws MediaExc, MediaFailure { try { - String date = anImageEntity.getValue("date"); + String date = anImageEntity.getFieldValue("date"); String datePath = StringUtil.webdbDate2path(date); - String ext = "." + mediaTypeEnt.getValue("name"); + String ext = "." + mediaTypeEnt.getFieldValue("name"); String fileBasePath = datePath + anImageEntity.getId(); String filePath = fileBasePath + ext; - String iconPath = getIconStoragePath() + fileBasePath + ".jpg"; + String iconPath = getBaseIconStoragePath() + fileBasePath + ".jpg"; String iconStoragePath = configuration.getString("Producer.StorageRoot") + iconPath; - String imageFilePath = getStoragePath() + File.separator + filePath; - + String imageFilePath = getBaseStoragePath() + File.separator + filePath; + + // yoss: get a file path where the the original image should be saved if image resizing is turned on + imageOriginalFilePath = imagesOriginalDir + filePath; + imageOriginalRelPath = imagesOriginalDirRelPath + filePath; + + // yoss:make a new File object for the originalFile + File originalFile = new File(imageOriginalFilePath); + logger.info("imageOriginalFilePath:" + imageOriginalFilePath); File imageFile = new File(imageFilePath); + logger.info("******************************************"); + logger.info("imageFile exists: " + imageFile.exists()); + logger.info("imageFile: " + imageFile.getAbsolutePath()); File iconFile = new File(iconStoragePath); - + logger.info("iconStoragePath:"+ iconStoragePath); + + if (!imageFile.exists()) { - throw new MediaExc("error in MediaHandlerImagesExtern.produce(): " + filePath + " does not exist!"); + throw new MediaExc("error in MediaHandlerImagesExtern.execute(): " + filePath + " does not exist!"); } else { - ImageProcessor processor = new ImageProcessor(imageFile); + ImageProcessor processor = new ImageMagickImageProcessor(imageFile); processor.descaleImage(maxIconSize, minDescaleRatio, minDescaleReduction); File dir = new File(iconFile.getParent()); @@ -99,38 +114,68 @@ public class MediaHandlerImagesExtern extends MediaHandlerGeneric dir.mkdirs(); } processor.writeScaledData(iconFile, "JPEG"); + + // yoss: if the config is set so that images should be scaled, make the resized file. + if (scaleImages){ + logger.info("entered scaleImages"); + ImageProcessor originalProcessor = new ImageMagickImageProcessor(imageFile); + originalProcessor.descaleImage(maxSize, minDescaleRatio, minDescaleReduction); + File originalDir = new File(originalFile.getParent()); + if(originalDir!=null && !originalDir.exists()) { + originalDir.mkdirs(); + } + if(!originalFile.exists()) { + logger.debug("the original image file doesn't exist, copying to originalFile"); + StreamCopier.copyFile(imageFile, originalFile); + } + // yoss: don't write the scaled data again if it's the same size as + // the file that's there right now. Image producer runs are 4 times faster this way. + logger.info("about to write scaled data, byte length: " + originalProcessor.getScaledFileSize()); + if (originalProcessor.getScaledFileSize() != imageFile.length()) { + originalProcessor.writeScaledData(imageFile, "JPEG"); + } + anImageEntity.setFieldValue("original_file_path", imageOriginalRelPath); + anImageEntity.setFieldValue("img_height", new Integer(originalProcessor.getScaledHeight()).toString()); + anImageEntity.setFieldValue("img_width", new Integer(originalProcessor.getScaledWidth()).toString()); + + originalProcessor.cleanup(); + + } else { + anImageEntity.setFieldValue("img_height", new Integer(processor.getHeight()).toString()); + anImageEntity.setFieldValue("img_width", new Integer(processor.getWidth()).toString()); + } - anImageEntity.setValueForProperty("img_height", new Integer(processor.getHeight()).toString()); - anImageEntity.setValueForProperty("img_width", new Integer(processor.getWidth()).toString()); + anImageEntity.setFieldValue("icon_height", new Integer(processor.getScaledHeight()).toString()); + anImageEntity.setFieldValue("icon_width", new Integer(processor.getScaledWidth()).toString()); - anImageEntity.setValueForProperty("icon_height", new Integer(processor.getScaledHeight()).toString()); - anImageEntity.setValueForProperty("icon_width", new Integer(processor.getScaledWidth()).toString()); + processor.cleanup(); - anImageEntity.setValueForProperty("icon_path", iconPath); - anImageEntity.setValueForProperty("publish_path", filePath); + anImageEntity.setFieldValue("icon_path", iconPath); + anImageEntity.setFieldValue("publish_path", filePath); anImageEntity.update(); - } } catch(Throwable t) { - logger.error("MediaHandlerImagesExtern.produce: " + t.getMessage()); - t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); + logger.error("MediaHandlerImagesExtern.execute: " + t.getMessage(), t); throw new MediaFailure(t.getMessage(), t); } } - public InputStream getIcon(Entity anImageEntity) throws MediaExc, MediaFailure { + /** {@inheritDoc} */ + public InputStream getThumbnail(Entity anImageEntity) throws MediaExc, MediaFailure { try { - String filePath = - configuration.getString("Producer.StorageRoot") + anImageEntity.getValue("icon_path"); + File file = new File(configuration.getString("Producer.StorageRoot") + anImageEntity.getFieldValue("icon_path")); - logger.info(filePath); + if (!file.exists()) { + // hackish + file = new File(configuration.getHome(), "../img/photo_big.gif"); + } return new BufferedInputStream( - new FileInputStream(new File(filePath)),8192); + new FileInputStream(file),8192); } catch (Throwable t) { return null; @@ -141,12 +186,12 @@ public class MediaHandlerImagesExtern extends MediaHandlerGeneric return "image/jpeg"; } - public String getStoragePath() + public String getBaseStoragePath() { return configuration.getString("Producer.Image.Path"); } - public String getIconStoragePath() + public String getBaseIconStoragePath() { return configuration.getString("Producer.Image.IconPath"); } @@ -171,21 +216,6 @@ public class MediaHandlerImagesExtern extends MediaHandlerGeneric return "Image"; } - public boolean isVideo() - { - return false; - } - - public boolean isAudio() - { - return false; - } - - public boolean isImage () - { - return true; - } - public String getDescr(Entity mediaType) { return "image/jpeg";