// Hit counter servlet, with visitor logging // http://home.comcast.net/~rowland3 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import java.awt.image.*; import com.sun.image.codec.jpeg.*; class Webpage { int count= 0; final String referer; static String rootpath= null; static final String fs= File.separator; Webpage(String _referer) { referer= _referer; count= 0; try { // read the old log LineNumberReader flog= logReader(); if (flog!= null) { while (flog.readLine()!= null) count++; flog.close(); } } catch (Exception E) { } } String logspec() { String safeRefer= referer.replace('/', '.'); if (safeRefer.startsWith("http:")) safeRefer= safeRefer.substring(7); return rootpath+ "Feedback."+ safeRefer+ ".log"; } LineNumberReader logReader() { try { String flogspec= logspec(); File f= new File(flogspec); if (!f.exists()) return null; Reader flogs= new InputStreamReader(new FileInputStream(flogspec)); LineNumberReader flog= new LineNumberReader(flogs); return flog; } catch (Exception E) { return null; } } static void flogwrite(OutputStream flog, String s) throws IOException { flog.write(s.getBytes()); } void log(HttpServletRequest request) { String remoteaddr= request.getRemoteAddr(); String localaddr= request.getLocalAddr(); if (!remoteaddr.equals(localaddr) && !remoteaddr.startsWith("192.168.")) { try { FileOutputStream flog= new FileOutputStream(logspec(), true); // open to append java.util.Date d= new java.util.Date(); flogwrite(flog, d.toString()+ ":\tHost:"+ request.getRemoteHost()+ "\n"); //flogwrite(flog, "\tReferer:"+ referer+ "\n"); flog.close(); } catch (Exception E) { try { FileOutputStream ferr= new FileOutputStream(rootpath+ "Feedback.ERR.log", true); // open to append ferr.write(E.toString().getBytes()); ferr.close(); } catch (Exception E2) { } } count++; } } } public class Feedback extends HttpServlet{ static final String fs= File.separator; static Map webpages= null; static BufferedImage[] cache= null; // Cribbed from http://www.developer.com/tech/article.php/606551 protected final static int WIDTH = 50, HEIGHT = 18, FONTSIZE = 14; protected final static String FONTNAME = "Arial"; public void init(ServletConfig config) throws ServletException { super.init(config); webpages= new TreeMap(); Webpage.rootpath= getServletContext().getRealPath("/")+fs; cache= new BufferedImage[100]; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Send the image to the client OutputStream out = response.getOutputStream(); String referer= request.getHeader("referer"); if (referer== null) referer= "null"; int ix= referer.indexOf('?'); if (ix< 0) ix= referer.indexOf('#'); if (ix> 0) referer= referer.substring(0, ix); Object O= webpages.get(referer); Webpage wp= null; if (O== null) { wp= new Webpage(referer); webpages.put(referer, wp); } else wp= (Webpage)O; // Now for the logging.. wp.log(request); // Now return something to client... String pathInfo= request.getPathInfo(); if (pathInfo==null) pathInfo="whatever.jpg"; ix= pathInfo.indexOf("list.html"); if (ix< 0) { response.setContentType("image/jpeg"); BufferedImage img= null; if (wp.count< cache.length) img= cache[wp.count]; if (img==null) { img = draw(Integer.toString(wp.count)); if (wp.count< cache.length) cache[wp.count]= img; // save time next time } JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(img); param.setQuality(1.0f,true); encoder.encode(img,param); } else { response.setContentType("text/plain"); LineNumberReader flog= wp.logReader(); if (flog!= null) { while (true) { String line= flog.readLine(); if (line== null) break; line+= "\n"; out.write(line.getBytes()); } flog.close(); } } out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } // Based on http://www.developer.com/tech/article.php/606551 protected BufferedImage draw(String st) { BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = img.createGraphics(); g2.setBackground(Color.black); g2.clearRect(0,0, WIDTH,HEIGHT); g2.setColor(Color.white); Font font = new Font(FONTNAME, Font.PLAIN, FONTSIZE); g2.setFont(font); TextLayout tl = new TextLayout(st,font, g2.getFontRenderContext()); Rectangle2D r = tl.getBounds(); // center the text tl.draw(g2,(float)((WIDTH- r.getWidth()) / 2), (float)(((HEIGHT- r.getHeight()) / 2) + r.getHeight())); g2.dispose(); return img; } }