did some extra instrumentation of these files (with LOG4J), at the request of
Amos and Laurie at Narex
This commit is contained in:
		
							parent
							
								
									2e455b4bdd
								
							
						
					
					
						commit
						a258f6ee80
					
				@ -25,6 +25,7 @@ import javax.activation.DataSource;
 | 
			
		||||
import javax.mail.*;
 | 
			
		||||
import javax.mail.internet.*;
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import org.apache.log4j.*;
 | 
			
		||||
 | 
			
		||||
// This class was built in a process I call "Java Junkyard Wars," in which I put together
 | 
			
		||||
// a bunch of APIs in ways that their designers would never have anticipated.  It's
 | 
			
		||||
@ -83,19 +84,29 @@ public class ServletMultipartHandler
 | 
			
		||||
 | 
			
		||||
  static class MultipartDataValue implements Blob
 | 
			
		||||
  {
 | 
			
		||||
    private static final int BLKSIZE = 4096;
 | 
			
		||||
 | 
			
		||||
    private byte[] actual_data;  // the actual data we contain
 | 
			
		||||
 | 
			
		||||
    public MultipartDataValue(MimeBodyPart part) throws MessagingException, IOException
 | 
			
		||||
    {
 | 
			
		||||
      if (logger.isDebugEnabled())
 | 
			
		||||
	logger.debug("creating new MultipartDataValue");
 | 
			
		||||
 | 
			
		||||
      // set up the streams to copy between
 | 
			
		||||
      InputStream in = part.getInputStream();
 | 
			
		||||
      ByteArrayOutputStream out = new ByteArrayOutputStream();
 | 
			
		||||
      byte[] copybuf = new byte[4096];
 | 
			
		||||
      int ct = in.read(copybuf);
 | 
			
		||||
      byte[] copybuf = new byte[BLKSIZE];
 | 
			
		||||
 | 
			
		||||
      // begin the copy loop
 | 
			
		||||
      int ct = in.read(copybuf,0,BLKSIZE);
 | 
			
		||||
      while (ct>=0)
 | 
			
		||||
      { // do a simple read and write
 | 
			
		||||
	if (logger.isDebugEnabled())
 | 
			
		||||
	  logger.debug("read blksize = " + ct);
 | 
			
		||||
	if (ct>0)
 | 
			
		||||
	  out.write(copybuf,0,ct);
 | 
			
		||||
	ct = in.read(copybuf);
 | 
			
		||||
	ct = in.read(copybuf,0,BLKSIZE);
 | 
			
		||||
 | 
			
		||||
      } // end while
 | 
			
		||||
 | 
			
		||||
@ -103,6 +114,9 @@ public class ServletMultipartHandler
 | 
			
		||||
      actual_data = out.toByteArray();
 | 
			
		||||
      out.close();
 | 
			
		||||
 | 
			
		||||
      if (logger.isDebugEnabled())
 | 
			
		||||
	logger.debug("finished copying, " + actual_data.length + " bytes transferred");
 | 
			
		||||
 | 
			
		||||
    } // end constructor
 | 
			
		||||
 | 
			
		||||
    public long length()
 | 
			
		||||
@ -127,6 +141,7 @@ public class ServletMultipartHandler
 | 
			
		||||
 | 
			
		||||
    public long position(byte[] pattern, long start) throws SQLException
 | 
			
		||||
    {
 | 
			
		||||
      logger.warn("position() function is not implemented for MultipartDataValue");
 | 
			
		||||
      throw new SQLException("function not implemented");
 | 
			
		||||
 | 
			
		||||
    } // end position
 | 
			
		||||
@ -172,6 +187,15 @@ public class ServletMultipartHandler
 | 
			
		||||
 | 
			
		||||
      } // end if
 | 
			
		||||
 | 
			
		||||
      if (logger.isDebugEnabled())
 | 
			
		||||
      { // tell us what kind of parameter we have
 | 
			
		||||
	if (filename!=null)
 | 
			
		||||
	  logger.debug("new file parameter \"" + name + "\" defined (filename = " + filename + ")");
 | 
			
		||||
	else
 | 
			
		||||
	  logger.debug("new text parameter \"" + name + "\" defined");
 | 
			
		||||
 | 
			
		||||
      } // end if
 | 
			
		||||
 | 
			
		||||
    } // end constructor
 | 
			
		||||
 | 
			
		||||
    public String getName()
 | 
			
		||||
@ -201,6 +225,7 @@ public class ServletMultipartHandler
 | 
			
		||||
      } // end try
 | 
			
		||||
      catch (Exception e)
 | 
			
		||||
      { // turn any exception returns here into null returns
 | 
			
		||||
	logger.warn("parameter getValue() method threw a " + e.getClass().getName(),e);
 | 
			
		||||
	return null;
 | 
			
		||||
 | 
			
		||||
      } // end catch
 | 
			
		||||
@ -216,6 +241,7 @@ public class ServletMultipartHandler
 | 
			
		||||
      } // end try
 | 
			
		||||
      catch (Exception e)
 | 
			
		||||
      { // just dump a null on error
 | 
			
		||||
	logger.warn("parameter getContentType() method threw a " + e.getClass().getName(),e);
 | 
			
		||||
	return null;
 | 
			
		||||
 | 
			
		||||
      } // end catch
 | 
			
		||||
@ -231,6 +257,7 @@ public class ServletMultipartHandler
 | 
			
		||||
      } // end try
 | 
			
		||||
      catch (Exception e)
 | 
			
		||||
      { // just dump a -1 on error
 | 
			
		||||
	logger.warn("parameter getSize() method threw a " + e.getClass().getName(),e);
 | 
			
		||||
	return -1;
 | 
			
		||||
 | 
			
		||||
      } // end catch
 | 
			
		||||
@ -244,6 +271,9 @@ public class ServletMultipartHandler
 | 
			
		||||
 | 
			
		||||
      if (cached_value==null)
 | 
			
		||||
      { // we don't have the value cached yet
 | 
			
		||||
	if (logger.isDebugEnabled())
 | 
			
		||||
	  logger.debug("getting MultipartDataValue for parameter \"" + name + "\"");
 | 
			
		||||
 | 
			
		||||
	try
 | 
			
		||||
	{ // extract the value
 | 
			
		||||
	  cached_value = new MultipartDataValue(part);
 | 
			
		||||
@ -251,11 +281,13 @@ public class ServletMultipartHandler
 | 
			
		||||
	} // end try
 | 
			
		||||
	catch (MessagingException me)
 | 
			
		||||
	{ // translate exception here
 | 
			
		||||
	  logger.error("MIME parse error getting data content: " + me.getMessage(),me);
 | 
			
		||||
	  throw new ServletMultipartException("Error getting data content: " + me.getMessage(),me);
 | 
			
		||||
 | 
			
		||||
	} // end catch
 | 
			
		||||
	catch (IOException ioe)
 | 
			
		||||
	{ // translate exception here
 | 
			
		||||
	  logger.error("IO error getting data: " + ioe.getMessage(),ioe);
 | 
			
		||||
	  throw new ServletMultipartException("Error getting data content: " + ioe.getMessage(),ioe);
 | 
			
		||||
 | 
			
		||||
	} // end catch
 | 
			
		||||
@ -268,6 +300,13 @@ public class ServletMultipartHandler
 | 
			
		||||
 | 
			
		||||
  } // end class MultipartParameter
 | 
			
		||||
 | 
			
		||||
  /*--------------------------------------------------------------------------------
 | 
			
		||||
   * Static data members
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  private static Category logger = Category.getInstance(ServletMultipartHandler.class.getName());
 | 
			
		||||
 | 
			
		||||
  /*--------------------------------------------------------------------------------
 | 
			
		||||
   * Attributes
 | 
			
		||||
   *--------------------------------------------------------------------------------
 | 
			
		||||
@ -284,13 +323,22 @@ public class ServletMultipartHandler
 | 
			
		||||
 | 
			
		||||
  public ServletMultipartHandler(ServletRequest request) throws ServletMultipartException
 | 
			
		||||
  {
 | 
			
		||||
    if (logger.isDebugEnabled())
 | 
			
		||||
      logger.debug("creating new ServletMultipartHandler");
 | 
			
		||||
 | 
			
		||||
    if (!canHandle(request))
 | 
			
		||||
    { // we can't handle ordinary requests, just multipart/form-data ones
 | 
			
		||||
      logger.error("this request is not of type multipart/form-data");
 | 
			
		||||
      throw new ServletMultipartException("not a multipart/form-data request");
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
 | 
			
		||||
    try
 | 
			
		||||
    { // build the MimeMultipart based on the ServletDataSource
 | 
			
		||||
      multipart = new MimeMultipart(new ServletDataSource(request));
 | 
			
		||||
      int count = multipart.getCount();
 | 
			
		||||
      if (logger.isDebugEnabled())
 | 
			
		||||
	logger.debug("retrieved " + count + " parameter(s) from request");
 | 
			
		||||
      
 | 
			
		||||
      // allocate the multipart parameters and slot them into our arrays
 | 
			
		||||
      param_byname = new Hashtable();
 | 
			
		||||
@ -306,6 +354,7 @@ public class ServletMultipartHandler
 | 
			
		||||
    } // end try
 | 
			
		||||
    catch (MessagingException me)
 | 
			
		||||
    { // translate a MessagingException into the nicer ServletMultipartException
 | 
			
		||||
      logger.error("multipart parsing failed: " + me.getMessage(),me);
 | 
			
		||||
      throw new ServletMultipartException("Error parsing request data: " + me.getMessage(),me);
 | 
			
		||||
 | 
			
		||||
    } // end catch
 | 
			
		||||
@ -356,7 +405,11 @@ public class ServletMultipartHandler
 | 
			
		||||
  {
 | 
			
		||||
    MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
 | 
			
		||||
    if (parm==null)
 | 
			
		||||
    { // no such parameter!
 | 
			
		||||
      logger.warn("parameter \"" + name + "\" not found");
 | 
			
		||||
      return false;
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
      return parm.isFile();
 | 
			
		||||
 | 
			
		||||
@ -366,7 +419,11 @@ public class ServletMultipartHandler
 | 
			
		||||
  {
 | 
			
		||||
    MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
 | 
			
		||||
    if (parm==null)
 | 
			
		||||
    { // no such parameter!
 | 
			
		||||
      logger.warn("parameter \"" + name + "\" not found");
 | 
			
		||||
      return null;
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
      return parm.getValue();
 | 
			
		||||
 | 
			
		||||
@ -376,7 +433,11 @@ public class ServletMultipartHandler
 | 
			
		||||
  {
 | 
			
		||||
    MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
 | 
			
		||||
    if (parm==null)
 | 
			
		||||
    { // no such parameter!
 | 
			
		||||
      logger.warn("parameter \"" + name + "\" not found");
 | 
			
		||||
      return null;
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
      return parm.getContentType();
 | 
			
		||||
 | 
			
		||||
@ -386,7 +447,11 @@ public class ServletMultipartHandler
 | 
			
		||||
  {
 | 
			
		||||
    MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
 | 
			
		||||
    if (parm==null)
 | 
			
		||||
    { // no such parameter!
 | 
			
		||||
      logger.warn("parameter \"" + name + "\" not found");
 | 
			
		||||
      return -1;
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
      return parm.getSize();
 | 
			
		||||
 | 
			
		||||
@ -396,7 +461,11 @@ public class ServletMultipartHandler
 | 
			
		||||
  {
 | 
			
		||||
    MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
 | 
			
		||||
    if (parm==null)
 | 
			
		||||
    { // no such parameter!
 | 
			
		||||
      logger.warn("parameter \"" + name + "\" not found");
 | 
			
		||||
      return null;
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
      return parm.getContent();
 | 
			
		||||
 | 
			
		||||
@ -406,7 +475,12 @@ public class ServletMultipartHandler
 | 
			
		||||
  {
 | 
			
		||||
    MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
 | 
			
		||||
    if (parm==null)
 | 
			
		||||
    { // no such parameter!
 | 
			
		||||
      logger.warn("parameter \"" + name + "\" not found");
 | 
			
		||||
      return null;
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
 | 
			
		||||
    MultipartDataValue val = parm.getContent();
 | 
			
		||||
    return val.getBinaryStream();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,13 @@ import java.io.*;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import javax.servlet.http.*;
 | 
			
		||||
import org.apache.log4j.*;
 | 
			
		||||
import com.silverwrist.util.*;
 | 
			
		||||
 | 
			
		||||
public class FormDataTest extends HttpServlet
 | 
			
		||||
{
 | 
			
		||||
  private static Category logger = Category.getInstance(FormDataTest.class.getName());
 | 
			
		||||
 | 
			
		||||
  public void doGet(HttpServletRequest request, HttpServletResponse response)
 | 
			
		||||
    throws IOException, ServletException
 | 
			
		||||
  {
 | 
			
		||||
@ -22,41 +25,6 @@ public class FormDataTest extends HttpServlet
 | 
			
		||||
 | 
			
		||||
  } // end doGet
 | 
			
		||||
 | 
			
		||||
  private void old_doPost(HttpServletRequest request, HttpServletResponse response)
 | 
			
		||||
    throws IOException, ServletException
 | 
			
		||||
  {
 | 
			
		||||
    TestMultiHandler tmh = null;
 | 
			
		||||
    String errmsg = null;
 | 
			
		||||
    int count = -1;
 | 
			
		||||
 | 
			
		||||
    try
 | 
			
		||||
    { // attempt to launch the multi handler
 | 
			
		||||
      tmh = new TestMultiHandler(request);
 | 
			
		||||
      count = tmh.getCount();
 | 
			
		||||
 | 
			
		||||
    } // end try
 | 
			
		||||
    catch (IOException e)
 | 
			
		||||
    { // we got an error from the parser
 | 
			
		||||
      errmsg = e.getMessage();
 | 
			
		||||
 | 
			
		||||
    } // end catch
 | 
			
		||||
 | 
			
		||||
    PrintWriter out = response.getWriter();
 | 
			
		||||
    out.println("<HTML><HEAD><TITLE>Form Test Results</TITLE></HEAD><BODY>");
 | 
			
		||||
    out.println("<H1>Form Test Results</H1>");
 | 
			
		||||
    if (errmsg==null)
 | 
			
		||||
      out.println("Success!<P>");
 | 
			
		||||
    else
 | 
			
		||||
      out.println("ERROR: " + errmsg + "<P>");
 | 
			
		||||
    out.println("Data count was: " + String.valueOf(count) + "<P>");
 | 
			
		||||
    out.println("<PRE>");
 | 
			
		||||
    tmh.dump(out);
 | 
			
		||||
    out.println("</PRE>");
 | 
			
		||||
    out.println("<A HREF=\"/venice/testformdata\">Go back.</A>");
 | 
			
		||||
    out.println("</BODY></HTML>");
 | 
			
		||||
 | 
			
		||||
  } // end old_doPost
 | 
			
		||||
 | 
			
		||||
  public void doPost(HttpServletRequest request, HttpServletResponse response)
 | 
			
		||||
    throws IOException, ServletException
 | 
			
		||||
  {
 | 
			
		||||
@ -67,40 +35,70 @@ public class FormDataTest extends HttpServlet
 | 
			
		||||
    String text_value = null;
 | 
			
		||||
    String file_name = null;
 | 
			
		||||
    String file_type = null;
 | 
			
		||||
    int file_size = -1;
 | 
			
		||||
 | 
			
		||||
    try
 | 
			
		||||
    { // create the multipart handler
 | 
			
		||||
      smh = new ServletMultipartHandler(request);
 | 
			
		||||
 | 
			
		||||
      // retrieve the text parameter value
 | 
			
		||||
      text_value = smh.getValue("text");
 | 
			
		||||
      if (logger.isDebugEnabled())
 | 
			
		||||
	logger.debug("text param value = \"" + text_value + "\"");
 | 
			
		||||
 | 
			
		||||
      // check to make sure the file parameter is really a file!
 | 
			
		||||
      file_check = smh.isFileParam("file");
 | 
			
		||||
      if (file_check)
 | 
			
		||||
      { // copy out to file
 | 
			
		||||
      { // get the file name and type
 | 
			
		||||
	file_name = smh.getValue("file");
 | 
			
		||||
	file_type = smh.getContentType("file");
 | 
			
		||||
	file_size = smh.getContentSize("file");
 | 
			
		||||
	if (logger.isDebugEnabled())
 | 
			
		||||
	  logger.debug("file param = \"" + file_name + "\", ctype = " + file_type + ", size = " + file_size);
 | 
			
		||||
 | 
			
		||||
	if ((file_name!=null) && (file_name.length()>0))
 | 
			
		||||
	{ // build the file name and save it
 | 
			
		||||
	  FileOutputStream stm = new FileOutputStream(save_dir + "/" + file_name);
 | 
			
		||||
	{ // build the file name and open a stream to save it
 | 
			
		||||
	  String real_name = save_dir + "/" + file_name;
 | 
			
		||||
	  FileOutputStream stm = new FileOutputStream(real_name);
 | 
			
		||||
	  InputStream in = smh.getFileContentStream("file");
 | 
			
		||||
	  byte[] copybuf = new byte[1024];
 | 
			
		||||
 | 
			
		||||
	  // go into a copy loop
 | 
			
		||||
	  int ct = in.read(copybuf);
 | 
			
		||||
	  int nbytes = 0;
 | 
			
		||||
	  while (ct>=0)
 | 
			
		||||
	  { // copy loop...
 | 
			
		||||
	    if (logger.isDebugEnabled())
 | 
			
		||||
	      logger.debug("read blksize = " + ct);
 | 
			
		||||
	    if (ct>0)
 | 
			
		||||
	    { // write out copy buffer data
 | 
			
		||||
	      stm.write(copybuf,0,ct);
 | 
			
		||||
	      nbytes += ct;
 | 
			
		||||
 | 
			
		||||
	    } // end if
 | 
			
		||||
 | 
			
		||||
	    ct = in.read(copybuf);
 | 
			
		||||
	    
 | 
			
		||||
	  } // end while
 | 
			
		||||
 | 
			
		||||
	  // all done - file saved
 | 
			
		||||
	  stm.close();
 | 
			
		||||
	  in.close();
 | 
			
		||||
	  if (nbytes!=file_size)
 | 
			
		||||
	    logger.warn("YIKES! expected " + file_size + " bytes but got " + nbytes + "!");
 | 
			
		||||
	  if (logger.isDebugEnabled())
 | 
			
		||||
	    logger.debug("saved " + nbytes + " bytes to file " + real_name);
 | 
			
		||||
 | 
			
		||||
	} // end if
 | 
			
		||||
 | 
			
		||||
      } // end if
 | 
			
		||||
      else  // this shouldn't happen
 | 
			
		||||
	logger.warn("file param was not a file?!?!?!?");
 | 
			
		||||
 | 
			
		||||
    } // end try
 | 
			
		||||
    catch (ServletMultipartException e)
 | 
			
		||||
    { // load error message
 | 
			
		||||
      logger.error("caught ServletMultipartException: " + e.getMessage(),e);
 | 
			
		||||
      errmsg = e.getMessage();
 | 
			
		||||
 | 
			
		||||
    } // end catch
 | 
			
		||||
@ -115,6 +113,7 @@ public class FormDataTest extends HttpServlet
 | 
			
		||||
      { // get file name and type
 | 
			
		||||
	out.println("File name: " + file_name + "<P>");
 | 
			
		||||
	out.println("File type: " + file_type + "<P>");
 | 
			
		||||
	out.println("File size: " + file_size + " bytes<P>");
 | 
			
		||||
	out.println("Saved to directory: " + save_dir + "<P>");
 | 
			
		||||
 | 
			
		||||
      } // end if
 | 
			
		||||
@ -124,7 +123,7 @@ public class FormDataTest extends HttpServlet
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
      out.println("ERROR: " + errmsg + "<P>");
 | 
			
		||||
    out.println("<A HREF=\"/venice/testformdata\">Go back.</A>");
 | 
			
		||||
    out.println("<A HREF=\"testformdata\">Go back.</A>");
 | 
			
		||||
    out.println("</BODY></HTML>");
 | 
			
		||||
 | 
			
		||||
  } // end doPost
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user