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