2006-04-03 00:59:53 +02:00
// ViewImage.java
// -----------------------
// part of YaCy
2008-07-20 19:14:51 +02:00
// (C) by Michael Peter Christen; mc@yacy.net
2006-04-03 00:59:53 +02:00
// first published on http://www.anomic.de
// Frankfurt, Germany, 2006
// created 03.04.2006
//
// 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
import java.awt.Container ;
import java.awt.Image ;
import java.awt.MediaTracker ;
2007-07-15 03:34:01 +02:00
import java.io.File ;
2006-10-03 13:05:48 +02:00
import java.io.IOException ;
import java.io.InputStream ;
2006-04-03 00:59:53 +02:00
import java.net.MalformedURLException ;
2007-09-06 03:28:35 +02:00
import java.util.HashMap ;
2006-04-03 00:59:53 +02:00
2008-08-25 20:11:47 +02:00
import de.anomic.http.httpRequestHeader ;
2009-01-31 00:33:47 +01:00
import de.anomic.kelondro.util.Log ;
2009-01-31 02:06:56 +01:00
import de.anomic.kelondro.util.FileUtils ;
2007-08-15 13:36:59 +02:00
import de.anomic.plasma.plasmaSnippetCache ;
2006-04-03 00:59:53 +02:00
import de.anomic.plasma.plasmaSwitchboard ;
import de.anomic.server.serverObjects ;
import de.anomic.server.serverSwitch ;
2007-09-05 11:01:35 +02:00
import de.anomic.yacy.yacyURL ;
2007-07-15 03:34:01 +02:00
import de.anomic.ymage.ymageImageParser ;
2006-04-03 00:59:53 +02:00
public class ViewImage {
2008-01-29 17:41:09 +01:00
private static HashMap < String , Image > iconcache = new HashMap < String , Image > ( ) ;
2007-09-06 03:28:35 +02:00
private static String defaulticon = " htroot/env/grafics/dfltfvcn.ico " ;
2009-03-06 16:39:02 +01:00
private static byte [ ] defaulticonb ;
static {
try {
defaulticonb = FileUtils . read ( new File ( defaulticon ) ) ;
} catch ( final IOException e ) {
}
}
2007-09-06 03:28:35 +02:00
2008-08-25 20:11:47 +02:00
public static Image respond ( final httpRequestHeader header , final serverObjects post , final serverSwitch < ? > env ) {
2006-04-03 00:59:53 +02:00
2008-08-02 14:12:04 +02:00
final plasmaSwitchboard sb = ( plasmaSwitchboard ) env ;
2006-04-03 00:59:53 +02:00
2007-08-04 01:06:53 +02:00
// the url to the image can be either submitted with an url in clear text, or using a license key
// if the url is given as clear text, the user must be authorized as admin
// the license can be used also from non-authorized users
String urlString = post . get ( " url " , " " ) ;
2008-08-02 14:12:04 +02:00
final String urlLicense = post . get ( " code " , " " ) ;
2008-08-25 20:11:47 +02:00
final boolean auth = ( ( String ) header . get ( httpRequestHeader . CONNECTION_PROP_CLIENTIP , " " ) ) . equals ( " localhost " ) | | sb . verifyAuthentication ( header , true ) ; // handle access rights
2007-08-04 01:06:53 +02:00
2007-09-05 11:01:35 +02:00
yacyURL url = null ;
2007-08-04 01:06:53 +02:00
if ( ( urlString . length ( ) > 0 ) & & ( auth ) ) try {
2007-09-05 11:01:35 +02:00
url = new yacyURL ( urlString , null ) ;
2008-08-02 14:12:04 +02:00
} catch ( final MalformedURLException e1 ) {
2007-08-04 01:06:53 +02:00
url = null ;
}
if ( ( url = = null ) & & ( urlLicense . length ( ) > 0 ) ) {
url = sb . licensedURLs . releaseLicense ( urlLicense ) ;
2007-08-28 14:15:46 +02:00
urlString = ( url = = null ) ? null : url . toNormalform ( true , true ) ;
2006-04-03 00:59:53 +02:00
}
2007-08-04 01:06:53 +02:00
2006-04-03 00:59:53 +02:00
int width = post . getInt ( " width " , 0 ) ;
int height = post . getInt ( " height " , 0 ) ;
2006-04-07 15:38:09 +02:00
int maxwidth = post . getInt ( " maxwidth " , 0 ) ;
int maxheight = post . getInt ( " maxheight " , 0 ) ;
2008-08-02 14:12:04 +02:00
final int timeout = post . getInt ( " timeout " , 5000 ) ;
2006-04-03 00:59:53 +02:00
2006-10-03 13:05:48 +02:00
// getting the image as stream
2008-01-29 17:41:09 +01:00
Image scaled = iconcache . get ( urlString ) ;
2007-09-06 03:28:35 +02:00
if ( scaled = = null ) {
2008-11-11 22:33:40 +01:00
Object [ ] resource = null ;
2009-03-06 16:39:02 +01:00
if ( url ! = null ) try {
2008-11-11 22:33:40 +01:00
resource = plasmaSnippetCache . getResource ( url , true , timeout , false , true ) ;
} catch ( IOException e ) {
2009-01-31 00:33:47 +01:00
Log . logWarning ( " ViewImage " , " cannot load: " + e . getMessage ( ) ) ;
2008-11-11 22:33:40 +01:00
}
2007-09-06 03:28:35 +02:00
byte [ ] imgb = null ;
if ( resource = = null ) {
if ( urlString . endsWith ( " .ico " ) ) {
// load default favicon dfltfvcn.ico
2009-03-06 16:39:02 +01:00
if ( defaulticonb = = null ) try {
2009-01-31 02:06:56 +01:00
imgb = FileUtils . read ( new File ( sb . getRootPath ( ) , defaulticon ) ) ;
2008-08-02 14:12:04 +02:00
} catch ( final IOException e ) {
2007-09-06 03:28:35 +02:00
return null ;
2009-03-06 16:39:02 +01:00
} else {
imgb = defaulticonb ;
2007-09-06 03:28:35 +02:00
}
} else {
return null ;
}
} else {
2008-08-02 14:12:04 +02:00
final InputStream imgStream = ( InputStream ) resource [ 0 ] ;
2007-09-06 03:28:35 +02:00
if ( imgStream = = null ) return null ;
// read image data
2007-07-15 03:34:01 +02:00
try {
2009-01-31 02:06:56 +01:00
imgb = FileUtils . read ( imgStream ) ;
2008-08-02 14:12:04 +02:00
} catch ( final IOException e ) {
2007-07-15 03:34:01 +02:00
return null ;
2007-09-06 03:28:35 +02:00
} finally {
try {
imgStream . close ( ) ;
2008-08-02 14:12:04 +02:00
} catch ( final Exception e ) { /* ignore this */ }
2007-07-15 03:34:01 +02:00
}
}
2007-09-06 03:28:35 +02:00
// read image
2008-08-06 21:43:12 +02:00
final Image image = ymageImageParser . parse ( urlString , imgb ) ;
2007-09-06 03:28:35 +02:00
if ( ( auth ) & & ( ( width = = 0 ) | | ( height = = 0 ) ) & & ( maxwidth = = 0 ) & & ( maxheight = = 0 ) ) return image ;
// find original size
2008-08-02 14:12:04 +02:00
final int h = image . getHeight ( null ) ;
final int w = image . getWidth ( null ) ;
2008-02-25 15:08:15 +01:00
2007-09-06 03:28:35 +02:00
// in case of not-authorized access shrink the image to prevent
2008-02-25 15:08:15 +01:00
// copyright problems, so that images are not larger than thumbnails
if ( auth ) {
maxwidth = ( maxwidth = = 0 ) ? w : maxwidth ;
maxheight = ( maxheight = = 0 ) ? h : maxheight ;
} else if ( ( w > 16 ) | | ( h > 16 ) ) {
2007-09-06 03:28:35 +02:00
maxwidth = ( int ) Math . min ( 64 . 0 , w * 0 . 6 ) ;
maxheight = ( int ) Math . min ( 64 . 0 , h * 0 . 6 ) ;
2008-02-25 15:08:15 +01:00
} else {
maxwidth = 16 ;
maxheight = 16 ;
2007-07-15 03:34:01 +02:00
}
2006-04-04 16:36:01 +02:00
2007-09-06 03:28:35 +02:00
// calculate width & height from maxwidth & maxheight
2008-02-25 15:08:15 +01:00
if ( ( maxwidth < w ) | | ( maxheight < h ) ) {
// scale image
2008-08-02 14:12:04 +02:00
final double hs = ( w < = maxwidth ) ? 1 . 0 : ( ( double ) maxwidth ) / ( ( double ) w ) ;
final double vs = ( h < = maxheight ) ? 1 . 0 : ( ( double ) maxheight ) / ( ( double ) h ) ;
2007-09-06 03:28:35 +02:00
double scale = Math . min ( hs , vs ) ;
if ( ! auth ) scale = Math . min ( scale , 0 . 6 ) ; // this is for copyright purpose
if ( scale < 1 . 0 ) {
2008-02-25 15:08:15 +01:00
width = Math . max ( 1 , ( int ) ( w * scale ) ) ;
height = Math . max ( 1 , ( int ) ( h * scale ) ) ;
2007-09-06 03:28:35 +02:00
} else {
2008-02-25 15:08:15 +01:00
width = Math . max ( 1 , w ) ;
height = Math . max ( 1 , h ) ;
2007-09-06 03:28:35 +02:00
}
2008-02-25 15:08:15 +01:00
// compute scaled image
scaled = ( ( w = = width ) & & ( h = = height ) ) ? image : image . getScaledInstance ( width , height , Image . SCALE_AREA_AVERAGING ) ;
2008-08-02 14:12:04 +02:00
final MediaTracker mediaTracker = new MediaTracker ( new Container ( ) ) ;
2008-02-25 15:08:15 +01:00
mediaTracker . addImage ( scaled , 0 ) ;
2008-08-02 14:12:04 +02:00
try { mediaTracker . waitForID ( 0 ) ; } catch ( final InterruptedException e ) { }
2006-04-07 15:38:09 +02:00
} else {
2008-02-25 15:08:15 +01:00
// do not scale
2006-04-07 15:38:09 +02:00
width = w ;
height = h ;
2008-02-25 15:08:15 +01:00
scaled = image ;
2006-04-04 16:36:01 +02:00
}
2007-09-06 03:28:35 +02:00
if ( ( height = = 16 ) & & ( width = = 16 ) & & ( resource ! = null ) ) {
// this might be a favicon, store image to cache for faster re-load later on
iconcache . put ( urlString , scaled ) ;
}
2006-04-04 16:36:01 +02:00
}
2006-04-03 00:59:53 +02:00
return scaled ;
}
}