r934 - in xwiki/trunk/src/main: java/com/xpn/xwiki/plugin java/com/xpn/xwiki/plugin/image java/com/xpn/xwiki/web web/WEB-INF

Xavier MOGHRABI moghrabix at users.forge.objectweb.org
Wed Feb 15 21:15:33 CET 2006


Author: moghrabix
Date: 2006-02-15 21:15:32 +0100 (Wed, 15 Feb 2006)
New Revision: 934

Added:
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/image/
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/image/ImagePlugin.java
Modified:
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiDefaultPlugin.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginInterface.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginManager.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/web/DownloadAction.java
   xwiki/trunk/src/main/web/WEB-INF/xwiki.cfg
Log:
Addition of a new plugin to create thumbnails by adding a height parameter at the end of a download URL.
(There is still a problem with the cache since files aren't removed with flushcache.)


Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiDefaultPlugin.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiDefaultPlugin.java	2006-02-13 01:38:47 UTC (rev 933)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiDefaultPlugin.java	2006-02-15 20:15:32 UTC (rev 934)
@@ -24,6 +24,7 @@
 
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.api.Api;
+import com.xpn.xwiki.doc.XWikiAttachment;
 
 public class XWikiDefaultPlugin implements XWikiPluginInterface {
     private String name;
@@ -89,4 +90,8 @@
 
     public void endRendering(XWikiContext context) {
     }
+    
+    public XWikiAttachment downloadAttachment(XWikiAttachment image, XWikiContext context) {
+    	return image;
+    }
 }

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginInterface.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginInterface.java	2006-02-13 01:38:47 UTC (rev 933)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginInterface.java	2006-02-15 20:15:32 UTC (rev 934)
@@ -24,6 +24,7 @@
 
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.api.Api;
+import com.xpn.xwiki.doc.XWikiAttachment;
 
 public interface XWikiPluginInterface {
     String getClassName();
@@ -53,5 +54,6 @@
     String insidePREHandler(String line, XWikiContext context);
     String endRenderingHandler(String line, XWikiContext context);
     Api getPluginApi(XWikiPluginInterface plugin, XWikiContext context);
+    XWikiAttachment downloadAttachment(XWikiAttachment image, XWikiContext context);
 
 }

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginManager.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginManager.java	2006-02-13 01:38:47 UTC (rev 933)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/XWikiPluginManager.java	2006-02-15 20:15:32 UTC (rev 934)
@@ -29,6 +29,7 @@
 import org.apache.commons.lang.StringUtils;
 
 import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.doc.XWikiAttachment;
 
 public class XWikiPluginManager {
     private Vector plugins = new Vector();
@@ -177,4 +178,14 @@
         }
     }
 
+    public XWikiAttachment downloadAttachment(XWikiAttachment image, XWikiContext context) {
+	for (int i=0;i<plugins.size();i++) {
+	    try {
+		image = ((XWikiPluginInterface)plugins_classes.get(plugins.get(i))).downloadAttachment(image, context);
+	    } catch (Exception e)
+	    {}
+	}
+	return image;
+    }
+
 }
\ No newline at end of file

Added: xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/image/ImagePlugin.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/image/ImagePlugin.java	2006-02-13 01:38:47 UTC (rev 933)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/plugin/image/ImagePlugin.java	2006-02-15 20:15:32 UTC (rev 934)
@@ -0,0 +1,177 @@
+/**
+ * XWiki
+ * Copyright (C) 2006 XpertNet
+ * Contact: xwiki-dev at objectweb.org
+ *
+ * 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 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
+ *
+ * @author Xavier MOGHRABI
+ * 
+ */
+
+package com.xpn.xwiki.plugin.image;
+
+import java.awt.Container;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+
+import javax.imageio.ImageIO;
+
+import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.cache.api.XWikiCache;
+import com.xpn.xwiki.cache.api.XWikiCacheNeedsRefreshException;
+import com.xpn.xwiki.cache.impl.OSCacheCache;
+import com.xpn.xwiki.doc.XWikiAttachment;
+import com.xpn.xwiki.plugin.PluginException;
+import com.xpn.xwiki.plugin.XWikiDefaultPlugin;
+
+public class ImagePlugin extends XWikiDefaultPlugin {
+	private static final int TYPE_JPG = 1;
+
+	private static final int TYPE_PNG = 2;
+
+	private static final int TYPE_BMP = 3;
+
+	private static String name = "image";
+
+	private XWikiCache imageCache;
+
+	private int capacity = 50;
+
+	public ImagePlugin(String name, String className, XWikiContext context) {
+		super(name, className, context);
+		init(context);
+
+	}
+
+	/**
+	 * Allow to get the plugin name
+	 * 
+	 * @return plugin name
+	 */
+	public String getName() {
+		return name;
+	}
+
+	public void init(XWikiContext context) {
+		super.init(context);
+		try {
+			String capacityParam = context.getWiki().Param("xwiki.plugin.image.cache.capacity");
+			capacity = Integer.parseInt(capacityParam);
+		} catch (NumberFormatException e) {
+			throw e;
+		} finally {
+			imageCache = new OSCacheCache(capacity, true, "temp/imageCache");
+		}
+
+	}
+
+	public void flushCache() {
+		if (imageCache != null)
+			imageCache.flushAll();
+	}
+
+	public XWikiAttachment downloadAttachment(XWikiAttachment image, XWikiContext context) {
+
+		int height = 0;
+		XWikiAttachment imageclone = null;
+		try {
+			
+			height = Integer.parseInt(context.getRequest().getParameter("height"));
+			
+			imageclone = (XWikiAttachment) image.clone();
+			String key = imageclone.getId() + "-" + TYPE_PNG + "-" + height;
+			
+			if (imageCache != null) {
+				try {
+					imageclone.setContent((byte []) imageCache.getFromCache(key));
+				} catch (XWikiCacheNeedsRefreshException e) {
+					try {
+						imageclone = this.getImageByHeight(imageclone, height, context);
+						imageCache.putInCache(key, imageclone.getContent(context));
+					} catch (Exception e2) {
+						imageCache.cancelUpdate(key);
+						throw e2;
+					}
+				}
+			} else {
+				imageclone = this.getImageByHeight(imageclone, height, context);
+			}
+		} catch (Exception e) {
+			imageclone = image;
+		} finally {
+			return imageclone;
+		}
+	}
+
+	public XWikiAttachment getImageByHeight(XWikiAttachment image, int thumbnailHeight, XWikiContext context) throws Exception {
+		
+		if (getType(image.getMimeType(context)) == 0)
+			throw new PluginException(name,  PluginException.ERROR_XWIKI_NOT_IMPLEMENTED,
+					"Only JPG, PNG or BMP images are supported.");
+
+		Toolkit tk = Toolkit.getDefaultToolkit();
+		Image imgOri = tk.createImage(image.getContent(context));
+
+		MediaTracker mediaTracker = new MediaTracker(new Container());
+		mediaTracker.addImage(imgOri, 0);
+		mediaTracker.waitForID(0);
+
+		int imgOriWidth = imgOri.getWidth(null);
+		int imgOriHeight = imgOri.getHeight(null);
+
+		if (thumbnailHeight >= imgOriHeight)
+			throw new PluginException(name, PluginException.ERROR_XWIKI_DIFF_METADATA_ERROR,
+					"Thumbnail image not created: the height is higher than the original one.");
+
+		double imageRatio = (double) imgOriWidth / (double) imgOriHeight;
+		int thumbnailWidth = (int) (thumbnailHeight * imageRatio);
+
+		// draw original image to thumbnail image object and
+		// scale it to the new size on-the-fly
+		BufferedImage imgTN = new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB);
+		Graphics2D graphics2D = imgTN.createGraphics();
+		graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+		graphics2D.drawImage(imgOri, 0, 0, thumbnailWidth, thumbnailHeight, null);
+
+		// save thumbnail image to bout
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		ImageIO.write(imgTN, "PNG", bout);
+
+		
+		image.setContent(bout.toByteArray());
+		
+		return image;
+	}
+
+	public static int getType(String mimeType) {
+	        if (mimeType.equals("image/jpg"))
+	            return TYPE_JPG;
+	        if (mimeType.equals("image/jpeg"))
+	            return TYPE_JPG;
+	        if (mimeType.equals("image/png"))
+	            return TYPE_PNG;
+	        if (mimeType.equals("image/bmp"))
+	            return TYPE_BMP;
+	        return 0;
+	}
+
+}

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/web/DownloadAction.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/web/DownloadAction.java	2006-02-13 01:38:47 UTC (rev 933)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/web/DownloadAction.java	2006-02-15 20:15:32 UTC (rev 934)
@@ -6,6 +6,7 @@
 import com.xpn.xwiki.XWikiException;
 import com.xpn.xwiki.doc.XWikiAttachment;
 import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.plugin.XWikiPluginManager;
 
 public class DownloadAction extends XWikiAction {
 	public String render(XWikiContext context) throws XWikiException {
@@ -31,6 +32,8 @@
                     "Attachment {0} not found", null, args);
         }
 
+	XWikiPluginManager plugins = context.getWiki().getPluginManager();
+	attachment = plugins.downloadAttachment(attachment, context);
         // Choose the right content type
         String mimetype = attachment.getMimeType(context);
         response.setContentType(mimetype);

Modified: xwiki/trunk/src/main/web/WEB-INF/xwiki.cfg
===================================================================
--- xwiki/trunk/src/main/web/WEB-INF/xwiki.cfg	2006-02-13 01:38:47 UTC (rev 933)
+++ xwiki/trunk/src/main/web/WEB-INF/xwiki.cfg	2006-02-15 20:15:32 UTC (rev 934)
@@ -9,7 +9,7 @@
 xwiki.store.cache=1
 xwiki.store.cache.capacity=100
 xwiki.monitor=1
-xwiki.plugins=com.xpn.xwiki.plugin.calendar.CalendarPlugin,com.xpn.xwiki.plugin.feed.FeedPlugin,com.xpn.xwiki.plugin.ldap.LDAPPlugin,com.xpn.xwiki.plugin.google.GooglePlugin,com.xpn.xwiki.plugin.flickr.FlickrPlugin,com.xpn.xwiki.plugin.mail.MailPlugin,com.xpn.xwiki.plugin.packaging.PackagePlugin,com.xpn.xwiki.plugin.query.QueryPlugin,com.xpn.xwiki.plugin.graphviz.GraphVizPlugin,com.xpn.xwiki.plugin.svg.SVGPlugin,com.xpn.xwiki.plugin.charts.ChartingPlugin,com.xpn.xwiki.plugin.fileupload.FileUploadPlugin,com.xpn.xwiki.plugin.laszlo.LaszloPlugin
+xwiki.plugins=com.xpn.xwiki.plugin.calendar.CalendarPlugin,com.xpn.xwiki.plugin.feed.FeedPlugin,com.xpn.xwiki.plugin.ldap.LDAPPlugin,com.xpn.xwiki.plugin.google.GooglePlugin,com.xpn.xwiki.plugin.flickr.FlickrPlugin,com.xpn.xwiki.plugin.mail.MailPlugin,com.xpn.xwiki.plugin.packaging.PackagePlugin,com.xpn.xwiki.plugin.query.QueryPlugin,com.xpn.xwiki.plugin.graphviz.GraphVizPlugin,com.xpn.xwiki.plugin.svg.SVGPlugin,com.xpn.xwiki.plugin.charts.ChartingPlugin,com.xpn.xwiki.plugin.fileupload.FileUploadPlugin,com.xpn.xwiki.plugin.laszlo.LaszloPlugin,com.xpn.xwiki.plugin.image.ImagePlugin
 
 # This parameter allows XWiki to operate in Hosting mode
 # allowing to create multiple wikis having their own database
@@ -40,5 +40,8 @@
 
 xwiki.plugin.laszlo.baseurl=/openlaszlo/xwiki/
 xwiki.plugin.laszlo.path=c:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/openlaszlo/xwiki/
+
+xwiki.plugin.image.cache.capacity=30
+
 xwiki.authentication.superadminpassword=toto
 xwiki.superadminpassword=toto





More information about the Xwiki-notifications mailing list