[SoapRMI] xpp potential cleanup/reset problem

CHEN,SHIH-CHANG (HP-NewJersey,ex2) shih-chang_chen_at_hp.com
Mon, 29 Jul 2002 07:50:05 -0700


This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_01C2370F.3A05A200
Content-Type: text/plain;
	charset="iso-8859-2"


> what is the parser state (getEventType()) just before last next()?

0 (start_document): nost
1, 2, 3 or 4: sometime ?

 
> did you make sure that only one thread at any time is accessing
> parser instance. the easiest approach is to use pool of parser
> instances that are reused to handle requests (typically each request
> gets its own parser instance and not shared with other thread).

I also suspect my ide (eclipse) or servlet engine(Tomcat404) has 
threading problems. But a servlet instance is supposed to run in
one thread. And Servlent container will take care of servlet instance
pooling. In my case, a parser instance is cached in a servlet instance.

I will using pooling if I cannot solve this problem. Attachment
is my servlet for server-side. In client-side, I use WebLoad5 to simulate
concurrent
10 http clients.(http://www.radview.com/products/WebLOAD.asp)

thansk,

-chen


------_=_NextPart_000_01C2370F.3A05A200
Content-Type: application/octet-stream;
	name="EchoServlet.java"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="EchoServlet.java"

import javax.servlet.http.HttpServlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Writer;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
/**
 * @author schen
 *
 * To change this generated comment edit the template variable =
"typecomment":
 * Window>Preferences>Java>Templates.
 * To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */
public class EchoServlet extends HttpServlet {
	=09
	private XmlPullParserFactory pullfactory;
	//reset does not work correctly
	private XmlPullParser xpp;

	public void init() throws ServletException {
		try {
			pullfactory =3D XmlPullParserFactory.newInstance();
        	=
pullfactory.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
        	xpp =3D pullfactory.newPullParser();
		} catch (XmlPullParserException e) {
			e.printStackTrace( System.out );
			throw new ServletException( e.getMessage() );
		}
	}
=09
	private void pullEcho( InputStream in, Writer writer )
        throws IOException,XmlPullParserException=20
    {   =20
    	//XmlPullParser xpp =3D pullfactory.newPullParser();   =20
		xpp.setInput ( new InputStreamReader ( in ) );       =20
        int eventType =3D xpp.getEventType();
        do {
            if(eventType =3D=3D xpp.START_DOCUMENT) {
                writer.write( "<?xml version=3D'1.0' =
encoding=3D'UTF-8'?>" );
            } else if(eventType =3D=3D xpp.END_DOCUMENT) {
                writer.flush();
                //break;
            } else if(eventType =3D=3D xpp.START_TAG) {
                writer.write( "<" + xpp.getName() );
				for (int i =3D 0; i < xpp.getAttributeCount(); i++) {
                	writer.write( " " );
                	writer.write(=20
                		xpp.getAttributeName( i ) + "=3D\"" +=20
                		xpp.getAttributeValue( i ) + "\"");
				}
        		writer.write( ">" );
            } else if(eventType =3D=3D xpp.END_TAG) {
                writer.write( "<" + xpp.getName() + ">" );
            } else if(eventType =3D=3D xpp.TEXT) {
            	int holderForStartAndLength[] =3D new int[2];
        		char ch[] =3D xpp.getTextCharacters(holderForStartAndLength);
        		int start =3D holderForStartAndLength[0];
        		int length =3D holderForStartAndLength[1];
        		for (int i =3D start; i < start + length; i++) {
            		switch (ch[i]) {
                		case '\\':
		                    writer.write( "\\\\");
		                    break;
		                case '"':
		                    writer.write( "\\\"");
		                    break;
		                case '\n':
		                    writer.write( "\\n");
		                    break;
		                case '\r':
		                    writer.write( "\\r");
		                    break;
		                case '\t':
		                    writer.write( "\\t");
		                    break;
		                default:
		                    writer.write( ch[i]);
		                    break;
		            }
        		}
            }
            writer.flush();
			try {
				eventType =3D xpp.next();
			} catch (XmlPullParserException e) {
				System.err.println( "---- eventType: " + eventType + " " + =
e.getMessage());
				//e.printStackTrace( System.out );
				throw e;
			}
        } while (eventType !=3D xpp.END_DOCUMENT);
    }
    =09
    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException
    {
    	InputStream in =3D req.getInputStream();
    	try {
			pullEcho( in, res.getWriter() );
		} catch (XmlPullParserException e) {
			//e.printStackTrace( System.out );
			throw new IOException( e.getMessage() );
		}//
    =09
    }
	/**
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest, =
HttpServletResponse)
	 */
	protected void doGet(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException=20
	{
		res.getWriter().write( "This is a EchoServlet" );
	}

}

------_=_NextPart_000_01C2370F.3A05A200--