<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Webtide Blogs &#187; Jetty</title>
	<atom:link href="http://webtide.intalio.com/category/jetty-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://webtide.intalio.com</link>
	<description>Blogs from the developers of Jetty &#38; Cometd</description>
	<lastBuildDate>Tue, 03 Apr 2012 10:17:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Jetty-SPDY blogged</title>
		<link>http://webtide.intalio.com/2012/04/jetty-spdy-blogged/</link>
		<comments>http://webtide.intalio.com/2012/04/jetty-spdy-blogged/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 10:17:06 +0000</pubDate>
		<dc:creator>simon</dc:creator>
				<category><![CDATA[Jetty]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=925</guid>
		<description><![CDATA[Jos Dirksen has written a nice blog about Jetty-SPDY, thanks Jos ! In the upcoming Jetty 7.6.3 and 8.1.3 (due in the next days), the Jetty-SPDY module has been enhanced with support for prioritized streams and for SPDY push (although the latter only available via the pure SPDY API), and we have fixed a few bugs that we spotted and &#8230; <a href="http://webtide.intalio.com/2012/04/jetty-spdy-blogged/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.smartjava.org/" target="_blank">Jos Dirksen</a> has written a <a href="http://www.smartjava.org/content/how-use-spdy-jetty" target="_blank">nice blog</a> about <a href="http://webtide.intalio.com/2012/03/spdy-support-in-jetty/" title="SPDY support in Jetty" target="_blank">Jetty-SPDY</a>, thanks Jos !</p>
<p>In the upcoming Jetty 7.6.3 and 8.1.3 (due in the next days), the Jetty-SPDY module has been enhanced with support for prioritized streams and for SPDY push (although the latter only available via the pure SPDY API), and we have fixed a few bugs that we spotted and were reported by early adopters.<br />
Also, we are working on making really easy for Jetty users to enable SPDY, so that the configuration changes needed to enable SPDY in Jetty will be minimal.</p>
<p>After these releases we will be working on full support for SPDY/3 (currently Jetty-SPDY supports SPDY/2, with some feature of SPDY/3).<br />
Browsers such as Chromium and Firefox are already updating their implementations to support also SPDY/3, so we will soon have support for the new version of the SPDY protocol also in the browsers.</p>
<p>Stay tuned !</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2012/04/jetty-spdy-blogged/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jetty-SPDY is joining the revolution!</title>
		<link>http://webtide.intalio.com/2012/03/jetty-spdy-is-joining-the-revolution/</link>
		<comments>http://webtide.intalio.com/2012/03/jetty-spdy-is-joining-the-revolution/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 03:47:47 +0000</pubDate>
		<dc:creator>gregw</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Jetty]]></category>
		<category><![CDATA[Servlets]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=909</guid>
		<description><![CDATA[There is a revolution quietly happening on the web and if you blink you might miss it. The revolution is in the speed and latency with which some browsers can load some web pages, and what used to take 100&#8242;s of ms is now often reduced to 10&#8242;s.  The revolution is Google&#8217;s  SPDY protocol which I predict will soon replace &#8230; <a href="http://webtide.intalio.com/2012/03/jetty-spdy-is-joining-the-revolution/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">There is a revolution quietly happening on the web and if you blink you might miss it. The revolution is in the speed and latency with which some browsers can load some web pages, and what used to take 100&#8242;s of ms is now often reduced to 10&#8242;s.  The revolution is Google&#8217;s  <a href="http://en.wikipedia.org/wiki/SPDY">SPDY</a> protocol which I predict will soon replace HTTP as the primary protocol of the web, and  <a href="http://webtide.intalio.com/2012/03/spdy-support-in-jetty/">Jetty-SPDY</a> is joining this revolution.</p>
<p style="text-align: justify;">SPDY is a fundamental rethink of how HTTP is transported over the internet, based on careful analysis of the interaction between TCP/IP, Browsers and web page design .  It does not entirely replace HTTP (it still uses HTTP GET&#8217;s and POST&#8217;s), but makes HTTP semantics available over a much more efficient wire protocol. It also opens up the possibility of new semantics that can be used on the web (eg server push/hint).  Improved latency, throughput and efficiency will improve user experience and facilitate better and cheaper services in environments like the mobile web.</p>
<h2 style="text-align: justify;">When is the revolution?</h2>
<p style="text-align: justify;">So when is SPDY going to be available?  It already is!!! The SPDY protocol is deployed in the current Chrome browsers and on the Amazon Kindle, and it is optionally supported by firefox 11.  Thus it is already on 25% of clients and will soon be over 50%. On the server side, Google supports SPDY on all their primary services and Twitter switched on SPDY support this month.  As the webs most popular browsers and servers are talking SPDY, this is a significant shift in the way data is moved on the web.   Since Jetty 7.6.2/8.1.2, SPDY is supported in  <a href="webtide.intalio.com/2012/03/spdy-support-in-jetty/">Jetty</a> and you can start using it without any changes to your web application!</p>
<h2>Is it a revolution or a coup?</h2>
<p style="text-align: justify;">By deploying SPDY on it&#8217;s popular browser and web services, Google has used it&#8217;s market share to make a fundamental shift in the web (<a href="http://techcrunch.com/2011/12/17/this-is-not-the-net-you-thought-you-knew/">but not as we know it</a>)!  and there are some <a href="http://www.technologyreview.in/web/37428/page3/">rum</a>b<a href="http://lambda-the-ultimate.org/node/4355">lings</a> that this may be an abuse of Google&#8217;s market power.  I&#8217;ve not been shy in the past of pointing out <a href="http://webtide.intalio.com/2008/08/bad-robot-google-android-is-evil-2/">google&#8217;s failings</a> to engage with the community in good faith, but in this case I think they have done an excellent job.  The SPDY protocol has been an <a href="http://dev.chromium.org/spdy">open project</a> for over two years and they have published specs and actively solicited feedback and participation.  More over, they are intending to take the protocol to the <a href="http://www.ietf.org/">IETF</a> for standardisation and have already submitted a <a href="http://tools.ietf.org/html/draft-mbelshe-httpbis-spdy-00">draft</a> to the httpbis working group.   Openly developing the protocol to the point of wide deployment is a good fit with the IETF&#8217;s approach of &#8220;<a href="https://www.google.com/search?q=ietf+%22rough+consensus+working+code%22">rough consensus and working code</a>&#8220;.</p>
<p style="text-align: justify;">Note also that Google are not tying any functionality to SPDY, so it is not as if they are saying that we must use their new protocol or else we can&#8217;t access their services.  We are free to disable or block SPDY on our own networks and the browsers will happily fallback to normal HTTP.  Currently SPDY is a totally transparent upgrade to the user.</p>
<h2 style="text-align: justify;">Is there a problem?</h2>
<p style="text-align: justify;">So why would anybody be upset about Google making the web run faster?  One of the most significant changes in the SPDY protocol, is that all traffic is encrypted with TLS. For most users, this can be considered a significant security enhancement, as they will no longer need to consider if a page/form is secure enough for the transaction they are conducting.</p>
<p style="text-align: justify;">However, if you are the administrator of a firewall that is enforcing some kind of content filtering policy, then having all traffic be opaque to your filters will make it impossible to check content (which may be great if you are a dissident in a rogue state, but not so great if you are responsible for a primary school network).  Similarly, caching proxies will no longer be able to cache shareable content as it will also be opaque to them, which may reduce some of the latency/throughput benefits of SPDY.</p>
<p style="text-align: justify;">Mike Belshe, who has lead the development of SPDY, points out that <a href="http://www.belshe.com/2011/11/17/spdy-of-the-future-might-blow-your-mind-today/">SPDY does not prevent proxies</a>, it just prevents implicit (aka transparent) proxies.  Since SPDY traffic is encrypted, the browser and any intermediaries must negotiate a session to pass TLS traffic, so the browser will need to give it&#8217;s consent before a proxy can see or modify any content.  This is probably workable for the primary school use-case, but no so much for the rouge state.</p>
<h2 style="text-align: justify;">Policy or Necessity?</h2>
<p style="text-align: justify;">There is nothing intrinsic about the SPDY protocol that requires TLS, and there are versions of it that operate in the clear.  I believe it was a policy rather than a technical decision to required TLS only. There are some technical justification by the argument that it reduces round trips needed to negotiate a SPDY and/or HTTP connection,  but I don&#8217;t see that encryption is the only answer to those problems.  Thus I suspect that there is also a little bit of an agenda in the decision and it will probably be the most contentious aspect of SPDY going forward.  It will be interesting to see if the TLS-only policy survives the IETF process, but then I might be hard to argue for a policy change that benefits rogue states and less personal privacy.</p>
<p style="text-align: justify;">Other than rouge states, another victim of the TLS-only policy is eas of debugging, as highlighted by Mike&#8217;s blog, where he is having trouble working out how the kindle uses SPDY because all the traffic is encrypted.  As a developer/debugger of a HTTP server, I cannot over stress how important it is to be able to see a TCP dump of a problematic session.  This argument is one of the reasons why the IETF has historically favoured clear text protocols.  It remains to be seen if this argument will continue to prevail or if we will have to rely on better tools and browser/servers coughing up TLS sessions keys in order to debug?</p>
<h2 style="text-align: justify;">In Summary</h2>
<p style="text-align: justify;">Google and the other contributors to the SPDY project have done great work to develop a protocol that promises to take the web a significant step forward and to open up the prospects for many new semantics and developments.  While they have done this some what unilaterally, it has been done openly and with out any evidence of any intent other than to improve user experience/privacy and to reduce server costs.</p>
<p style="text-align: justify;">SPDY is a great development for the web and the Jetty team is please to be a part of it.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2012/03/jetty-spdy-is-joining-the-revolution/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>SPDY support in Jetty</title>
		<link>http://webtide.intalio.com/2012/03/spdy-support-in-jetty/</link>
		<comments>http://webtide.intalio.com/2012/03/spdy-support-in-jetty/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 10:50:52 +0000</pubDate>
		<dc:creator>simon</dc:creator>
				<category><![CDATA[Jetty]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=914</guid>
		<description><![CDATA[SPDY is Google&#8217;s protocol that is intended to improve user experience on the web, by reducing the latency of web pages, sometimes up to a factor of 3. Yes, three times faster. How does SPDY accomplish that ? SPDY reduces roundtrips with the server, reduces the HTTP verboseness by compressing HTTP headers, improves the utilization of the TCP connection, multiplexes &#8230; <a href="http://webtide.intalio.com/2012/03/spdy-support-in-jetty/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.chromium.org/spdy/">SPDY</a> is Google&#8217;s protocol that is intended to improve user experience on the web, by reducing the latency of web pages, sometimes up to a factor of 3. Yes, three times faster.</p>
<p>How does SPDY accomplish that ?</p>
<p>SPDY reduces roundtrips with the server, reduces the HTTP verboseness by compressing HTTP headers, improves the utilization of the TCP connection, multiplexes requests into a single TCP connection (instead of using a limited number of connections, each serving only one request), and allows for server to push secondary resources (like CSS, images, scripts, etc.) associated with a primary resource (typically a web page) without incurring in additional round-trips.</p>
<p>Now, the <em>really</em> cool thing is that <a href="http://eclipse.org/jetty">Jetty</a> has an implementation of SPDY (see the <a href="http://wiki.eclipse.org/Jetty/Feature/SPDY">documentation</a>) in the newly released 7.6.2 and 8.1.2 releases.<br />
Your web applications can immediately and transparently benefit of many of the SPDY improvements without changes, because Jetty does the heavy lifting for you under the covers.</p>
<p>With Chromium/Chrome already supporting SPDY, and Firefox 11 supporting it also (although it needs to be enabled, see how <a href="http://en.wikipedia.org/wiki/SPDY">here</a>), more than 50% of the web browsers will be supporting it, so servers needs to catch up, and where Jetty shines.</p>
<p>The Jetty project continues to foster innovation by supporting emerging web protocols: first <a href="http://webtide.intalio.com/2011/12/websocket-over-ssl-in-jetty/" title="WebSocket over SSL in Jetty">WebSocket</a> and now SPDY.</p>
<p>A corollary project that came out from the SPDY implementation is a pure Java implementation of the <a href="http://wiki.eclipse.org/Jetty/Feature/NPN">Next Protocol Negotiation (NPN) TLS Extension</a>, also available in Jetty 7.6.2 and 8.1.2.</p>
<p>To prove that this is no fluke, we have updated <a href="https://www.webtide.com" target="_blank">Webtide&#8217;s website</a> with Jetty&#8217;s SPDY implementation, and now the website can be served via SPDY, if the browser supports it.</p>
<p>We encourage early adopters to test out Jetty&#8217;s SPDY and feedback us on <a href="http://eclipse.org/jetty/mailinglists.php">jetty-dev@eclipse.org</a>.</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2012/03/spdy-support-in-jetty/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>i-jetty 3.1 Released</title>
		<link>http://webtide.intalio.com/2012/01/i-jetty-3-1-released/</link>
		<comments>http://webtide.intalio.com/2012/01/i-jetty-3-1-released/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 04:26:56 +0000</pubDate>
		<dc:creator>janb</dc:creator>
				<category><![CDATA[i-jetty]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=885</guid>
		<description><![CDATA[Release 3.1 of i-jetty for Android is now available from the Android Market and the i-jetty download page. This release updates the embedded Jetty to jetty-7.6.0.RC4, although the majority of the changes have been to the Console, which is a webapp that allows you to interact with your Android device from a remote browser. Higlights include: pagination of large data &#8230; <a href="http://webtide.intalio.com/2012/01/i-jetty-3-1-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Release 3.1 of <a href="http://code.google.com/p/i-jetty">i-jetty</a> for Android is now available from the <a href="http://market.android.com">Android Market</a> and the i-jetty <a href="http://code.google.com/p/i-jetty/downloads/list">download page</a>.</p>
<p>This release updates the embedded Jetty to jetty-7.6.0.RC4, although the majority of the changes have been to the <a href="http://code.google.com/p/i-jetty/wiki/ConsoleWebApplication">Console</a>, which is a webapp that allows you to interact with your Android device from a remote browser.</p>
<p>Higlights include:</p>
<ul>
<li> pagination of large data sets such as Contacts and Media thumbnails (images, videos) </li>
<li> re-implementation of generated content as json &#038; ajax REST</li>
<li> ability to cause the device to ring (helpful for finding it around the house!)</li>
<li> ability to show current location of the Android device on Google maps , or track its location on the map as the device moves.</li>
</ul>
<p>Here&#8217;s a screenshot showing tracking my phone as it moves from the Sydney Opera House to Fort Denison on Sydney Harbour:</p>
<div id="attachment_893" class="wp-caption aligncenter" style="width: 600px"><a href="http://webtide.intalio.com/wp-content/uploads/2012/01/screenshot1.png"><img src="http://webtide.intalio.com/wp-content/uploads/2012/01/screenshot1.png" alt="Tracking phone via i-jetty console webapp" title="screenshot" width="590" height="915" class="size-full wp-image-893" /></a><p class="wp-caption-text">Tracking phone via i-jetty console webapp</p></div>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2012/01/i-jetty-3-1-released/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WebSocket over SSL in Jetty</title>
		<link>http://webtide.intalio.com/2011/12/websocket-over-ssl-in-jetty/</link>
		<comments>http://webtide.intalio.com/2011/12/websocket-over-ssl-in-jetty/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 11:52:44 +0000</pubDate>
		<dc:creator>simon</dc:creator>
				<category><![CDATA[cometd]]></category>
		<category><![CDATA[Jetty]]></category>
		<category><![CDATA[WebSockets]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[websocket]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=877</guid>
		<description><![CDATA[Jetty has always been in the front line on the implementation of the WebSocket Protocol. The CometD project leverages the Jetty WebSocket implementation to its maximum, to achieve great scalability and minimal latencies. Until now, however, support for WebSocket over SSL was lacking in Jetty. In Jetty 7.6.x a redesign of the connection layer allows for more pluggability of SSL &#8230; <a href="http://webtide.intalio.com/2011/12/websocket-over-ssl-in-jetty/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://eclipse.org/jetty" target="_blank">Jetty</a> has always been in the front line on the implementation of the <a href="http://www.ietf.org/rfc/rfc6455.txt" target="_blank">WebSocket Protocol</a>.</p>
<p>The <a href="http://cometd.org" title="http://cometd.org" target="_blank">CometD project</a> leverages the Jetty WebSocket implementation to its maximum, to achieve <a href="http://webtide.intalio.com/2011/09/cometd-2-4-0-websocket-benchmarks/" title="CometD 2.4.0 WebSocket Benchmarks" target="_blank">great scalability and minimal latencies</a>.</p>
<p>Until now, however, support for WebSocket over SSL was lacking in Jetty.</p>
<p>In Jetty 7.6.x a redesign of the connection layer allows for more pluggability of SSL encryption/decryption and of connection upgrade (from HTTP to WebSocket), and these changes combined allowed to implement very easily WebSocket over SSL.</p>
<p>These changes are now merged into Jetty&#8217;s <code>master</code> branch, and will be shipped with the next version of Jetty.</p>
<p>Developers will now be able to use the <code>wss://</code> protocol in web pages in conjunction with Jetty on the server side, or just rely on the CometD framework to forget about transport details and always have the fastest, most reliable and now also confidential transport available, and concentrate in writing application logic rather than transport logic.</p>
<p>WebSocket over SSL is of course also available in the Java WebSocket client provided by Jetty.</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2011/12/websocket-over-ssl-in-jetty/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>mvn jetty:run-forked</title>
		<link>http://webtide.intalio.com/2011/10/mvn-jettyrun-forked/</link>
		<comments>http://webtide.intalio.com/2011/10/mvn-jettyrun-forked/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 06:45:58 +0000</pubDate>
		<dc:creator>janb</dc:creator>
				<category><![CDATA[Jetty]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=842</guid>
		<description><![CDATA[Being able to run the jetty maven plugin on your webapp &#8211; but in a freshly forked jvm &#8211; is a feature that has been requested for a loooong time. With jetty-7.5.2 release, this feature has been implemented, and it even works on your unassembled webapp. How to Run mvn jetty:run-forked That will kick off a Jetty instance in a &#8230; <a href="http://webtide.intalio.com/2011/10/mvn-jettyrun-forked/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Being able to run the jetty maven plugin on your webapp &#8211; but in a freshly forked jvm &#8211; is a feature that has been requested for a loooong time. With jetty-7.5.2 release, this feature has been implemented, and it even works on your <strong>unassembled</strong> webapp.</p>
<h2>How to Run</h2>
<p><code><br />
  mvn jetty:run-forked<br />
</code><br />
That will kick off a Jetty instance in a brand new jvm and deploy your unassemabled webapp to it. The forked Jetty will keep on running until either:</p>
<ul>
<li> you execute a <code>mvn jetty:stop</code> (in another terminal window)</li>
<li> you &lt;cntrl-c&gt; the plugin
</ul>
<p>The plugin will keep on executing until either:</p>
<ul>
<li> you stop it with a &lt;cntrl-c&gt; </li>
<li> the forked jvm terminates </li>
</ul>
<p><strong>NOTE: </strong> I&#8217;m interested in obtaining feedback about the lifecycles of the plugin and the forked Jetty. Is the lifecycle linkage that I&#8217;ve implemented the way you want to use it? Do you want the forked jvm to continue on, even if the plugin exits? Please post your input to the Jetty list at <code>jetty-users@eclipse.org</code>.</p>
<h2>How to Configure</h2>
<p>You need a few different configuration parameters from the usual <code>jetty:run</code> ones. Let&#8217;s look at an example:</p>
<pre>
     &lt;plugin&gt;
        &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
        &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
        &lt;version&gt;7.5.2.v20111006&lt;/version&gt;
        &lt;configuration&gt;
          &lt;stopPort&gt;8087&lt;/stopPort&gt;
          &lt;stopKey&gt;foo&lt;/stopKey&gt;
          &lt;jettyXml&gt;src/main/config/jetty.xml&lt;/jetty.xml&gt;
          &lt;contextXml&gt;src/main/config/context.xml&lt;/jetty.xml&gt;
          &lt;contextPath&gt;/foo&lt;/contextPath&gt;
          &lt;tmpDirectory&gt;${project.build.directory}/tmp&lt;/tmpDirectory&gt;
          &lt;jvmArgs&gt;-verbose:gc -Xmx80m&lt;/jvmArgs&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
</pre>
<p>You need to specify the <code>stopKey</code> and <code>stopPort</code> so that you can control the forked Jetty using the handy maven goal <code>mvn jetty:stop</code>.</p>
<p>You can use the <code>jettyXml</code> parameter to specify a comma separated list of jetty xml configuration files that you can use to configure the container. There&#8217;s nothing special about these config files, they&#8217;re just normal <a href="http://wiki.eclipse.org/Jetty/Reference/jetty.xml" title="Jetty Config File Reference" target="_blank">jetty configuration files</a>. You can also use this parameter with the <code>jetty:run</code> goal too.</p>
<p>The <code>contextXml</code> parameter specifies the location of a webapp context xml configuration file. Again, this is a normal jetty <a href="http://wiki.eclipse.org/Jetty/Feature/ContextDeployer" title="Context Xml Configuration File" target="_blank">context xml configuration file</a>. You can also use this with the <code>jetty:run</code> goal too, either in conjunction with, or instead of, the &lt;webAppConfig&gt; parameter (which configures the webapp right there in the pom). As the <code>jetty:run-forked</code> goal does NOT support the &lt;webAppConfig&gt; element, you MUST use <code>contextXml</code> if you need to configure the webapp.</p>
<p>The <code>contextPath</code> parameter specifies the context path at which to deploy the webapp. You can use this as a simple shortcut instead of the <code>contextXml</code> parameter if you have no other configuration that you need to do for the webapp. Or, you can specify both this AND the <code>contextXml</code> parameter, in which case the <code>contextPath</code> takes precedence over the context path inside the context xml file.</p>
<p><code>tmpDirectory</code> is the location of a temporary working directory for the webapp. You can configure it either here, or in a <code>contextXml</code> file.  If specified in both places, the <code>tmpDirectory</code> takes precedence.</p>
<p>With the <code>jvmArgs</code> parameter, you can specify an arbitrary list of args that will be passed as-is to the newly forked jvm. </p>
<p>There&#8217;s also the same parameters as the <code>mvn jetty:run</code> goal:</p>
<ul>
<li><code>skip</code> &#8211; if <code>true</code> the execution of the plugin is skipped</li>
<li><code>useTestScope</code> &#8211; if <code>true</code>, jars of <code>&lt;scope&gt;test&lt;/scope&gt;</code> and the test classes are placed on the webapp&#8217;s classpath inside the forked jvm</li>
<li><code>useProvidedScope</code> &#8211; if <code>true</code>, jars of <code>&lt;scope&gt;provided&lt;/scope&gt;</code>  are placed on the container&#8217;s classpath inside the forked jvm</li>
<li><code>classesDirectory</code> &#8211; the location of the classes for the webapp</li>
<li><code>testClassesDirectory</code> &#8211; the location of the test classes</li>
<li><code>webAppSourceDirectory</code> &#8211; the location of the static resources for the webapp</li>
</ul>
<p>Also, just like the <code>mvn jetty:run</code> case, if you have dependencies that are <code>&lt;type&gt;war&lt;/type&gt;</code> , then their resources will be <a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin#Using_Overlayed_WARs">overlaid</a> onto the webapp when it is deployed in the new jvm.</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2011/10/mvn-jettyrun-forked/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CometD 2.4.0.beta1 Released</title>
		<link>http://webtide.intalio.com/2011/09/cometd-2-4-0-beta1-released/</link>
		<comments>http://webtide.intalio.com/2011/09/cometd-2-4-0-beta1-released/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 12:05:15 +0000</pubDate>
		<dc:creator>simon</dc:creator>
				<category><![CDATA[Jetty]]></category>
		<category><![CDATA[cometd]]></category>
		<category><![CDATA[jackson]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[websocket]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=746</guid>
		<description><![CDATA[CometD 2.4.0.beta1 has been released. This is a major release that brings in a few new Java API (see this issue) &#8211; client-side channels can now be released to save memory, along with an API deprecation (see this issue) &#8211; client-side publish() should not specify the message id. On the WebSocket front, the WebSocket transports have been overhauled and made &#8230; <a href="http://webtide.intalio.com/2011/09/cometd-2-4-0-beta1-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://cometd.org">CometD</a> 2.4.0.beta1 has been released.</p>
<p>This is a major release that brings in a few new Java API (see <a href="http://bugs.cometd.org/browse/COMETD-282">this issue</a>) &#8211; client-side channels can now be released to save memory, along with an API deprecation (see <a href="http://bugs.cometd.org/browse/COMETD-270">this issue</a>) &#8211; client-side publish() should not specify the message id.</p>
<p>On the WebSocket front, the WebSocket transports have been overhauled and made up-to-date with the latest WebSocket drafts (currently Jetty implements up to draft 13, while browsers are still a bit back on draft 7/8 or so), and made scalable as well in both threading and memory usage.</p>
<p>Following these changes, <a href="http://cometd.org/documentation/2.x/cometd-java/client">BayeuxClient</a> has been updated to negotiate transports with the server, and <a href="http://cometd.org/documentation/2.x/cometd-java/server/oort">Oort</a> has also been updated to use WebSocket by default for server-to-server communication, making server-to-server communication more efficient and with less latency.</p>
<p>WebSocket is now supported on Firefox 6 through the use of the Firefox-specific MozWebSocket object in the javascript library.</p>
<p>We have performed some <a href="http://webtide.intalio.com/2011/08/prelim-cometd-websocket-benchmarks">preliminary benchmarks</a> with WebSocket; they look really promising, although have been done before the latest changes to the CometD WebSocket transports.<br />
We plan to do a more accurate benchmarking in the next days/weeks.</p>
<p>The other major change is the pluggability of the JSON library to handle JSON generation and parsing (see <a href="http://webtide.intalio.com/2011/08/cometd-json-library-pluggability">this issue</a>).<br />
CometD has been long time based on Jetty&#8217;s JSON library, but now also <a href="http://jackson.codehaus.org">Jackson</a> can be used (the default will still be Jetty&#8217;s however, to avoid breaking deployed applications that were using the Jetty JSON classes).<br />
Jackson proved to be faster than Jetty in both parsing and generation, and will likely to become the default in few releases, to allow gradual migration of application that made use of Jetty JSON classes directly.<br />
The applications should be written independently of the JSON library used.<br />
Of course Jackson also brings in its powerful configurability and annotation processing so that your custom classes can be de/serialized from/to JSON.</p>
<p>Here you can find the <a href="http://bugs.cometd.org/secure/ReleaseNote.jspa?projectId=10000&#038;version=10071">release notes</a>.</p>
<p><a href="http://download.cometd.org/cometd-2.4.0.beta1-distribution.tar.gz">Download it</a>, use it, and report back, any feedback is important before the final 2.4.0 release.</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2011/09/cometd-2-4-0-beta1-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jetty WebSocket Client API updated</title>
		<link>http://webtide.intalio.com/2011/09/jetty-websocket-client-api-updated/</link>
		<comments>http://webtide.intalio.com/2011/09/jetty-websocket-client-api-updated/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 07:40:28 +0000</pubDate>
		<dc:creator>gregw</dc:creator>
				<category><![CDATA[Jetty]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=736</guid>
		<description><![CDATA[With the release of Jetty 7.5.0 and the latest draft 13 of the WebSocket protocol, the API for the client has be re-factored a little since my last blog on WebSocket: Server, Client and Load Test. WebSocketClientFactory When creating many instances of the java WebSocketClient, there is much that can be shared between multiple instances: buffer pools, thread pools and &#8230; <a href="http://webtide.intalio.com/2011/09/jetty-websocket-client-api-updated/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">With the release of <a href="http://eclipse.org/jetty">Jetty 7.5.0</a> and the latest <a href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-13">draft 13 of the WebSocket protocol</a>, the API for the client has be re-factored a little since my last blog on <a href="http://webtide.intalio.com/2011/08/websocket-example-server-client-and-loadtest/">WebSocket: Server, Client and Load Test</a>.</p>
<h3 style="text-align: justify;">WebSocketClientFactory</h3>
<p style="text-align: justify;">When creating many instances of the java WebSocketClient, there is much that can be shared between multiple instances: buffer pools, thread pools and NIO selectors.  Thus the client API has been updated to use a factory pattern, where the factory can hold the configuration and instances of the common infrastructure:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">WebSocketClientFactory factory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> WebSocketClientFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
factory.<span style="color: #006633;">setBufferSize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4096</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
factory.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>WebSocketClient</h3>
<p style="text-align: justify;">Once the WebSocketClientFactory is started, WebSocketClient instances can be created and configured:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">WebSocketClient client <span style="color: #339933;">=</span> factory.<span style="color: #006633;">newWebSocketClient</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
client.<span style="color: #006633;">setMaxIdleTime</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">30000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
client.<span style="color: #006633;">setMaxTextMessageSize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
client.<span style="color: #006633;">setProtocol</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;chat&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">The WebSocketClient does not need to be started and the configuration set is copied to the connection instances as they are opened.</p>
<h3>WebSocketClient.open(&#8230;)</h3>
<p style="text-align: justify;">A websocket connection can be created from a WebSocketClient by calling open and passing the URI and the websocket instance that will handle the call backs (eg onOpen, onMessage etc.):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Future future <span style="color: #339933;">=</span> client.<span style="color: #006633;">open</span><span style="color: #009900;">&#40;</span>uri,mywebsocket<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
WebSocket.<span style="color: #003399;">Connection</span> connection <span style="color: #339933;">=</span> future.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span>,TimeUnit.<span style="color: #006633;">SECONDS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">The open call returns a Future to the WebSocket.Connection.  Like the NIO.2 API in JDK7, calling get with a timeout imposes a connect time on the connection attempt and the connection will be aborted if the get times out.   If the connection is successful, the connection returned by the get is the same object passed to the WebSocket.onOpen(Connection) callback, so it may be access and used in either way.</p>
<h3 style="text-align: justify;">WebSocket.Connection</h3>
<p style="text-align: justify;">The connection instance accessed via the onOpen callback or Future.get() is used to send messages and also to configure the connection:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">connection.<span style="color: #006633;">setMaxIdleTime</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
connection.<span style="color: #006633;">setMaxTextMessageSize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
connection.<span style="color: #006633;">setMaxBinaryMessageSize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">64</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">The  maximum message sizes are used to control how large messages can grow when they are being aggregated from multiple websocket frames.  Small max message sizes protect a server against DOS attack.</p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2011/09/jetty-websocket-client-api-updated/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>GWT and JNDI</title>
		<link>http://webtide.intalio.com/2011/08/gwt-and-jndi/</link>
		<comments>http://webtide.intalio.com/2011/08/gwt-and-jndi/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 09:22:47 +0000</pubDate>
		<dc:creator>janb</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Jetty]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=692</guid>
		<description><![CDATA[Many folks want to use some features beyond the bare servlet basics with GWT, such as JNDI lookups. It&#8217;s not hard to set up, but there are a couple of steps to it so here&#8217;s a detailed guide. Since GWT switched to using Jetty for its hosted mode (also known as development mode) back at GWT 1.6, lots of people &#8230; <a href="http://webtide.intalio.com/2011/08/gwt-and-jndi/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Many folks want to use some features beyond the bare servlet basics with GWT, such as JNDI lookups. It&#8217;s not hard to set up, but there are a couple of steps to it so here&#8217;s a detailed guide.</p>
<p>Since GWT <a title="switched" href="http://blogs.webtide.com/sbordet/entry/gwt_1_6_hostedmode_now">switched</a> to using Jetty for its <a title="hosted mode" href="http://code.google.com/webtoolkit/gettingstarted.html#run">hosted mode</a> (also known as development mode) back at GWT 1.6, lots of people have been asking how to use features such as JNDI lookups in their webapps.  Several people have posted helpful instructions, perhaps the best of them being from Nicolas Wetzel in<a title="this thread" href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/3f5369b0aea1a265"> this thread</a> on Google Groups, and from Henning on his <a href="http://curtstech.blogspot.com/2009/07/gwt-16-hosted-mode-internen-jetty.html">blog</a> (in German).</p>
<p>In this blog post, we&#8217;ll put all these instructions together in the one place, and give you a couple of projects you can download to get you started faster. You might want to <a href="#res">skip down</a> to the downloadable projects.</p>
<h2>Customizing the GWT Launcher</h2>
<p>The first step is to customize the JettyLauncher provided by GWT.  Unfortunately, at the time of writing (GWT2.3.0) you cannot customize by extension due to the use of final inner classes and private constructors. Therefore, you will need to copy and paste the entire class in order to make the necessary and trivial modifications to enable JNDI.</p>
<p>You can find the source of the <code>JettyLauncher.java</code> class inside the <code>gwt-dev.jar</code> in your local installation of the GWT SDK.  Here&#8217;s a link to the jar from Maven Central Repository for convenience: <a href="http://search.maven.org/remotecontent?filepath=com/google/gwt/gwt-dev/2.3.0/gwt-dev-2.3.0.jar">gwt-dev-2.3.0.jar</a>.  Unjar it, and copy the <code>com/google/gwt/dev/shell/jetty/JettyLauncher.java</code> class to a new location and name.</p>
<p>Edit your new class and paste in this declaration:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> DEFAULT_CONFIG_CLASSES <span style="color: #339933;">=</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #0000ff;">&quot;org.mortbay.jetty.webapp.WebInfConfiguration&quot;</span>,    <span style="color: #666666; font-style: italic;">//init webapp structure</span>
    <span style="color: #0000ff;">&quot;org.mortbay.jetty.plus.webapp.EnvConfiguration&quot;</span>,  <span style="color: #666666; font-style: italic;">//process jetty-env</span>
    <span style="color: #0000ff;">&quot;org.mortbay.jetty.plus.webapp.Configuration&quot;</span>,     <span style="color: #666666; font-style: italic;">//process web.xml</span>
    <span style="color: #0000ff;">&quot;org.mortbay.jetty.webapp.JettyWebXmlConfiguration&quot;</span>,<span style="color: #666666; font-style: italic;">//process jetty-web.xml</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>This declaration tells Jetty to setup JNDI for your web app and process the various xml files concerned.  Nearly done now. All you need to do is now apply these Configuration classes to the <code>WebAppContext</code> that represents your web app. Find the line that creates the <code>WebAppContext</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">WebAppContext wac <span style="color: #339933;">=</span> createWebAppContext<span style="color: #009900;">&#40;</span>logger, appRootDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Now, add this line straight afterwards:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">wac.<span style="color: #006633;">setConfigurationClasses</span><span style="color: #009900;">&#40;</span>DEFAULT_CONFIG_CLASSES<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Build your new class and you&#8217;re done. To save you some time, here&#8217;s a small project with the class modifications already done for you (variants for Ant and Maven):</p>
<ul>
<li><a href='http://webtide.intalio.com/wp-content/uploads/2011/08/GWTJettyPlusLauncher-ant.zip'>GWTJettyPlusLauncher (ant)</a><br/> Build with: <code>ant build</code>.</li>
<li><a href='http://webtide.intalio.com/wp-content/uploads/2011/08/GWTJettyPlusLauncher-mvn.zip'>GWTJettyPlusLauncher (mvn)</a><br/> Build with: <code>mvn install</code>.</li>
</ul>
<h2>Modifying your Web App</h2>
<h3>Step 1</h3>
<p>Add the extra jetty jars that implement JDNI lookups to your web app&#8217;s <code>WEB-INF/lib</code> directory. Here&#8217;s the links to version 6.1.26 of these jars &#8211; these have been tested against GWT 2.3.0 and will work, even though GWT is using a much older version of jetty (6.1.11?):</p>
<ul>
<li><a href="http://search.maven.org/remotecontent?filepath=org/mortbay/jetty/jetty-naming/6.1.26/jetty-naming-6.1.26.jar">jetty-naming-6.1.26.jar</a></li>
<li><a href="http://search.maven.org/remotecontent?filepath=org/mortbay/jetty/jetty-plus/6.1.26/jetty-plus-6.1.26.jar">jetty-plus-61.26.jar</a></li>
</ul>
<h3>Step 2</h3>
<p>Now you can create a <a href="http://docs.codehaus.org/display/JETTY/jetty-env.xml">WEB-INF/jetty-env.xml</a> file to define the resources that you want to link into your web.xml file, and lookup at runtime with JNDI. </p>
<p>That&#8217;s it, you&#8217;re good to go with runtime JNDI lookups in GWT hosted mode. Your webapp should also be able to run without modification when deployed into standalone Jetty. If you deploy to a different container (huh?!), then you&#8217;ll need to define the JNDI resources appropriately for that container (but you can leave <code>WEB-INF/jetty-env.xml</code> in place and it will be ignored).</p>
<h3>If You&#8217;re Not Sure How To Define JNDI Resources For Jetty&#8230;</h3>
<p>The Jetty 6 Wiki contains <a href="http://docs.codehaus.org/display/JETTY/JNDI">instructions</a> on how to do his, but here&#8217;s a short example that defines a MySQL datasource:</p>
<p>In <code>WEB-INF/jetty-env.xml</code>:</p>
<pre title="Hint: double-click to select code">&lt;New id="DSTest" class="org.mortbay.jetty.plus.naming.Resource"&gt;
    &lt;Arg&gt;jdbc/DSTest&lt;/Arg&gt;
    &lt;Arg&gt;
     &lt;New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"&gt;
       &lt;Set name="Url"&gt;jdbc:mysql://localhost:3306/databasename&lt;/Set&gt;
       &lt;Set name="User"&gt;user&lt;/Set&gt;
       &lt;Set name="Password"&gt;pass&lt;/Set&gt;
     &lt;/New&gt;
    &lt;/Arg&gt;
&lt;/New&gt;</pre>
<p>Now link this into your web app with a corresponding entry in your <code>WEB-INF/web.xml</code>:</p>
<pre>&lt;resource-ref&gt;
    &lt;description&gt;My DataSource Reference&lt;/description&gt;
    &lt;res-ref-name&gt;jdbc/DSTest&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;</pre>
<p>Of course, you will also need to copy any jars required by your resources &#8211; in this case the MySQL jar &#8211; into your<code> WEB-INF/lib</code>.</p>
<p>You can then lookup the JNDI resource inside your servlet, filter etc:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.naming.InitialContext</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.sql.DataSource</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">InitialContext</span> ic <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InitialContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DataSource ds <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>DataSource<span style="color: #009900;">&#41;</span>ic.<span style="color: #006633;">lookup</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;java:comp/env/jdbc/DSTest&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>An Example WebApp</h2>
<p>An example usually helps, so I&#8217;ve put together a silly, tiny webapp that does a JNDI lookup. It is based on the standard GWT &#8220;Hello World&#8221; webapp that is generated by default by the <a href="http://code.google.com/webtoolkit/doc/latest/RefCommandLineTools.html#webAppCreator">GWT webAppCreator</a> script.  This webapp does an RPC call to a servlet to get a message incorporating the name entered by the user. I&#8217;ve simply modified the message that is returned to also include an extra sentence obtained by doing a <code>java:com/env</code> lookup.</p>
<p>Here&#8217;s my <code>WEB-INF/jetty-env.xml</code>:</p>
<pre>
&lt;Configure id='wac' class="org.mortbay.jetty.webapp.WebAppContext"&gt;
  &lt;!-- An example EnvEntry that acts like it was defined in web.xml as an env-entry --&gt;
  &lt;New class="org.mortbay.jetty.plus.naming.EnvEntry"&gt;
    &lt;Arg>msg&lt;/Arg&gt;
    &lt;Arg type="java.lang.String"&gt;A bird in the hand is worth 2 in the bush &lt;/Arg&gt;
    &lt;Arg type="boolean">true&lt;/Arg&gt;
  &lt;/New&gt;
</pre>
<p>This defines the equivalent of an &lt;env-entry&gt; outside of <code>web.xml</code>. In fact, the boolean argument set to &#8220;true&#8221; means that it would override the value of an &lt;env-entry&gt; of the same name inside <code>WEB-INF/web.xml</code>. This is actually most useful when used in a Jetty <a href="http://docs.codehaus.org/display/JETTY/ContextDeployer">context xml</a> file for the webapp instead of <code>WEB-INF/jetty-env.xml</code>, as it would allow you to define a default value inside <code>WEB-INF/web.xml</code> and then customize for each deployment in the context xml file (which is external to the webapp). For this example, we could have just as well defined the &lt;env-entry&gt; in <code>WEB-INF/web.xml</code> instead, but I wanted to show you a <code>WEB-INF/jetty-env.xml</code> file so you have an example of where to define your resources.</p>
<p>Here&#8217;s the extra code that does the lookup inside of <code>GreetingServletImpl.java</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> lookupMessage <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> user<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">InitialContext</span> ic <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InitialContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> message <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>ic.<span style="color: #006633;">lookup</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;java:comp/env/msg&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> message <span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">+</span>user<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> e.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Running the built project in hosted mode and hitting the url http://127.0.0.1:8888/HelloJNDI.html?gwt.codesvr=127.0.0.1:9997 I see:<br />
<a href="http://webtide.intalio.com/wp-content/uploads/2011/08/HelloJNDI.png"><img src="http://webtide.intalio.com/wp-content/uploads/2011/08/HelloJNDI.png" alt="Screen shot of webapp in action." title="HelloJNDI" width="602" height="453" class="aligncenter size-full wp-image-728" /></a></p>
<p>Here&#8217;s an Ant project for this trivial webapp: <a href='http://webtide.intalio.com/wp-content/uploads/2011/08/HelloJNDI.zip'>HelloJNDI</a></p>
<ol>
<li> edit the <code>build.xml</code> file to change the property <code>gwt.sdk</code> to where you have the GWT SDK locally installed.</li>
<li> build and run it in hosted mode with: <code>ant devmode</code></li>
<li> follow the hosted mode instructions to cut and paste the url into your browser</li>
</ol>
<p><a name="res"><br />
<h2>Resource Listing</h2>
<p></a></p>
<ul>
<li><a href='http://webtide.intalio.com/wp-content/uploads/2011/08/GWTJettyPlusLauncher-ant.zip'>GWTJettyPlusLauncher (ant)</a></li>
<li><a href='http://webtide.intalio.com/wp-content/uploads/2011/08/GWTJettyPlusLauncher-mvn.zip'>GWTJettyPlusLauncher (mvn)</a></li>
<li><a href='http://webtide.intalio.com/wp-content/uploads/2011/08/HelloJNDI.zip'>HelloJNDI webapp (ant)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2011/08/gwt-and-jndi/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Sifting Logs in Jetty with Logback</title>
		<link>http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/</link>
		<comments>http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 22:15:28 +0000</pubDate>
		<dc:creator>Joakim Erdfelt</dc:creator>
				<category><![CDATA[Jetty]]></category>
		<category><![CDATA[Servlets]]></category>

		<guid isPermaLink="false">http://webtide.intalio.com/?p=675</guid>
		<description><![CDATA[Ever wanted to create log files at the server level that are named based on some sort of arbitrary context?It is possible to do with Slf4j + Logback + Jetty Webapp Logging in the mix. Example projects for this can be found at github https://github.com/jetty-project/jetty-and-logback-example Modules: /jetty-distro-with-logback-basic/ This configures the jetty distribution with logback enabled at the server level with  &#8230; <a href="http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ever wanted to create log files at the server level that are named based on some sort of arbitrary context?It is possible to do with Slf4j + Logback + Jetty <span>Webapp</span> Logging in the mix.</p>
<p>Example projects for this can be found at <span>github</span><br />
<a href="https://github.com/jetty-project/jetty-and-logback-example">https://github.com/jetty-project/jetty-and-logback-example</a></p>
<p>Modules:</p>
<dl>
<dt>/jetty-distro-with-<span>logback</span>-basic/</dt>
<dd>This configures the jetty distribution with logback enabled at the server level with     an example logback configuration.</dd>
<dt>/jetty-<span>distro</span>-with-logback-sifting/</dt>
<dd> This configures the jetty distribution with logback, centralized <span>webapp</span> logging,     a MDC handler, and a sample logback configuration that performs sifting based  on the incoming Host header on the requests.</dd>
<dt>/jetty-slf4j-<span><span>mdc</span></span>-handler/</dt>
<dd> This provides the Slf4J MDC key/value pairs that are needed to perform the     sample sifting with.</dd>
<dt>/jetty-slf4j-test-webapp/</dt>
<dd> This is a sample webapp+<span>servlet</span> that accepts arbitrary values on a form POST     and logs them via Slf4J, so that we can see the results of this example.</dd>
</dl>
<h2>Basic <span><span>Logback</span></span> Configuration for Jetty</h2>
<p>See the /jetty-distro-with-logback-basic/ for a maven project that builds this configuration.Note: the output directory /jetty-distro-with-logback-basic/target/jetty-distro/ is where <span>this configuration</span> will be built by maven.</p>
<p>What is being done:</p>
<ol>
<li> Unpack your Jetty 7.x Distribution Zip of choice<br />
The example uses the latest stable release<br />
(7.4.5.v20110725 at the time of writing this)</li>
<li> Install the slf4j and logback jars into <code>${jetty.home}/lib/logging/</code>
<ul>
<li><a href="http://search.maven.org/#browse%7C-784682263"><span>slf4j-</span><span><span>api</span></span>-1.6.1.jar</a></li>
<li><a href="http://search.maven.org/#browse%7C-1948538962">logback-classic-0.9.29.jar</a></li>
<li><a href="http://search.maven.org/#browse%7C-7494467053">logback-core-0.9.29.jar</a></li>
</ul>
</li>
<li> Configure <a href="https://github.com/jetty-project/jetty-and-logback-example/blob/master/jetty-distro-with-logback-basic/src/main/config/start.ini">${jetty.home}/start.<span><span>ini</span></span></a> to add the lib/logging directory into the server classpath
<pre>#===========================================================
# Start classpath OPTIONS.
# These control what classes are on the classpath
# for a full listing do
#   java -jar start.jar --list-options
#-----------------------------------------------------------
OPTIONS=Server,resources,logging,websocket,ext
#-----------------------------------------------------------

#===========================================================
# Configuration files.
# For a full list of available configuration files do
#   java -jar start.jar --help
#-----------------------------------------------------------
etc/jetty.xml
# etc/jetty-<span><span>requestlog</span></span>.xml
etc/jetty-deploy.xml
etc/jetty-<span><span>webapps</span></span>.xml
etc/jetty-contexts.xml
etc/jetty-testrealm.xml
#===========================================================</pre>
</li>
<li>Create a <a href="https://github.com/jetty-project/jetty-and-logback-example/blob/master/jetty-distro-with-logback-basic/src/main/config/resources/logback.xml">${jetty.home}/resources/logback.xml</a> file with the configuration you want.
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!--
  Example LOGBACK Configuration File

http://logback.<span><span>qos</span></span>.ch/manual/configuration.html

  --&gt;
&lt;configuration&gt;
  &lt;<span><span>appender</span></span> name="STDOUT" class="ch.<span><span>qos</span></span>.logback.core.<span><span>ConsoleAppender</span></span>"&gt;
    &lt;!-- encoders are assigned the type
         ch.<span><span>qos</span></span>.logback.classic.encoder.<span><span>PatternLayoutEncoder</span></span> by default --&gt;
    &lt;encoder&gt;
      &lt;pattern&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %<span><span>msg</span></span>%n&lt;/pattern&gt;
    &lt;/encoder&gt;
  &lt;/<span><span>appender</span></span>&gt;

  &lt;<span><span>appender</span></span> name="FILE" class="ch.<span><span>qos</span></span>.logback.core.rolling.<span><span>RollingFileAppender</span></span>"&gt;
    &lt;file&gt;${jetty.home}/logs/jetty.log&lt;/file&gt;
    &lt;<span><span>rollingPolicy</span></span> class="ch.<span><span>qos</span></span>.logback.core.rolling.<span><span>TimeBasedRollingPolicy</span></span>"&gt;
      &lt;!-- daily rollover --&gt;
      &lt;<span><span>fileNamePattern</span></span>&gt;jetty_%d{<span><span>yyyy</span></span>-MM-dd}.log&lt;/<span><span>fileNamePattern</span></span>&gt;

      &lt;!-- keep 30 days' worth of history --&gt;
      &lt;<span><span>maxHistory</span></span>&gt;30&lt;/<span><span>maxHistory</span></span>&gt;
    &lt;/<span><span>rollingPolicy</span></span>&gt;

    &lt;encoder&gt;
      &lt;pattern&gt;%-4relative [%thread] %-5level %logger{35} - %<span><span>msg</span></span>%n&lt;/pattern&gt;
    &lt;/encoder&gt;
  &lt;/<span><span>appender</span></span>&gt;

  &lt;root level="info"&gt;
    &lt;<span><span>appender</span></span>-ref ref="STDOUT" /&gt;
    &lt;<span><span>appender</span></span>-ref ref="FILE" /&gt;
  &lt;/root&gt;
&lt;/configuration&gt;</pre>
</li>
</ol>
<p>That&#8217;s it, now you have (in the following order)</p>
<ol>
<li>Jetty configured to use slf4j<br />
(via the <span><span>existance</span></span> <code><span>slf4j-</span><span><span>api</span></span>.jar</code> in the classpath on Jetty <span><span>startup</span></span>)</li>
<li><span>slf4j configured to use </span>logback<br />
(via the <span><span>existance</span></span> of <code><span>logback-core.jar</span></code> in the classpath at Jetty <span><span>startup</span></span>)</li>
<li>logback configured to produce output to:
<ul>
<li><code>${jetty.home}/logs/jetty.log</code> (with daily rolling)</li>
<li> and STDOUT console</li>
</ul>
</li>
</ol>
<p>Pretty easy huh?</p>
<p>Go ahead and start Jetty.</p>
<blockquote><p>$ java -jar start.jar</p></blockquote>
<p>You&#8217;ll notice that the log events being produced by Jetty are being handled by Slf4j and <span><span>Logback</span></span> is doing the writing of those events to the STDOUT console and <code>logs/jetty.log</code> file</p>
<p>Now lets try something a bit more complex.</p>
<h2>Sifting Logs produced by <span><span>webapps</span></span> via <span><span>Hostname</span></span> using <span><span>Logback</span></span> in Jetty</h2>
<p>Lets say we have several virtual hosts, or a variety of DNS <span><span>hostnames</span></span> for the Jetty instance that is running.And you want to have the logging events being produced by the <span><span>webapps</span></span> captured into uniquely named log files by the <span><span>hostname</span></span> that the request came in on.</p>
<p>This too is possible with logback, albeit with a little help from slf4j and <span><span>jettty</span></span> <span><span>WebappContextClassloader</span></span> configuration.</p>
<p>See the <code>/jetty-distro-with-logback-sifting/</code> project example from the github project above for a <span>build-able</span> configuration of the following instructions:</p>
<ol>
<li>Unpack your Jetty 7.x Distribution Zip of choice.<br />
The example uses the latest stable release.<br />
(7.4.5.v20110725 at the time of writing this)</li>
<li>Install the slf4j and logback jars into <code>${jetty.home}/lib/logging/</code>
<ul>
<li><a href="http://search.maven.org/#browse%7C-784682263"><span>slf4j-</span><span><span>api</span></span>-1.6.1.jar</a></li>
<li><a href="http://search.maven.org/#browse%7C-1948538962">logback-classic-0.9.29.jar</a></li>
<li><a href="http://search.maven.org/#browse%7C-749446705">logback-core-0.9.29.jar</a></li>
<li><a href="http://search.maven.org/#browse%7C1693692108">jetty-webapp-logging.jar</a> (be sure you match your jetty version here)</li>
<li><a href="https://github.com/jetty-project/jetty-and-logback-example/tree/master/jetty-slf4j-mdc-handler">jetty-slf4j-<span><span>mdc</span></span>-handler.jar</a> (found in the examples project)</li>
</ul>
</li>
<li>Configure <a href="https://github.com/jetty-project/jetty-and-logback-example/blob/master/jetty-distro-with-logback-sifting/src/main/config/start.ini">${jetty.home}/start.<span><span>ini</span></span></a> to add the <code>lib/logging</code> directory into the server <span>classpath</span>
<pre>#===========================================================
# Start classpath OPTIONS.
# These control what classes are on the classpath
# for a full listing do
#   java -jar start.jar --list-options
#-----------------------------------------------------------
OPTIONS=Server,resources,logging,<span>websocket</span>,ext
#-----------------------------------------------------------

#===========================================================
# Configuration files.
# For a full list of available configuration files do
#   java -jar start.jar --help
#-----------------------------------------------------------
etc/jetty.xml
# etc/jetty-<span><span>requestlog</span></span>.xml
etc/jetty-<span><span>mdc</span></span>-handler.xml
etc/jetty-deploy.xml
etc/jetty-<span><span>webapps</span></span>.xml
etc/jetty-contexts.xml
etc/jetty-webapp-logging.<span>xml</span>
etc/jetty-<span>testrealm</span>.xml
#===========================================================</pre>
<p>The key entries here are the addition of the &#8220;<code>logging</code>&#8221; OPTION to load the classes in <code>${jetty.home}/lib/logging</code> into the jetty server classpath, and the 2 new configuration files:</p>
<dl>
<dt><a href="https://github.com/jetty-project/jetty-and-logback-example/blob/master/jetty-distro-with-logback-sifting/src/main/config/etc/jetty-mdc-handler.xml">etc/jetty-<span><span>mdc</span></span>-handler.xml</a></dt>
<dd>This adds wraps the <span><span>MDCHandler</span></span> found in jetty-slf4j-<span><span>mdc</span></span>-handler around all of the handlers in Jetty Server.</dd>
<dt><a href="http://git.codehaus.org/gitweb.cgi?p=jetty-project.git;a=blob;f=jetty-webapp-logging/src/main/config/etc/jetty-webapp-logging.xml;h=f69d9b540986b7c24a58de8c366844c717c0df20;hb=HEAD">etc/jetty-webapp-logging.xml</a></dt>
<dd>This adds a <span><span>DeploymentManager</span></span> <span><span>lifecycle</span></span> handler that configures the created <span><span>Webapp&#8217;s</span></span> <span><span>Classloaders</span></span> to deny      <span><span>acccess</span></span> to any webapp (war) file contained logger implementations in favor of using the ones that exist      on the server classpath.      This is a concept known as Centralized Webapp Logging.</dd>
</dl>
</li>
<li>Create a <a href="https://github.com/jetty-project/jetty-and-logback-example/blob/master/jetty-distro-with-logback-sifting/src/main/config/resources/logback.xml">${jetty.home}/resources/logback.xml</a> file with the configuration you want.
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!--
  Example LOGBACK Configuration File

http://logback.<span><span>qos</span></span>.ch/manual/configuration.html

  --&gt;
&lt;configuration&gt;
  &lt;<span><span>appender</span></span> name="STDOUT" class="ch.<span><span>qos</span></span>.logback.core.<span><span>ConsoleAppender</span></span>"&gt;
    &lt;!-- encoders are assigned the type
         ch.<span><span>qos</span></span>.logback.classic.encoder.<span><span>PatternLayoutEncoder</span></span> by default --&gt;
    &lt;encoder&gt;
      &lt;pattern&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %<span><span>msg</span></span>%n&lt;/pattern&gt;
    &lt;/encoder&gt;
  &lt;/<span><span>appender</span></span>&gt;

  &lt;<span><span>appender</span></span> name="SIFT" class="ch.<span><span>qos</span></span>.logback.classic.sift.<span><span>SiftingAppender</span></span>"&gt;
    &lt;!-- in the absence of the class attribute, it is assumed that the
         desired discriminator type is
         ch.<span><span>qos</span></span>.logback.classic.sift.<span><span>MDCBasedDiscriminator</span></span> --&gt;
    &lt;discriminator&gt;
      &lt;key&gt;host&lt;/key&gt;
      &lt;<span><span>defaultValue</span></span>&gt;unknown&lt;/<span><span>defaultValue</span></span>&gt;
    &lt;/discriminator&gt;
    &lt;sift&gt;
      &lt;<span><span>appender</span></span> name="FILE-${host}" class="ch.<span><span>qos</span></span>.logback.core.rolling.<span><span>RollingFileAppender</span></span>"&gt;
        &lt;file&gt;${jetty.home}/logs/jetty-${host}.log&lt;/file&gt;
        &lt;<span><span>rollingPolicy</span></span> class="ch.<span><span>qos</span></span>.logback.core.rolling.<span><span>TimeBasedRollingPolicy</span></span>"&gt;
          &lt;!-- daily rollover --&gt;
          &lt;<span><span>fileNamePattern</span></span>&gt;jetty-${host}_%d{<span><span>yyyy</span></span>-MM-dd}.log&lt;/<span><span>fileNamePattern</span></span>&gt;

          &lt;!-- keep 30 days' worth of history --&gt;
          &lt;<span><span>maxHistory</span></span>&gt;30&lt;/<span><span>maxHistory</span></span>&gt;
        &lt;/<span><span>rollingPolicy</span></span>&gt;

        &lt;encoder&gt;
          &lt;pattern&gt;%-4relative [%thread] %-5level %logger{35} - %<span><span>msg</span></span>%n&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/<span><span>appender</span></span>&gt;
    &lt;/sift&gt;
  &lt;/<span><span>appender</span></span>&gt;

  &lt;root level="INFO"&gt;
    &lt;<span><span>appender</span></span>-ref ref="STDOUT" /&gt;
    &lt;<span><span>appender</span></span>-ref ref="SIFT" /&gt;
  &lt;/root&gt;
&lt;/configuration&gt;</pre>
</li>
</ol>
<p>That&#8217;s it, now you have (in the following order):</p>
<ol>
<li>Jetty configured to use slf4j<br />
(via the <span>existence</span> <code><span>slf4j-</span><span><span>api</span></span>.jar</code> in the classpath on Jetty <span><span>startup</span></span>)</li>
<li>Jetty is configured to modify incoming <span><span>Webapp&#8217;s</span></span> <span><span>classloaders</span></span> to favor server logging classes   over the <span><span>webapp&#8217;s</span></span> own logging classes.<br />
<span> (a.k.a. Centralized Webapp Logging)</span></li>
<li><span>slf4j configured to use </span>logback<br />
(via the <span>existence</span> of <code><span>logback-core.jar</span></code> in the classpath at Jetty <span><span>startup</span></span>)</li>
<li>logback configured to produce output to:
<ul>
<li><code>${jetty.home}/logs/jetty-${host}.log</code> (with daily rolling)  and using &#8220;unknown&#8221; for log events that <span>don&#8217;t</span> originate from a request.</li>
<li>and STDOUT console</li>
</ul>
</li>
</ol>
<p>Not too bad huh?</p>
<p>Go ahead and start Jetty.</p>
<blockquote><p>$ java -jar start.jar</p></blockquote>
<p><a href="http://webtide.intalio.com/wp-content/uploads/2011/08/example-start-jetty.png"><img class="alignnone size-full wp-image-680" title="Example Jetty Start (Sifted)" src="http://webtide.intalio.com/wp-content/uploads/2011/08/example-start-jetty.png" alt="" width="769" height="550" /></a></p>
<p>If you have started the distribution produced by the example configuration, you can use the provided /slf4j-tests/ context to experiment with this.</p>
<p>Go ahead and use the default URL of <a href="http://localhost:8080/slf4j-tests/">http://<span><span>localhost</span></span>:8080/slf4j-tests/</a></p>
<p><a href="http://webtide.intalio.com/wp-content/uploads/2011/08/example-form.png"><img class="alignnone size-full wp-image-681" title="Example Form (Jetty Logging)" src="http://webtide.intalio.com/wp-content/uploads/2011/08/example-form.png" alt="" width="769" height="550" /></a></p>
<p>Now try a few more URLs that are for the same Jetty instance.</p>
<ul>
<li><a href="http://127.0.0.1:8080/slf4j-tests/">http://127.0.0.1:8080/slf4j-tests/</a></li>
<li><a href="http://127.0.1.1:8080/slf4j-tests/">http://127.0.1.1:8080/slf4j-tests/</a></li>
<li>http://<span><span>lapetus</span></span>:8080/slf4j-tests/</li>
<li>http://<span><span>lapetus</span></span>.local:8080/slf4j-tests/</li>
</ul>
<p><em>Note: &#8220;<span><span>lapetus</span></span>&#8221; is the name of my development machine.</em></p>
<p>You should now have a few different log files in your <code>${jetty.home}/logs/</code> directory.</p>
<p><a href="http://webtide.intalio.com/wp-content/uploads/2011/08/example-logs-sifted.png"><img class="alignnone size-full wp-image-682" title="Example Jetty Logs (Sifted by Host)" src="http://webtide.intalio.com/wp-content/uploads/2011/08/example-logs-sifted.png" alt="" width="769" height="276" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

