<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7944602763219273916</id><updated>2012-01-31T00:32:58.677+01:00</updated><category term='firefox'/><category term='google app engine'/><category term='XSLT'/><category term='javascript'/><category term='ajax'/><category term='memcache'/><title type='text'>Developer's Notes</title><subtitle type='html'>About everything what can happen when computer programs executes exactly as they were developed and not as programmers wanted to.

Java, Google App Engine ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-2219883353292283764</id><published>2010-09-14T20:42:00.002+02:00</published><updated>2010-09-14T21:35:32.881+02:00</updated><title type='text'>Java Crashing in libc.so.6</title><content type='html'>I must share this horrible experience although it is not directly related to programming. But I hope that article will be helpful for somebody.&lt;br /&gt;&lt;br /&gt;I use Java in my browser for practical things like digital signing of requests when communicating with offices and banks. I use it very often and without any serious problems. Of course I had to configure my truststore and keystore and I also have two versions of extension (jre/lib/ext) directory, because different offices and banks use different versions of the IAIK library. But it is another story.&lt;br /&gt;&lt;br /&gt;But one nice morning when I tried to connect to a page containing an applet, my Java console window (which I have configured to be always started) flashed and the entire browser crashed. I used Java JDK 1.6.0_04 (32bit on 64bit Linux machine - kernel 2.6.23).&lt;br /&gt;&lt;br /&gt;I tried again and again, but with the same result - crash. After a while I found, that there are generated files with name "hs_err_pidXXXX.log" wher XXXX was a PID of the process which crashed. I looked into it - it began with these lines:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#&lt;br /&gt;# An unexpected error has been detected by Java Runtime Environment:&lt;br /&gt;#&lt;br /&gt;#  SIGSEGV (0xb) at pc=0x0094a8ac, pid=5587, tid=4108254096&lt;br /&gt;#&lt;br /&gt;# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing linux-x86)&lt;br /&gt;# Problematic frame:&lt;br /&gt;# C  [libc.so.6+0x718ac]  memcpy+0x1c&lt;br /&gt;#&lt;br /&gt;# If you would like to submit a bug report, please visit:&lt;br /&gt;#   http://java.sun.com/webapps/bugreport/crash.jsp&lt;br /&gt;# The crash happened outside the Java Virtual Machine in native code.&lt;br /&gt;# See problematic frame for where to report the bug.&lt;br /&gt;#&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then a lot of stack traces, thread states and so on, which I was not interested.&lt;br /&gt;&lt;br /&gt;So it looked like a problem in libc.so.6 ! It was strange, because I used Java in my browser a day before without problems.&lt;br /&gt;&lt;br /&gt;I realized that was the time to upgrade my browser, so I tried these steps:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;updating from FireFox 3.0 to FireFox 3.6 - hmm, the Java plugin (libjavaplugin_oji.so) did not worked&lt;/li&gt;&lt;br /&gt;&lt;li&gt;updating from JDK 1.6.0_04 to JDK 1.6.0_21 - hmm, the Java plugin (libjavaplugin_oji.so) still did not worked - using info at &lt;a href="http://plugindoc.mozdev.org/linux.html#Java"&gt;FireFox Java Plugin Doc&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finally I found info about new Java plugin technology &lt;a href="https://jdk6.dev.java.net/plugin2/"&gt;here&lt;/a&gt;, so Java was able to start in FireFox 3.6, but crashed again - only the Java process, not FireFox, but I needed Java...&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I tried to clear all my FireFox user profile (including cache, cookies..) - but Java crashed again.&lt;br /&gt;&lt;br /&gt;I tried to clear all my Java user profile data - but the result was the same - crash!&lt;br /&gt;&lt;br /&gt;I even simulated crash with Java only - no browser plugin. So now it seemed that problem is not in the plugin or browser at all.&lt;br /&gt;&lt;br /&gt;There was still the same info in the hserr_pidXXXX.log - "problematic frame in libc.so.6". Ok, it was the time to look at this.&lt;br /&gt;&lt;br /&gt;I found that I use libc-2.7.so. It seemed that problem could be there. OK, I had to try to compile the newest version of it and try to start Java with it (certainly I could not change the core library for the whole system !!)&lt;br /&gt;&lt;br /&gt;(Un)Fortunately I could not compile the libc sources.&lt;br /&gt;It was horrible - only reinstalling the whole system was my last chance to bring Java to life again.&lt;br /&gt;&lt;br /&gt;I looked into the log file again and tried to decompile the info there:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Stack: [0xf4d9f000,0xf4df0000],  sp=0xf4d6e0f4,  free space=-196k&lt;br /&gt;Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)&lt;br /&gt;C  [libc.so.6+0x718ac]  memcpy+0x1c&lt;br /&gt;C  [libc.so.6+0x59c01]  _IO_getline+0x41&lt;br /&gt;C  [libc.so.6+0x6236b]  fgets_unlocked+0x5b&lt;br /&gt;C  [libnss_files.so.2+0x3045]&lt;br /&gt;C  [libnss_files.so.2+0x382b]  _nss_files_gethostbyname2_r+0xdb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The last line was a little sun in dark. It looked like a problem when translating DNS names to IP addresses using file - /etc/hosts !&lt;br /&gt;&lt;br /&gt;I looked into /etc/hosts and I was surprised - there were two lines (records) with duplicating host names:&lt;br /&gt;127.0.0.1 localhost localhost localhost .....&lt;br /&gt;The whole file had 3.3MB in size !! That was the reason that it crashed in the libc - it was an overflow error caught by the system and killing the process !&lt;br /&gt;&lt;br /&gt;And why Java only was crashing ? Maybe other applications would crash soon as well. Java was crashing just after the start, because it tried to resolve DNS names stored in the cache - in the cache of loaded applets - that was the reason !!&lt;br /&gt;&lt;br /&gt;Uff, I was very happy, that the solution was so simple at the end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-2219883353292283764?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/2219883353292283764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/09/java-crashing-in-libcso6.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/2219883353292283764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/2219883353292283764'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/09/java-crashing-in-libcso6.html' title='Java Crashing in libc.so.6'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-9069227320525879512</id><published>2010-06-28T18:28:00.004+02:00</published><updated>2011-05-26T11:08:59.375+02:00</updated><title type='text'>Raw AAC Player for Android</title><content type='html'>This blog (and project) was written for those developers spending hours of googling the internet to answer a simple question:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to make Android to play raw AAC files (streams) ?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I've spent many hours by it and I want to save other's time to public what I found.&lt;br /&gt;&lt;br /&gt;I tried to:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;invoke MediaPlayer on raw AAC http:// URL (error)&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;invoke MediaPlayer on raw AAC file (error in emulator, OK on HTC Desire)&lt;/li&gt;&lt;br /&gt;    &lt;li&gt; pass a NetSocket FileHandle to MediaPlayer (error)&lt;/li&gt;&lt;br /&gt;    &lt;li&gt; filter the stream using local ServerSocket and:&lt;ul&gt;&lt;br /&gt;          &lt;li&gt; discard HTTP header (error)&lt;/li&gt;&lt;br /&gt;          &lt;li&gt; change content-type to several possibilities like audio/mpeg (error)&lt;/li&gt;&lt;br /&gt;          &lt;li&gt; sync ADTS header (icecast does not do it) (error) &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;    &lt;li&gt; split the AAC stream into small file chunks (OK, but not excellent)&lt;/li&gt;&lt;br /&gt;    &lt;li&gt; use 3rd party native library (FAAD2) to decode AAC (OK on HTC Desire, working on emulator - but slow) &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Using FAAD2 library works on my HTC Desire phone without problems. I tried 32kbit AAC stream served by www.play.cz (the exact URL you can find in the sources). It failed when trying 128kbit AAC stream served by the same server -  but it also failed when using mplayer or when I saved it to a file and tried the internal HTC Desire's AAC player.&lt;br /&gt;&lt;br /&gt;On the emulator it works, but it is not smooth (performance problems).&lt;br /&gt;I tried Android 1.5 (cupcake) and Android 2.1 (Eclair) versions - both with the same results (working, but not perfect).&lt;br /&gt;&lt;br /&gt;So the result is that playing raw AAC on Android devices (er even on the emulator) is possible, but there are several "buts":&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;although Android contains AAC decoder, you cannot use it / access it natively&lt;/li&gt;&lt;br /&gt; &lt;li&gt;if you create your own AAC decoder, then as a developer you must obtain a license from the patent holders - and you must pay for it&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The sources you can find here:&lt;br /&gt;&lt;a href="http://code.google.com/p/aacplayer-android/"&gt;http://code.google.com/p/aacplayer-android/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Updated 2011-05-05&lt;/b&gt;&lt;br /&gt;I've added OpenCORE aacdec library/decoder and rewrote both Java and C parts of the player. Now I am able to play streams smoothly even on the emulator (using no more than 60% of my host CPU)!&lt;br /&gt;You can download the sources and compiled shared libraries from the Downloads section (aacplayer-android-r20.zip).&lt;br /&gt;&lt;br /&gt;How to compile it ? Just unzip the archive, edit local.properties, copy sample.ant.properties to .ant.properties (oh, yes in rev20 you must change the name of the property "loglevel" to "jni.loglevel") and run Apache Ant (beginners please consult Android SDK and NDK documentation - you need to have installed Apache Ant and GNU Make - Windows users also Cygwin). Or read the README file :-)&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Updated 2011-05-26&lt;/b&gt;&lt;br /&gt;I've created a follow-up project "AACDecoder" which uses only OpenCORE aacdec library and allows using the working library in other 3rd party Android projects.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/aacdecoder-android/"&gt;http://code.google.com/p/aacdecoder-android/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thank you all for your feedback!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-9069227320525879512?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/9069227320525879512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/06/raw-aac-player-for-android.html#comment-form' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/9069227320525879512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/9069227320525879512'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/06/raw-aac-player-for-android.html' title='Raw AAC Player for Android'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-3167201274400987410</id><published>2010-06-16T11:03:00.002+02:00</published><updated>2010-06-16T11:09:39.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>GAE/J - Memcache namespaces and validations</title><content type='html'>In GAE/J SDK 1.3.4 the method &lt;code&gt;MemcacheService.setNamespace(String ns)&lt;/code&gt; was deprecated. Instead of that one should use &lt;code&gt;MemcacheServiceFactory.getMemcacheService(String ns)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;When using the new one, the name of the namespace is validated against pattern, but this validation is not done when calling the old (deprecated) method:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint java"&gt;&lt;br /&gt;  String namespace = "TEST:One";&lt;br /&gt;&lt;br /&gt;  MemcacheService msOld = MemcacheServiceFactory.getMemcacheService();&lt;br /&gt;  // deprecation warning by compiler, but OK at runtime:&lt;br /&gt;  msOld.setNamespace( namespace );&lt;br /&gt;&lt;br /&gt;  // no warning by compiler, but throws exception at runtime:&lt;br /&gt;  MemcacheService msNew = MemcacheServiceFactory.getMemcacheService( namespace );&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The exception is:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  java.lang.IllegalArgumentException:&lt;br /&gt;    Namespace 'TEST:One' does not match pattern '[0-9A-Za-z._-]{0,100}'.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I think that this behaviour should be documented in low-level API at least.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine-java/browse_thread/thread/8b5792d38bf74f28#"&gt;http://groups.google.com/group/google-appengine-java/browse_thread/thread/8b5792d38bf74f28#&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-3167201274400987410?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/3167201274400987410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/06/gaej-memcache-namespaces-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/3167201274400987410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/3167201274400987410'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/06/gaej-memcache-namespaces-and.html' title='GAE/J - Memcache namespaces and validations'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-8559357428915423567</id><published>2010-02-24T10:25:00.004+01:00</published><updated>2010-02-24T10:41:21.700+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>Google App Engine Data Viewer - GQL Java</title><content type='html'>A simple data viewer based on the  &lt;a href="http://audao.spoledge.com/download.jsp"&gt;GQL dynamic parser&lt;/a&gt;. The parser needs ANTLR library - antlr-runtime-3.2.jar&lt;br /&gt;&lt;br /&gt;Currently this code was tested on local devapp server running GAE SDK 1.3.1&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page language="java" contentType="text/html; charset=UTF-8" isELIgnored="false"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.google.appengine.api.datastore.Cursor"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.google.appengine.api.datastore.DatastoreServiceFactory"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.google.appengine.api.datastore.Entity"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.google.appengine.api.datastore.FetchOptions"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.google.appengine.api.datastore.QueryResultIterator"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.google.appengine.api.datastore.PreparedQuery"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="com.spoledge.audao.parser.gql.GqlDynamic"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="java.util.ArrayList"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="java.util.HashSet"/&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page import="java.util.Iterator"/&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;GQL Console&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;body { background: #fff; color: #333; font-family: Arial, Verdana, Sans-Serif;}&lt;br /&gt;table { border-collapse: collapse; border: 1px solid #888; width:100%}&lt;br /&gt;td { border-top: 1px solid #888; padding: 2px 10px; font-size: 85%}&lt;br /&gt;tr.header td { font-weigth: bold; background: #555; color: #fff}&lt;br /&gt;tr.even td { background: #fff;}&lt;br /&gt;tr.odd td { background: #ccc;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form action="gql.jsp" method="post"&amp;gt;&lt;br /&gt;    Enter a GQL query (e.g. "SELECT * FROM MyEntity WHERE propertyName='propertyValue'"):&amp;lt;br/&amp;gt;&lt;br /&gt;    &amp;lt;input type="text" size="96" name="gql" value="&amp;lt;c:out value="${param.gql}" escapeXml="true"/&amp;gt;"/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;    &amp;lt;input type="submit" value="Execute"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;    String gql = request.getParameter( "gql" );&lt;br /&gt;    String encCursor = request.getParameter( "cursor" );&lt;br /&gt;    int offset = 0;&lt;br /&gt;    int maxRows = 20;&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;        offset = Integer.parseInt( request.getParameter("offset"));&lt;br /&gt;    }&lt;br /&gt;    catch (Exception e) {}&lt;br /&gt;&lt;br /&gt;    if (gql != null &amp;amp;&amp;amp; gql.length() != 0) {&lt;br /&gt;        GqlDynamic gqld = new GqlDynamic();&lt;br /&gt;        gqld.setDatastoreService( DatastoreServiceFactory.getDatastoreService());&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            PreparedQuery pq = gqld.prepareQuery( gql );&lt;br /&gt;            FetchOptions fo = gqld.getFetchOptions();&lt;br /&gt;&lt;br /&gt;            if (encCursor != null) {&lt;br /&gt;                // add +1 to detect more rows:&lt;br /&gt;                FetchOptions foo = FetchOptions.Builder.withLimit( (fo.getLimit() != null ? fo.getLimit() : maxRows)+1);&lt;br /&gt;                foo.cursor( Cursor.fromWebSafeString( encCursor ));&lt;br /&gt;&lt;br /&gt;                fo = foo;&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                offset = fo.getOffset();&lt;br /&gt;&lt;br /&gt;                if (fo.getLimit() == null) fo.limit( maxRows + 1 );&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            QueryResultIterator&amp;lt;Entity&amp;gt; result = pq.asQueryResultIterator( fo );&lt;br /&gt;            Cursor cursor = null;&lt;br /&gt;&lt;br /&gt;            // find all property names&lt;br /&gt;            ArrayList&amp;lt;Entity&amp;gt; entities = new ArrayList&amp;lt;Entity&amp;gt;( maxRows );&lt;br /&gt;            HashSet&amp;lt;String&amp;gt; propNameSet = new HashSet&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;            while (result.hasNext()) {&lt;br /&gt;                Entity ent = result.next();&lt;br /&gt;                propNameSet.addAll( ent.getProperties().keySet() );&lt;br /&gt;&lt;br /&gt;                entities.add( ent );&lt;br /&gt;                if (entities.size() &amp;gt;= maxRows) {&lt;br /&gt;                    if (result.hasNext()) cursor = result.getCursor();&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            ArrayList&amp;lt;String&amp;gt; propNames = new ArrayList&amp;lt;String&amp;gt;( propNameSet );&lt;br /&gt;            java.util.Collections.sort( propNames,&lt;br /&gt;                new java.util.Comparator&amp;lt;String&amp;gt;() {&lt;br /&gt;                    public int compare( String s1, String s2) {&lt;br /&gt;                        return s1.compareTo( s2 );&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;&lt;br /&gt;            // render header&lt;br /&gt;            out.print("&amp;lt;table&amp;gt;&amp;lt;tr class=\"summary\"&amp;gt;&amp;lt;td colspan=\""+ (propNames.size()+1)+"\"&amp;gt;");&lt;br /&gt;            if (entities.size() == 0) {&lt;br /&gt;                out.print("No records found");&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                out.print("&amp;lt;b&amp;gt;" + (offset+1) + '-' + (offset+entities.size()) + "&amp;lt;/b&amp;gt; ");&lt;br /&gt;&lt;br /&gt;                if (cursor != null) {&lt;br /&gt;                    out.print("&amp;lt;a href=\"gql.jsp?gql=" + gql + "&amp;amp;cursor=" + cursor.toWebSafeString()&lt;br /&gt;                        + "&amp;amp;offset=" + (offset+maxRows)&lt;br /&gt;                        + "\"&amp;gt;Next&amp;lt;/a&amp;gt; " );&lt;br /&gt;                }&lt;br /&gt;                else {&lt;br /&gt;                    out.print( "Next" );&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            out.print("&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;");&lt;br /&gt;&lt;br /&gt;            if (entities.size() != 0) {&lt;br /&gt;                out.print("&amp;lt;tr class=\"header\"&amp;gt;");&lt;br /&gt;                out.print("&amp;lt;td&amp;gt;Id&amp;lt;/td&amp;gt;");&lt;br /&gt;                for (String propName : propNames) {&lt;br /&gt;                    out.print("&amp;lt;td&amp;gt;" + propName + "&amp;lt;/td&amp;gt;");&lt;br /&gt;                }&lt;br /&gt;                out.print("&amp;lt;/tr&amp;gt;");&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // render values&lt;br /&gt;            int i = 0;&lt;br /&gt;            for (Entity ent : entities) {&lt;br /&gt;                out.print("&amp;lt;tr class=\"" + ((++i % 2)==0 ? "odd" : "even" ) +"\"&amp;gt;");&lt;br /&gt;                out.print("&amp;lt;td&amp;gt;");&lt;br /&gt;                out.print( ent.getKey().getName() != null ? ent.getKey().getName() : ent.getKey().getId());&lt;br /&gt;                out.print("&amp;lt;/td&amp;gt;");&lt;br /&gt;                for (String propName : propNames) {&lt;br /&gt;                    out.print( "&amp;lt;td&amp;gt;" );&lt;br /&gt;                    if (ent.hasProperty( propName )) {&lt;br /&gt;                        Object o = ent.getProperty( propName );&lt;br /&gt;                        if (o == null) {&lt;br /&gt;                            out.print( "null" );&lt;br /&gt;                        }&lt;br /&gt;                        else {&lt;br /&gt;                            pageContext.setAttribute("val", o.toString());&lt;br /&gt;%&amp;gt;&lt;br /&gt;    &amp;lt;c:out value="${val}" escapeXml="true"/&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    out.print( "&amp;lt;/td&amp;gt;" );&lt;br /&gt;                }&lt;br /&gt;                out.print("&amp;lt;/tr&amp;gt;");&lt;br /&gt;            }&lt;br /&gt;            out.print("&amp;lt;/table&amp;gt;");&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {&lt;br /&gt;            out.print( "Invalid GQL: " + e );&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;%&amp;gt;&lt;br /&gt;    Please enter a query.&lt;br /&gt;&amp;lt;%&lt;br /&gt;    }&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-8559357428915423567?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/8559357428915423567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/02/google-app-engine-data-viewer-gql-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/8559357428915423567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/8559357428915423567'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/02/google-app-engine-data-viewer-gql-java.html' title='Google App Engine Data Viewer - GQL Java'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-4862459647172050166</id><published>2010-02-19T15:25:00.002+01:00</published><updated>2010-02-19T15:57:09.249+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>Lists and Nulls in Google App Engine Datastore</title><content type='html'>Do you know what happens when you store empty List into Google App Engine Datastore ? And do you know what happens if you store a List containing one null value ?&lt;br /&gt;&lt;br /&gt;Let's look at a piece of code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();&lt;br /&gt;    ArrayList emptyList = new ArrayList();&lt;br /&gt;    ArrayList hasNullList = new ArrayList();&lt;br /&gt;    hasNullList.add( null );&lt;br /&gt;&lt;br /&gt;    Entity ent = new Entity("Test");&lt;br /&gt;    ent.setProperty("nullProp", null);&lt;br /&gt;    ent.setProperty("emptyList", emptyList);&lt;br /&gt;    ent.setProperty("hasNullList", hasNullList);&lt;br /&gt;&lt;br /&gt;    System.out.println("ENTITY - before: " + ent);&lt;br /&gt;&lt;br /&gt;    Key key = ds.put( ent );&lt;br /&gt;    ent = ds.get( key );&lt;br /&gt;&lt;br /&gt;    System.out.println("ENTITY - after: " + ent);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output of the code is following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; ENTITY - before: &amp;lt;Entity [Test(no-id-yet)]:&lt;br /&gt;     nullProp = null&lt;br /&gt;     hasNullList = [null]&lt;br /&gt;     emptyList = []&lt;br /&gt; &amp;gt;&lt;br /&gt; &lt;br /&gt; ENTITY - after: &amp;lt;Entity [Test(1)]:&lt;br /&gt;     nullProp = null&lt;br /&gt;     hasNullList = [null]&lt;br /&gt;     emptyList = &lt;b&gt;null&lt;/b&gt;&lt;br /&gt; &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So it means, that GAE does not store an empty list at all ! Instead of an empty list, the property is null.&lt;br /&gt;&lt;br /&gt;This is not so big surprise and is not against anything in the official documentation. But the problem is the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:110%;font-weight:bold"&gt;Can we filter 'null' and '[null]' values separately ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We will answer quickly - just extend our first example by these lines:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    System.out.println( "count(emptyList==null) = "&lt;br /&gt;        + ds.prepare( &lt;br /&gt;            new Query("Test").addFilter("emptyList",&lt;br /&gt;                Query.FilterOperator.EQUAL, null)&lt;br /&gt;         ).countEntities());&lt;br /&gt;&lt;br /&gt;    System.out.println( "count(hasNullList==null) = "&lt;br /&gt;        + ds.prepare(&lt;br /&gt;            new Query("Test").addFilter("hasNullList",&lt;br /&gt;                Query.FilterOperator.EQUAL, null)&lt;br /&gt;         ).countEntities());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And the output is:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; count(emptyList==null) = 1&lt;br /&gt; count(hasNullList==null) = 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This means that it is not possible (this way) to distinguish between null and [null] properties!&lt;br /&gt;&lt;br /&gt;So the summary is: do not store nulls into Lists, otherwise you will get into a problem in future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-4862459647172050166?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/4862459647172050166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/02/lists-and-nulls-in-google-app-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/4862459647172050166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/4862459647172050166'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/02/lists-and-nulls-in-google-app-engine.html' title='Lists and Nulls in Google App Engine Datastore'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-1863420284922663378</id><published>2010-02-17T16:34:00.003+01:00</published><updated>2010-02-17T16:47:27.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Large Response in AJAX XMLHttpRequest</title><content type='html'>Sometimes happens that you need to send large data in the response of the XMLHttpRequest (XHR). For example you need to fetch a sorce code and display it somewhere in the document - exactly as I needed.&lt;br /&gt;&lt;br /&gt;The code was as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    if (window.XMLHttpRequest) {&lt;br /&gt;      xhr=new XMLHttpRequest();&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;      xhr=new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;    }&lt;br /&gt;    xhr.open("GET","/code/MyCode.java",false);&lt;br /&gt;    xhr.send("");&lt;br /&gt;&lt;br /&gt;    xmlDoc=xhr.responseXML;&lt;br /&gt;&lt;br /&gt;    // a bug is somewhere here:&lt;br /&gt;    code=xmlDoc.getElementsByTagName('code').childNodes[0].nodeValue;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately this worked fine in Internet Explorer (IE). In FireFox (FF) it worked if the size of the code was less than certain limit. The limit in my FF 3.0 was 4096 bytes.&lt;br /&gt;&lt;br /&gt;So the solution which works ion both IE and FF was the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    cnt = xmlDoc.getElementsByTagName('code')[0].childNodes;&lt;br /&gt;&lt;br /&gt;    code = cnt[0].nodeValue;&lt;br /&gt;    for (i=1; i &lt; cnt.length; i++) code += cnt[j].nodeValue;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So you do not need to create chunks on the server, just concatenate what FF split on the client.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-1863420284922663378?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/1863420284922663378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/02/large-response-in-ajax-xmlhttprequest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/1863420284922663378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/1863420284922663378'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/02/large-response-in-ajax-xmlhttprequest.html' title='Large Response in AJAX XMLHttpRequest'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-6109683257945500521</id><published>2010-02-15T14:11:00.003+01:00</published><updated>2010-02-15T14:31:19.135+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><category scheme='http://www.blogger.com/atom/ns#' term='XSLT'/><title type='text'>XSLT Using Xalan on Google App Engine</title><content type='html'>The online DAO generator at &lt;a href="http://audao.spoledge.com"&gt;audao.spoledge.com&lt;/a&gt; is running on the Google App Engine. The DAO generator uses XSLT transformation and Xalan is used as the XSLT implementation.&lt;br /&gt;&lt;br /&gt;When I tested it locally using the dev appserver, everything worked fine. But after I uploaded it to the real Google App Engine, then strange things started to happen - the XSL transformations were somehow cut, unfinished, simply different than I expected. When I looked into the logs, I found why:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;javax.xml.transform.TransformerException: Failed calling setMethod method&lt;br /&gt; at org.apache.xalan.processor.StylesheetHandler.error(StylesheetHandler.java:907)&lt;br /&gt; at org.apache.xalan.processor.StylesheetHandler.error(StylesheetHandler.java:950)&lt;br /&gt; at org.apache.xalan.processor.XSLTAttributeDef.setAttrValue(XSLTAttributeDef.java:1638)&lt;br /&gt; ...&lt;br /&gt;Caused by: java.lang.IllegalAccessException: Class&lt;br /&gt;com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$3&lt;br /&gt;can not access a member of class org.apache.xalan.processor.ProcessorOutputElem with&lt;br /&gt;modifiers "public"&lt;br /&gt; at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)&lt;br /&gt; at java.lang.reflect.Method.invoke(Unknown Source)&lt;br /&gt; at&lt;br /&gt;com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$3.run(Method_.java:149)&lt;br /&gt; at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt; at&lt;br /&gt;com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:147)&lt;br /&gt; at&lt;br /&gt;com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:120)&lt;br /&gt; at org.apache.xalan.processor.XSLTAttributeDef.setAttrValue(XSLTAttributeDef.java:1626)&lt;br /&gt; ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The problem was only with the XSL &amp;lt;xsl:output ...&amp;gt; tag. When I removed it, everything was OK. It was a surprise for me, because the reflection used for this tag is also used for other XSL tags and there were no errors there - just only with the &amp;lt;xsl:output...&amp;gt; tag.&lt;br /&gt;&lt;br /&gt;Since I relied in Xalan (I have a bad experience using more than one implementation in one project), I had to patch it myself. The patch just calls the implementation Java method directly - without reflection. And it works now ! The patch you can find &lt;a href="http://code.google.com/p/googleappengine/issues/detail?id=1367"&gt;here&lt;/a&gt; (post 21).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-6109683257945500521?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/6109683257945500521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/02/xslt-using-xalan-on-google-app-engine.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/6109683257945500521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/6109683257945500521'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/02/xslt-using-xalan-on-google-app-engine.html' title='XSLT Using Xalan on Google App Engine'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7944602763219273916.post-7014305136543450900</id><published>2010-02-15T13:37:00.000+01:00</published><updated>2010-02-15T13:48:31.493+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>StackOverflowError - Including a non-JSP Page</title><content type='html'>This happened to me when developing an application on Google App Engine (GAE SDK 1.3.1).&lt;br /&gt;&lt;br /&gt;I tried to include a non-JSP page using standard &amp;lt;jsp:include page="/resources/news.xml"/&amp;gt; tag. There was no problem when testing on the local dev appserver (I only had to specify that the "news.xml" is a resource file in the appengine-web.xml). But when it was running on the production - real - GAE, I got the following error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.lang.StackOverflowError&lt;br /&gt; at java.lang.String.startsWith(Unknown Source)&lt;br /&gt; at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.setAttribute(Dispatcher.java:475)&lt;br /&gt; at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.removeAttribute(Dispatcher.java:508)&lt;br /&gt; at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.setAttribute(Dispatcher.java:488)&lt;br /&gt; at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.removeAttribute(Dispatcher.java:508)&lt;br /&gt; at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.setAttribute(Dispatcher.java:488)&lt;br /&gt; at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.removeAttribute(Dispatcher.java:508)&lt;br /&gt; ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When I renamed the "news.xml" to "news.jsp", then everything worked fine. Is it a bug or feature ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7944602763219273916-7014305136543450900?l=vaclavb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vaclavb.blogspot.com/feeds/7014305136543450900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vaclavb.blogspot.com/2010/02/stackoverflowerror-including-non-jsp.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/7014305136543450900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7944602763219273916/posts/default/7014305136543450900'/><link rel='alternate' type='text/html' href='http://vaclavb.blogspot.com/2010/02/stackoverflowerror-including-non-jsp.html' title='StackOverflowError - Including a non-JSP Page'/><author><name>Vaclav Bartacek</name><uri>http://www.blogger.com/profile/17477116207057295603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_1D8-nTDo-q4/S2fzHIxpNwI/AAAAAAAAADU/qcuEuMDRgow/S220/photo-2008-04-30.jpg'/></author><thr:total>1</thr:total></entry></feed>
