/* * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.arsdigita.cms; import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.kernel.ACSObject; import com.arsdigita.mimetypes.ImageMimeType; import com.arsdigita.mimetypes.MimeType; import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.Filter; import com.arsdigita.persistence.OID; import com.arsdigita.persistence.SessionManager; import com.arsdigita.versioning.VersionedACSObject; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.awt.image.RenderedImage; import javax.media.jai.JAI; import org.apache.log4j.Logger; /** *

An {@link com.arsdigita.cms.Asset asset} representing a reusable * image.

* * @see com.arsdigita.cms.ImageAsset * * @author Scott Seago (sseago@redhat.com) * @author Stanislav Freidin * * @version $Revision: #12 $ $DateTime: 2004/08/17 23:15:09 $ */ public class ReusableImageAsset extends ImageAsset { public static final String versionId = "$Id: ReusableImageAsset.java 754 2005-09-02 13:26:17Z sskracic $" + "$Author: sskracic $" + "$DateTime: 2004/08/17 23:15:09 $"; private static final Logger s_log = Logger.getLogger( ReusableImageAsset.class ); public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.ReusableImageAsset"; /** * Default constructor. This creates a new image asset. */ public ReusableImageAsset() { super(BASE_DATA_OBJECT_TYPE); } /** * Constructor. The contained DataObject is retrieved * from the persistent storage mechanism with an OID * specified by oid. * * @param oid The OID for the retrieved * DataObject. */ public ReusableImageAsset(OID oid) throws DataObjectNotFoundException { super(oid); } /** * Constructor. The contained DataObject is retrieved * from the persistent storage mechanism with an OID * specified by id and * ReusableImageAsset.BASE_DATA_OBJECT_TYPE. * * @param id The id for the retrieved * DataObject. **/ public ReusableImageAsset(BigDecimal id) throws DataObjectNotFoundException { this(new OID(BASE_DATA_OBJECT_TYPE, id)); } public ReusableImageAsset(DataObject obj) { super(obj); } public ReusableImageAsset(String type) { super(type); } /** * @return the base PDL object type for this item. Child classes should * override this method to return the correct value */ public String getBaseDataObjectType() { return BASE_DATA_OBJECT_TYPE; } public BigDecimal getWidth() { return (BigDecimal) get(WIDTH); } public void setWidth(BigDecimal width) { set(WIDTH, width); } public BigDecimal getHeight() { return (BigDecimal) get(HEIGHT); } public void setHeight(BigDecimal height) { set(HEIGHT, height); } /** * Retrieves the Blob content. * * @return the Blob content */ protected byte[] getContent() { return (byte[]) get(CONTENT); } /** * Sets the Blob content. */ protected void setContent(byte[] content) { set(CONTENT, content); } /** * Load the image asset from the specified file. Automatically guesses * the mime type of the file. If the file is a jpeg, tries to automatically * determine width and height, as well. * * @param fileName The original name of the file * @param File The actual file on the server * @param defaultMimeType The default mime type for the file */ public void loadFromFile(String fileName, File file, String defaultMimeType) throws IOException { // Guess mime type MimeType mime = MimeType.guessMimeTypeFromFile(fileName); if( s_log.isDebugEnabled() ) { s_log.debug( "Mime type is " + ( null == mime ? "null" : mime.getMimeType() ) ); } RenderedImage image = JAI.create( "FileLoad", file.getPath() ); int width = image.getWidth(); int height = image.getHeight(); if( s_log.isDebugEnabled() ) { s_log.debug( "Width: " + width ); s_log.debug( "Height: " + height ); } if( s_log.isDebugEnabled() ) { String[] props = image.getPropertyNames(); for( int i = 0; i < props.length; i++ ) { String prop = props[i]; s_log.debug( prop + ": " + image.getProperty( prop ) ); } } setWidth( new BigDecimal( width ) ); setHeight( new BigDecimal( height ) ); if(mime == null || !( mime instanceof ImageMimeType ) ) { mime = MimeType.loadMimeType(defaultMimeType); } setMimeType(mime); // Extract the filename int i = fileName.lastIndexOf("/"); if(i > 0) { fileName = fileName.substring(i+1); } i = fileName.lastIndexOf("\\"); // DOS-style if(i > 0) { fileName = fileName.substring(i+1); } setName(fileName); FileInputStream in = new FileInputStream(file); readBytes(in); } /** * Write the image asset content to a file. * * @param file The file on the server to write to. */ public void writeToFile(File file) throws IOException { FileOutputStream fs = new FileOutputStream(file); try { fs.write(getContent()); } finally { if (null != fs) { fs.close(); } } } /** * Retrieve all images in the database. Expensive operation. * * @return a collection of ReusableImageAssets */ public static ImageAssetCollection getAllReusableImages() { DataCollection da = SessionManager.getSession().retrieve (BASE_DATA_OBJECT_TYPE); da.addEqualsFilter(VersionedACSObject.IS_DELETED, new Integer(0)); da.addEqualsFilter(ACSObject.OBJECT_TYPE, BASE_DATA_OBJECT_TYPE); return new ImageAssetCollection(da); } /** * Find all images whose name matches the specified keyword * * @param keyword a String keyword * @param context the context for the retrieved items. Should be * {@link ContentItem#DRAFT} or {@link ContentItem#LIVE} * @return a collection of images whose name matches the keyword */ public static ImageAssetCollection getReusableImagesByKeyword( String keyword, String context ) { ImageAssetCollection c = getAllReusableImages(); c.addOrder(Asset.NAME); Filter f; if(!(keyword == null || keyword.length() < 1)) { f = c.addFilter("lower(name) like lower(\'%\' || :keyword || \'%\')"); f.set("keyword", keyword); } f = c.addFilter("version = :version"); f.set("version", context); return c; } /** * Find all images whose name matches the specified keyword * * @param keyword a String keyword * @return a collection of images whose name matches the keyword */ public static ImageAssetCollection getReusableImagesByKeyword(String keyword) { return getReusableImagesByKeyword(keyword, ContentItem.DRAFT); } }