Hey guys.
I'm trying to write an app that parses uploaded xml files into a
document, lets the user deselect nodes, then export the xml with the
selected nodes.
My problem is, that it's working locally, but throws the following
exception on the servers. As far as I can tell I only use whitelisted
classes.
You can check my project here. It's still not finished, have temporary
solutions, but it's working(locally). I paste the related source below
the stacktrace.
javax.servlet.ServletException: java.lang.RuntimeException:
java.lang.ClassNotFoundException:
com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
at
com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:
240)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
542)
at org.mortbay.jetty.HttpConnection
$RequestHandler.headerComplete(HttpConnection.java:923)
at
com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:
76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at
com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:
135)
at
com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:
260)
at com.google.apphosting.base.RuntimePb$EvaluationRuntime
$2.handleRequest(RuntimePb.java:9669)
at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:
439)
at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:
573)
at com.google.tracing.TraceContext$TraceContextRunnable
$1.run(TraceContext.java:448)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:
688)
at com.google.tracing.TraceContext
$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:
326)
at com.google.tracing.TraceContext
$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:
318)
at com.google.tracing.TraceContext
$TraceContextRunnable.run(TraceContext.java:446)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1110)
at java.util.concurrent.ThreadPoolExecutor
$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:636)
Caused by: java.lang.RuntimeException:
java.lang.ClassNotFoundException:
com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
at
com.google.apphosting.runtime.jetty.SessionManager.deserialize(SessionManager.java:
421)
at
com.google.apphosting.runtime.jetty.SessionManager.loadSession(SessionManager.java:
315)
at
com.google.apphosting.runtime.jetty.SessionManager.getSession(SessionManager.java:
288)
at
org.mortbay.jetty.servlet.AbstractSessionManager.getHttpSession(AbstractSessionManager.java:
237)
at
org.mortbay.jetty.servlet.SessionHandler.setRequestedId(SessionHandler.java:
246)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
136)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
418)
at
com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:
238)
... 19 more
Caused by: java.lang.ClassNotFoundException:
com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
at
com.google.apphosting.runtime.security.UserClassLoader.loadClass(UserClassLoader.java:
445)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.google.apphosting.runtime.jetty.SessionManager
$DelegatingObjectInputStream.resolveClass(SessionManager.java:476)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:
1592)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:
1513)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1749)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at java.util.HashMap.readObject(HashMap.java:1047)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
43)
at java.lang.reflect.Method.invoke(Method.java:616)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:
991)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1865)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1770)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:
1963)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1887)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1770)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at
com.google.apphosting.runtime.jetty.SessionManager.deserialize(SessionManager.java:
417)
... 27 more
Upload servlet:
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
.....
public void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException {
ServletFileUpload upload = new ServletFileUpload();
Document document = null;
try{
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
if (item.getContentType().toLowerCase().indexOf("zip")
< 0) {
continue;
}
InputStream stream = item.openStream();
// Open the ZIP file
ZipInputStream in = new ZipInputStream(stream);
// Get the first entry
ZipEntry entry = in.getNextEntry();
document = XMLUtils.getXml(in);
// Close the streams
in.close();
//only one file gets processed
break;
}
}
Method that parses creates the xml from the stream:
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
...
public static Document getXml(InputStream stream) throws
ParserConfigurationException, SAXException, IOException {
// Create JAXP document builder
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
// Parse xml data
Document xml = parser.parse(stream);
return xml;
}
Thanks for helping guys,
Richie
--
You received this message because you are subscribed to the Google Groups
"Google App Engine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-appengine?hl=en.