/* * Copyleft 1997-1999 by Anton Kolonin, * */ import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import com.vm.app.VMServer; import com.vm.mind.MIWorld; import com.vm.visual.VMSpace; import com.vm.visual.VMContainer; public class w extends GenericServlet { public void _service(ServletRequest req, ServletResponse res) { doSimpleTest(req,res); } public void doSimpleTest(ServletRequest req, ServletResponse res) { try { res.setContentType("text/html"); OutputStream os = res.getOutputStream(); DataOutputStream bo = new DataOutputStream(new BufferedOutputStream(os)); bo.writeBytes("\n"); bo.writeBytes("\n"); bo.writeBytes("My Servlet\n"); bo.writeBytes("\n"); bo.writeBytes("\n"); bo.writeBytes("

My Servlet

\n"); bo.writeBytes("

This is a test.\n"); bo.writeBytes("

Your IP address is " + req.getRemoteAddr()+"\n"); bo.writeBytes("

Your request class is " + req.getClass().getName()+"\n"); bo.writeBytes("

Your current directory is " + System.getProperty("user.dir")+"\n"); if (req instanceof HttpServletRequest) { bo.writeBytes("

Your query string is " + ((HttpServletRequest)req).getQueryString()+"\n"); } else bo.writeBytes("

Your request is not Http one\n"); bo.writeBytes("\n"); bo.writeBytes("\n"); bo.flush(); bo.close(); res.flushBuffer(); } catch (Exception e) { lastInput.append("doSimpleTest: "+e.toString()+"\n"); } } Properties requestProps = new Properties(); String udir; String content; String method; String query; int length; static int callCount = 0; static StringBuffer lastInput = new StringBuffer(); static Hashtable worldMap = new Hashtable(); static boolean debug = true; static void println(String s) { lastInput.append(s+"\n"); } public void destroy() { save(); } synchronized void save() { lastInput.setLength(0); Enumeration e = worldMap.elements(); while (e.hasMoreElements()) { VMContainer c = (VMContainer)e.nextElement(); lastInput.append("saving world "+c.getSpace().m_world.m_name+"\n"); c.getSpace().save(); } } synchronized void doDown() { Enumeration e = worldMap.keys(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); VMContainer c = (VMContainer)worldMap.get(name); lastInput.append("closing world "+c.getSpace().m_world.m_name+"\n"); worldMap.remove(name); } } public void service(ServletRequest req, ServletResponse res) { VMContainer wContainer; try { callCount++; String query = null; if (req instanceof HttpServletRequest) { query = ((HttpServletRequest)req).getQueryString(); } String udir = System.getProperty("user.dir"); if (udir.equals("/")) { udir="/usr/home/webstructor/blah/blah/blah"; } String propname; if (query==null || query.equalsIgnoreCase("")) { doSimpleTest(req,res); } else if (query.equalsIgnoreCase("info")) { doInfo(req,res); // passed } else if (query.equalsIgnoreCase("down")) { doDown(); // passed } else if (query.equalsIgnoreCase("save")) { save(); BufferedWriter bw = new BufferedWriter(new FileWriter(udir+"log.txt",true)); bw.write(lastInput.toString()); bw.close(); } else if (query.equalsIgnoreCase("dir")) { doDir(req,res,udir); } if (req instanceof HttpServletRequest) { String method = ((HttpServletRequest)req).getMethod(); String lowerQ = query.toLowerCase(); if (method.equalsIgnoreCase("get")&&(lowerQ.endsWith(".gif")||lowerQ.endsWith(".jpg")||lowerQ.endsWith(".jpeg"))) { if (!lowerQ.startsWith("http://")) query=udir+query; lastInput.setLength(0); lastInput.append("serving image "+query+"\n"); try { InputStream is = req.getInputStream(); OutputStream os = res.getOutputStream(); serveImage(req,res,is,os,query); } catch (Exception e) { lastInput.append("got POST error:"+e.toString()+"\n"); } } else if ((wContainer = getContainer(udir+query))!=null) { if (method.equalsIgnoreCase("POST")) { lastInput.setLength(0); lastInput.append("getting input\n"); int count=0; try { StringBuffer data = new StringBuffer(); BufferedReader br = req.getReader(); String s; while ((s=br.readLine())!=null) { data.append(s).append('\n'); count++; } synchronized (wContainer) { getData(wContainer.getSpace(),data.toString()); } lastInput.append("got "+count+" input lines:"+data+"\n"); } catch (Exception e) { lastInput.append("got POST error:"+e.toString()+"\n"); } lastInput.append("saving all\n"); save(); } if (method.equalsIgnoreCase("GET")) { InputStream is = req.getInputStream(); OutputStream os = res.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); synchronized (wContainer) { bw.write(wContainer.getSpace().toString(wContainer.getSpace().m_world)); } bw.flush(); res.flushBuffer(); } }// if (wContainer = getContainer(query))!=null) { }//if (req instanceof HttpServletRequest) } catch (Exception e) { lastInput.append("service: "+e.toString()+"\n"); } } VMContainer getContainer(String wName) { VMServer wContainer = null; if (wName!=null) { wName = wName+".txt"; if (!(new File(wName)).exists()) { //oops } else { synchronized (worldMap) { wContainer = (VMServer)worldMap.get(wName); if (wContainer==null) { wContainer = (VMServer)VMServer.make(new String[]{wName}); wContainer.setOutput(lastInput); worldMap.put(wName,wContainer); } } } } return wContainer; } /** provide image from local file only */ void doImage(InputStream is, OutputStream os, ServletResponse res, String image) { try { DataOutputStream bo = new DataOutputStream(new BufferedOutputStream(os)); File imageFile = new File(image); if (imageFile.exists()) { int i=0; BufferedInputStream im = new BufferedInputStream(new FileInputStream(imageFile)); int b; while ((b=im.read())!=-1) { bo.write(b); i++; } } bo.flush(); bo.close(); res.flushBuffer(); } catch (Exception e) { lastInput.append("doImage : "+e.toString()+"\n"); } } /** provide image from local file or remote URL */ public void serveImage(ServletRequest req, ServletResponse res, InputStream is, OutputStream os, String i_name) throws Exception { BufferedInputStream bi = new BufferedInputStream(is); DataOutputStream bo = new DataOutputStream(new BufferedOutputStream(os)); BufferedInputStream im = null; String lowerImage = i_name.toLowerCase(); if (lowerImage.startsWith("http://")) { URL url = new URL(i_name); URLConnection connection = url.openConnection(); im = new BufferedInputStream(connection.getInputStream()); } else { File imageFile = new File(i_name); if (!imageFile.exists()) { } else { im = new BufferedInputStream(new FileInputStream(imageFile)); } } if (im!=null) { if (lowerImage.endsWith("gif")) res.setContentType("image/gif"); else if (lowerImage.endsWith("jpeg") || lowerImage.endsWith("jpg")) res.setContentType("image/jpeg"); int b; int c=0; while ((b=im.read())!=-1) { bo.write(b); c++; } res.setContentLength(c); } bo.flush(); bo.close(); res.flushBuffer(); } /** logs request parameters into propery */ void logRequestProperty(String k, String v) { if (k!=null && v!=null) requestProps.put(k,v); } void getData(VMSpace space,String data) { { MIWorld world = new MIWorld(space); world.receive(data); space.m_world.merge(world); world = null; // help gc } System.gc(); // collect world } void doInfo(ServletRequest req, ServletResponse res) throws java.io.IOException { InputStream is = req.getInputStream(); OutputStream os = res.getOutputStream(); DataOutputStream bo = new DataOutputStream(new BufferedOutputStream(os)); bo.writeBytes("protocol="+req.getProtocol()+"\n"); bo.writeBytes("udir="+System.getProperty("user.dir")+"\n"); bo.writeBytes("count="+callCount+"\n"); bo.writeBytes("entries="+worldMap.size()+"\n"); bo.writeBytes("lastInput="+lastInput.toString()+"\n"); bo.flush(); res.flushBuffer(); } void doDir(ServletRequest req, ServletResponse res,String path) throws java.io.IOException { InputStream is = req.getInputStream(); OutputStream os = res.getOutputStream(); DataOutputStream bo = new DataOutputStream(new BufferedOutputStream(os)); File dir = new File(path); String list[] = dir.list(); bo.writeBytes("directory="+path+"\n"); for (int i=0;i