<?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-34817473</id><updated>2012-02-11T23:05:53.913-08:00</updated><category term='mobile'/><category term='flash'/><category term='blog tools'/><category term='Cross domain'/><category term='web'/><category term='google appengine'/><category term='GWT2.0'/><category term='junit'/><category term='AJAX'/><category term='gwt'/><category term='gwt-ext'/><category term='Advertising'/><category term='fixed positioning'/><category term='drag and drop'/><category term='jdeveloper'/><category term='location'/><category term='iphone'/><category term='google map'/><category term='loading indicator'/><category term='SDK3.0'/><category term='ejb3'/><category term='itouch'/><category term='Safari'/><category term='code'/><category term='WebApp.Net'/><category term='JSON'/><category term='goole app engine'/><category term='iui'/><category term='google calendar'/><category term='HTML5'/><category term='hibernate'/><category term='google analytics'/><category term='java'/><category term='CSS'/><category term='AdMob'/><category term='rounded button'/><category term='embedded-jboss'/><category term='loading'/><category term='gae'/><category term='google data'/><category term='thumbnailing'/><category term='resizing picture'/><category term='gears'/><category term='JSONP'/><category term='geolocation'/><category term='gxt'/><category term='desktop'/><category term='CSS3'/><category term='adsense'/><category term='ext-js'/><category term='webkit animation'/><category term='JSF'/><category term='JavaScript'/><title type='text'>Fred Visticot blog</title><subtitle type='html'>Programming, Technologies, J2E, Java, Google, GWT, JSF...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34817473.post-7482540465082045186</id><published>2010-02-03T01:54:00.001-08:00</published><updated>2010-02-03T01:55:14.568-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS3'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit animation'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='fixed positioning'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='WebApp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Fixed positioning with WebApp.net</title><content type='html'>&lt;h4&gt;Introduction&lt;/h4&gt;  &lt;p&gt;It is actually not possible with mobile Safari to realize CSS fixed positioning. As a result of this constraint, iPhone web applications can not have fixed header or footer positioning natively.&lt;/p&gt;  &lt;p&gt;Hopefully, there is a trick powered by several lines of javascript….Thanks a lot to &lt;a href="http://cubiq.org/"&gt;cubiq.org&lt;/a&gt; !!!&lt;/p&gt;  &lt;p&gt;This powerful javascript file allows you to include a scrollview to your webapp and choose to specify if you want an horizontal or vertical scrollbar…or both.&lt;/p&gt;  &lt;p&gt;Of course, this trick is available for all webapp microframework and is working as well with WebApp.net !&lt;/p&gt;  &lt;h4&gt;Integration&lt;/h4&gt;  &lt;p&gt;This demonstration will show you how to include a fixed header to your WebApp.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Step1: Download the script from &lt;a href="http://cubiq.org/dropbox/iscroll/iscroll.js?v=3.0a3"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This original script can be replaced by &lt;a href="http://visticot.frederic.perso.neuf.fr/iscroll/js/iscroll.js"&gt;this one&lt;/a&gt; if you want to restrict scrolling to the correct direction. I have used the modified version for this demonstration.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Step2: Include the script in your webapp &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You simply need to add the downloaded javascript in your html file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/S2lHwdGUSUI/AAAAAAAADf0/XRQblksLNY0/s1600-h/image%5B1%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="69" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/S2lHx7zqDAI/AAAAAAAADf4/hIX3pg3V4TY/image_thumb.png?imgmax=800" width="453" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Step3: Initialize the “scrolling framework” &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In the WebApp.net load callback, you need to add the following code:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/S2lHyqDvv1I/AAAAAAAADf8/w3NZ7rPx9-8/s1600-h/image3.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="152" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/S2lH0Lll3lI/AAAAAAAADgA/PQcpWF0RNlA/image_thumb1.png?imgmax=800" width="597" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Add the following CSS style to your WebApp.net application as well&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/S2lH0yCoasI/AAAAAAAADgE/Y44DjCvDAGs/s1600-h/image11.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="130" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/S2lH1q9eBwI/AAAAAAAADgI/Or_DKYMS1hE/image_thumb5.png?imgmax=800" width="493" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Step4: Add the wrapper in the WebApp.net application &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Before the iGroup div block, include the wrapper and scroller divs as followed:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/S2lH2-RcycI/AAAAAAAADgM/66kCHhDTW-M/s1600-h/image%5B2%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="309" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/S2lH45eRrzI/AAAAAAAADgQ/VD2m-DY20Gc/image_thumb%5B1%5D.png?imgmax=800" width="548" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Step5: Enyoy !!! &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can take a look of the demonstration &lt;a href="http://visticot.frederic.perso.neuf.fr/iscroll/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;  &lt;p&gt;This trick is really an interesting solution waiting for the native one provided by Apple... &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-7482540465082045186?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/7482540465082045186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=7482540465082045186' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7482540465082045186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7482540465082045186'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2010/02/fixed-positioning-with-webappnet.html' title='Fixed positioning with WebApp.net'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_9aNzw45OvZo/S2lHx7zqDAI/AAAAAAAADf4/hIX3pg3V4TY/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-2997360504007403263</id><published>2010-01-17T15:03:00.001-08:00</published><updated>2010-01-17T15:03:12.886-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JSONP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Cross domain'/><title type='text'>JSON Cross domain…How it works</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;More and more applications are mashup applications and need to make several JSON requests to multiple external services. Actually, for security reasons, AJAX requests can only be done in the same domain used for the application itself…How can we solve this cross domain problem ?&lt;/p&gt;  &lt;p&gt;The solution called &lt;strong&gt;JSONP&lt;/strong&gt; exists from 2 or 3 years using the HTML &lt;strong&gt;script&lt;/strong&gt; tag. Indeed this tag is mostly used to load several Javascript files from different servers. &lt;/p&gt;  &lt;p&gt;Therefore, the solution/trick consists of creating dynamically a script tag with the source attribute pointing to the external JSON server and passing in the url the Javascript&amp;#160; callback function name.&lt;/p&gt;  &lt;p&gt;The server part needs to be modified as well to treat this kind of cross domain requests. The server will read from the url, the callback function he needs to call with the resulting data. &lt;/p&gt;  &lt;h3&gt;Implementation&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Creating the Javascript function in charge of creating the script tag&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/S1OXF07_XzI/AAAAAAAADfc/go0sEgy6cOE/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="137" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/S1OXHNmUVtI/AAAAAAAADfg/p6_uOc9YxVo/image_thumb%5B1%5D.png?imgmax=800" width="552" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Calling the external JSON server&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As you can see the Javasript callback function name is passed as an url argument.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/S1OXIY3xJ0I/AAAAAAAADfk/wG_6PnQwAC4/s1600-h/image%5B7%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="118" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/S1OXJrWCv4I/AAAAAAAADfo/yzAgdKW0oYE/image_thumb%5B3%5D.png?imgmax=800" width="556" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adapting the External JSON server&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of course, you need to have the possibility to modify the JSON server part to have the solution working !&lt;/p&gt;  &lt;p&gt;The servlet or PHP code needs to read the callback name and return the appropriate answer&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/S1OXKtz7a6I/AAAAAAAADfs/ASXpyh3miNU/s1600-h/image%5B11%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="128" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/S1OXLzdTuRI/AAAAAAAADfw/NKp88OrfZ7w/image_thumb%5B5%5D.png?imgmax=800" width="562" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;This &lt;strong&gt;JSONP&lt;/strong&gt; solution is very useful for mashup web applications. Of course, this solution requires to have the target server implementing the &lt;strong&gt;JSONP&lt;/strong&gt; protocol. Google and Yahoo JSON services have already implemented this protocol in their services.&lt;/p&gt;  &lt;p&gt;A second problem with this solution is that only GET requests can be done through cross domain….No solution are available regarding POST requests…&lt;/p&gt;  &lt;p&gt;This post is mostly inspired from this &lt;a href="http://blog.jaysalvat.com/articles/comprendre-jsonp-et-acces-de-donnees-a-distance-en-javascript.php"&gt;french blog&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-2997360504007403263?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/2997360504007403263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=2997360504007403263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2997360504007403263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2997360504007403263'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2010/01/json-cross-domainhow-it-works.html' title='JSON Cross domain…How it works'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_9aNzw45OvZo/S1OXHNmUVtI/AAAAAAAADfg/p6_uOc9YxVo/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-4296806717834407536</id><published>2010-01-15T15:57:00.001-08:00</published><updated>2010-01-15T15:57:37.004-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone, Flash and… Javascript</title><content type='html'>&lt;p&gt;Today i read a post about someone who has implemented a Javascript engine in charge of reading flash files…&lt;/p&gt;  &lt;p&gt;The article is available &lt;a href="http://ajaxian.com/archives/gordon-flash-runtime-implemented-in-javascript"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I found first that it was a fake…but after downloading the source files it appears that is was a real project !!!&lt;/p&gt;  &lt;p&gt;Actually the engine, in its current stage is very limited and not useful for anything… I have tested with different flash files and only very basic files are working…&lt;/p&gt;  &lt;p&gt;I'm really interested to know the Apple strategy regarding flash... How can we imagine an iSlate or the next iPhone without flash !!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-4296806717834407536?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/4296806717834407536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=4296806717834407536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/4296806717834407536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/4296806717834407536'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2010/01/iphone-flash-and-javascript.html' title='iPhone, Flash and… Javascript'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-7920095253467270881</id><published>2010-01-02T13:26:00.001-08:00</published><updated>2010-01-02T13:26:49.079-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS3'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Scalable Image with GWT2.0 and DataResource</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;Today, i wanted to use an ImageResource combined with an Image widget to display a resizable image. My first approach was not the good one !!! and it’s why i decided to write this note to provide the trick. Hopefully GWT2.0 has the solution !&lt;/p&gt;  &lt;h3&gt;Using ImageResource&lt;/h3&gt;  &lt;p&gt;When using ImageResource, GWT2.0 uses a CSS background url property to render the complete image and set automatically the width and height properties with the image original size. You can see the sources and related CSS just below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/Sz-56yZUiTI/AAAAAAAADeA/rG_iXqL3GXk/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="137" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/Sz-575rR7kI/AAAAAAAADeE/RihwACgDVMk/image_thumb%5B5%5D.png?imgmax=800" width="583" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Sz-58mjjT1I/AAAAAAAADeI/A-Y99qD2ayk/s1600-h/image%5B13%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="207" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/Sz-59h3wK-I/AAAAAAAADeM/D-Vcb1NK0ao/image_thumb%5B7%5D.png?imgmax=800" width="585" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/Sz-5-NnPXlI/AAAAAAAADeQ/LGzZn00pFA0/s1600-h/image%5B17%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="231" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/Sz-5_YgEbBI/AAAAAAAADeU/Rymz1ho_q3Q/image_thumb%5B9%5D.png?imgmax=800" width="601" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Resizing the original image&lt;/h3&gt;  &lt;p&gt;My objective was to resize the original image. I tried to use the setSize method. When running the application, the image was cropped (0, 0, 400, 300) and not resized.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Sz-5_wY2ivI/AAAAAAAADeY/tN63CQ9xQo8/s1600-h/image%5B25%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="242" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/Sz-6AtDwL7I/AAAAAAAADec/T-6Btuq_4os/image_thumb%5B13%5D.png?imgmax=800" width="609" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/Sz-6BFdSifI/AAAAAAAADeg/_L4t_7EEYCg/s1600-h/image%5B21%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="304" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/Sz-6B47G4lI/AAAAAAAADek/s0VxtujZByI/image_thumb%5B11%5D.png?imgmax=800" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The problem with this ImageResource implementation is that a CSS background property is used and CSS does not allow to resize an image background yet.&lt;/p&gt;  &lt;h3&gt;The DataResource to the rescue !&lt;/h3&gt;  &lt;p&gt;The DataResource solution does not use the CSS background property but fills the img src property with the base64 encoded image. The image is correctly resized with the setSize() method.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/Sz-6Cbijd6I/AAAAAAAADeo/DeV2pAmJMQk/s1600-h/image%5B29%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="135" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/Sz-6DQlph2I/AAAAAAAADes/islzbGKFd2U/image_thumb%5B15%5D.png?imgmax=800" width="595" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/Sz-6ED_PK6I/AAAAAAAADew/f5DQbdpFIa8/s1600-h/image%5B37%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="142" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/Sz-6EjQnk1I/AAAAAAAADe0/J-7UD-B5eaE/image_thumb%5B21%5D.png?imgmax=800" width="601" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Sz-6FDp950I/AAAAAAAADe4/6TGTG2ASZCM/s1600-h/image%5B42%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="291" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/Sz-6F9QlKjI/AAAAAAAADe8/KqrVf_MDZac/image_thumb%5B24%5D.png?imgmax=800" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;When the objective is to display a simple image with the original size, using ImageResource is the good approach. When an image dimensioning is required, the DataResource is the solution !&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:66aab97b-29c8-49c9-a283-519b8c46df86" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;del.icio.us Tags: &lt;a href="http://del.icio.us/popular/GWT2.0" rel="tag"&gt;GWT2.0&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-7920095253467270881?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/7920095253467270881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=7920095253467270881' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7920095253467270881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7920095253467270881'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2010/01/scalable-image-with-gwt20-and.html' title='Scalable Image with GWT2.0 and DataResource'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_9aNzw45OvZo/Sz-575rR7kI/AAAAAAAADeE/RihwACgDVMk/s72-c/image_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-6460066449629039694</id><published>2009-12-29T14:34:00.001-08:00</published><updated>2009-12-29T14:34:25.840-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS3'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='rounded button'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Rounded button, CSS3 and GWT2.0 ClientBundle</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;CSS3 introduces new powerful capabilities for web designers. Instead of merging several sub-images to generate a rounded button, CSS3 allows to define this button with properties.&lt;/p&gt;  &lt;p&gt;This tutorial will not only expose the CSS3 instructions to create the&amp;#160; button. The new GWT2.0 ClientBundle facility will be used to create a GWT RoundedButton.&lt;/p&gt;  &lt;p&gt;The basic GWT Button will be used with a dedicated CSS3 style provided by a ClientBundle.&lt;/p&gt;  &lt;h2&gt;Let’s go !&lt;/h2&gt;  &lt;h3&gt;ClientBundle introduction&lt;/h3&gt;  &lt;p&gt;GWT2.0 introduces this new&amp;#160; functionality bringing the power of combining and optimizing resources into one download for things like text files, CSS, and XML. This means fewer network roundtrips, which in turn can decrease application latency, especially on mobile applications.&lt;/p&gt;  &lt;p&gt;More information regarding ClientBundle can be found &lt;a href="http://code.google.com/intl/fr-FR/webtoolkit/doc/latest/ReleaseNotes.html#NewFeaturesClientBundle"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Step1: Creating the CSS clientBundle&lt;/h3&gt;  &lt;p&gt;The &lt;strong&gt;.iPush&lt;/strong&gt; style is used to polish the button in the “normal state”. Basic attributes like color, font and positioning are described in this section. As CSS3 webkit implementation is used, you can notice that a &lt;strong&gt;\&lt;/strong&gt; is added in front of the webkit. without this &lt;strong&gt;\&lt;/strong&gt;, GWT compile will fire an error during compilation.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;.iPush.IBClassic&lt;/strong&gt; is used to add the rounded button properties. A “templated button image” is required to define the button properties. This image will automatically adapt is size regarding the text contained in the button or the button forced width.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/SzqDx3cqi2I/AAAAAAAADV0/Tr_CzwqvqSM/s1600-h/image%5B8%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="52" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SzqDyeWwxII/AAAAAAAADV4/PVBKUgrsie8/image_thumb%5B4%5D.png?imgmax=800" width="35" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;@url annotation is used to define the “templated” image required to design the button(lines 182-183).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the @url annotation will produce the url CSS instruction&lt;/li&gt;    &lt;li&gt;the imageUrl1 is the image referenced in the CSS instruction&lt;/li&gt;    &lt;li&gt;the bigButtonWhite is a reference to a property defined in the ClientBundle java file in charge of locating the image (.png). This java file will be presented just after…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/SzqDzd-7xpI/AAAAAAAADV8/7eIlaStgeAs/s1600-h/image%5B5%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="439" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/SzqD0QyDcpI/AAAAAAAADWA/ULUHQPERYSM/image_thumb%5B3%5D.png?imgmax=800" width="576" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;If we take a look at the generated CSS with the Chrome developer tools, we can see that the image has been base64 encoded during the GWT compilation !! no additional network access is used to download the image.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/SzqD1PkZYKI/AAAAAAAADWI/vyhTY1sdWWI/s1600-h/image%5B18%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="320" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/SzqD1_gzaJI/AAAAAAAADWM/J7m1g_pW4G0/image_thumb%5B10%5D.png?imgmax=800" width="588" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Step2: Creating the Java ClientBundle &lt;/h3&gt;  &lt;p&gt;The Resources interface is used to define all the resources (CSS files, images, JavaScript..) that are part of the bundle.&lt;/p&gt;  &lt;p&gt;The previous CSS file is referenced by the @Source(“test.css”) annotation, the image location defined in the CSS file is defined in this interface as well.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SzqD2ZaplFI/AAAAAAAADWQ/XozwU4RBb2A/s1600-h/image%5B36%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="488" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/SzqD3d9Jr3I/AAAAAAAADWU/-R5esltcvzQ/image_thumb%5B22%5D.png?imgmax=800" width="584" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;An other interface (MyCssResource) returned by the previous Resources interface is used to access the styles defined in the CSS file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/SzqD4GCxUEI/AAAAAAAADWY/tnhxrbjYtsg/s1600-h/image%5B31%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="224" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/SzqD45GpmHI/AAAAAAAADWc/DUJuLvavVmE/image_thumb%5B19%5D.png?imgmax=800" width="580" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Using the button in the application&lt;/h3&gt;  &lt;p&gt;GWT.create method retrieves the Resources interface (56).&lt;/p&gt;  &lt;p&gt;The button is “styled” with the MyCssResources iPush and iBClassic methods. This 2 methods are related to the .iPush and .iPush.iBClassic defined in the CSS file.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/SzqD50xRPPI/AAAAAAAADWg/pCcH1Uk-cJ8/s1600-h/image%5B44%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="117" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/SzqD6uA-rGI/AAAAAAAADWk/iddFoecr27U/image_thumb%5B26%5D.png?imgmax=800" width="587" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Finally, the resource is injected to the component (60)&lt;/p&gt;  &lt;h3&gt;And the result is:&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/SzqD7GRvGTI/AAAAAAAADWo/vQdUloLGiHU/s1600-h/image%5B48%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="61" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SzqD8Bk5-BI/AAAAAAAADWs/-IK4Nop4iq0/image_thumb%5B28%5D.png?imgmax=800" width="521" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;This tutorial was for me the occasion to test the ClientBundle provided by the new GWT2.0 framework. Using ClientBundle seems really a good way to reduce the network transfers and only use the “active” part of the CSS.&lt;/p&gt;  &lt;p&gt;Special thanks to Thomas Broyer who provide me efficient support !&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:492d870b-2da4-4c78-87c1-606e574db627" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;del.icio.us Tags: &lt;a href="http://del.icio.us/popular/GWT" rel="tag"&gt;GWT&lt;/a&gt;,&lt;a href="http://del.icio.us/popular/CSS3" rel="tag"&gt;CSS3&lt;/a&gt;,&lt;a href="http://del.icio.us/popular/GWT2.0" rel="tag"&gt;GWT2.0&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-6460066449629039694?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/6460066449629039694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=6460066449629039694' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6460066449629039694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6460066449629039694'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/12/rounded-button-css3-and-gwt20.html' title='Rounded button, CSS3 and GWT2.0 ClientBundle'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_9aNzw45OvZo/SzqDyeWwxII/AAAAAAAADV4/PVBKUgrsie8/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-3639032014849601387</id><published>2009-12-28T06:22:00.001-08:00</published><updated>2009-12-28T06:22:39.849-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webkit animation'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='loading indicator'/><category scheme='http://www.blogger.com/atom/ns#' term='loading'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Activity indicator with WebKit CSS animation</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;It is possible to create loading indicators with animated gif. A lot of sites are proposing this service like &lt;a href="http://mentalized.net/activity-indicators/"&gt;mentalized.net&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;An other approach is to use a CSS animation provided by Safari WebKit. This solution will work for WebKit browsers (Chrome, Safari).&lt;/p&gt;  &lt;p&gt;I will expose briefly how this animation is working.&lt;/p&gt;  &lt;h2&gt;Tutorial description&lt;/h2&gt;  &lt;p&gt;Objective of this tutorial is to create a loading indicator that is activated when the user click on a start button.&lt;/p&gt;  &lt;h2&gt;Starting the tutorial&lt;/h2&gt;  &lt;h3&gt;Step1: The Activity indicator HTML code&lt;/h3&gt;  &lt;p&gt;2 divs are used for the indicator.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The fisrt div(activityIndicatorCont) is used to add extra parameters of the indicator like text or background color.&lt;/li&gt;    &lt;li&gt;The second div is used to display the transparent load indicator image. This div will be used during the CSS animation (rotation).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/Szi_Fyij5FI/AAAAAAAADVQ/LnbcPFldato/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="123" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/Szi_G6apqdI/AAAAAAAADVU/l5rojQ1vo9g/image_thumb%5B1%5D.png?imgmax=800" width="571" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Step2: The Activity indicator CSS animation code&lt;/h3&gt;  &lt;p&gt;The &lt;strong&gt;activityIndicatorCont&lt;/strong&gt; is used to customize the loading indicator (background-color, rounded border…). As the animation is only visible when the user clicks on the start button, this div is hidden.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;activityIndicator&lt;/strong&gt; defines the animation parameters and the image used for the indicator.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Szi_HwONUYI/AAAAAAAADVY/vs5QT6HE-z0/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="510" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/Szi_JPirtuI/AAAAAAAADVc/wcceB3U_bYc/image_thumb%5B5%5D.png?imgmax=800" width="585" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Step3: The CSS keyFrames animation description&lt;/h3&gt;  &lt;p&gt; The animation used to rotate the loading indicator image is described in this section. The &lt;strong&gt;activity-indicator&lt;/strong&gt; name will be used to reference this keyframes animation (JavaScript part).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/Szi_JvHIQ8I/AAAAAAAADVg/KREuhgCUb5k/s1600-h/image%5B15%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="526" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/Szi_KVGhGsI/AAAAAAAADVk/hQoEWmSHExY/image_thumb%5B9%5D.png?imgmax=800" width="588" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Step4: Starting the animation with JavaScript&lt;/h3&gt;  &lt;p&gt;When the user click the go Button, the Javascript function starts the animation. The components becomes visible (line 10) and the animation name is assigned (line 11).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Szi_KwVJfwI/AAAAAAAADVo/cTlehN70D0w/s1600-h/image%5B24%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="186" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/Szi_LsTNvHI/AAAAAAAADVs/Nle8HlAooYs/image_thumb%5B14%5D.png?imgmax=800" width="585" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can try the animation &lt;a href="http://visticot.frederic.perso.neuf.fr/blogspot/css-webkit/activity-test.html"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;You can download the project (html + css + png) &lt;a href="http://visticot.frederic.perso.neuf.fr/blogspot/css-webkit/activity.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;CSS webKit animation provides powerful animation possibilities. Actually the CSS functions described in this tutorial are only available for webKit browser (-webkit). &lt;/p&gt;  &lt;p&gt;More information regarding the functionalities are available on the Apple developer website available &lt;a href="http://developer.apple.com/safari/library/documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Animations/Animations.html#//apple_ref/doc/uid/TP40008032-CH6-SW1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3614674d-b9a2-4814-8b6c-8616072b3014" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;del.icio.us Tags: &lt;a href="http://del.icio.us/popular/CSS" rel="tag"&gt;CSS&lt;/a&gt;,&lt;a href="http://del.icio.us/popular/webkit+animation" rel="tag"&gt;webkit animation&lt;/a&gt;,&lt;a href="http://del.icio.us/popular/html5" rel="tag"&gt;html5&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-3639032014849601387?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/3639032014849601387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=3639032014849601387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3639032014849601387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3639032014849601387'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/12/activity-indicator-with-webkit-css.html' title='Activity indicator with WebKit CSS animation'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_9aNzw45OvZo/Szi_G6apqdI/AAAAAAAADVU/l5rojQ1vo9g/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-4068052172442568033</id><published>2009-10-05T14:37:00.001-07:00</published><updated>2009-10-05T14:46:09.782-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='adsense'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari'/><category scheme='http://www.blogger.com/atom/ns#' term='WebApp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>WebApp.Net and AdSense integration</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;In a &lt;a href="http://fvisticot.blogspot.com/2009/08/webappnet-and-admob-integration.html"&gt;previous&lt;/a&gt; post, i have explained how to integrate AdMob advertising with WebApp.&lt;/p&gt;  &lt;p&gt;Today Google has &lt;a href="http://googleblog.blogspot.com/2009/10/adsense-for-mobile-optimized-for-high.html"&gt;announced&lt;/a&gt; the launch of AdSense for Mobile (high end devices only). Thanks to this new feature, you can now develop your mobile advertising with Google as well !!!.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Sspm70wTNCI/AAAAAAAADQE/xEJR08iYFo8/s1600-h/image3.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="99" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/Sspm88b2ApI/AAAAAAAADQI/CWVB1wEoPMY/image_thumb1.png?imgmax=800" width="457" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This post will briefly describe how to integrate AdSense with WebApp.Net framework.&lt;/p&gt;  &lt;h2&gt;Mini tutorial&lt;/h2&gt;  &lt;h3&gt;Step1: Registering an AdSense account&lt;/h3&gt;  &lt;p&gt;Of course this step is mandatory. All explanation are described &lt;a href="http://www.google.com/adsense/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Step2: Creating your app advertising&lt;/h3&gt;  &lt;p&gt;This 4 steps wizard helps you to customize your advertising (device type, format, colors, channels). The last step provides you the javascript code to be included in the web page.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Sspm-3OzNqI/AAAAAAAADQM/zkAeHEAT57o/s1600-h/image%5B4%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="247" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/SspnAJ9QqCI/AAAAAAAADQQ/84q6sWPWFlk/image_thumb%5B1%5D.png?imgmax=800" width="435" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Step3: Adding&amp;#160; the javascript to the WebApp.net app&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Simply add the javascript code just after the iHeader section of the app and just before the IGroup section as described in the next picture.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/SspnBXu-6pI/AAAAAAAADQU/jiABGWUSLMw/s1600-h/image%5B10%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="323" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/SspnCXFiFRI/AAAAAAAADQY/WzYcqPEivlE/image_thumb%5B5%5D.png?imgmax=800" width="460" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Step4: Enjoy !!!&lt;/h3&gt;  &lt;p&gt;That’s all for the integration…You can see as easy it is…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SspnDmF8h0I/AAAAAAAADQc/hefOtpcUlQQ/s1600-h/image%5B14%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="351" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/SspnEpGR1EI/AAAAAAAADQg/uhW2E_YPXE4/image_thumb%5B7%5D.png?imgmax=800" width="241" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The sample code and the demo for the tutorial is available here: &lt;a title="http://visticot.frederic.perso.neuf.fr/webapp/adsense/" href="http://visticot.frederic.perso.neuf.fr/webapp/adsense/"&gt;http://visticot.frederic.perso.neuf.fr/webapp/adsense/&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;It is very easy to integrate both of AdSense and AdMob advertising API. What will be your choice ?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-4068052172442568033?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/4068052172442568033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=4068052172442568033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/4068052172442568033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/4068052172442568033'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/10/webappnet-and-adsense-integration.html' title='WebApp.Net and AdSense integration'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_9aNzw45OvZo/Sspm88b2ApI/AAAAAAAADQI/CWVB1wEoPMY/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-6502000096947129165</id><published>2009-08-21T16:08:00.001-07:00</published><updated>2009-08-21T16:10:04.889-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='location'/><category scheme='http://www.blogger.com/atom/ns#' term='geolocation'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='WebApp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Add location in a IPhone WebApp with Google maps</title><content type='html'>&lt;p&gt;Today, i wanted to test how to display user location on a Google maps using an IPhone Safari browser. In a &lt;a href="http://fvisticot.blogspot.com/2009/05/location-with-iphone-safari-browser.html"&gt;previous blog&lt;/a&gt;, i have already demonstrated how to use the embedded JavaScript location Api provided by Safari. The only thing that was missing with that previous Web App was to display the user location on the Google maps.&lt;/p&gt;  &lt;p&gt;For this demo, i have used the new Google maps Api (V3) available &lt;a href="http://code.google.com/intl/fr-FR/apis/maps/documentation/v3/reference.html#Map"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I have developed 2 versions of the demo, 1 “standalone” Web App and an other Web App using the WebApp-Net framework.&lt;/p&gt;  &lt;h3&gt;Standalone WebApp&lt;/h3&gt;  &lt;p&gt;This very basic Web application will display your location when you click on the “Get Location” button. If you click on the “Watch Location”, the map will be refreshed each time your location has changed. To stop the tracking, you need to press the “Clear watch” button.&lt;/p&gt;  &lt;p&gt;The location method used to retrieve your location can be GPS, WIFI, or other methods provided by the network.&lt;/p&gt;  &lt;h4&gt;Graphical interface:&lt;/h4&gt;  &lt;p&gt;As described in the next code, a div(map_canvas) is used to display the map.    &lt;br /&gt;3 buttons are available to get the location. A JavaScript listener is attached to each buttons to trig the location operation.    &lt;br /&gt;Initialization of the Google Maps Api is done in the initialize JavaScript method. 2 Divs are used to display the current location and address.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/So8o0Gvq6UI/AAAAAAAADOM/zBmpt4ze_m8/s1600-h/image%5B12%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/So8o1Du7BYI/AAAAAAAADOQ/gqmqYFN78y0/image_thumb%5B6%5D.png?imgmax=800" width="554" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Google Maps initialization:&lt;/h4&gt;  &lt;p&gt;The initialize function initializes the Geocoder (used to return the address) and initialize the map. A default location is provided during the initialization.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/So8o1o9NLMI/AAAAAAAADOU/jEW_K-3IklM/s1600-h/image%5B15%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="246" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/So8o2jJEBdI/AAAAAAAADOY/RhIfSJUdeJA/image_thumb%5B9%5D.png?imgmax=800" width="609" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;JavaScript Safari Location Api:&lt;/h4&gt;  &lt;p&gt;4 functions are provided by the JavaScript Api to retrieve the location. Details of this function is available &lt;a href="http://fvisticot.blogspot.com/2009/05/location-with-iphone-safari-browser.html"&gt;here&lt;/a&gt;. The displayLocation method is provided as callback when location is successfully retrieved by the location Api.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/So8o3HQUSTI/AAAAAAAADOc/KRtmewa1ha4/s1600-h/image%5B19%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/So8o3tV0R8I/AAAAAAAADOg/swus0bvigG0/image_thumb%5B11%5D.png?imgmax=800" width="609" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Sample application:&lt;/h4&gt;  &lt;p&gt;Go to this URL with your IPhone to test the application. &lt;a title="http://visticot.frederic.perso.neuf.fr/webapp/loc/index-basic.html" href="http://visticot.frederic.perso.neuf.fr/webapp/loc/index-basic.html"&gt;http://visticot.frederic.perso.neuf.fr/webapp/loc/index-basic.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Using the application, you can see that you can scroll the map !!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/So8o4IAFCrI/AAAAAAAADOk/v3fb69s1Qr8/s1600-h/photo%20%282%29%5B3%5D.jpg"&gt;&lt;img title="photo (2)" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="384" alt="photo (2)" src="http://lh5.ggpht.com/_9aNzw45OvZo/So8o5JcFytI/AAAAAAAADOo/nT4_z25RDsY/photo%20%282%29_thumb%5B1%5D.jpg?imgmax=800" width="263" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Using the WebApp-Net framework&lt;/h3&gt;  &lt;p&gt;I wanted to test if the WebApp-Net framework was “compatible” with the Google maps and Location Api. No particular “tricks” needs to be solved during the development. You simply need to add the div used to display the map as described in the next picture:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/So8o6LHBh-I/AAAAAAAADOs/UrM96oSS_fw/s1600-h/image%5B23%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="130" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/So8o60K-BxI/AAAAAAAADOw/lH99-DXoSQQ/image_thumb%5B13%5D.png?imgmax=800" width="604" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Sample application:&lt;/h4&gt;  &lt;p&gt;Go to this URL with your IPhone to test the application. &lt;a title="http://visticot.frederic.perso.neuf.fr/webapp/loc/index-basic.html" href="http://visticot.frederic.perso.neuf.fr/webapp/loc/index.html"&gt;http://visticot.frederic.perso.neuf.fr/webapp/loc/index.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Actually, scrolling the map like the previous application is not possible, some investigation need to be done with the WebApp-Net framework.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/So8o7z0WLdI/AAAAAAAADO0/QRNoThdy8Ms/s1600-h/photo%20%281%29%5B7%5D.jpg"&gt;&lt;img title="photo (1)" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="422" alt="photo (1)" src="http://lh5.ggpht.com/_9aNzw45OvZo/So8o8zuiHUI/AAAAAAAADO4/bApFTP-Cv_g/photo%20%281%29_thumb%5B2%5D.jpg?imgmax=800" width="293" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-6502000096947129165?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/6502000096947129165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=6502000096947129165' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6502000096947129165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6502000096947129165'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/08/add-location-in-iphone-webapp-with.html' title='Add location in a IPhone WebApp with Google maps'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_9aNzw45OvZo/So8o1Du7BYI/AAAAAAAADOQ/gqmqYFN78y0/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-2402957463275640327</id><published>2009-08-12T16:27:00.001-07:00</published><updated>2009-08-13T01:31:35.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='AdMob'/><category scheme='http://www.blogger.com/atom/ns#' term='WebApp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>WebApp.Net and AdMob integration</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;When designing Web applications for IPhone, it could be useful to add advertising to your mobile application. My first idea was to use Google Ad for mobile but the product is only available for early access and i have not the possibility to use it. &lt;/p&gt;  &lt;p&gt;After some googling, i have found that AdMob solution was a good alternative.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.admob.com/"&gt;AdMob&lt;/a&gt; is an advertising platform specialized for mobile applications (Web and embedded). For the “business and marketing” side, they provide a suite of web tools to monitor and analyze web audience. For the developers, they provide a very flexible JavaScript Api witch is very easy to integrate in your WebApp. They also provide a dedicated SDK API for IPhone applications.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://webapp-net.com/"&gt;WebApp.Net&lt;/a&gt; is for me one of the best IPhone Web micro framework. It provides many powerful and easy to use items to help you designing great and must seen web applications for Apple's latest mobile devices.&lt;/p&gt;  &lt;p&gt;After the presentation, let’s go to the integration…&lt;/p&gt;  &lt;h2&gt;Mini tutorial&lt;/h2&gt;  &lt;h3&gt;Step1: Registering an AdMob account&lt;/h3&gt;  &lt;p&gt;This step needs only to be executed 1 time (and takes 5 minutes). It provides you an account and an access to the AdMob portal.&lt;/p&gt;  &lt;h3&gt;Step2: Registering a new web application&lt;/h3&gt;  &lt;p&gt;Click on the Add IPhone Site link&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SoNPjy5iBMI/AAAAAAAADNU/292bPPWSgYk/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="273" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SoNPofpPzFI/AAAAAAAADNY/x4dVOr5R2nA/image_thumb%5B1%5D.png?imgmax=800" width="518" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt; Click on the IPhone Site icon. You need yet to provide information regarding your web site and the look and feel of the advertising. After feeling the form, click on the Add button.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SoNPw3ICAsI/AAAAAAAADNc/duRdEifw8K4/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="384" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SoNPzV4rRuI/AAAAAAAADNg/JD4PU7Yoo-w/image_thumb%5B5%5D.png?imgmax=800" width="530" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If the step has been successfully completed, you should see the newly registered application in the list.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/SoNP0-p4H7I/AAAAAAAADNk/tsvJzOZgBGQ/s1600-h/image%5B14%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="161" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/SoNP2LJHnzI/AAAAAAAADNo/83w78ymXG0U/image_thumb%5B8%5D.png?imgmax=800" width="538" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click on the Setup link to access the JavaScript code that needs to be added in your mobile web site.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/SoNP3bL1jfI/AAAAAAAADNs/0uaUcq_eVaQ/s1600-h/image%5B18%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="252" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/SoNP4tzt2YI/AAAAAAAADNw/9N106reln0M/image_thumb%5B10%5D.png?imgmax=800" width="548" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Copy the script in the clipboard…&lt;/p&gt;  &lt;h3&gt;Step3: Adding the JavaScript snippet in the WebApp&lt;/h3&gt;  &lt;p&gt;…and then simply past it in the section just after the iHeader section (before the iGroup). &lt;/p&gt;  &lt;p&gt;Pay attention that you only need to insert the code one time, all the other layers will display the advertising.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/SoNP55J3zCI/AAAAAAAADN0/YVWlyYgxLME/s1600-h/image%5B24%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="496" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SoNP7e2fgZI/AAAAAAAADN4/3w5QBIIGJLE/image_thumb%5B14%5D.png?imgmax=800" width="556" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Step4 Testing the result…and activating the script&lt;/h3&gt;  &lt;p&gt;The default JavaScript provided by AdMob is for debug purpose and does not provide any “real advertising”. One you have made your tests, you need to activate the script by setting the test parameter to false;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SoPPYVs8GdI/AAAAAAAADOE/-_b5Zpem5No/s1600-h/image%5B32%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="186" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/SoPPZRZdcNI/AAAAAAAADOI/phWfJB2SQbo/image_thumb%5B18%5D.png?imgmax=800" width="532" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;AdMob provides other interesting JavaScript functions described into their &lt;a href="http://developer.admob.com/wiki/IPhone#Web_Integration"&gt;developer website&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The sample application is available at : &lt;a href="http://visticot.frederic.perso.neuf.fr/webapp/admob/index.html"&gt;http://visticot.frederic.perso.neuf.fr/webapp/admob/index.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The result of the previous sample code is shown in the next picture.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/SoNP9G4DCnI/AAAAAAAADN8/RR9ZOm55dZE/s1600-h/image%5B28%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="364" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/SoNP-Zy9wKI/AAAAAAAADOA/x3GVIlsbKJ4/image_thumb%5B16%5D.png?imgmax=800" width="250" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Do not hesitate to give your feedback regarding AdMob and WebApp.Net !!!&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:13b59d63-9a13-494b-b7e2-dea0edc03eaf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;del.icio.us Tags: &lt;a href="http://del.icio.us/popular/AdMob" rel="tag"&gt;AdMob&lt;/a&gt;,&lt;a href="http://del.icio.us/popular/WebApp.Net" rel="tag"&gt;WebApp.Net&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-2402957463275640327?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/2402957463275640327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=2402957463275640327' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2402957463275640327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2402957463275640327'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/08/webappnet-and-admob-integration.html' title='WebApp.Net and AdMob integration'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_9aNzw45OvZo/SoNPofpPzFI/AAAAAAAADNY/x4dVOr5R2nA/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-6555336505680318258</id><published>2009-07-08T05:11:00.001-07:00</published><updated>2009-07-08T05:18:54.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='google data'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='google analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>My first Google Analytics WebApp</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;I really think that Google Analytics is a great application to display statistics about Web applications. I use this powerful tool to display statistics about my blog. &lt;/p&gt;  &lt;p&gt;I have an IPhone and i would like to use an analytics WebApp on my mobile. Of course some WebApps and Apps are available on the Apple Store but those applications are not free or does not provide all the reports i need.&lt;/p&gt;  &lt;p&gt;I have decided to create my own Webapp to use Google Analytics on my IPhone. To do this, i am using the Google Analytics API available &lt;a href="http://code.google.com/apis/analytics/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Google Analytics API&lt;/h3&gt;  &lt;p&gt;Most of the information required to use the API is available on the Google Web site, i will only sum up my understanding of the API and present a complete sample code using the API.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;This Google Analytics API is available for Java and JavaScript. As my objective is to develop a Web client for IPhone, i have decided to use the JavaScript version.&lt;/li&gt;    &lt;li&gt;Authentication and authorization steps are done by the Google JavaScript client library. No need to create a login /password page or request any user account information, all is done by the library. Multiple solution are provided for this step (see the &lt;a href="http://code.google.com/apis/accounts/"&gt;Account Authentication APIS&lt;/a&gt; for more information). For my Web application, i have selected the &lt;a href="http://code.google.com/apis/accounts/docs/AuthSub.html"&gt;AuthSub&lt;/a&gt; solution.&lt;/li&gt;    &lt;li&gt;Flexible report configuration is available with the API. Only a simple HTTP request needs to be created with all the metrics and dimensions required by the report (huge quantity of statistics are available, the list is available &lt;a href="http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html"&gt;here&lt;/a&gt;). As a result, the API returns an array of entries…simple…&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Hello Google Analytics !!!&lt;/h3&gt;  &lt;p&gt;The API documentation provides an &lt;a href="http://code.google.com/apis/analytics/docs/gdata/1.0/gdataInteractiveSamples.html"&gt;interactive sample code section&lt;/a&gt; used to test the API. The only problem i see with this sample code is that not all the HTML page is available and we can not easily “copy past” the code to create our own application…. It is why i have decided to create this page…&lt;/p&gt;  &lt;h4&gt;To begin…&lt;/h4&gt;  &lt;p&gt;You must be aware that &lt;strong&gt;it is not possible&lt;/strong&gt; to test the API without deploying the HTML page on a server on the Internet. This is for security reason and Google needs to authorize your application. So the first thing to do is to &lt;strong&gt;register a new domain&lt;/strong&gt;. This first step is mandatory and is clearly explained &lt;a href="https://www.google.com/accounts/ManageDomains"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Domain creation&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You need to enter your web server domain name or IP address.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/SlSMwEP1K3I/AAAAAAAADKM/kT6bsFt7rNc/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="292" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SlSMw5vsN0I/AAAAAAAADKQ/neoPHjxCao4/image_thumb%5B1%5D.png?imgmax=800" width="351" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Managing you new domain&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You only need to click on the domain name you have created on the previous step.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SlSMxi_ifUI/AAAAAAAADKU/9DPD5DJt0ZA/s1600-h/image%5B7%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="147" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SlSMyMQbYWI/AAAAAAAADKY/Rg7BjrfRS18/image_thumb%5B3%5D.png?imgmax=800" width="459" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Domain verification and activation&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Because the application i am using is available on a port different than 80, i have chosen the Upload an HTML file method. Google provides you an HTML file that you need to place on your WEB server. After uploading the file on your WEB server, please click on the Verify button.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SlSMys4qhFI/AAAAAAAADKc/y_RGSChtEa8/s1600-h/image%5B11%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="213" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/SlSMzbCi6DI/AAAAAAAADKg/wbynZTd0e9M/image_thumb%5B5%5D.png?imgmax=800" width="428" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;The Web application&lt;/h4&gt;  &lt;p&gt;After successfully executed the previous step, you can now create the Google Analytics Web page. The following sample code is a very basic web application returning the available Google analytics profiles.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adding a dummy image in your Web page…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;your page must contain an image that's hosted at the same domain as your page. (see code line 63 of the next section).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Google Analytics initialization, authentication and authorization&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The Google Analytics JavaScript API is loaded (line 3 and line 5). A callback to the init function is declared (line 6).&lt;/p&gt;  &lt;p&gt;The initFunction(line 23) will check (with cookies) if the user is already authenticated. If the user is already authenticated, the statictics are displayed (line 32). If not (line 26) a Login button is displayed for authentication.&lt;/p&gt;  &lt;p&gt;The login function (line 15) will ask the user if he allows the application to access his Google Account. If the user is not actually logged with his Google Account, the Google Login/Password page is displayed. &lt;/p&gt;  &lt;p&gt;After this login operation, the Google Authentication will &lt;strong&gt;redirect the user to this page and the InitFunction will be called again.&lt;/strong&gt; The initFunction will check if the user is authenticated (and it is the case now) and the statistics are displayed.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Remark:&lt;/strong&gt; I actually don’t know how to redirect to another page… a next parameter is mention in some documents but i don’t know how to use it…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/SlSM0c_TcxI/AAAAAAAADKk/zgIF5fdw03Y/s1600-h/image%5B16%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="468" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/SlSM1SwLGBI/AAAAAAAADKo/Waq-1ImakwU/image_thumb%5B8%5D.png?imgmax=800" width="585" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Asking for statistics&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This step is very easy and correctly documented by the Google documentation. I have nothing to add… Only my sample code is provided here…&lt;/p&gt;  &lt;p&gt;The available profiles are displayed in a table (line 64). To retrieve the different profiles, an HTTP requested is prepared (line 42) and the request is sent (line 43). A callback is provided in parameter (listProfiles method line 43). The callback method is in charge of formatting the result (line 48 to 58).&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/SlSOqcJ-lTI/AAAAAAAADK0/tR1XQCsVIpw/s1600-h/image%5B26%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="460" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/SlSOrYwgFVI/AAAAAAAADK4/o0jRA__u4LI/image_thumb%5B14%5D.png?imgmax=800" width="554" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Download the HTML sample code&lt;/h3&gt;  &lt;p&gt;You can download the sample Web page &lt;a href="http://visticot.frederic.perso.neuf.fr/blogspot/analytics/public_html.rar"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt; The Google Analytics API is a powerful library to manage the statistics of your Web sites. Authentication and authorization are managed as well with the Google Data API. Still a very good API from Google…    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-6555336505680318258?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/6555336505680318258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=6555336505680318258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6555336505680318258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6555336505680318258'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/07/my-first-google-analytics-webapp.html' title='My first Google Analytics WebApp'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_9aNzw45OvZo/SlSMw5vsN0I/AAAAAAAADKQ/neoPHjxCao4/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-3422780762227823299</id><published>2009-06-08T14:44:00.001-07:00</published><updated>2009-06-08T15:03:33.990-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='thumbnailing'/><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><category scheme='http://www.blogger.com/atom/ns#' term='resizing picture'/><title type='text'>Google Gears Desktop Drag and drop operation</title><content type='html'>&lt;h4&gt;Introduction&lt;/h4&gt;  &lt;p&gt;During the Google I/O event, The Google Wave prototype has been unveiled. During the demonstration, a drag and drop operation has been realized between the desktop and the browser. This new capability is possible thanks the new Google Gears plugin V0.5.21.0.    &lt;br /&gt;The main new features available with this Gears version are: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Drag &amp;amp; Drop support for dragging files into a web page and letting the web page act on those files. &lt;/li&gt;    &lt;li&gt;Image thumbnailing. &lt;/li&gt;    &lt;li&gt;Blob builder API, which allows script to build binary blobs, including valid multi-part-form-encoded blobs that contain binary file parts, which can then be uploaded using Gears.HttpRequest. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In this post, i will demonstrate how to use 2 features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Drag &amp;amp; Drop support between desktop and browser. &lt;/li&gt;    &lt;li&gt;Image thumbnailing. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To illustrate those 2 interesting features, a basic web application is developed. This web application allows a user to drag and drop pictures from desktop to browser. The Gears plugin will resize the image to keep in the local server 2 versions of the image (1 thumbnail and 1 800x600 normalized). A basic image gallery browser allows to review the images even in offline mode.&lt;/p&gt;  &lt;h4&gt;Preparation&lt;/h4&gt;  &lt;p&gt;This demonstration is only available with Firefox3.0 with the Gears plugin V0.5.21.0.&lt;/p&gt;  &lt;h4&gt;Drag &amp;amp; Drop support&lt;/h4&gt;  &lt;p&gt;The drag and drop operation is available between the desktop and an HTML element of the web page. To specify the drop element target, listeners should be added to the DOM element. As you can see in the next JavaScript code, 4 events are configurable (‘&lt;strong&gt;dragenter’&lt;/strong&gt;, ‘&lt;strong&gt;dragover’&lt;/strong&gt;, ‘&lt;strong&gt;dragexit’&lt;/strong&gt;, ‘&lt;strong&gt;dragdop’&lt;/strong&gt;) and need to be linked to callbacks. Event names are clear enough to not be explained more.&lt;/p&gt;  &lt;p&gt;This next JavaScript code illustrates how to activate or de-active the drag and drop operation on an HTML DOM element (dropZone).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/Si2GNwZIrKI/AAAAAAAADIo/06nE0V_40nM/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="385" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/Si2GOz1YQZI/AAAAAAAADIs/z3gENFFY8DA/image_thumb%5B1%5D.png?imgmax=800" width="535" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The handleDragEnter, handleDragOver and HandleLeave callbacks call the &lt;strong&gt;finishDrag&lt;/strong&gt; method in charge of modifying the mouse cursor (in blue, indicating that copy is in progress) and checking if the drop operation is allowed (in green)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/Si2GQNN5bpI/AAAAAAAADIw/wuWOkhSTt_Q/s1600-h/image%5B13%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="658" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/Si2GRcl9oHI/AAAAAAAADI0/f4sNs6GhhE4/image_thumb%5B7%5D.png?imgmax=800" width="539" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;handleDrop&lt;/strong&gt; callback is used to manage the drop operation. This function will do the following action:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Receive and analyze the file coming from the desktop. MetaData like the image dimension, imageType are available from the blob object (line 132) &lt;/li&gt;    &lt;li&gt;Create a thumbnail of the picture(used later for the gallery). This operation is explained more into detail in the next paragraph. &lt;/li&gt;    &lt;li&gt;Create a reduced picture (800x600) of the original picture. &lt;/li&gt;    &lt;li&gt;Store those 2 new pictures in the Local server. The captureBlob (line 144) method is call to save the picture blob into the local server. &lt;/li&gt;    &lt;li&gt;Store this new image in the local database. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/Si2GSjoICII/AAAAAAAADI4/qIlzdqqmzIo/s1600-h/image%5B18%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="608" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/Si2GUE-T1rI/AAAAAAAADI8/aQKLW8B5JL0/image_thumb%5B10%5D.png?imgmax=800" width="580" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Image thumbnailing&lt;/h4&gt;  &lt;p&gt;This new feature allow to resize a picture directly in the browser. This operation was not possible before and a round trip was required with the server to do this operation. Operation to resize a picture are the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a GearsCanvas (line 133). &lt;/li&gt;    &lt;li&gt;Use the &lt;strong&gt;decode&lt;/strong&gt; method with the blog information in parameter (line134). &lt;/li&gt;    &lt;li&gt;Use &lt;strong&gt;resize&lt;/strong&gt; method (line 135) to resize the image (2 methods are available: nearest and bilinear). &lt;/li&gt;    &lt;li&gt;Use the &lt;strong&gt;encode&lt;/strong&gt; method (line 136) to return the resulting blob. &lt;/li&gt;    &lt;li&gt;To use the image later in the HTML page, the blob must be stored in the local server (line144). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can note that it is not possible yet to display directly the resized image in the HTML web page and the Gears localServer must be used to store this picture. The img element tag will use this localServer image to display the picture in the browser.&lt;/p&gt;  &lt;p&gt;A next step could be to create an other GearsCanvas and display the resizing picture blob directly in that canvas.&lt;/p&gt;  &lt;h4&gt;Accessing the demo and browsing the code&lt;/h4&gt;  &lt;p&gt;To test the prototype:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use Firefox 3.0. &lt;/li&gt;    &lt;li&gt;Install Gears V0.5.21.0. &lt;/li&gt;    &lt;li&gt;Drag and drop pictures(more than 1024x768 images) in the drop zone. &lt;/li&gt;    &lt;li&gt;The dropped image is displayed in the zone and added in the gallery. Multiple pictures can be drag and drop in the same operation. &lt;/li&gt;    &lt;li&gt;The new added images are stored in the local server and in the localDb. When you will access the web page another time, the picture gallery is still present. &lt;/li&gt;    &lt;li&gt;If you want to erase the Local store and the Local db 2 buttons are available. &lt;/li&gt;    &lt;li&gt;In bonus, the web application is available offline (Gears feature). Some bugs are still present for the offline management mode. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The demo is available &lt;a href="http://visticot.frederic.perso.neuf.fr/blogspot/desktopdnd/index.html"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The code is available &lt;a href="http://visticot.frederic.perso.neuf.fr/blogspot/desktopdnd/desktop-dnd.rar"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:a1bd44ac-1255-4e73-a83e-6fe405b972f7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div id="de45e5f3-ea79-4cdb-958c-a0772fadb45e" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=QEbZ8Vh9tEk" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_9aNzw45OvZo/Si2KtK5ZQlI/AAAAAAAADJA/s0Ks0B7MMF0/video043048f2c561.jpg?imgmax=800" galleryimg="no" onload="var downlevelDiv = document.getElementById('de45e5f3-ea79-4cdb-958c-a0772fadb45e'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/QEbZ8Vh9tEk&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/QEbZ8Vh9tEk&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;  &lt;p&gt;Those new Drag and Drop operation and thumbnailing features are very promising and can be use for multiple use cases where the traditional “browse button” was added in the web page. Those features are not HTML5 compliant and will be available only with the Gears plugin…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-3422780762227823299?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/3422780762227823299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=3422780762227823299' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3422780762227823299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3422780762227823299'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/06/google-gears-desktop-drag-and-drop.html' title='Google Gears Desktop Drag and drop operation'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_9aNzw45OvZo/Si2GOz1YQZI/AAAAAAAADIs/z3gENFFY8DA/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-1387185324011380507</id><published>2009-06-03T10:25:00.001-07:00</published><updated>2009-06-03T10:25:18.805-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SDK3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='location'/><category scheme='http://www.blogger.com/atom/ns#' term='geolocation'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Location with Firefox3.5</title><content type='html'>&lt;p&gt;The recent Google I/O event demonstrates the Firefox3.5 location feature. Indeed, in a near future, every HTML5 browser will have the possibility to return the browser location. This new interesting feature will allow developers to propose new kind of web applications taken into account user location.&lt;/p&gt;  &lt;p&gt;Today, I decide to evaluate the Firefox3.5Beta4 location capabilities.    &lt;br /&gt;In a &lt;a href="http://fvisticot.blogspot.com/2009/05/location-with-iphone-safari-browser.html"&gt;previous article&lt;/a&gt;, i had already evaluated the Safari IPhone3 W3C implementation. Idea was to verify if the same JavaScript code was working on both IPhone Safari and Firefox browsers.&lt;/p&gt;  &lt;p&gt;For my tests, i take the same JavaScript used for the previous article and test it in the Firefox browser.&lt;/p&gt;  &lt;p&gt;I’m happy to check that it works without ANY source code modification !!!&lt;/p&gt;  &lt;p&gt;Even if it’s working fine, i have some interrogations regarding the location information returned by both implementation. I don’t understand very well how this location is returned with the IP address information. During my evaluation, without moving my laptop or changing my IP address, the location returned by the API is not always the same… more interesting, the location returned by both Safari and Firefox is not exactly the same !!! I will try in a next article to enter more into details in this interesting behavior.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-1387185324011380507?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/1387185324011380507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=1387185324011380507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/1387185324011380507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/1387185324011380507'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/06/location-with-firefox35.html' title='Location with Firefox3.5'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-2840195371458023539</id><published>2009-05-18T13:35:00.001-07:00</published><updated>2009-05-18T13:35:49.439-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='google appengine'/><category scheme='http://www.blogger.com/atom/ns#' term='ext-js'/><category scheme='http://www.blogger.com/atom/ns#' term='gxt'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Google App Engine for Java, GWT and GXT</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;With the launch of the new Google App Engine (Beta) delivered with an Eclipse plugin managing GAE and GWT1.6, it is now very easy to deploy new GWT applications in the Google cloud.    &lt;br /&gt;&lt;a href="http://extjs.com/products/gxt/"&gt;GXT&lt;/a&gt; is a java library for building rich Internet applications with GWT. As demonstrated on their Web site, this library provides a huge quantity of graphical components to help you creating applications very quickly.&lt;/p&gt;  &lt;p&gt;My objective was to evaluate how easy it is to deploy a basic application combining GAE-1.2.1, GWT-1.6.4 and GXT-2.0-md01.&lt;/p&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Steps to create the application&lt;/h2&gt;  &lt;h3&gt;Downloading and installing the GAE SDK-1.2.1&lt;/h3&gt;  &lt;p&gt;This step is done without any problem.&lt;/p&gt;  &lt;h3&gt;Installing the Eclipse Plugin for GAE&lt;/h3&gt;  &lt;p&gt;The Eclipse Plugin for GAE is easy to install as well and adds 3 buttons in the toolbar.    &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGUArrp1I/AAAAAAAADGM/-KLqm0NFenM/s1600-h/image%5B2%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="127" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/ShHGVPPttXI/AAAAAAAADGQ/W9JWtuyj61c/image_thumb.png?imgmax=800" width="223" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The contextual menu is modified as well to add a a Google entry&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGVycopNI/AAAAAAAADGU/nlf9cPxYKI4/s1600-h/image%5B11%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="151" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGXGkfuhI/AAAAAAAADGY/PJpgWToFjGw/image_thumb%5B5%5D.png?imgmax=800" width="425" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Those 3 buttons are used to: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a new GAE application. You can choose to use GWT, GAE or both. &lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGYmsp-qI/AAAAAAAADGc/h8A2brvQ6ik/s1600-h/image%5B7%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="452" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/ShHGaHyWq2I/AAAAAAAADGg/dlRIyD6kosA/image_thumb%5B3%5D.png?imgmax=800" width="359" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Compile the code (transform the Java code in JavaScript) &lt;/li&gt;    &lt;li&gt;Deploy your application on the Google App Engine servers. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Adding the GXT2.0-md01 jar library&lt;/h3&gt;  &lt;p&gt;You simply need to add an external java library in the project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/ShHGbbJxkjI/AAAAAAAADGk/PG3TSs9-TiE/s1600-h/image%5B29%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="151" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/ShHGcSxVO7I/AAAAAAAADGo/SOxPggTTJm4/image_thumb%5B13%5D.png?imgmax=800" width="391" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Coding the application using GWT and GXT&lt;/h3&gt;  &lt;p&gt;No remark in this section, no specific think related to GAE.&lt;/p&gt;  &lt;h3&gt;Compiling and deploying the application&lt;/h3&gt;  &lt;p&gt;Of course, you need to have a developer account to deploy your application.    &lt;br /&gt;Before deploying the application, you need to enter the applicationId obtain on the GAE web portal &lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/ShHGdHKCsCI/AAAAAAAADGs/GfBpr_Y0xAk/s1600-h/image%5B22%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="159" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/ShHGePyw_rI/AAAAAAAADGw/W7CV3ncXrVk/image_thumb%5B10%5D.png?imgmax=800" width="266" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;a href="http://lh4.ggpht.com/_9aNzw45OvZo/ShHGfE2yfxI/AAAAAAAADG0/JIR6I7XpnM8/s1600-h/image%5B21%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="151" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGguUp6zI/AAAAAAAADG4/T3RXE0sxJPk/image_thumb%5B9%5D.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;After entering this information, you only need to click on the &lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/ShHGhVd8ALI/AAAAAAAADG8/tGRMyZpTJSU/s1600-h/image%5B32%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="36" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/ShHGiFIsvXI/AAAAAAAADHA/DJ6-9nlRWVI/image_thumb%5B14%5D.png?imgmax=800" width="32" border="0" /&gt;&lt;/a&gt; button from the toolbar. A popup appears asking you to fill your Google password. If all is OK, you should visualize your application on a Web browser.&lt;/p&gt;  &lt;h2&gt;Remarks and problems&lt;/h2&gt;  &lt;p&gt;For a basic application, there is really no problem, compilation and deployment is working fine. For a more elaborated application with GXT library, problems can occurs.&lt;/p&gt;  &lt;h3&gt;StackOverflow error during compilation&lt;/h3&gt;  &lt;p&gt;You need to click on the Advanced link and add the –Xss16M VM argument.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGjBAzMvI/AAAAAAAADHE/BpaLDuteBLM/s1600-h/image%5B36%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="362" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGkQoubhI/AAAAAAAADHI/tO8ZMqfJIqo/image_thumb%5B16%5D.png?imgmax=800" width="328" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Max number of files and blobs is 1000&lt;/h3&gt;  &lt;p&gt;Your application can use a lot of static files for images, CSS, and JavaScript. When the number of files is greater than 1000, the deployer fires an error.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/ShHGlPi0QNI/AAAAAAAADHM/A03gNlr4xTg/s1600-h/image%5B41%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="115" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/ShHGmFwp2XI/AAAAAAAADHQ/q-uJolHit8U/image_thumb%5B19%5D.png?imgmax=800" width="543" border="0" /&gt;&lt;/a&gt; To avoid this problem, you need to reduce the number of static files included in your application. &lt;/p&gt; Multiple options are available:   &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Locating your static file in an other Web server &lt;/li&gt;    &lt;li&gt;Zipping the static files and serving those zipped files with a Servlet included in your application. This solution is working fine for development process but can not be used in a production solution. A link with a sample code is available &lt;a href="http://forums.smartclient.com/showthread.php?t=5258&amp;lt;/span&amp;gt;"&gt;&amp;quot;&amp;gt;here&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Other remarks&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;During the tests i need to connect behind a proxy. The Eclipse proxy configuration needs to be used to deploy the GEA with a proxy.&lt;/li&gt;    &lt;li&gt;GAE can be used with an ant file available &lt;a href="http://code.google.com/intl/fr-FR/appengine/docs/java/tools/ant.html#The_Complete_Build_File"&gt;here&lt;/a&gt;. This build file does not include the target to compile the GWT code. To compile the GWT code with this build, you need to add the &lt;strong&gt;gwtc&lt;/strong&gt; target section.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGnSmOWCI/AAAAAAAADHU/CnNXVD7RJvI/s1600-h/image%5B45%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="188" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShHGpNvflwI/AAAAAAAADHY/Xy2dHpqFWRw/image_thumb%5B21%5D.png?imgmax=800" width="550" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This post explains very quickly the main steps to create an application with GWT, GAE and GXT. The Eclipse Plugin is well designed and the application development is easy. I will try to continue playing with all capabilities provided by the GAE (database, …)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-2840195371458023539?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/2840195371458023539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=2840195371458023539' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2840195371458023539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2840195371458023539'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/05/google-app-engine-for-java-gwt-and-gxt.html' title='Google App Engine for Java, GWT and GXT'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_9aNzw45OvZo/ShHGVPPttXI/AAAAAAAADGQ/W9JWtuyj61c/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-3754736108727153624</id><published>2009-05-17T15:35:00.001-07:00</published><updated>2009-05-18T14:21:09.098-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SDK3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='location'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><category scheme='http://www.blogger.com/atom/ns#' term='WebApp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Location with the IPhone Safari browser (SDK3.0)</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;In a &lt;a href="http://fvisticot.blogspot.com/2009/05/geolocation-with-google-gears-and-gwt.html"&gt;previous article&lt;/a&gt;, the Google Gears geo-location technology has been introduced to demonstrate how to retrieve the location from the Internet browser.&lt;/p&gt;  &lt;p&gt;The IPhone SDK3.0 is introducing a &lt;a href="http://dev.w3.org/geo/api/spec-source.html"&gt;W3C standardized&lt;/a&gt; location API in the Safari browser. Objective of this post is to evaluate this JavaScript API provided by the Mobile Safari browser.&lt;/p&gt;  &lt;p&gt;I have found the following information from the Apple Web site:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A &lt;a href="http://developer.apple.com/iphone/prerelease/library/documentation/AppleApplications/Reference/SafariWebContent/Introduction/Introduction.html"&gt;PDF document&lt;/a&gt; providing information regarding geographic location classes. &lt;/li&gt;    &lt;li&gt;A podcast describing the JavaScript location API.      &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShCQ4K1Y1VI/AAAAAAAADFU/DWJUEMxpIbY/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="132" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/ShCQ5cK1Y5I/AAAAAAAADFY/Td1i1qUtFkg/image_thumb%5B1%5D.png?imgmax=800" width="471" border="0" /&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;IPhone Web application illustration&lt;/h2&gt;  &lt;p&gt;A very basic IPhone WebApp is developed to test the JavaScript API.    &lt;br /&gt;The &lt;a href="http://webapp.net.free.fr/"&gt;WebApp.Net&lt;/a&gt; micro framework has been used for this evaluation. &lt;/p&gt;  &lt;p&gt;The application is containing the JavaScript code used to retrieve the location. This code is located in the &lt;strong&gt;&amp;lt;script&amp;gt;&lt;/strong&gt; section of the HTML page. As you can see, 3 JavaScript functions has been used and any JavaScript import or other configuration is required.     &lt;br /&gt;You can call directly the &lt;strong&gt;navigator.geolocation.watchPosition&lt;/strong&gt; function without any initialization…the navigator object is already known by the Safari…&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;getCurrentPosition&lt;/strong&gt; returns the current position in the &lt;strong&gt;displayLocation&lt;/strong&gt; callback. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;watchLocation&lt;/strong&gt; is used to track the IPhone location. Each time a new location is available, the &lt;strong&gt;displayLocation&lt;/strong&gt; callback is triggered. This method is returning a watchId used to stop the tracking. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;clearWatch&lt;/strong&gt; is used to stop the tracking started with the &lt;strong&gt;watchLocation&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/ShCQ6hpMNJI/AAAAAAAADFc/6x9zJMH_tBM/s1600-h/image%5B21%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="343" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/ShCQ7qm5flI/AAAAAAAADFg/v-PigyFxQF8/image_thumb%5B11%5D.png?imgmax=800" width="558" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;getCurrentPosition&lt;/strong&gt; and &lt;strong&gt;watchLocation&lt;/strong&gt; can have up to 3 parameters in input:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The success location callback is returning a &lt;strong&gt;Position&lt;/strong&gt; object.       &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/ShCQ8eptMrI/AAAAAAAADFk/1UF0Fyf973o/s1600-h/image%5B16%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="182" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/ShCQ9lrYnXI/AAAAAAAADFo/xhntDCu7pHI/image_thumb%5B8%5D.png?imgmax=800" width="369" border="0" /&gt;&lt;/a&gt;       &lt;br /&gt;I have only checked that longitude, latitude and accuracy was returned, i need to complete the tests for altitude and speed. For the heading (direction) i think that this information is not returned with the current IPhone. &lt;/li&gt;    &lt;li&gt;The error callback is returned in case of error &lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/ShCQ-KxdJQI/AAAAAAAADFs/-HiBFcyVRVk/s1600-h/image%5B12%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="175" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/ShCQ_wGPWNI/AAAAAAAADFw/qL__hB4RzKA/image_thumb%5B6%5D.png?imgmax=800" width="403" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;The &lt;strong&gt;PositionOptions&lt;/strong&gt; object has 3 parameters &lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShCRAaDX-wI/AAAAAAAADF0/EqI2uoG41qU/s1600-h/image%5B20%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="165" alt="image" src="http://lh3.ggpht.com/_9aNzw45OvZo/ShCRBCq-BQI/AAAAAAAADF4/aaQCPsq1dss/image_thumb%5B10%5D.png?imgmax=800" width="362" border="0" /&gt;&lt;/a&gt;       &lt;p&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Starting the WebApp&lt;/h2&gt;  &lt;p&gt;When starting the application for the first time, the Safari browser displays a popup. You need to confirm that you agree to give your location. After multiple uses, the popup does not appear anymore.&lt;/p&gt;  &lt;p&gt;In this sample application, the location is displayed in a popup.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/ShCRCVjka_I/AAAAAAAADF8/zYhCddDH5Ds/s1600-h/image%5B35%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="357" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/ShCRDkufJaI/AAAAAAAADGA/d7hq-otPv3o/image_thumb%5B21%5D.png?imgmax=800" width="279" border="0" /&gt;&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/ShCRFB1WKvI/AAAAAAAADGE/jppHao62M_k/s1600-h/image%5B38%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="363" alt="image" src="http://lh6.ggpht.com/_9aNzw45OvZo/ShCRGZawenI/AAAAAAAADGI/pdGxeBWbDFg/image_thumb%5B24%5D.png?imgmax=800" width="279" border="0" /&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;The W3C standard API provided with IPhone 3.0 SDK is very easy to use and provides a position through multiple sources (GPS, WIFI, BTS…).    &lt;br /&gt;Any Geocoding API is provided by Safari to retrieve an address from this location.     &lt;br /&gt;This interesting feature is available with the Google Gears API…     &lt;br /&gt;During my evaluation (with the Beta version), the Safari browser was frozen multiple times and i need to restart the mobile…&lt;/p&gt;  &lt;p&gt;The application sample will be available in a near future…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-3754736108727153624?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/3754736108727153624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=3754736108727153624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3754736108727153624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3754736108727153624'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/05/location-with-iphone-safari-browser.html' title='Location with the IPhone Safari browser (SDK3.0)'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_9aNzw45OvZo/ShCQ5cK1Y5I/AAAAAAAADFY/Td1i1qUtFkg/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-7244556350235940349</id><published>2009-05-17T14:20:00.001-07:00</published><updated>2009-05-17T14:20:27.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='location'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><title type='text'>GeoLocation with Google Gears and GWT</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;Geo-location is used and available everywhere and it exists multiple solutions to retrieve the position.    &lt;br /&gt;Computed position is more or less accurate regarding the technology used. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Basic handsets can retrieve the location thanks the operator base stations. &lt;/li&gt;    &lt;li&gt;GPS handsets can retrieve a more accurate position with GPS or AGPS technologies. &lt;/li&gt;    &lt;li&gt;When GPS signal is to limited and WIFI available, WIFI positioning can be used... &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;More and more applications are available with location capabilities.    &lt;br /&gt;Those applications are used to find the nearest restaurant, cinema.     &lt;br /&gt;Big companies are launching new services to locate your friends (Google Latitude)…&lt;/p&gt; To create those applications, a location API is required to get the handset or laptop position.   &lt;br /&gt;The main features of those API are:   &lt;ul&gt;   &lt;li&gt;Returning a position (longitude, latitude, speed) taking abstraction of the underlying technologies (GPS, WIFI, BTS...) &lt;/li&gt;    &lt;li&gt;Returning the response accuracy. &lt;/li&gt;    &lt;li&gt;Tracking the handset(return multiple location each time a modification is observed) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This article will focus on the location API's available for PCs and laptops Internet browsers(Safari, IE, Firefox) and more especially on the Google Gears technology. &lt;/p&gt;  &lt;h2&gt;Google Gears&lt;/h2&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;p&gt;Google is proposing the &lt;a href="http://gears.google.com/"&gt;Gears&lt;/a&gt; API for Geo-Location purpose. &lt;/p&gt;  &lt;p&gt;This Google API like the majority of other APIs is returning the position &lt;strong&gt;BUT can in addition return geocoding information like the country, city, street number, street and region information.     &lt;br /&gt;&lt;/strong&gt;After installing this plugin, web applications have the possibility to retrieve the location from the Internet browser.     &lt;br /&gt;A very basic JavaScript API is proposed to fulfill the main location features exposed previously. &lt;/p&gt;  &lt;p&gt;For people familiar with the &lt;a href="http://code.google.com/intl/fr/webtoolkit"&gt;Google Web Toolkit framework&lt;/a&gt;, this Gears API is available as a GWT module. &lt;/p&gt;  &lt;p&gt;Next part of the article will demonstrate how to use this GWT Gears API. &lt;/p&gt;  &lt;p&gt;To create a web application with GWT and Gears, you need:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download the Gears plugin available &lt;a href="http://gears.google.com/"&gt;Here&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Download the Gears GWT module available &lt;a href="http://code.google.com/p/gwt-google-apis/"&gt;Here&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Create a basic GWT application with Eclipse or other Java editor &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;The GWT-Gears Java code&lt;/h2&gt;  &lt;p&gt;Retrieving the GeoLocation service from the Gears factory&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_9aNzw45OvZo/ShB_gAq6yTI/AAAAAAAADE0/I3ayzHASy5c/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="81" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShB_g2ONV4I/AAAAAAAADE4/6eaL4523y7E/image_thumb%5B1%5D.png?imgmax=800" width="506" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To retrieve the current location, you can use the &lt;strong&gt;getCurrentPosition&lt;/strong&gt; method. As you can see in the code, options can be used to specify the accuracy.&lt;/p&gt;  &lt;p&gt;If you want to retrieve the address information determined from the longitude and latitude, &lt;strong&gt;you need to set the gearsRequestAddress to true&lt;/strong&gt;. By default, the geocoding is disabled.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_9aNzw45OvZo/ShB_iK8I13I/AAAAAAAADE8/r2pFaViHZWE/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="197" alt="image" src="http://lh4.ggpht.com/_9aNzw45OvZo/ShB_jDCT-EI/AAAAAAAADFA/prtHRHAbGT8/image_thumb%5B5%5D.png?imgmax=800" width="598" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; If you want to be notified each time the location is modified, you need to use the &lt;strong&gt;watchPosition&lt;/strong&gt; method. This method is returning an identifier used to stop the tracking.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/ShB_kSgMsPI/AAAAAAAADFE/EZ3JkFlH4e4/s1600-h/image%5B14%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="204" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShB_lSSDHoI/AAAAAAAADFI/Ro-ETkmmPnU/image_thumb%5B8%5D.png?imgmax=800" width="597" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you want to stop the tracking (started with the watchPosition method), you need to call the &lt;strong&gt;clearWatch&lt;/strong&gt; method.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_9aNzw45OvZo/ShB_l11u13I/AAAAAAAADFM/1p3fIS3VOck/s1600-h/image%5B22%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="79" alt="image" src="http://lh5.ggpht.com/_9aNzw45OvZo/ShB_miaeeuI/AAAAAAAADFQ/Xqs2Wjou_I8/image_thumb%5B12%5D.png?imgmax=800" width="514" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;The Google Gears API (available as a JavaScript library or a GWT module) is very easy to use and provides interesting geocoding features to retrieve Address information.&lt;/p&gt;  &lt;p&gt;A W3C standard available &lt;a href="http://dev.w3.org/geo/api/spec-source.html"&gt;here&lt;/a&gt; is describing an API for location for Web browsers. The Google API seems very closed from this specification.&lt;/p&gt;  &lt;p&gt;In a next article, an overview of the IPhone3.0 Safari location API will be exposed.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-7244556350235940349?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/7244556350235940349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=7244556350235940349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7244556350235940349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7244556350235940349'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2009/05/geolocation-with-google-gears-and-gwt.html' title='GeoLocation with Google Gears and GWT'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_9aNzw45OvZo/ShB_g2ONV4I/AAAAAAAADE4/6eaL4523y7E/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-3215327177371664983</id><published>2008-10-25T14:05:00.001-07:00</published><updated>2008-10-25T14:05:05.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iui'/><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>IUI library for Iphone</title><content type='html'>I'm evaluating the IUI library for the iphone. This library has a dedicated .css and .js to skin an iphone web appliation. This library is using AJAX technology for better performances.  Take a look to this video for a better understanding  &lt;div&gt;&lt;object width="512" height="322"&gt;&lt;param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="AllowScriptAccess" VALUE="always" /&gt;&lt;param name="bgcolor" value="#000000" /&gt;&lt;param name="flashVars" value="id=3491272&amp;amp;vid=853528&amp;lang;=en-us&amp;amp;intl=us&amp;amp;thumbUrl=http%3A//us.i1.yimg.com/us.yimg.com/i/us/sch/cn/v/v2/w455/853528_320_240.jpeg&amp;amp;embed=1" /&gt;&lt;embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=3491272&amp;vid=853528&amp;lang=en-us&amp;intl=us&amp;thumbUrl=http%3A//us.i1.yimg.com/us.yimg.com/i/us/sch/cn/v/v2/w455/853528_320_240.jpeg&amp;embed=1"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://video.yahoo.com/watch/853528/3491272"&gt;Joe Hewitt: &amp;quot;An Introduction to iUI&amp;quot;&lt;/a&gt; @ &lt;a href="http://video.yahoo.com"&gt;Yahoo! Video&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-3215327177371664983?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/3215327177371664983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=3215327177371664983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3215327177371664983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/3215327177371664983'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/10/iui-library-for-iphone.html' title='IUI library for Iphone'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-6597939689649964589</id><published>2008-10-23T14:55:00.001-07:00</published><updated>2008-10-23T15:21:59.206-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><title type='text'>JSF and Weblets, how simple it is …</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;When creating JSF components libraries, the rendering part of the JSF component needs make some references to resource files (.css, .js, images).&lt;/p&gt;  &lt;p&gt;Those resources needs to be stored in the component library jar file. By this way the webapp using this library does not require any configuration.&lt;/p&gt;  &lt;p&gt;Main JSF frameworks (Trinidad, Adf, IceFaces…) already include a resource manager servlet used to retrieve resources files.&lt;/p&gt;  &lt;p&gt;When creating a JSF component library from scratch (starting from MyFaces or Sun JSF implementation), this kind of resource manager does not exist and it is in charge to the library developer to manage the resource management.&lt;/p&gt;  &lt;p&gt;Different solutions are available and are described in the post:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.developpez.net/forums/d239467/java/developpement-web-java/frameworks/jsf/participez-creation-faq-jsf/" href="http://www.developpez.net/forums/d239467/java/developpement-web-java/frameworks/jsf/participez-creation-faq-jsf/"&gt;http://www.developpez.net/forums/d239467/java/developpement-web-java/frameworks/jsf/participez-creation-faq-jsf/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This post will sum-up the weblets1.0 solution.&lt;/p&gt;  &lt;p&gt;Objectives of the weblets project is to simplify the management of resources. Weblets are not restricted to JSF frameworks and can be use in multiple ways.&lt;/p&gt;  &lt;h3&gt;Steps to call a resource from JSF component:&lt;/h3&gt;  &lt;p&gt;1. Downloading the weblets libraries(weblets-api-1.0.jar, weblets-impl-1.0.jar) and add it in your project &lt;p&gt;2. Creating the weblets-config.xml file located in the META-INF directory of the component library.&lt;/p&gt; &lt;pre class="xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;&lt;weblets-config xmlns="http://weblets.dev.java.net/config"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;weblet&gt;&lt;br /&gt;    &lt;weblet-name&gt;myapp.resources&lt;/weblet-name&gt;&lt;br /&gt;    &lt;weblet-class&gt;net.java.dev.weblets.packaged.PackagedWeblet&lt;/weblet-class&gt;&lt;br /&gt;    &lt;init-param&gt;&lt;br /&gt;      &lt;param-name&gt;package&lt;/param-name&gt;&lt;br /&gt;      &lt;param-value&gt;com.myapp.resources&lt;/param-value&gt;&lt;br /&gt;    &lt;/init-param&gt;&lt;br /&gt;  &lt;/weblet&gt;&lt;br /&gt;&lt;br /&gt;  &lt;weblet-mapping&gt;&lt;br /&gt;    &lt;weblet-name&gt;myapp.resources&lt;/weblet-name&gt;&lt;br /&gt;    &lt;url-pattern&gt;/resources/*&lt;/url-pattern&gt;&lt;br /&gt;  &lt;/weblet-mapping&gt;&lt;br /&gt;&lt;br /&gt;&lt;/weblets-config&gt;&lt;/pre&gt;&lt;br /&gt;The only thinks to configure are: &lt;br /&gt;-Defining a weblet-name (myapp.resources) &lt;br /&gt;-Referencing your resource directory path containing your css, js with the weblet init-param element (com.myapp.resources). &lt;br /&gt;com.myapp.resources refers to the directory path com/myapp/resources &lt;br /&gt;&lt;br /&gt;&lt;p&gt;3. Referencing a resource managed by the weblets from the JSF component&lt;/p&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;        String cssFile = FacesWebletUtils.getURL(context, &amp;quot;myapp.resources&amp;quot;,&amp;quot;/myapp.css&amp;quot;);&lt;br /&gt;        writer.startElement(&amp;quot;link&amp;quot;, this);&lt;br /&gt;        writer.writeAttribute(&amp;quot;rel&amp;quot;, &amp;quot;stylesheet&amp;quot;, null);&lt;br /&gt;        writer.writeAttribute(&amp;quot;href&amp;quot;, cssFile, null);&lt;br /&gt;        writer.endElement(&amp;quot;link&amp;quot;);&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;FacesWebletUtils.getURL(context,&lt;weblet-name&gt;, &amp;quot;/&lt;resource-name&gt;&amp;quot;)&lt;/strong&gt; is used to retrieve the resources stored in the library jar file. &lt;br /&gt;In the sample code, myapp.css is located in the com/myapp/resources directory. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;Weblets is a very usefull library used to simplify the resource management. We can regret that this is not part of the basic JSF framework. You can download and access all weblets documentation &lt;a href="https://weblets.dev.java.net/"&gt;here&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-6597939689649964589?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/6597939689649964589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=6597939689649964589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6597939689649964589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/6597939689649964589'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/10/jsf-and-weblets-how-simple-it-is.html' title='JSF and Weblets, how simple it is …'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-661083125138866437</id><published>2008-09-27T08:16:00.001-07:00</published><updated>2008-09-27T08:16:15.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Masking the URL bar on an iphone web application</title><content type='html'>&lt;p&gt;With the firmware 2.1, it’s possible to mask the URL bar with a meta tag. Previous this meta tag instruction, the masking was done with javascript code.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Adding &lt;strong&gt;&amp;lt;meta name=&amp;quot;apple-mobile-web-app-capable&amp;quot; content=&amp;quot;yes&amp;quot; /&amp;gt;&lt;/strong&gt; instruction in the HTML code will result in masking the URL bar.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Take attention&lt;/strong&gt; that this instruction is only valid when your webapp is added as the home screen.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-661083125138866437?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/661083125138866437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=661083125138866437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/661083125138866437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/661083125138866437'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/09/masking-url-bar-on-iphone-web.html' title='Masking the URL bar on an iphone web application'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-1857546388431963926</id><published>2008-09-04T08:08:00.001-07:00</published><updated>2008-09-04T08:12:28.919-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Using the apt ant task</title><content type='html'>I'm using Jdeveloper and there is not support for the apt task in this IDE. Ant 1.7.0 has a built in support task for Apt. &lt;/br&gt; To use it, add the apt tag in your build file as followed.&lt;/br&gt; &lt;textarea name="code" class="xml"&gt; &lt;target name="compile" depends="init"&gt;     &lt;apt srcdir="${src}" destdir="${build}"&lt;br /&gt;         classpath="${deploy}/annotations-tutorial.jar" debug="true"&lt;br /&gt;         compile="true"&lt;br /&gt;         factory="com.techno.annotations.chp5.SimpleAnnotationProcessorFactory"&gt;&lt;/apt&gt;   &lt;/target&gt; &lt;/textarea&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-1857546388431963926?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/1857546388431963926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=1857546388431963926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/1857546388431963926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/1857546388431963926'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/09/using-apt-ant-task.html' title='Using the apt ant task'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-4190023378756660764</id><published>2008-07-26T06:35:00.001-07:00</published><updated>2008-07-26T08:34:09.190-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt-ext'/><category scheme='http://www.blogger.com/atom/ns#' term='google map'/><title type='text'>GWT-Ext: Wrapping a Google Map component</title><content type='html'>&lt;p&gt;The aim of this tutorial is to present how to wrap a Google Map component with GWT-Ext. &lt;/p&gt; GWT-Ext proposes a lot of Google Map wrappers. The tutorial proposes to demonstrate how to wrap the “Direction” and “Map” components. Thanks this component it’s now easy to reuse a Direction in a web page.   &lt;br /&gt;  &lt;h4&gt;Direction widget features:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/fvisticot/SIstRlifFfI/AAAAAAAABfA/neEHO5ugabU/s1600-h/directions%5B3%5D.png"&gt;&lt;img title="directions" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="337" alt="directions" src="http://lh5.ggpht.com/fvisticot/SIstS28ChmI/AAAAAAAABfE/l1U0T4zDgNg/directions_thumb%5B1%5D.png?imgmax=800" width="664" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Map and direction in the same component &lt;/li&gt;    &lt;li&gt;Map and directions size are automaticaly adjusted depending component size &lt;/li&gt;    &lt;li&gt;Optional form to define origin and destination &lt;/li&gt;    &lt;li&gt;Horizontal or vertical layout &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Main steps to create the widget:&lt;/h4&gt;     &lt;h5&gt;Overloading the Panel component &lt;/h5&gt;    &lt;h5&gt;Creating the “&amp;lt;Div&amp;gt;” elements used by the Google Map API&lt;/h5&gt;     Those 2 elements are used by the Google API (next step) to display the map and the directions components.       &lt;pre class="java" name="code"&gt;        String mapDiv = &amp;quot;&lt;div id="widget_map_canvas" style="width: 100%; height: 100%"&gt;&lt;/div&gt;&amp;quot;;&lt;br /&gt;        String directionsDiv = &amp;quot;&lt;div id="widget_directions" style="overflow: auto; height: 90%"&gt;&lt;/div&gt;&amp;quot;;&lt;br /&gt;        _mapHTMLPanel = new HTMLPanel(mapDiv);&lt;br /&gt;        _directionsHTMLPanel = new HTMLPanel(directionsDiv);&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;h5&gt;Initializing the Google Map API&lt;/h5&gt;GMap2 and GDirections javascript objects are initialized. $wnd is used by GWT API to access javascript objects. &lt;br /&gt;    &lt;pre class="java" name="code"&gt;    private native JavaScriptObject initializeMap() /*-{&lt;br /&gt;     var map = new $wnd.GMap2($doc.getElementById('widget_map_canvas'));&lt;br /&gt;     map.addControl(new $wnd.GSmallMapControl());&lt;br /&gt;     map.addControl(new $wnd.GMapTypeControl());&lt;br /&gt;     return map;&lt;br /&gt;    }-*/;&lt;br /&gt;    &lt;br /&gt;    private native JavaScriptObject initializeDirections(Directions thisModule) /*-{&lt;br /&gt;     var map = this.@com.benevolarc.gwt.client.Directions::_map;&lt;br /&gt;     var gdir = new $wnd.GDirections(map, $doc.getElementById('widget_directions'));&lt;br /&gt;     $wnd.GEvent.addListener(gdir, &amp;quot;load&amp;quot;, function(response) {&lt;br /&gt;        if (response &amp;amp;&amp;amp; response.getStatus().code == 200) {&lt;br /&gt;            thisModule.@com.benevolarc.gwt.client.Directions::directionsOK()();                          &lt;br /&gt;        } &lt;br /&gt;     });&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;h5&gt;Creating the layout (horizontal or vertical) to store the Map and the Direction components&lt;/h5&gt;The layout allows to display the map and the directions with 2 options (left-rigth or top-down)&lt;br /&gt; Muliple GWT-Ext layouts are used for that purpose:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;FitLayout is used a base class for layouts that contain a single item that automatically expands to fill the layout's container&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Panels with ColumLayoutData are used for the Horizontal mode&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AnchorLayoutData with PanelListenerAdapter is used for the Horizontal mode&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;The difficulty was to display an horizontal panel with a height expressed in percentage instead of pixel. The solution was to use a PanelListenerAdapter.&lt;br /&gt;&lt;pre class="java" name="code"&gt;    private void init() {&lt;br /&gt;        setLayout(new FitLayout());&lt;br /&gt;        setBorder(false);&lt;br /&gt;        String mapDiv = &amp;quot;&lt;div id="widget_map_canvas" style="width: 100%; height: 100%"&gt;&lt;/div&gt;&amp;quot;;&lt;br /&gt;        String directionsDiv = &amp;quot;&lt;div id="widget_directions" style="overflow: auto; height: 90%"&gt;&lt;/div&gt;&amp;quot;;&lt;br /&gt;        _mapHTMLPanel = new HTMLPanel(mapDiv);&lt;br /&gt;        _directionsHTMLPanel = new HTMLPanel(directionsDiv);&lt;br /&gt;        &lt;br /&gt;        //_panel.add(new HTMLPanel(&amp;quot;&lt;div style="padding-right: 10px; padding-left: 10px; padding-bottom: 10px; padding-top: 10px"&gt;&lt;/div&gt;&amp;quot;)); &lt;br /&gt;        &lt;br /&gt;        if (_displayMode == DisplayMode.HORIZONTAL) {&lt;br /&gt;            Log.debug(&amp;quot;Horizontal mode&amp;quot;);&lt;br /&gt;            Panel columnLayoutPanel = new Panel();&lt;br /&gt;            columnLayoutPanel.setBorder(false);&lt;br /&gt;            columnLayoutPanel.setLayout(new ColumnLayout());&lt;br /&gt;&lt;br /&gt;            col1Panel = new Panel();&lt;br /&gt;            col1Panel.setBorder(false);&lt;br /&gt;            col1Panel.setLayout(new FitLayout());&lt;br /&gt;            Panel panelMap = new Panel();&lt;br /&gt;            panelMap.setBorder(false);&lt;br /&gt;            _mapHTMLPanel.setMargins(10, 10, 10, 10);&lt;br /&gt;            panelMap.setLayout(new AnchorLayout());&lt;br /&gt;            if (_displayForm) {&lt;br /&gt;                panelMap.add(createFromToForm());&lt;br /&gt;            }&lt;br /&gt;            panelMap.add(_mapHTMLPanel, new AnchorLayoutData(&amp;quot;100% 100%&amp;quot;));&lt;br /&gt;            col1Panel.add(panelMap);&lt;br /&gt;            col2Panel = new Panel();&lt;br /&gt;            col2Panel.setBorder(false);&lt;br /&gt;            col2Panel.setLayout(new FitLayout()); &lt;br /&gt;            col2Panel.add(_directionsHTMLPanel);&lt;br /&gt;&lt;br /&gt;            columnLayoutPanel.add(col1Panel, new ColumnLayoutData(.50));&lt;br /&gt;            columnLayoutPanel.add(col2Panel, new ColumnLayoutData(.50));&lt;br /&gt;            columnLayoutPanel.addListener(new PanelListenerAdapter() {&lt;br /&gt;                    public void onResize(BoxComponent component, int adjWidth, int adjHeight, int rawWidth, int rawHeight) {&lt;br /&gt;                        col1Panel.setHeight(rawHeight);&lt;br /&gt;                        col2Panel.setHeight(rawHeight);&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            add(columnLayoutPanel);&lt;br /&gt;           &lt;br /&gt;        } else {&lt;br /&gt;            Log.debug(&amp;quot;Vertical mode&amp;quot;);&lt;br /&gt;            Panel panel = new Panel();&lt;br /&gt;            panel.setLayout(new AnchorLayout());&lt;br /&gt;            if (_displayForm) {&lt;br /&gt;                FormPanel fPanel = createFromToForm();&lt;br /&gt;                panel.add(fPanel);  &lt;br /&gt;            } &lt;br /&gt;            panel.add(_mapHTMLPanel, new AnchorLayoutData(&amp;quot;100% 50%&amp;quot;));&lt;br /&gt;            _mapHTMLPanel.collapse();&lt;br /&gt;            panel.add(_directionsHTMLPanel, new AnchorLayoutData(&amp;quot;100% 50%&amp;quot;));&lt;br /&gt;            add(panel);  &lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h5&gt;Invoking the directions &lt;/h5&gt;When the user clicks on the &amp;quot;get directions&amp;quot; button a call to the Google API has to be done. A listener is attached on the button and a call to the JSNI method is done &lt;br /&gt;    &lt;pre class="java" name="code"&gt;        &lt;br /&gt;	goButton.addListener(new ButtonListenerAdapter() {&lt;br /&gt;            public void onClick(Button button, EventObject e) {&lt;br /&gt;                lauchDirections();&lt;br /&gt;            }&lt;br /&gt;        });&lt;/pre&gt;&lt;br /&gt;    launchDirections checks if origin and destination are correctly filled and call the setDirections native method.&lt;br /&gt;    &lt;pre class="java" name="code"&gt;    private void lauchDirections() {&lt;br /&gt;        Log.debug(&amp;quot;Getting direction&amp;quot; + _map);&lt;br /&gt;        if (_toTextField.getText().length() &amp;gt; 0 &amp;amp;&amp;amp; _fromTextField.getText().length() &amp;gt; 0) {&lt;br /&gt;            setDirections(_fromTextField.getValueAsString(), _toTextField.getValueAsString(), _locale);&lt;br /&gt;            clearErrorMessage();&lt;br /&gt;        } else {&lt;br /&gt;            Log.warn(&amp;quot;From and to must be filled&amp;quot;);&lt;br /&gt;            setErrorMessage(&amp;quot;From and to must be filled&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;    The setDirections method calls the Google API method &lt;strong&gt;gdir.load&lt;/strong&gt;. In case of success, the Map and the directions components are updated. In case of error, a message is displayed to the user.&lt;br /&gt;    &lt;pre class="java" name="code"&gt;  public native void setDirections(String fromAddress, String toAddress, String locale) /*-{&lt;br /&gt;     var gdir = this.@com.benevolarc.gwt.client.Directions::_gdir;&lt;br /&gt;     gdir.clear();&lt;br /&gt;     gdir.load(&amp;quot;from: &amp;quot; + fromAddress + &amp;quot; to: &amp;quot; + toAddress,&lt;br /&gt;                  { &amp;quot;locale&amp;quot;: locale });&lt;br /&gt;    }-*/;&lt;/pre&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;h4&gt;Using the Directions component&lt;/h4&gt;Using the component is easy&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Displaying the Directions and Map component with origin and destination in the constructor (horizontal layout)&lt;/br&gt; Default component size is 600px*600px&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;	directions = new Directions("paris","bordeaux", Directions.DisplayMode.HORIZONTAL);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Displaying the Form allowing the user to enter origin and destination (horizontal layout)&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;        //directions with Horizontal layout&lt;br /&gt;        directions = new Directions(true, Directions.DisplayMode.HORIZONTAL);&lt;br /&gt;        directions.setWidth("1000px");&lt;br /&gt;        directions.setHeight("800px");&lt;br /&gt;        directions.setBorder(true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Displaying the Form allowing the user to enter origin and destination vertical layout)&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;        //directions with Horizontal layout&lt;br /&gt;        directions = new Directions(true, Directions.DisplayMode.VERTICAL);&lt;br /&gt;        directions.setBorder(true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt; The tutorial demonstrates how to wrap a Google component. Of course this component is not perfect and a lot of improvement needs to be done. &lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Improve the look and feel&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Support to Google street&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Internationalization support&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Printing capabilities&lt;/li&gt;&lt;br /&gt;&lt;li&gt;And more...&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Feel free to reuse it and please don't hesitate to give your opinion. If you find this component usefull, the source can be use for GWT-EXT extenstion...&lt;br /&gt;Thanks for GWT-Ext forum for the support regarding layout management.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Complete Code&lt;/h4&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt; &lt;br /&gt;package com.benevolarc.gwt.client;&lt;br /&gt;&lt;br /&gt;import com.allen_sauer.gwt.log.client.Log;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.core.client.JavaScriptObject;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.user.client.ui.HTML;&lt;br /&gt;&lt;br /&gt;import com.gwtext.client.core.EventObject;&lt;br /&gt;import com.gwtext.client.widgets.BoxComponent;&lt;br /&gt;import com.gwtext.client.widgets.Button;&lt;br /&gt;import com.gwtext.client.widgets.HTMLPanel;&lt;br /&gt;import com.gwtext.client.widgets.Panel;&lt;br /&gt;import com.gwtext.client.widgets.event.ButtonListenerAdapter;&lt;br /&gt;import com.gwtext.client.widgets.event.PanelListenerAdapter;&lt;br /&gt;import com.gwtext.client.widgets.form.Field;&lt;br /&gt;import com.gwtext.client.widgets.form.FormPanel;&lt;br /&gt;import com.gwtext.client.widgets.form.MultiFieldPanel;&lt;br /&gt;import com.gwtext.client.widgets.form.TextField;&lt;br /&gt;import com.gwtext.client.widgets.form.event.FieldListenerAdapter;&lt;br /&gt;import com.gwtext.client.widgets.layout.AnchorLayout;&lt;br /&gt;import com.gwtext.client.widgets.layout.AnchorLayoutData;&lt;br /&gt;import com.gwtext.client.widgets.layout.ColumnLayout;&lt;br /&gt;import com.gwtext.client.widgets.layout.ColumnLayoutData;&lt;br /&gt;import com.gwtext.client.widgets.layout.FitLayout;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class Directions extends Panel{&lt;br /&gt;    //private Panel _panel;&lt;br /&gt;    private TextField _fromTextField;&lt;br /&gt;    private TextField _toTextField;&lt;br /&gt;    private HTMLPanel _mapHTMLPanel;&lt;br /&gt;    private HTMLPanel _directionsHTMLPanel;&lt;br /&gt;    private JavaScriptObject _map;&lt;br /&gt;    private JavaScriptObject _gdir;&lt;br /&gt;    public enum DisplayMode {HORIZONTAL, VERTICAL};&lt;br /&gt;    private DisplayMode _displayMode = DisplayMode.VERTICAL;&lt;br /&gt;    private boolean _displayForm = true;&lt;br /&gt;    private Panel col1Panel = null;&lt;br /&gt;    private Panel col2Panel = null;&lt;br /&gt;    private HTML _errorMessage = new HTML();&lt;br /&gt;    private String _from = null;&lt;br /&gt;    private String _to = null;&lt;br /&gt;    private String _locale = &amp;quot;EN&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    public Directions(boolean displayForm) {&lt;br /&gt;        _displayForm = displayForm;&lt;br /&gt;        init();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public Directions(boolean displayForm, DisplayMode displayMode) {&lt;br /&gt;        _displayForm = displayForm;&lt;br /&gt;        _displayMode = displayMode;&lt;br /&gt;        init();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public Directions(String from, String to, DisplayMode displayMode) {&lt;br /&gt;        _displayMode = displayMode;&lt;br /&gt;        _displayForm = false;&lt;br /&gt;        _from = from;&lt;br /&gt;        _to = to;&lt;br /&gt;        init();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private FormPanel createFromToForm() {&lt;br /&gt;        _fromTextField = new TextField(&amp;quot;From&amp;quot;, &amp;quot;from&amp;quot;, 250);&lt;br /&gt;        _toTextField = new TextField(&amp;quot;To&amp;quot;, &amp;quot;to&amp;quot;, 250);&lt;br /&gt;        Button goButton = new Button(&amp;quot;Get directions&amp;quot;);&lt;br /&gt;        &lt;br /&gt;        MultiFieldPanel directionsFormPanel = new MultiFieldPanel();&lt;br /&gt;        &lt;br /&gt;        directionsFormPanel.setBorder(false);&lt;br /&gt;        directionsFormPanel.setPaddings(10, 10, 10, 10);&lt;br /&gt;        directionsFormPanel.addToRow(_fromTextField, 300);&lt;br /&gt;        directionsFormPanel.addToRow(_toTextField, 300);&lt;br /&gt;        directionsFormPanel.addToRow(goButton, 100);&lt;br /&gt;         &lt;br /&gt;        FormPanel fPanel = new FormPanel();&lt;br /&gt;        fPanel.setBorder(false);&lt;br /&gt;        fPanel.setLabelWidth(30);&lt;br /&gt;        fPanel.add(_errorMessage);&lt;br /&gt;        fPanel.add(directionsFormPanel);&lt;br /&gt;        _fromTextField.addListener(new FieldListenerAdapter() {&lt;br /&gt;            public void onSpecialKey(Field field, EventObject e)  {&lt;br /&gt;                if (e.getKey() == EventObject.ENTER) {    &lt;br /&gt;                   lauchDirections();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        _toTextField.addListener(new FieldListenerAdapter() {&lt;br /&gt;        public void onSpecialKey(Field field, EventObject e)  {&lt;br /&gt;            if (e.getKey() == EventObject.ENTER) {    &lt;br /&gt;               lauchDirections();&lt;br /&gt;            }&lt;br /&gt;           }&lt;br /&gt;        });&lt;br /&gt;         &lt;br /&gt;        goButton.addListener(new ButtonListenerAdapter() {&lt;br /&gt;            public void onClick(Button button, EventObject e) {&lt;br /&gt;                lauchDirections();&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        return fPanel;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void setErrorMessage(String message) {&lt;br /&gt;        _errorMessage.setHTML(&amp;quot;&lt;div style="margin-left: 10px; color: red"&gt;Error: &amp;quot;+ message + &amp;quot;&lt;/div&gt;&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void clearErrorMessage() {&lt;br /&gt;        _errorMessage.setHTML(&amp;quot;&lt;div style="margin-left: 10px; color: red"&gt;&lt;/div&gt;&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void lauchDirections() {&lt;br /&gt;        Log.debug(&amp;quot;Getting direction&amp;quot; + _map);&lt;br /&gt;        if (_toTextField.getText().length() &amp;gt; 0 &amp;amp;&amp;amp; _fromTextField.getText().length() &amp;gt; 0) {&lt;br /&gt;            setDirections(_fromTextField.getValueAsString(), _toTextField.getValueAsString(), _locale);&lt;br /&gt;            clearErrorMessage();&lt;br /&gt;        } else {&lt;br /&gt;            Log.warn(&amp;quot;From and to must be filled&amp;quot;);&lt;br /&gt;            setErrorMessage(&amp;quot;From and to must be filled&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void init() {&lt;br /&gt;	Log.debug("Setting default width and heigth");&lt;br /&gt;        setWidth(600);&lt;br /&gt;        setHeight(600);&lt;br /&gt;        setLayout(new FitLayout());&lt;br /&gt;        setBorder(false);&lt;br /&gt;        String mapDiv = &amp;quot;&lt;div id="widget_map_canvas" style="width: 100%; height: 100%"&gt;&lt;/div&gt;&amp;quot;;&lt;br /&gt;        String directionsDiv = &amp;quot;&lt;div id="widget_directions" style="overflow: auto; height: 90%"&gt;&lt;/div&gt;&amp;quot;;&lt;br /&gt;        _mapHTMLPanel = new HTMLPanel(mapDiv);&lt;br /&gt;        _directionsHTMLPanel = new HTMLPanel(directionsDiv);&lt;br /&gt;        &lt;br /&gt;        //_panel.add(new HTMLPanel(&amp;quot;&lt;div style="padding-right: 10px; padding-left: 10px; padding-bottom: 10px; padding-top: 10px"&gt;&lt;/div&gt;&amp;quot;)); &lt;br /&gt;        &lt;br /&gt;        if (_displayMode == DisplayMode.HORIZONTAL) {&lt;br /&gt;            Log.debug(&amp;quot;Horizontal mode&amp;quot;);&lt;br /&gt;            Panel columnLayoutPanel = new Panel();&lt;br /&gt;            columnLayoutPanel.setBorder(false);&lt;br /&gt;            columnLayoutPanel.setLayout(new ColumnLayout());&lt;br /&gt;&lt;br /&gt;            col1Panel = new Panel();&lt;br /&gt;            col1Panel.setBorder(false);&lt;br /&gt;            col1Panel.setLayout(new FitLayout());&lt;br /&gt;            Panel panelMap = new Panel();&lt;br /&gt;            panelMap.setBorder(false);&lt;br /&gt;            _mapHTMLPanel.setMargins(10, 10, 10, 10);&lt;br /&gt;            panelMap.setLayout(new AnchorLayout());&lt;br /&gt;            if (_displayForm) {&lt;br /&gt;                panelMap.add(createFromToForm());&lt;br /&gt;            }&lt;br /&gt;            panelMap.add(_mapHTMLPanel, new AnchorLayoutData(&amp;quot;100% 100%&amp;quot;));&lt;br /&gt;            col1Panel.add(panelMap);&lt;br /&gt;            col2Panel = new Panel();&lt;br /&gt;            col2Panel.setBorder(false);&lt;br /&gt;            col2Panel.setLayout(new FitLayout()); &lt;br /&gt;            col2Panel.add(_directionsHTMLPanel);&lt;br /&gt;&lt;br /&gt;            columnLayoutPanel.add(col1Panel, new ColumnLayoutData(.50));&lt;br /&gt;            columnLayoutPanel.add(col2Panel, new ColumnLayoutData(.50));&lt;br /&gt;            columnLayoutPanel.addListener(new PanelListenerAdapter() {&lt;br /&gt;                    public void onResize(BoxComponent component, int adjWidth, int adjHeight, int rawWidth, int rawHeight) {&lt;br /&gt;                        col1Panel.setHeight(rawHeight);&lt;br /&gt;                        col2Panel.setHeight(rawHeight);&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            add(columnLayoutPanel);&lt;br /&gt;           &lt;br /&gt;        } else {&lt;br /&gt;            Log.debug(&amp;quot;Vertical mode&amp;quot;);&lt;br /&gt;            Panel panel = new Panel();&lt;br /&gt;            panel.setLayout(new AnchorLayout());&lt;br /&gt;            if (_displayForm) {&lt;br /&gt;                FormPanel fPanel = createFromToForm();&lt;br /&gt;                panel.add(fPanel);  &lt;br /&gt;            } &lt;br /&gt;            panel.add(_mapHTMLPanel, new AnchorLayoutData(&amp;quot;100% 50%&amp;quot;));&lt;br /&gt;            _mapHTMLPanel.collapse();&lt;br /&gt;            panel.add(_directionsHTMLPanel, new AnchorLayoutData(&amp;quot;100% 50%&amp;quot;));&lt;br /&gt;            add(panel);  &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    protected void onAttach() {&lt;br /&gt;        Log.debug(&amp;quot;Component attached&amp;quot;);&lt;br /&gt;        _map = initializeMap();&lt;br /&gt;        _gdir = initializeDirections(this);&lt;br /&gt;        if (_from != null &amp;amp;&amp;amp; _to != null) {&lt;br /&gt;            setDirections(_from, _to, _locale);&lt;br /&gt;        } else {&lt;br /&gt;            _mapHTMLPanel.collapse();&lt;br /&gt;        }&lt;br /&gt;        super.onAttach();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private native JavaScriptObject initializeMap() /*-{&lt;br /&gt;     var map = new $wnd.GMap2($doc.getElementById('widget_map_canvas'));&lt;br /&gt;     map.addControl(new $wnd.GSmallMapControl());&lt;br /&gt;     map.addControl(new $wnd.GMapTypeControl());&lt;br /&gt;     return map;&lt;br /&gt;    }-*/;&lt;br /&gt;    &lt;br /&gt;    private native JavaScriptObject initializeDirections(Directions thisModule) /*-{&lt;br /&gt;     var map = this.@com.benevolarc.gwt.client.Directions::_map;&lt;br /&gt;     var gdir = new $wnd.GDirections(map, $doc.getElementById('widget_directions'));&lt;br /&gt;     $wnd.GEvent.addListener(gdir, &amp;quot;load&amp;quot;, function(response) {&lt;br /&gt;        if (response &amp;amp;&amp;amp; response.getStatus().code == 200) {&lt;br /&gt;            thisModule.@com.benevolarc.gwt.client.Directions::directionsOK()();                          &lt;br /&gt;        } &lt;br /&gt;     });&lt;br /&gt;     &lt;br /&gt;     $wnd.GEvent.addListener(gdir, &amp;quot;error&amp;quot;, function(response) {&lt;br /&gt;        if (!response || response.getStatus().code != 200) {&lt;br /&gt;            thisModule.@com.benevolarc.gwt.client.Directions::directionsError(I)(response.getStatus().code);                          &lt;br /&gt;        } &lt;br /&gt;     });&lt;br /&gt;     return gdir;&lt;br /&gt;    }-*/;&lt;br /&gt;    &lt;br /&gt;    public void directionsError(int error) {&lt;br /&gt;        Log.debug(&amp;quot;Error&amp;quot;);&lt;br /&gt;        String errorMessage = &amp;quot;Unknown error&amp;quot;;&lt;br /&gt;        switch (error) {&lt;br /&gt;            case 601: errorMessage = &amp;quot;Missing query&amp;quot;;break;&lt;br /&gt;            case 602: errorMessage = &amp;quot;Unknown address&amp;quot;;break;&lt;br /&gt;            case 603: errorMessage = &amp;quot;Unavailable address&amp;quot;;break;&lt;br /&gt;            case 604: errorMessage = &amp;quot;Unknown direction&amp;quot;;break;&lt;br /&gt;            default: errorMessage =&amp;quot;Unknown error&amp;quot;;&lt;br /&gt;        }&lt;br /&gt;        setErrorMessage(errorMessage);&lt;br /&gt;        _mapHTMLPanel.collapse();&lt;br /&gt;        _directionsHTMLPanel.collapse();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void directionsOK() {&lt;br /&gt;        Log.debug(&amp;quot;Directions OK&amp;quot;);&lt;br /&gt;        _mapHTMLPanel.expand(true);&lt;br /&gt;        _directionsHTMLPanel.expand(true);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    public native void setDirections(String fromAddress, String toAddress, String locale) /*-{&lt;br /&gt;     var gdir = this.@com.benevolarc.gwt.client.Directions::_gdir;&lt;br /&gt;     gdir.clear();&lt;br /&gt;     gdir.load(&amp;quot;from: &amp;quot; + fromAddress + &amp;quot; to: &amp;quot; + toAddress,&lt;br /&gt;                  { &amp;quot;locale&amp;quot;: locale });&lt;br /&gt;    }-*/;&lt;br /&gt;    &lt;br /&gt;     public void setLocale(String locale) {&lt;br /&gt;         this._locale = locale;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     public String getLocale() {&lt;br /&gt;         return _locale;&lt;br /&gt;     }&lt;br /&gt;    &lt;br /&gt;   &lt;br /&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/34817473-4190023378756660764?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/4190023378756660764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=4190023378756660764' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/4190023378756660764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/4190023378756660764'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/07/gwt-ext-wrapping-google-map-component.html' title='GWT-Ext: Wrapping a Google Map component'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/fvisticot/SIstS28ChmI/AAAAAAAABfE/l1U0T4zDgNg/s72-c/directions_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-7214298316028084227</id><published>2008-07-20T07:46:00.001-07:00</published><updated>2008-07-20T07:59:51.930-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google appengine'/><title type='text'>Google App Engine: Queries as an SQL “LIKE”</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Introduction:&lt;/h3&gt; &lt;p&gt;When i have developed my first GAE application, i wanted to use a request with a “LIKE” to find all tuples beginning with a prefix.&lt;/br&gt; GQLQuery does not allow this kind of SQL request (SELECT * FROM user where name LIKE ‘SMIT%’).&lt;/br&gt; The solution is to use this kind of request: &lt;pre name="code" class="java"&gt;&lt;br /&gt;query = self.request.str_POST['query']&lt;br /&gt;queryEnd = query+"\xEF\xBF\xBD".decode('utf-8')&lt;br /&gt;res=db.GqlQuery('SELECT * FROM User WHERE name&gt;=:1 AND name&lt;=:2 ORDER BY nom DESC', query, queryEnd)&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;I was obliged to modify the sample code provided by the documentation (&lt;a href="http://code.google.com/appengine/docs/datastore/queriesandindexes.html#Restrictions_on_Queries" target="_blank"&gt;here&lt;/a&gt;)&lt;br /&gt;queryEnd = query+"\xEF\xBF\xBD".decode('utf-8') was added.&lt;/br&gt;&lt;br /&gt;Thanks a lot to José Oliver Segura for his support.&lt;/br&gt;&lt;br /&gt;Information can be found &lt;a href="http://code.google.com/appengine/docs/datastore/queriesandindexes.html#Restrictions_on_Queries" target="_blank"&gt;here&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-7214298316028084227?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/7214298316028084227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=7214298316028084227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7214298316028084227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7214298316028084227'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/07/google-app-engine-queries-as-sql-like.html' title='Google App Engine: Queries as an SQL “LIKE”'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-8890827892373718974</id><published>2008-07-17T14:50:00.001-07:00</published><updated>2008-07-17T15:53:46.610-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='blog tools'/><title type='text'>Inserting code snippet in Blogger</title><content type='html'>It was really difficult for me to find a solution to insert java code snippets in my Blogger !! &lt;/br&gt; I found a solution using the &lt;strong&gt;syntaxhighlighter&lt;/strong&gt; JavaScript plugin.&lt;/br&gt;  The steps used to insert code snippet:  &lt;ul&gt;   &lt;li&gt;Download syntaxhighlighter from &lt;a href="http://code.google.com/p/syntaxhighlighter/" target="_blank"&gt;syntaxhighlighter&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Unzip the file and place the Scripts and Styles directories in a URL (location in my sample)&lt;/li&gt;    &lt;li&gt;Modify your blogger template adding those lines just after the &amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- end outer-wrapper –&amp;gt;&lt;/li&gt; &lt;/ul&gt;  &lt;textarea class="js" name="code"&gt; &lt;link href="&amp;lt;http:&amp;lt;location&amp;gt;/Styles/SyntaxHighlighter.css" rel="stylesheet" type="text/css" /&gt; &lt;script src="&amp;lt;http:&amp;lt;location&amp;gt;/Scripts/shCore.js" type="text/javascript" /&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushCpp.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushCSharp.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushCss.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushJava.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushJScript.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushSql.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='&lt;http:&lt;location&gt;/Scripts/shBrushXml.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class='javascript'&gt;&lt;br /&gt;//&lt;![CDATA[&lt;br /&gt;    function FindTagsByName(container, name, Tag)&lt;br /&gt;    {&lt;br /&gt;        var elements = document.getElementsByTagName(Tag);&lt;br /&gt;        for (var i = 0; i &lt; elements.length; i++)&lt;br /&gt;        {&lt;br /&gt;            if (elements[i].getAttribute("name") == name)&lt;br /&gt;            {&lt;br /&gt;                container.push(elements[i]);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    var elements = [];&lt;br /&gt;    FindTagsByName(elements, "code", "pre");&lt;br /&gt;    FindTagsByName(elements, "code", "textarea");&lt;br /&gt; &lt;br /&gt; for(var i=0; i &lt; elements.length; i++) {&lt;br /&gt;  if(elements[i].nodeName.toUpperCase() == "TEXTAREA") {&lt;br /&gt;   var childNode = elements[i].childNodes[0];&lt;br /&gt;   var newNode = document.createTextNode(childNode.nodeValue.replace(/&lt;br\s*\/?&gt;/gi,'\n'));&lt;br /&gt;   elements[i].replaceChild(newNode, childNode);&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;else if(elements[i].nodeName.toUpperCase() == "PRE") {&lt;br /&gt;   brs = elements[i].getElementsByTagName("br");&lt;br /&gt;   for(var j = 0, brLength = brs.length; j &lt; brLength; j++) {&lt;br /&gt;    var newNode = document.createTextNode("\n");&lt;br /&gt;    elements[i].replaceChild(newNode, brs[0]);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;  //clipboard does not work well, no line breaks&lt;br /&gt;  // dp.SyntaxHighlighter.ClipboardSwf = &lt;br /&gt;  //"http://[YOUR HOST]/clipboard.swf";&lt;br /&gt;  dp.SyntaxHighlighter.HighlightAll("code");&lt;br /&gt;//]]&gt;&lt;br /&gt;&lt;/script&gt; &lt;/textarea&gt;  &lt;ul&gt;   &lt;li&gt;To publish a post with code snippet, insert your code inside the &amp;lt;pre&amp;gt; or &amp;lt;textarea&amp;gt; tags&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;textarea name=&amp;quot;code&amp;quot; class=&amp;quot;c#&amp;quot; cols=&amp;quot;60&amp;quot; rows=&amp;quot;10&amp;quot;&amp;gt; &lt;/p&gt;    &lt;p&gt;... some code here ... &lt;/p&gt;    &lt;p&gt;&amp;lt;/textarea&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;More information and configuration is available on the &lt;a href="http://code.google.com/p/syntaxhighlighter/" target="_blank"&gt;syntaxhighlighter&lt;/a&gt; web site.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-8890827892373718974?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/8890827892373718974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=8890827892373718974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/8890827892373718974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/8890827892373718974'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/07/syntaxhiglighter.html' title='Inserting code snippet in Blogger'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-953839758198276877</id><published>2008-07-15T13:11:00.001-07:00</published><updated>2008-07-15T13:11:55.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt-ext'/><title type='text'>Rounded corners panel with GWT</title><content type='html'>&lt;h1&gt;&lt;/h1&gt;  &lt;h4&gt;Native GWT solution&lt;/h4&gt;  &lt;p&gt;GWT provides a native solution to build panels with rounded corners. This solution is done with a &lt;strong&gt;DecoratorPanel&lt;/strong&gt; component. &lt;/p&gt;  &lt;p&gt;The rounded corners are build thanks a .css file customization where images needs to be provided in the css file.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;html&amp;gt;body .gwt-DecoratorPanel .topLeft {      &lt;br /&gt;&amp;#160; background: url(images/corner.png) no-repeat 0px 0px;       &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font color="#666666"&gt;The drawback of this solution is that images need to be provided when a new rounded panel has to be created with a new color.&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;Bouwkamp solution&lt;/h4&gt;  &lt;p&gt;An other solution without providing any images for corner definition is available thanks &lt;a title="http://code.google.com/p/com-bouwkamp-gwt/" href="http://code.google.com/p/com-bouwkamp-gwt/"&gt;http://code.google.com/p/com-bouwkamp-gwt/&lt;/a&gt;. By this way creating a new rounded corner panel with different colors is a very basic task.&lt;/p&gt;  &lt;p&gt;Steps to create a new rounded panel:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download the jar file and reference this file in the classpath &lt;/li&gt;    &lt;li&gt;Modify the &amp;lt;appli&amp;gt;.gwt.xml and add : &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;inherits name='com.bouwkamp.gwt.user.User' /&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Create your java file:      &lt;p&gt;By default the height of the corners is 2px. It is possible to set a different height at construction time. The height can be a value between and including 1 and 9. This value doesn't correspond exactly with the height, e.g. 9 is 12px height. &lt;/p&gt;      &lt;blockquote&gt;       &lt;pre&gt; // all 4 corners are rounded and height index 5&lt;br /&gt;      RoundedPanel rp = new RoundedPanel(yourWidget, ALL, 5);&lt;/pre&gt;&lt;br /&gt;    &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;    &lt;p&gt;In the previous sample yourWidget can be any component like a VerticalPanel&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;    &lt;p&gt;You can even define the color of the corner programaticaly:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;    &lt;blockquote&gt;&lt;br /&gt;      &lt;pre&gt;// all 4 corners are rounded.&lt;br /&gt;      RoundedPanel rp = new RoundedPanel(yourWidget); &lt;br /&gt;      rp.setCornerColor(&amp;quot;red&amp;quot;);&lt;/pre&gt;&lt;br /&gt;    &lt;/blockquote&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Customize the .css application file for rounder corner customization &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;Default the css style name of the rounded corner divs is &lt;code&gt;cbg-RP&lt;/code&gt;. Use it to set the colors of the corner. For example: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;blockquote&gt;&lt;br /&gt;    &lt;pre&gt; .cbg-RP { background-color:#c3d9ff; }&lt;/pre&gt;&lt;br /&gt;  &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;The solution provided by the Bouwkamp library is very easy to use. Some improvement can be done like providing a rounded corner support and shadow borders. It seems javascript libary is available for this feature see:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;a title="http://www.ruzee.com/blog/shadedborder/" href="http://www.ruzee.com/blog/shadedborder/"&gt;http://www.ruzee.com/blog/shadedborder/&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h3&gt;&lt;/h3&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New" color="#666666"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-953839758198276877?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/953839758198276877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=953839758198276877' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/953839758198276877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/953839758198276877'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/07/rounded-corners-panel-with-gwt.html' title='Rounded corners panel with GWT'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-9161208823528537581</id><published>2008-07-12T07:58:00.001-07:00</published><updated>2008-07-19T10:26:51.623-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt-ext'/><title type='text'>GWT-Ext, Remote ComboBox tutorial</title><content type='html'>&lt;p&gt;Designing a local comboBox is a basic documented task. For the remote mode (where data to be suggested are returned from a server) the documentation is not so clear. &lt;/p&gt;  &lt;p&gt;In this post, a basic review of the LOCAL mode is done and in a second part, the REMOTE mode is developped. &lt;/p&gt;  &lt;h2&gt;Local comboBox mode:&lt;/h2&gt;  &lt;p&gt;Basic steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Store initialization &lt;/li&gt;    &lt;li&gt;Loading the store &lt;/li&gt;    &lt;li&gt;Creating the combobox with LOCAL mode &lt;/li&gt;    &lt;li&gt;Linking the combobox with the store &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Sample code:&lt;/h3&gt;  &lt;pre class="java" name="code"&gt;        final Store store = &lt;br /&gt;            new SimpleStore(new String[] { &amp;quot;civilite&amp;quot;, &amp;quot;desc&amp;quot;, }, &lt;br /&gt;                            new String[][] { new String[] { &amp;quot;Mr&amp;quot;, &amp;quot;Mr&amp;quot; }, &lt;br /&gt;                                             new String[] { &amp;quot;Mlle&amp;quot;, &amp;quot;Mlle&amp;quot; }, &lt;br /&gt;                                             new String[] { &amp;quot;Mde&amp;quot;, &amp;quot;Mde&amp;quot; } });&lt;br /&gt;        store.load();&lt;br /&gt;&lt;br /&gt;        final ComboBox cb = new ComboBox();&lt;br /&gt;        cb.setForceSelection(true);&lt;br /&gt;        cb.setMinChars(1);&lt;br /&gt;        cb.setFieldLabel(&amp;quot;Civilité&amp;quot;);&lt;br /&gt;        cb.setStore(store);&lt;br /&gt;        cb.setAllowBlank(false);&lt;br /&gt;        cb.setDisplayField(&amp;quot;civilite&amp;quot;);&lt;br /&gt;        cb.setMode(ComboBox.LOCAL);&lt;br /&gt;        cb.setTriggerAction(ComboBox.ALL);&lt;br /&gt;        cb.setEmptyText(&amp;quot;Enter civilité&amp;quot;);&lt;br /&gt;        cb.setLoadingText(&amp;quot;Recherche...&amp;quot;);&lt;br /&gt;        cb.setTypeAhead(true);&lt;br /&gt;        cb.setEditable(false);&lt;br /&gt;        cb.setSelectOnFocus(true);&lt;br /&gt;        cb.setWidth(230);&lt;br /&gt;&lt;br /&gt;        cb.setHideTrigger(false);&lt;br /&gt;        add(cb);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Remote comboBox mode:&lt;/h2&gt;&lt;br /&gt;In that case, the store needs to be constructed dynamicaly from the server. &lt;br /&gt;&lt;br /&gt;Each time the user tapes a new key in the combobox, a request has to be sent to the server to update the suggest box. The current combobox value has to be sent as a parameter to the server. &lt;br /&gt;&lt;br /&gt;The combobox REMOTE mode uses a &lt;b&gt;POST &lt;/b&gt;query to the server with the &lt;b&gt;query &lt;/b&gt;parameter filled with the current combobox value. &lt;br /&gt;&lt;br /&gt;The server side (any servlet or CGI) needs to analyze the POST request, retrieve the &lt;b&gt;query &lt;/b&gt;parameter and return an answer to be displayed in the combobox (in the sample code, JSON is used). Some parameters can be set for autocomplete configuration: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;setMinChar:&lt;/b&gt; The minimum number of characters the user must type before autocomplete activate (default is 4) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;setQueryDelay:&lt;/b&gt; The length of time in milliseconds to delay between the start of typing and sending the query to filter the dropdown list (defaults to 500 ms) &lt;br /&gt;&lt;br /&gt;Basic steps:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Store creation and loading with a HttpProxy and a JsonReader &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Combobox creaction with REMOTE mode &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Linking the combobox with the store &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Creating the server side part (servlet or CGI) by analyzing the &lt;strong&gt;query&lt;/strong&gt; parameter on the &lt;strong&gt;POST&lt;/strong&gt; request. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Sample code:&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;         HttpProxy dataProxy = new HttpProxy(&amp;quot;/rpc/adherents&amp;quot;);&lt;br /&gt;         final String resultTpl = &amp;quot;&lt;div class="\&amp;quot;search-item\&amp;quot;"&gt;&lt;h3&gt;{nom} {prenom}&lt;/h3&gt;{email}&lt;/div&gt;&amp;quot;;   &lt;br /&gt;         RecordDef adherentsRecordDef =  &lt;br /&gt;                 new RecordDef(new FieldDef[] { new StringFieldDef(&amp;quot;id&amp;quot;),&lt;br /&gt;                                                new StringFieldDef(&amp;quot;nom&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;prenom&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;telephoneFixe&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;telephoneMobile&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;email&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;adresse&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;codePostal&amp;quot;), &lt;br /&gt;                                                new StringFieldDef(&amp;quot;ville&amp;quot;) });&lt;br /&gt;         JsonReader reader = new JsonReader(adherentsRecordDef);&lt;br /&gt;         reader.setRoot(&amp;quot;adherents&amp;quot;);&lt;br /&gt;         Store store = new Store(dataProxy, reader);&lt;br /&gt;         store.load();&lt;br /&gt;         ComboBox cb = new ComboBox();   &lt;br /&gt;         cb.setStore(store);   &lt;br /&gt;         cb.setDisplayField(&amp;quot;nom&amp;quot;);   &lt;br /&gt;         cb.setId(&amp;quot;nom&amp;quot;);&lt;br /&gt;         cb.setTypeAhead(false);   &lt;br /&gt;         cb.setLoadingText(&amp;quot;Searching...&amp;quot;);  &lt;br /&gt;         cb.setFieldLabel(&amp;quot;Nom&amp;quot;);&lt;br /&gt;         cb.setWidth(230);   &lt;br /&gt;         cb.setTpl(resultTpl);&lt;br /&gt;         cb.setPageSize(10);   &lt;br /&gt;         cb.setHideTrigger(true);   &lt;br /&gt;         cb.setMode(ComboBox.REMOTE);   &lt;br /&gt;         cb.setTitle(&amp;quot;Users&amp;quot;);   &lt;br /&gt;         //cb.setHideLabel(true);   &lt;br /&gt;         cb.setItemSelector(&amp;quot;div.search-item&amp;quot;); &lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-9161208823528537581?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/9161208823528537581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=9161208823528537581' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/9161208823528537581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/9161208823528537581'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/07/gwt-ext-remote-combobox-tutorial.html' title='GWT-Ext, Remote ComboBox tutorial'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-8371889310378971458</id><published>2008-06-29T15:27:00.001-07:00</published><updated>2008-06-29T15:27:20.759-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><title type='text'>Google Calendar API: managing main and secondary calendars</title><content type='html'>&lt;p&gt;Adding an event in a Google calendar is pretty easy. For me, the only touchy think is to select the correct calendarID.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;To add an event in the main calendar (the default calendar created by Google when the account is created) the url is: &lt;strong&gt;/calendar/feeds/default/private/full&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;To add an event in a secondary calendar the url is: &lt;strong&gt;/calendar/feeds/&amp;lt;calendarID&amp;gt;/private/full&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To find the calendarID:&lt;/p&gt;  &lt;p&gt;1) Go to Google Calendar.    &lt;br /&gt;2) Click on &amp;quot;Manage calendar     &lt;br /&gt;3) Select the tab Calendars     &lt;br /&gt;4) Click on the name of the secondary calendar     &lt;br /&gt;5) You will see an entry that says &amp;quot;Calendar address&amp;quot;     &lt;br /&gt;6) Search (CalendarID:...@group.calendar.google.com)&lt;/p&gt;  Don't forget to replace the @ with %40 when used in you application.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-8371889310378971458?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/8371889310378971458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=8371889310378971458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/8371889310378971458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/8371889310378971458'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/06/google-calendar-api-managing-main-and.html' title='Google Calendar API: managing main and secondary calendars'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-7929728706704369640</id><published>2008-06-22T08:14:00.001-07:00</published><updated>2008-07-19T10:18:02.637-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google appengine'/><category scheme='http://www.blogger.com/atom/ns#' term='goole app engine'/><title type='text'>Google App Engine: basic tips</title><content type='html'>&lt;ul&gt;   &lt;li&gt;To start the local python server in debug mode: &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;python dev_appserver.py –debug&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;To reset the datastore: &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;python dev_appserver.py --clear_datastore&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;To use Google App Engine behind a proxy &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;With Windows, 2 system variables need to be set:&lt;/p&gt;  &lt;p&gt;http_proxy =http://&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;proxy_address&amp;gt;:&amp;lt;proxy_port&amp;gt;&lt;/p&gt;  &lt;p&gt;https_proxy = &amp;quot;http://&amp;lt;login&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;proxy_address&amp;gt;:&amp;lt;proxy_port&amp;gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;To access the local datastore to view the application data: &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://localhost:8080/_ah/admin"&gt;http://localhost:8080/_ah/admin&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-7929728706704369640?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/7929728706704369640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=7929728706704369640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7929728706704369640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7929728706704369640'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/06/google-app-engine-basic-tips.html' title='Google App Engine: basic tips'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-7288954666176311466</id><published>2008-05-04T02:22:00.001-07:00</published><updated>2008-05-04T06:10:45.323-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='embedded-jboss'/><category scheme='http://www.blogger.com/atom/ns#' term='ejb3'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>EJB3 and JUnit</title><content type='html'>&lt;p&gt;For EJB3 testing, an interesting solution based on JBoss embedded package. Of course other alternative are available (Cactus, EJB3Unit...).&lt;/p&gt;  &lt;p&gt;Thanks to this solution, it is now possible to launch an embedded JBoss container in &lt;strong&gt;standalone&lt;/strong&gt; (without the need to install and configure a full JBoss container). &lt;/p&gt;  &lt;p&gt;This solution is very interesting for testing purpose because there is no need to deploy and un-deploy each time on the server.&lt;/p&gt;  &lt;p&gt;This JBoss package includes all mandatory libraries used to validated an EJB3 solution:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;1 EJB3 container &lt;/li&gt;    &lt;li&gt;The EJB3 Hibernate implementation &lt;/li&gt;    &lt;li&gt;1 embedded java database: HSQLDB &lt;/li&gt;    &lt;li&gt;JUnit (3) for testing purpose &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For this tutorial, the &lt;strong&gt;embedded-jboss-beta3 &lt;/strong&gt;is used and can be downloaded &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=22866&amp;amp;package_id=228977" target="_blank"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;All the tutorial sources is available &lt;a href="http://frederic.visticot.club.fr/blogger/fred/EJB3-JUnit/EmbeddedJBoss.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Tutorial objective: Testing an EJB3 solution with JUnit based on&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;1 entity bean (Person) &lt;/li&gt;    &lt;li&gt;1 session bean used for CRUD operation (Create, Remove, Update, Display) &lt;/li&gt;    &lt;li&gt;1 JUnit test case used to validate session bean operation &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Step 1: Download the embedded JBoss library&lt;/h4&gt;  &lt;h4&gt;Step 2: Create a startup project&lt;/h4&gt;  &lt;p&gt;Create a project with your favorite IDE and import the JBoss embedded library (from the library and from the optional-lib directories). Do not forget to add all the .jar files in the classpath. Embedded configuration directory needs to be in the classpath also (/embedded-jboss/bootstrap).&lt;/p&gt;  &lt;h4&gt;Step 3: Create your Entity bean&lt;/h4&gt;  &lt;p&gt;For this tutorial, the &lt;strong&gt;Person&lt;/strong&gt; class is created&lt;/p&gt;  &lt;h4&gt;Step 4: Create your session bean&lt;/h4&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;p&gt;For this tutorial, the &lt;strong&gt;PersonService&lt;/strong&gt; session bean (interface and local implementation)&lt;/p&gt;  &lt;h4&gt;Step 5: Create your JUnit test case&lt;/h4&gt;  &lt;p&gt;It's the most interesting part of the tutorial.&lt;/p&gt;  &lt;p&gt;To create and deploy JUnit tests easily, JBoss provides an extension of the JUnit &lt;strong&gt;TestCase&lt;/strong&gt; class, the &lt;strong&gt;BaseTestCase&lt;/strong&gt;. This class needs to package the application hosting the testes. A dynamical jar builder is used to create the package.&lt;/p&gt;  &lt;h4&gt;Step 6: Build your applications and tests with ant&lt;/h4&gt;  &lt;p&gt;Ant 1.7 is used for this tutorial.&lt;/p&gt;  &lt;h4&gt;Step 7: Run the tests&lt;/h4&gt;  &lt;p&gt;The &lt;strong&gt;tests&lt;/strong&gt; ant task is used. This task will execute all tests available in the test directory.&lt;/p&gt;  &lt;p&gt;An other ant task &lt;strong&gt;tests-report-html&lt;/strong&gt; can be used to generate the report in html format.&lt;/p&gt;  &lt;h4&gt;Step 8 (optional): Running multiple tests&lt;/h4&gt;  &lt;p&gt;To avoid deploying and starting the JBoss container for each test case, it's possible to group all test cases in a suite by extending the JUnit &lt;strong&gt;TestSuite&lt;/strong&gt; class. &lt;/p&gt;  &lt;p&gt;For the tutorial, the AllTests class has been used and 2 test cases has been added in the suite. The &lt;strong&gt;all-tests&lt;/strong&gt; task is used to run the TestSuite.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Embedded JBoss seems to be an attractive solution for EJB3 testing with JUnit. For now, only the internal java DB is used for persistence but it seems possible to configure an other database like Mysql. I will try to cover this feature in a new post.&lt;/p&gt;  &lt;p&gt;The JUnit4 framework has not been tested and can be evaluated in an other post.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ea28458c-014d-47b3-80eb-3e278e2ee44b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Mots clés Technorati : &lt;a href="http://technorati.com/tags/junit" rel="tag"&gt;junit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ejb3" rel="tag"&gt;ejb3&lt;/a&gt;,&lt;a href="http://technorati.com/tags/embedded-jboss" rel="tag"&gt;embedded-jboss&lt;/a&gt;,&lt;a href="http://technorati.com/tags/hibernate" rel="tag"&gt;hibernate&lt;/a&gt;&lt;/div&gt;  &lt;div class="csharpcode"&gt;   &lt;h3&gt;&lt;span class="lnum"&gt;&lt;/span&gt;&lt;/h3&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-7288954666176311466?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/7288954666176311466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=7288954666176311466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7288954666176311466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/7288954666176311466'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2008/05/ejb3-and-junit.html' title='EJB3 and JUnit'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-1061173565772323905</id><published>2007-12-01T00:47:00.001-08:00</published><updated>2007-12-01T00:47:50.660-08:00</updated><title type='text'>Hibernate...</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-1061173565772323905?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/1061173565772323905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=1061173565772323905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/1061173565772323905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/1061173565772323905'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2007/12/hibernate.html' title='Hibernate...'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-2570831796366952179</id><published>2007-11-16T07:34:00.001-08:00</published><updated>2007-11-16T07:34:30.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><title type='text'>JDeveloper and Jad</title><content type='html'>&lt;p&gt;JDeveloper does not decompile the class file automaticaly. When you drop a .class in the editor, jdev only provides the class description with methods...not the java code.&lt;/p&gt; &lt;p&gt;Jdev configuration file located in &lt;strong&gt;&amp;lt;jdev-home&amp;gt;/jdev/bin/jdev.conf&lt;/strong&gt; has to be modified to allow jad to be taken into account for decompilation. The following line has to be added at the end of the&amp;nbsp;jdev.conf file.&lt;/p&gt; &lt;p&gt;AddVMOption -Djcncmd=&lt;strong&gt;c:/jadnt158/jad.exe&lt;/strong&gt; -p -b -ff -nl -pi99999 -space -t2 -noinner&lt;/p&gt; &lt;p&gt;Take care to modify the jad path !&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-2570831796366952179?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/2570831796366952179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=2570831796366952179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2570831796366952179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2570831796366952179'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2007/11/jdeveloper-and-jad.html' title='JDeveloper and Jad'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34817473.post-2536535611488175785</id><published>2007-11-16T05:03:00.001-08:00</published><updated>2007-11-16T13:17:02.017-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>GWT and Gears, automatic manifest generation</title><content type='html'>&lt;p&gt;When you create an application with GWT and Gear (&lt;a href="http://code.google.com/p/gwt-google-apis/"&gt;http://code.google.com/p/gwt-google-apis/&lt;/a&gt;), a manifest has to be created to manage offline content.&lt;br&gt;Depending the targeted browser (Safari, IE, Gecko1.8, Gecko, Opera) GWT generates specifics files for html and javascript.&lt;br&gt;To minimize the manifest management (and the downloading process) a dedicated manifest has to be created for each browser.&lt;br&gt;A solution is to use a ServletFilter. This filter will automaticaly return the manifest regarding user's browser. &lt;br&gt;The filter configuration manages manifest version and resources to be included in the manifest (.css, .html, .gif...).&lt;br&gt;This filter will only be trigged when the manifest file is requested by Gears.&lt;/p&gt; &lt;p&gt;&lt;br&gt;I hope this solution can help..&lt;br&gt;Don' t hesitate to post any comments or modifications.&lt;/p&gt; &lt;div class="csharpcode-wrapper"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;strong&gt;FilterServlet code:&lt;/strong&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="fb3a1972-4489-4e52-abe7-25a00bb07fdf:0c565689-dec1-4b68-932b-fe1fe6ceb3ee" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;p&gt; &lt;a href="http://frederic.visticot.club.fr/blogger/fred/GWTandGearsautomaticmanifestgeneration_C5BD/GearManifestFilter_3.java" target="_blank"&gt;download the file&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;package com.alu.gwt.server;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import java.io.BufferedReader;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import java.io.File;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import java.io.FileFilter;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import java.io.FileReader;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import java.io.FilenameFilter;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import java.io.IOException;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import java.util.ArrayList;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import java.util.HashMap;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import java.util.List;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import java.util.Map;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import java.util.regex.Matcher;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import java.util.regex.Pattern;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import javax.servlet.Filter;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import javax.servlet.FilterChain;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import javax.servlet.FilterConfig;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import javax.servlet.ServletException;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import javax.servlet.ServletOutputStream;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import javax.servlet.ServletRequest;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import javax.servlet.ServletResponse;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;import javax.servlet.http.HttpServletRequest;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;import javax.servlet.http.HttpServletResponse;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GearManifestFilter implements Filter {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String EXTENSIONS = &lt;span style="color: #006080"&gt;"extensions"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String MANIFEST_VERSION = &lt;span style="color: #006080"&gt;"manifestVersion"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String OPERA_PATTERN = &lt;span style="color: #006080"&gt;"'opera'],"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String SAFARI_PATTERN = &lt;span style="color: #006080"&gt;"'safari'],"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String GECKO1_8_PATTERN = &lt;span style="color: #006080"&gt;"'gecko1_8'],"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String GECKO_PATTERN = &lt;span style="color: #006080"&gt;"'gecko'],"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String IE6_PATTERN = &lt;span style="color: #006080"&gt;"'ie6'],"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String OPERA = &lt;span style="color: #006080"&gt;"opera"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String SAFARI = &lt;span style="color: #006080"&gt;"safari"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String GECKO1_8 = &lt;span style="color: #006080"&gt;"gecko1_8"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String GECKO = &lt;span style="color: #006080"&gt;"gecko"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; final String IE6 = &lt;span style="color: #006080"&gt;"ie6"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _operaCacheFilename;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _safariCacheFilename;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _gecko1_8CacheFilename;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _geckoCacheFilename;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _ie6CacheFilename;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _extensions;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String _manifestVersion = &lt;span style="color: #006080"&gt;"1.0"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; Map _manifestMap = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HashMap();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GearRegexpFilenameFilter implements FilenameFilter {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; String _regexpFilter;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Pattern _regexpPattern;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        GearRegexpFilenameFilter(String regexpFilter) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            _regexpFilter = regexpFilter;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            _regexpPattern = Pattern.compile(_regexpFilter);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; boolean accept(File dir, String name) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((name.indexOf(&lt;span style="color: #006080"&gt;".cache."&lt;/span&gt;) == -1) &amp;amp;&amp;amp; &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                (name.indexOf(&lt;span style="color: #006080"&gt;"-xs.nocache."&lt;/span&gt;) == -1)) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                Matcher matcher = _regexpPattern.matcher(name);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; matcher.find();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GearResourcesExplorer {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        List _result = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArrayList();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; GearResourcesExplorer() {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; List list(File directory, FilenameFilter filter, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                         boolean recursive, boolean root) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (recursive) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                File[] dirs = directory.listFiles(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileFilter() {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; boolean accept(File pathname) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pathname.isDirectory())&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                            }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                        });&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i=0; i &amp;lt; dirs.length; i++)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                    list(dirs[i], filter, recursive, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            String[] res = directory.list(filter);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; res.length; i++) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (root) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                _result.add(res[i]);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                    _result.add(directory.getName() + File.separator + res[i]);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _result;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; GearManifestFilter() {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; init(FilterConfig filterConfig) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _extensions = filterConfig.getInitParameter(EXTENSIONS);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        _manifestVersion = filterConfig.getInitParameter(MANIFEST_VERSION);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"Extensions: "&lt;/span&gt; + _extensions);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        String realPath = filterConfig.getServletContext().getRealPath(&lt;span style="color: #006080"&gt;"/"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"Path:"&lt;/span&gt; + realPath);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        File dir = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; File(realPath);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        List resourceFilenames = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GearResourcesExplorer().list(dir, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GearRegexpFilenameFilter(_extensions), &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; resourceFilenames.size(); i++) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"File: "&lt;/span&gt; + resourceFilenames.get(i));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        FilenameFilter noCacheFilter = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FilenameFilter() {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; boolean accept(File dir, String name) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (name.endsWith(&lt;span style="color: #006080"&gt;".nocache.js"&lt;/span&gt;) &amp;amp;&amp;amp; &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                        !name.endsWith(&lt;span style="color: #006080"&gt;"-xs.nocache.js"&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            };&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        String[] noCacheFilenames = dir.list(noCacheFilter);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (noCacheFilenames.length != 1) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"Error !!"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            getResourcesAccordingUserAgent(realPath + noCacheFilenames[0]);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _manifestMap.put(SAFARI, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                         createManifest(_safariCacheFilename, _manifestVersion, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                                        resourceFilenames));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        _manifestMap.put(GECKO, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                         createManifest(_geckoCacheFilename, _manifestVersion, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                        resourceFilenames));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _manifestMap.put(GECKO1_8, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                         createManifest(_gecko1_8CacheFilename, _manifestVersion, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                                        resourceFilenames));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        _manifestMap.put(OPERA, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                         createManifest(_operaCacheFilename, _manifestVersion, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                        resourceFilenames));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _manifestMap.put(IE6, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                         createManifest(_ie6CacheFilename, _manifestVersion, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                                        resourceFilenames));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; getResourcesAccordingUserAgent(String noCacheFilename) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(noCacheFilename);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        BufferedReader &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        StringBuffer buffer = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringBuffer();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; BufferedReader(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileReader(noCacheFilename));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            String currentLine;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; ((currentLine = &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;.readLine()) != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                buffer.append(currentLine);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;.close();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (IOException e) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"Error"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        } &lt;span style="color: #0000ff"&gt;finally&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;in&lt;/span&gt; != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                    &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;.close();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (IOException e) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                    e.printStackTrace();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _operaCacheFilename = getFilename(buffer, OPERA_PATTERN);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        _geckoCacheFilename = getFilename(buffer, GECKO_PATTERN);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _gecko1_8CacheFilename = getFilename(buffer, GECKO1_8_PATTERN);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        _safariCacheFilename = getFilename(buffer, SAFARI_PATTERN);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        _ie6CacheFilename = getFilename(buffer, IE6_PATTERN);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"OperaFilename: "&lt;/span&gt; + _operaCacheFilename);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"GeckoFilename: "&lt;/span&gt; + _geckoCacheFilename);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"Gecko1_8Filename: "&lt;/span&gt; + _gecko1_8CacheFilename);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"SafariFilename: "&lt;/span&gt; + _safariCacheFilename);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"IE6Filename: "&lt;/span&gt; + _ie6CacheFilename);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String getFilename(StringBuffer noCacheStringBuffer, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                 String agentPattern) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        String noCacheString = noCacheStringBuffer.toString();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; beginIndex = &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            noCacheString.indexOf(agentPattern) + agentPattern.length() + 1;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; endIndex = noCacheString.indexOf(&lt;span style="color: #006080"&gt;"'"&lt;/span&gt;, beginIndex);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        String filename = noCacheString.substring(beginIndex, endIndex);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; filename;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String createManifest(String userAgentHash, String version, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                    List resourceFilenames) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        StringBuffer manifestBuffer = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringBuffer(&lt;span style="color: #006080"&gt;"{\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"\"betaManifestVersion\": 1,\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"\"version\": \""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(version);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"\",\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"\"entries\": [\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"{ \"url\": \""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(userAgentHash + &lt;span style="color: #006080"&gt;".cache.js\""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"},\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"{ \"url\": \""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(userAgentHash + &lt;span style="color: #006080"&gt;".cache.html\""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"},\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; resourceFilenames.size() - 1; i++) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            manifestBuffer.append(&lt;span style="color: #006080"&gt;"{ \"url\": \""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            manifestBuffer.append(resourceFilenames.get(i));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            manifestBuffer.append(&lt;span style="color: #006080"&gt;"\"},\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"{ \"url\": \""&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(resourceFilenames.get(resourceFilenames.size() - 1));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"\"}\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"]\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        manifestBuffer.append(&lt;span style="color: #006080"&gt;"}\n"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"Manifest: "&lt;/span&gt; + manifestBuffer.toString());&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; manifestBuffer.toString();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; doFilter(ServletRequest servletRequest, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                         ServletResponse servletResponse, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;                         FilterChain filterChain) throws IOException, &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;                                                         ServletException {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        HttpServletRequest request = ((HttpServletRequest)servletRequest);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        String userAgentString = request.getHeader(&lt;span style="color: #006080"&gt;"user-agent"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"UserAgent: "&lt;/span&gt; + userAgentString);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        String userAgent = getUserAgent(userAgentString);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        ServletOutputStream &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; = servletResponse.getOutputStream();&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        HttpServletResponse response = (HttpServletResponse)servletResponse;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        response.setContentType(&lt;span style="color: #006080"&gt;"application/jsonrequest"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println((String)_manifestMap.get(userAgent));&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; String getUserAgent(String userAgentString) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (userAgentString.indexOf(&lt;span style="color: #006080"&gt;"IE6"&lt;/span&gt;) != -1 || &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            userAgentString.indexOf(&lt;span style="color: #006080"&gt;"MSIE 7"&lt;/span&gt;) != -1) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"IE6 or more detected"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; IE6;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (userAgentString.indexOf(&lt;span style="color: #006080"&gt;"MOZILLA"&lt;/span&gt;) != -1) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"MOZILLA detected"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GECKO;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (userAgentString.indexOf(&lt;span style="color: #006080"&gt;"MOZILLA"&lt;/span&gt;) != -1) {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;            System.&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color: #006080"&gt;"MOZILLA detected"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; IE6;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; SAFARI;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; destroy() {&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;web.xml:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;    &amp;lt;filter-name&amp;gt;gearManifestFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;    &amp;lt;filter-&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;gt;com.alu.gwt.server.GearManifestFilter&amp;lt;/filter-&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;init-param&amp;gt;&lt;br /&gt;        &amp;lt;description&amp;gt;Resources to be include &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; manifest&amp;lt;/description&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;extensions&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;.htm|.css|.html|.js|.gif|.jpg&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/init-param&amp;gt;&lt;br /&gt;    &amp;lt;init-param&amp;gt;&lt;br /&gt;        &amp;lt;description&amp;gt;manifest version&amp;lt;/description&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;manifestVersion&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;1.0&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;    &amp;lt;filter-name&amp;gt;gearManifestFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;    &amp;lt;url-pattern&amp;gt;/manifest.json&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34817473-2536535611488175785?l=fvisticot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fvisticot.blogspot.com/feeds/2536535611488175785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34817473&amp;postID=2536535611488175785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2536535611488175785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34817473/posts/default/2536535611488175785'/><link rel='alternate' type='text/html' href='http://fvisticot.blogspot.com/2007/11/gwt-and-gears-automatic-manifest.html' title='GWT and Gears, automatic manifest generation'/><author><name>Fred</name><uri>http://www.blogger.com/profile/13800887573243605279</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://bp0.blogger.com/_9aNzw45OvZo/SEfTV-jkzEI/AAAAAAAABbQ/wbll0DGnYYM/S220/FO3_4211.jpg'/></author><thr:total>0</thr:total></entry></feed>
