I wanted to consolidate two functions.
After getting a viable solution, I decided to play with the code a bit further, and came up with this:
package hu.flux.helper;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import javax.servlet.jsp.JspWriter;
import com.objectmentor.library.web.framework.mocks.*;
// A holder for formatting data
public class NameAndAddress
{
public String firstName;
public String middleName;
public String lastName;
public String address1;
public String address2;
public String city;
public String state;
public String zip;
public String FormattedString()
{
String formattedString = "<PRE>\n" + firstName;
// Add the middle name only if it contains data.
if ((middleName != null) && (middleName.length() > 0))
{formattedString += " " + middleName;}
formattedString += " " + lastName + "\n";
formattedString += address1 + "\n";
if ((address2 != null) && (address2.length() > 0))
formattedString += address2 + "\n";
formattedString += city + ", " + state + " " + zip + "\n</PRE>";
return formattedString;
}
// Print out the name and address.
public void print(Writer writer) {
long now = System.currentTimeMillis();
System.out.println("--Entering-- " + now);
PrintWriter p = new PrintWriter (writer);
p.write(this.FormattedString());
now = System.currentTimeMillis();
System.out.println("--Exiting-- " + now);
}
/*
public void print(JspWriter out) throws java.io.IOException
{ print (new PrintWriter(out)); }
*/
@SuppressWarnings("deprecation")
public static void main (String args[])
{
NameAndAddress naa = new NameAndAddress();
naa.firstName = "Brian";
naa.middleName = "Matthew";
naa.lastName = "Kessler";
naa.address1 = "Tatra u. 15/b V/3";
naa.city = "Budapest";
naa.state = "Hungary";
naa.zip = "HU-1136";
System.out.println("\nTesting PrintWriter...");
PrintWriter p = null;
try { p = new PrintWriter("d:/temp/pwriter_text.txt"); }
catch (FileNotFoundException e)
{
System.err.print ("Can not create new PrintWriter: " + e);
e.printStackTrace();
}
naa.print(p);
p.flush();
FileInputStream fis;
DataInputStream dis;
try
{
fis = new FileInputStream("d:/temp/pwriter_text.txt");
dis = new DataInputStream (fis);
while (dis.available() != 0)
{ System.out.println(dis.readLine()); }
dis.close();
}
catch (Exception e)
{
System.err.println("File input error");
}
System.out.println("\nTested PrintWriter...");
System.out.println("---------------------");
System.out.println("\nTesting JSPWriter...");
JspWriter j = null;
naa.print(j);
System.out.print("\nTested JSPWriter...");
System.out.println("---------------------");
System.out.println("\nTesting MockJspWriter");
MockJspWriter m = null;
m = new MockJspWriter(255, true);
naa.print(m);
System.out.print(m.getContent());
System.out.println("\nTested MockJSPWriter...");
System.out.println("---------------------");
}
}
I expected that the print() method would catch both JspWriter and PrintWriter.
While this solution worked fine for PrintWriter, when I tried to run this as a console application, I get this output:
Testing PrintWriter...
--Entering--
--Exiting--
<PRE>
Brian Matthew Kessler
Tatra u. 15/b V/3
Budapest, Hungary HU-1136
</PRE>
Tested PrintWriter...
---------------------
Testing JSPWriter...
--Entering--
Exception in thread "main" java.lang.NullPointerException
at hu.flux.helper.NameAndAddress.print(NameAndAddress.java:46)
at hu.flux.helper.NameAndAddress.main(NameAndAddress.java:101)
I get a different error, however, if I try to access print(Writer writer) from a JSP:
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoSuchMethodError: hu.flux.helper.NameAndAddress.print(Ljavax/servlet/jsp/JspWriter;)V
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:492)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:407)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
javax.servlet.ServletException: java.lang.NoSuchMethodError: hu.flux.helper.NameAndAddress.print(Ljavax/servlet/jsp/JspWriter;)V
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:898)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:827)
org.apache.jsp.Address_jsp._jspService(Address_jsp.java:92)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.lang.NoSuchMethodError: hu.flux.helper.NameAndAddress.print(Ljavax/servlet/jsp/JspWriter;)V
org.apache.jsp.Address_jsp._jspService(Address_jsp.java:81)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.2 logs.
Apache Tomcat/7.0.2
When calling from the JSP, I can make a call to the class with JspWriter work by adding this code:
public void print(JspWriter out) throws java.io.IOException
{ print (new PrintWriter(out)); }
However, when attempting to use JspWriter from a console application (for testing -- I don't think anyone would ever need to use JspWriter in the console!), the above console error is moved to this function.
If print(JspWriter out) can fix the problem for JSPs, shouldn't it also fix the problem for console apps?
Moreover, if JspWriter is a Writer object, shouldn't it always be a Writer object, regardless whether it is called from the console or a JSP?