diff --git a/htroot/imagetest.java b/htroot/imagetest.java new file mode 100644 index 000000000..b199c2209 --- /dev/null +++ b/htroot/imagetest.java @@ -0,0 +1,99 @@ +// imagetest.java +// ----------------------- +// part of YaCy +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2005 +// Created 05.10.2005 +// +// $LastChangedDate: 2005-09-29 02:24:09 +0200 (Thu, 29 Sep 2005) $ +// $LastChangedRevision: 811 $ +// $LastChangedBy: orbiter $ +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +import de.anomic.http.httpHeader; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; + +import java.awt.Graphics2D; +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.awt.image.WritableRaster; +import javax.imageio.ImageIO; +import java.io.File; +import java.io.IOException; +import java.io.FileOutputStream; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class imagetest { + + + public static BufferedImage respond(httpHeader header, serverObjects post, serverSwitch env) { + + BufferedImage bi = new BufferedImage(640, 400, BufferedImage.TYPE_INT_RGB); + Graphics2D g = bi.createGraphics(); + g.setBackground(Color.white); + g.clearRect(0, 0, 640, 400); + + g.setColor(new Color(200, 200, 0)); + g.drawRect(100, 50, 40, 30); + + g.setColor(new Color(0, 0, 200)); + try { + Class[] pType = {Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE}; + Object[] pParam = new Integer[]{new Integer(66), new Integer(55), new Integer(80), new Integer(80)}; + + String com = "drawRect"; + Method m = g.getClass().getMethod(com, pType); + Object result = m.invoke(g, pParam); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + WritableRaster r = bi.getRaster(); + for (int i = 20; i < 100; i++) r.setPixel(i, 30, new int[]{255, 0, 0}); + for (int i = 20; i < 100; i++) r.setPixel(i, 32, new int[]{0, 255, 0}); + for (int i = 20; i < 100; i++) r.setPixel(i, 34, new int[]{0, 0, 255}); + + return bi; + } + +} diff --git a/source/de/anomic/http/httpdFileHandler.java b/source/de/anomic/http/httpdFileHandler.java index 849ede99b..b7449e3a6 100644 --- a/source/de/anomic/http/httpdFileHandler.java +++ b/source/de/anomic/http/httpdFileHandler.java @@ -2,8 +2,8 @@ // ----------------------- // (C) by Michael Peter Christen; mc@anomic.de // first published on http://www.anomic.de -// Frankfurt, Germany, 2004 -// last change: 22.06.2004 +// Frankfurt, Germany, 2004, 2005 +// last major change: 05.10.2005 // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -98,6 +98,8 @@ import java.util.Properties; import java.util.logging.Level; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; import de.anomic.plasma.plasmaSwitchboard; import de.anomic.server.serverClassLoader; @@ -369,8 +371,6 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http return; } - Date filedate; - File rc = null; try { // locate the file if (!(path.startsWith("/"))) { @@ -391,29 +391,45 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http } } - // find locales or alternatives in htDocsPath - File defaultFile = new File(htDefaultPath, path); - File localizedFile = defaultFile; - if (defaultFile.exists()) { - // look if we have a localization of that file - String htLocaleSelection = switchboard.getConfig("htLocaleSelection","default"); - if (!(htLocaleSelection.equals("default"))) { - File localePath = new File(htLocalePath, htLocaleSelection + "/" + path); - if (localePath.exists()) localizedFile = localePath; + File targetFile = new File(htDefaultPath, path); + File targetClass = rewriteClassFile(targetFile); + String targetExt = conProp.getProperty("EXT",""); + Date targetDate; + + if ((targetClass != null) && ((path.endsWith("png") || (path.endsWith("gif"))))) { + // call an image-servlet to produce an on-the-fly - generated image + BufferedImage bi = null; + try { + requestHeader.put("CLIENTIP", conProp.getProperty("CLIENTIP")); + requestHeader.put("PATH", path); + // in case that there are no args given, args = null or empty hashmap + bi = (BufferedImage) rewriteMethod(targetClass).invoke(null, new Object[] {requestHeader, args, switchboard}); + } catch (InvocationTargetException e) { + this.theLogger.logSevere("INTERNAL ERROR: " + e.toString() + ":" + + e.getMessage() + + " target exception at " + targetClass + ": " + + e.getTargetException().toString() + ":" + + e.getTargetException().getMessage(),e); + targetClass = null; } - } else { - // try to find that file in the htDocsPath - defaultFile = new File(htDocsPath, path); - localizedFile = defaultFile; - } - - if ((localizedFile.exists()) && (localizedFile.canRead())) { + targetDate = new Date(System.currentTimeMillis()); + String mimeType = mimeTable.getProperty(targetExt,"text/html"); + + // generate an byte array from the generated image + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(bi, targetExt, baos); + byte[] result = baos.toByteArray(); + + // write the array to the client + httpd.sendRespondHeader(this.connectionProperties, out, "HTTP/1.1", 200, null, mimeType, result.length, targetDate, null, null, null, null); + Thread.currentThread().sleep(200); // see below + serverFileUtils.write(result, out); + + } else if ((targetFile.exists()) && (targetFile.canRead())) { // we have found a file that can be written to the client // if this file uses templates, then we use the template // re-write - method to create an result - serverObjects tp = new serverObjects(); - filedate = new Date(localizedFile.lastModified()); - String mimeType = mimeTable.getProperty(conProp.getProperty("EXT",""),"text/html"); + String mimeType = mimeTable.getProperty(targetExt,"text/html"); byte[] result; boolean zipContent = requestHeader.acceptGzip() && httpd.shallTransportZipped("." + conProp.getProperty("EXT","")); String md5String = null; @@ -422,14 +438,26 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http path.endsWith("rss") || path.endsWith("csv") || path.endsWith("pac")) { - rc = rewriteClassFile(defaultFile); - if (rc != null) { + + // find locales or alternatives in htDocsPath + String htLocaleSelection = switchboard.getConfig("htLocaleSelection","default"); + // look if we have a localization of that file + if (!(htLocaleSelection.equals("default"))) { + File localePath = new File(htLocalePath, htLocaleSelection + "/" + path); + if (localePath.exists()) targetFile = localePath; + } + + // call rewrite-class + serverObjects tp = new serverObjects(); + if (targetClass == null) { + targetDate = new Date(targetFile.lastModified()); + } else { // CGI-class: call the class to create a property for rewriting try { requestHeader.put("CLIENTIP", conProp.getProperty("CLIENTIP")); requestHeader.put("PATH", path); // in case that there are no args given, args = null or empty hashmap - tp = (serverObjects) rewriteMethod(rc).invoke(null, new Object[] {requestHeader, args, switchboard}); + tp = (serverObjects) rewriteMethod(targetClass).invoke(null, new Object[] {requestHeader, args, switchboard}); // if no args given , then tp will be an empty Hashtable object (not null) if (tp == null) tp = new serverObjects(); // check if the servlets requests authentification @@ -466,12 +494,12 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http } catch (InvocationTargetException e) { this.theLogger.logSevere("INTERNAL ERROR: " + e.toString() + ":" + e.getMessage() + - " target exception at " + rc + ": " + + " target exception at " + targetClass + ": " + e.getTargetException().toString() + ":" + e.getTargetException().getMessage(),e); - rc = null; + targetClass = null; } - filedate = new Date(System.currentTimeMillis()); + targetDate = new Date(System.currentTimeMillis()); } // read templates tp.putAll(templates); @@ -484,37 +512,37 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http // do fileCaching here byte[] templateContent = null; if (useTemplateCache) { - long fileSize = localizedFile.length(); + long fileSize = targetFile.length(); if (fileSize <= 512*1024) { - SoftReference ref = (SoftReference) templateCache.get(localizedFile); + SoftReference ref = (SoftReference) templateCache.get(targetFile); if (ref != null) { templateContent = (byte[]) ref.get(); if (templateContent == null) - templateCache.remove(localizedFile); + templateCache.remove(targetFile); } if (templateContent == null) { // loading the content of the template file into a byte array - templateContent = serverFileUtils.read(localizedFile); + templateContent = serverFileUtils.read(targetFile); // storing the content into the cache ref = new SoftReference(templateContent); - templateCache.put(localizedFile,ref); + templateCache.put(targetFile,ref); if (this.theLogger.isLoggable(Level.FINEST)) - this.theLogger.logFinest("Cache MISS for file " + localizedFile); + this.theLogger.logFinest("Cache MISS for file " + targetFile); } else { if (this.theLogger.isLoggable(Level.FINEST)) - this.theLogger.logFinest("Cache HIT for file " + localizedFile); + this.theLogger.logFinest("Cache HIT for file " + targetFile); } // creating an inputstream needed by the template rewrite function fis = new ByteArrayInputStream(templateContent); templateContent = null; } else { - fis = new BufferedInputStream(new FileInputStream(localizedFile)); + fis = new BufferedInputStream(new FileInputStream(targetFile)); } } else { - fis = new BufferedInputStream(new FileInputStream(localizedFile)); + fis = new BufferedInputStream(new FileInputStream(targetFile)); } o = new ByteArrayOutputStream(); @@ -546,7 +574,8 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http } else { // no html // write the file to the client - result = (zipContent)? serverFileUtils.readAndZip(localizedFile) : serverFileUtils.read(localizedFile); + targetDate = new Date(targetFile.lastModified()); + result = (zipContent) ? serverFileUtils.readAndZip(targetFile) : serverFileUtils.read(targetFile); // check mime type again using the result array: these are 'magics' // if (serverByteBuffer.equals(result, 1, "PNG".getBytes())) mimeType = mimeTable.getProperty("png","text/html"); @@ -556,7 +585,7 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http } // write the array to the client - httpd.sendRespondHeader(this.connectionProperties, out, "HTTP/1.1", 200, null, mimeType, result.length, filedate, null, null, (zipContent)?"gzip":null, null); + httpd.sendRespondHeader(this.connectionProperties, out, "HTTP/1.1", 200, null, mimeType, result.length, targetDate, null, null, (zipContent)?"gzip":null, null); Thread.currentThread().sleep(200); // this solved the message problem (!!) serverFileUtils.write(result, out); } else {