KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > kawa > servlet > CGIServletWrapper


1 // Copyright (c) 2002 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.kawa.servlet;
5 import javax.servlet.*;
6 import javax.servlet.http.*;
7 import java.util.*;
8 import java.io.*;
9 import java.net.*;
10
11 /** Wrapper class to allow a Servlet to be run as a CGI script.
12  * Invoked as:
13  * java CGI_ARGS... gnu.kawa.servlet.CGIServletWrapper SERVLET
14  * where CGI_ARGS... are properties set from CGI environment variables (for
15  * example -DPATH_INFO="foo") and SERVLET is the name of the servlet class.
16  * The cgi-wrapper program in ../../../bin can used do this.
17  */

18
19 public class CGIServletWrapper extends ServletOutputStream
20 implements HttpServletRequest, HttpServletResponse,
21   ServletConfig, ServletContext
22 {
23   byte buffer[] = null;
24   int bufpos = 0;
25   PrintStream out = System.out;
26   Vector headers = new Vector();
27   String JavaDoc sawContentType;
28   int statusCode = 0;
29   String JavaDoc statusString;
30   String JavaDoc servletName;
31
32   public static void main(String JavaDoc[] args)
33   {
34     try
35       {
36     CGIServletWrapper wrapper = new CGIServletWrapper();
37     Class JavaDoc servClass = Class.forName(args[0]);
38     wrapper.servletName = args[0];
39     HttpServlet servlet = (HttpServlet) servClass.newInstance();
40     servlet.init(wrapper);
41     servlet.service(wrapper, wrapper);
42     wrapper.flushBuffer();
43       }
44     catch (Throwable JavaDoc ex)
45       {
46     ex.printStackTrace();
47     System.exit(-1);
48       }
49   }
50
51   private static final int defaultBufferSize = 2048;
52
53   private void allocateBuffer()
54   {
55     if (buffer == null)
56       buffer = new byte[defaultBufferSize];
57   }
58
59   public void write(int c)
60     throws java.io.IOException JavaDoc
61   {
62     allocateBuffer();
63     int bufsize = buffer.length;
64     if (buffer.length == 0)
65       {
66     committ();
67     out.write(c);
68       }
69     else
70       {
71     if (bufpos >= buffer.length)
72       flushBuffer();
73     buffer[bufpos++] = (byte) c;
74       }
75   }
76
77   public String JavaDoc getCgiEnvVar(String JavaDoc name)
78   {
79     return System.getProperty(name);
80   }
81
82   public ServletOutputStream getOutputStream()
83   {
84     return this;
85   }
86
87   PrintWriter writer;
88
89   public java.io.PrintWriter JavaDoc getWriter()
90   {
91     if (writer == null)
92       writer = new PrintWriter(out);
93     return writer;
94   }
95
96   public java.util.Map JavaDoc getParameterMap()
97   {
98     return null; // FIXME
99
}
100
101   public void setBufferSize(int size)
102   {
103     if (bufpos > 0 || committed)
104       throw new IllegalStateException JavaDoc();
105     buffer = new byte[size];
106   }
107
108   public int getBufferSize()
109   {
110
111     return buffer == null ? defaultBufferSize : buffer.length;
112   }
113
114   public void setLocale (java.util.Locale JavaDoc locale)
115   {
116     // FIXME
117
}
118
119   private void committ()
120     throws IOException
121   {
122     if (! committed)
123       {
124     printHeaders();
125     committed = true;
126       }
127   }
128
129   public void flushBuffer()
130     throws IOException
131   {
132     committ();
133     if (bufpos > 0)
134       out.write(buffer, 0, bufpos);
135     bufpos = 0;
136   }
137
138   public void resetBuffer()
139   {
140     bufpos = 0;
141   }
142
143   public void reset()
144   {
145     // FIXME
146
resetBuffer();
147   }
148
149   java.util.Hashtable JavaDoc attributes;
150
151   public Object JavaDoc getAttribute(String JavaDoc name)
152   {
153     return attributes == null ? null : attributes.get(name);
154   }
155
156   public void setAttribute(String JavaDoc name, Object JavaDoc value)
157   {
158     if (value == null)
159       removeAttribute(name);
160     else
161       {
162     if (attributes == null)
163       attributes = new java.util.Hashtable JavaDoc();
164     attributes.put(name, value);
165       }
166   }
167
168   public void removeAttribute(String JavaDoc name)
169   {
170     if (attributes != null)
171       attributes.remove(name);
172   }
173
174   public Enumeration getAttributeNames()
175   {
176     return attributes.keys();
177   }
178
179   public String JavaDoc getContentType()
180   {
181     return getCgiEnvVar("CONTENT_TYPE");
182   }
183
184
185   public String JavaDoc getPathInfo()
186   {
187     return getCgiEnvVar("PATH_INFO");
188   }
189
190   public String JavaDoc getPathTranslated()
191   {
192     return getCgiEnvVar("PATH_TRANSLATED");
193   }
194
195   public String JavaDoc getRequestURI()
196   {
197     String JavaDoc script = getServletPath();
198     String JavaDoc path = getPathInfo();
199     if (script == null)
200       return path;
201     if (path == null)
202       return script;
203     return script + '/' + path;
204   }
205
206   public StringBuffer JavaDoc getRequestURL()
207   {
208     // Copied from Tomcat 4.0:
209

210     StringBuffer JavaDoc url = new StringBuffer JavaDoc(100);
211     String JavaDoc scheme = getScheme();
212     int port = getServerPort();
213     if (port < 0)
214       port = 80; // Work around java.net.URL bug
215
url.append(scheme);
216     url.append("://");
217     url.append(getServerName());
218     if ((scheme.equals("http") && (port != 80))
219     || (scheme.equals("https") && (port != 443)))
220       {
221     url.append(':');
222     url.append(port);
223       }
224     url.append('/');
225     url.append(getRequestURI());
226     return url;
227   }
228
229   public String JavaDoc getProtocol()
230   {
231     return getCgiEnvVar("SERVER_PROTOCOL");
232   }
233
234   public int getServerPort()
235   {
236     String JavaDoc port = getCgiEnvVar("SERVER_PORT");
237     if (port != null)
238       {
239     try
240       {
241         return Integer.parseInt(port);
242       }
243     catch (Throwable JavaDoc ex)
244       {
245       }
246       }
247     return -1;
248   }
249
250   public int getLocalPort()
251   {
252     return getServerPort(); // is this resonable?
253
}
254
255   public String JavaDoc getLocalAddr ()
256   {
257     try
258       {
259     return InetAddress.getByName(getLocalName()).getHostAddress();
260       }
261     catch (UnknownHostException ex)
262       {
263     return "127.0.0.1";
264       }
265   }
266
267   public String JavaDoc getLocalName ()
268   {
269     return getServerName(); // is this resonable?
270
}
271
272   public int getRemotePort()
273   {
274     return -1; // FIXME
275
}
276
277   public boolean isSecure()
278   {
279     return getServerPort() == 443; // FIXME
280
}
281
282   public String JavaDoc getServerName()
283   {
284     return getCgiEnvVar("SERVER_NAME");
285   }
286
287   public String JavaDoc getMethod()
288   {
289     String JavaDoc method = getCgiEnvVar("REQUEST_METHOD");
290     return method == null ? "GET" : method;
291   }
292
293   boolean committed;
294   String JavaDoc characterEncoding;
295
296   public boolean isCommitted()
297   {
298     return committed;
299   }
300
301   public String JavaDoc getCharacterEncoding () { return characterEncoding; }
302
303   public void setCharacterEncoding(String JavaDoc enc)
304   {
305     characterEncoding = enc;
306   }
307
308   public void setContentType(String JavaDoc type)
309   {
310     setHeader("Content-Type", type);
311   }
312
313   public void setContentLength (int len)
314   {
315     setIntHeader("Content-Length", len);
316   }
317
318   public void addCookie(Cookie cookie)
319   {
320     // FIXME
321
}
322
323   public boolean containsHeader(String JavaDoc str)
324   {
325     int num = headers.size();
326     for (int i = 0; i < num; i += 2)
327       if (headers.elementAt(i).equals(str))
328     return true;
329     return false;
330   }
331
332   public String JavaDoc encodeURL(String JavaDoc str)
333   {
334     return null; // FIXME
335
}
336
337   public String JavaDoc encodeUrl(String JavaDoc str)
338   {
339     return null; // FIXME
340
}
341
342   public String JavaDoc encodeRedirectURL(String JavaDoc str)
343   {
344     return null; // FIXME
345
}
346
347   public String JavaDoc encodeRedirectUrl(String JavaDoc str)
348   {
349     return null; // FIXME
350
}
351
352   public void sendError(int i, String JavaDoc str)
353   {
354     statusCode = i;
355     statusString = str;
356   }
357
358   public void sendError(int i)
359   {
360     statusCode = i;
361     statusString = null;
362   }
363
364   public void sendRedirect(String JavaDoc str)
365   {
366     // ignore FIXME
367
}
368
369   private void printHeader(String JavaDoc label, String JavaDoc value)
370   {
371     out.print(label);
372     out.print(": ");
373     out.println(value); // FIXME - need to quote?
374
}
375
376   private void printHeaders()
377   {
378     if (statusCode != 0)
379       {
380     out.print("Status: ");
381     out.print(statusCode);
382     if (statusString != null)
383       {
384         out.print(' ');
385         out.print(statusString);
386       }
387     out.println();
388       }
389     if (sawContentType == null)
390       setContentType("text/html"); // FIXME
391
int num = headers.size();
392     for (int i = 0; i < num; i += 2)
393       printHeader(headers.elementAt(i).toString(),
394           headers.elementAt(i + 1).toString());
395     // if (sawContentType == null) writeRaw("Content-Type: text/html"); FIXME
396
out.println();
397   }
398
399   public void setDateHeader(String JavaDoc str, long l)
400   {
401     // ignore FIXME
402
}
403
404   public void addDateHeader(String JavaDoc str, long l)
405   {
406     // ignore FIXME
407
}
408
409   public void setHeader(String JavaDoc label, String JavaDoc value)
410   {
411     int num = headers.size();
412     for (int i = 0; i < num; i += 2)
413       if (headers.elementAt(i).equals(label))
414     {
415       if (label.equalsIgnoreCase("Content-type"))
416         sawContentType = value;
417       headers.setElementAt(value, i+1);
418       break;
419     }
420     addHeader(label, value);
421   }
422
423   public void setIntHeader(String JavaDoc str, int i)
424   {
425     setHeader(str, Integer.toString(i));
426   }
427
428   public void addHeader(String JavaDoc label, String JavaDoc value)
429   {
430     if (label.equalsIgnoreCase("Content-type"))
431       sawContentType = value;
432     headers.addElement(label);
433     headers.addElement(value);
434   }
435
436   public void addIntHeader(String JavaDoc str, int i)
437   {
438     addHeader(str, Integer.toString(i));
439   }
440
441   public void setStatus(int i)
442   {
443     statusCode = i;
444     statusString = null;
445   }
446
447   public void setStatus(int i, String JavaDoc str)
448   {
449     statusCode = i;
450     statusString = str;
451   }
452
453   public String JavaDoc getScheme()
454   {
455     return getServerPort() == 443 ? "https" : "http"; // FIXME
456
}
457
458   public java.util.Enumeration JavaDoc getLocales()
459   {
460     return null; // FIXME
461
}
462
463   public String JavaDoc getRealPath(String JavaDoc path)
464   {
465     return null; // FIXME
466
}
467
468   public Locale getLocale()
469   {
470     return null; // FIXME
471
}
472
473   public RequestDispatcher getRequestDispatcher(String JavaDoc path)
474   {
475     return null; // FIXME
476
}
477
478   public String JavaDoc getRemoteAddr()
479   {
480     return getCgiEnvVar("REMOTE_ADDR");
481   }
482
483   public String JavaDoc getRemoteHost()
484   {
485     String JavaDoc host = getCgiEnvVar("REMOTE_HOST");
486     return host != null ? host : getRemoteAddr();
487   }
488
489   public java.io.BufferedReader JavaDoc getReader()
490   {
491     return null; // FIXME
492
}
493
494   public ServletInputStream getInputStream()
495   {
496     return null; // FIXME
497
}
498
499   public String JavaDoc getParameter(String JavaDoc name)
500   {
501     return null; // FIXME
502
}
503
504   public Enumeration getParameterNames()
505   {
506     return null; // FIXME
507
}
508
509   public String JavaDoc[] getParameterValues(String JavaDoc name)
510   {
511     return null; // FIXME
512
}
513
514   public int getContentLength()
515   {
516    String JavaDoc length = getCgiEnvVar("CONTENT_LENGTH");
517     if (length != null)
518       {
519     try
520       {
521         return Integer.parseInt(length);
522       }
523     catch (Throwable JavaDoc ex)
524       {
525       }
526       }
527     return 0;
528   }
529
530   public String JavaDoc getAuthType()
531   {
532     return getCgiEnvVar("AUTH_TYPE");
533   }
534
535   public long getDateHeader(String JavaDoc str)
536   {
537     return -1; // FIXME
538
}
539
540   public String JavaDoc getHeader(String JavaDoc str)
541   {
542     return null; // FIXME
543
}
544
545   public Enumeration getHeaders(String JavaDoc str)
546   {
547     return null; // FIXME
548
}
549
550   public boolean isRequestedSessionIdValid()
551   {
552     return false; // FIXME
553
}
554
555   public boolean isRequestedSessionIdFromCookie()
556   {
557     return false; // FIXME
558
}
559
560   public boolean isRequestedSessionIdFromURL()
561   {
562     return false; // FIXME
563
}
564
565   public boolean isRequestedSessionIdFromUrl()
566   {
567     return false; // FIXME
568
}
569
570   public String JavaDoc getRequestedSessionId()
571   {
572     return null; // FIXME
573
}
574
575   public String JavaDoc getServletPath()
576   {
577     return getCgiEnvVar("SCRIPT_NAME");
578   }
579
580   public HttpSession getSession(boolean b)
581   {
582     return null; // FIXME
583
}
584
585   public HttpSession getSession()
586   {
587     return null; // FIXME
588
}
589
590   public String JavaDoc getRemoteUser()
591   {
592     return getCgiEnvVar("REMOTE_USER");
593   }
594
595   public boolean isUserInRole(String JavaDoc role)
596   {
597     return false; // FIXME
598
}
599
600   public java.security.Principal JavaDoc getUserPrincipal()
601   {
602     return null; // FIXME
603
}
604
605   public String JavaDoc getContextPath()
606   {
607     return ""; // FIXME
608
}
609
610   public String JavaDoc getQueryString()
611   {
612     return getCgiEnvVar("QUERY_STRING");
613   }
614
615   public Enumeration getHeaderNames()
616   {
617     return null; // FIXME
618
}
619
620   public int getIntHeader(String JavaDoc str)
621   {
622     return -1; // FIXME
623
}
624
625   public javax.servlet.http.Cookie JavaDoc[] getCookies()
626   {
627     return null; // FIXME
628
}
629
630   // ServletConfig methods
631

632   public String JavaDoc getInitParameter(String JavaDoc name)
633   {
634     return null; // FIXME
635
}
636
637   public Enumeration getInitParameterNames()
638   {
639     return nullEnumeration;
640   }
641
642   public ServletContext getServletContext()
643   {
644     return this;
645   }
646
647   public String JavaDoc getServletName()
648   {
649     return servletName;
650   }
651
652   // ServletContext methods:
653

654   public ServletContext getContext (String JavaDoc path) { return null; }
655
656   public int getMajorVersion () { return 2; }
657   public int getMinorVersion () { return 3; }
658   public String JavaDoc getMimeType (String JavaDoc file) { return null; }
659
660   public java.util.Set JavaDoc getResourcePaths (String JavaDoc path) { return null; }
661   public java.net.URL JavaDoc getResource (String JavaDoc path) { return null; }
662   public java.io.InputStream JavaDoc getResourceAsStream (String JavaDoc path) { return null; }
663
664   public RequestDispatcher getNamedDispatcher (String JavaDoc path) { return null; }
665   public Servlet getServlet (String JavaDoc name) { return null; }
666   static final Enumeration nullEnumeration
667     = new gnu.lists.SeqPosition(gnu.lists.LList.Empty, 0, false);
668   public Enumeration getServlets () { return nullEnumeration; }
669   public Enumeration getServletNames () { return nullEnumeration; }
670
671   public void log (String JavaDoc message) { }
672   public void log (Exception JavaDoc ex, String JavaDoc mgs) { }
673   public void log (String JavaDoc msg, Throwable JavaDoc ex) { }
674   public String JavaDoc getServerInfo () { return "Kawa CGI/servlet wrapper";}
675
676   public java.lang.String JavaDoc getServletContextName () { return null; }
677 }
678
Popular Tags