Skip to content

Commit

Permalink
implemented image-servlets. the imagetest will stay there only for a …
Browse files Browse the repository at this point in the history
…limited time. Now images can be generated on-the-fly from servlets

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@852 6c8d7289-2bf4-0310-a012-ef5d649a1542
  • Loading branch information
orbiter committed Oct 5, 2005
1 parent f6a0e0f commit 01db66d
Show file tree
Hide file tree
Showing 2 changed files with 168 additions and 40 deletions.
99 changes: 99 additions & 0 deletions 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;
}

}
109 changes: 69 additions & 40 deletions source/de/anomic/http/httpdFileHandler.java
Expand Up @@ -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
Expand Down Expand Up @@ -98,6 +98,8 @@ public static java.util.Hashtable respond(java.util.HashMap, serverSwitch)
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;
Expand Down Expand Up @@ -369,8 +371,6 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea
return;
}

Date filedate;
File rc = null;
try {
// locate the file
if (!(path.startsWith("/"))) {
Expand All @@ -391,29 +391,45 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea
}
}

// 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;
Expand All @@ -422,14 +438,26 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea
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
Expand Down Expand Up @@ -466,12 +494,12 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea
} 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);
Expand All @@ -484,37 +512,37 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea
// 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();
Expand Down Expand Up @@ -546,7 +574,8 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea

} 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");
Expand All @@ -556,7 +585,7 @@ public void doResponse(Properties conProp, httpHeader requestHeader, OutputStrea
}

// 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 {
Expand Down

0 comments on commit 01db66d

Please sign in to comment.