/* * 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("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