<?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-7816298951182073261</id><updated>2011-10-11T14:07:33.429-07:00</updated><category term='setup'/><category term='fedora 9'/><category term='JQuery MonoRail'/><category term='jasig CAS roller spring security'/><category term='Restful Restlet Jaxb JaxbRepresentation jaxb.index JAXBException'/><category term='jquery nekohtml javascript automated testing screen scraping'/><category term='OpenSocial OAuth Gadgets Shindig Social Developer Java'/><category term='OpenSocial Gadgets EnduroTracker.com'/><category term='Google Docs Blogs BlogSpot Publishing'/><category term='Amazon Flexible Payments Service FPS'/><category term='New Release Endurotracker'/><category term='Amazon ec2 fps payments setup'/><category term='Spring Multiple Database Java JTA Hibernate'/><category term='Spring Multiple Database Java JTA Hibernate JUnit 4.0 Annotations'/><category term='yum'/><category term='apache load balancer CAS 4 Session High Availability'/><category term='CAS SSO Spring Security'/><category term='Email Smtp PostFix Amazon EC2 Relay Gmail'/><category term='apache fedora ssl Amazon EC2'/><category term='OpenSocial OAuth Gadgets Castle MonoRail'/><category term='Amazon ec2 ebs'/><category term='new release CAS jasig apache roller SSO'/><category term='Spring Multiple Database Java JTA Hibernate Transactions'/><category term='Amazon EC2 PostgreSql'/><category term='Mono Fedora .Net Framework Open Source'/><category term='Mono Asp.net Amazon EC2 MonoRail Cloud'/><category term='Amazon FPS Flexible Payment Service'/><title type='text'>EnduroTracker</title><subtitle type='html'>Blog for discussing EnduroTracker.com development, design, and implementation using Open Source tools including Fedora, Monorail (.Net MVC framework), Java, Spring, Hibernate, Postgresql using Amazon's EC2 and FPS services.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-2175024802961269169</id><published>2011-07-18T20:59:00.000-07:00</published><updated>2011-07-18T20:59:49.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon ec2 ebs'/><title type='text'>Resize EBS Volumes , Here is A Link</title><content type='html'>If you need to increase the size of an EBS volume, here is good article to accomplish this: &lt;a href="http://aws-musings.com/how-to-expand-your-ebs-volume/"&gt;article&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-2175024802961269169?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/2175024802961269169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2011/07/resize-ebs-volumes-here-is-link.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2175024802961269169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2175024802961269169'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2011/07/resize-ebs-volumes-here-is-link.html' title='Resize EBS Volumes , Here is A Link'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-3563513753466344036</id><published>2011-06-19T14:42:00.001-07:00</published><updated>2011-06-19T14:42:57.759-07:00</updated><title type='text'>Developing and Testing in Android Against Local Web Services</title><content type='html'>Found a great post on Developing and Testing in Android Against Local Web Services, so I thought I would share it.&lt;br /&gt;&lt;a href="http://denimgroup.posterous.com/android-dns-setup-for-developing-and-testing"&gt;http://denimgroup.posterous.com/android-dns-setup-for-developing-and-testing&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-3563513753466344036?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/3563513753466344036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2011/06/developing-and-testing-in-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/3563513753466344036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/3563513753466344036'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2011/06/developing-and-testing-in-android.html' title='Developing and Testing in Android Against Local Web Services'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-1139394342303037768</id><published>2010-11-18T17:55:00.000-08:00</published><updated>2010-11-18T17:55:04.984-08:00</updated><title type='text'>Recommend using Fluent Nhibernate</title><content type='html'>I have been using Fluent Nhibernate instead of Nhibernate with xml config files.&lt;br /&gt;It is definitely helpful in preventing configuration typos.&lt;br /&gt;There other contrib projects for Nhibernate that I have found extremely useful&lt;br /&gt;including Nhibernate Validator and NHibernate Spatial.&lt;br /&gt;Nhibernate is independent from Hibernate and it doesn't benefit from a large corporate backer. Due to this Nhibernate and contrib projects are spread across multiple websites. &lt;br /&gt;Main Site: &lt;a href="http://nhforge.org/"&gt;&lt;/a&gt;&lt;br /&gt;Fluent Nhibernate: &lt;a href="http://fluentnhibernate.org/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-1139394342303037768?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/1139394342303037768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2010/11/recommend-using-fluent-nhibernate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1139394342303037768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1139394342303037768'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2010/11/recommend-using-fluent-nhibernate.html' title='Recommend using Fluent Nhibernate'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-5173795480844455598</id><published>2010-01-22T09:43:00.000-08:00</published><updated>2010-01-22T09:43:46.105-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Restful Restlet Jaxb JaxbRepresentation jaxb.index JAXBException'/><title type='text'>Unit Testing Restful Web Services using Restlet and Jaxb</title><content type='html'>&lt;div&gt;One way to post data to a Restful web services is to Serialize your object using Jaxb (Java Architecture for XML Binding) when you are using Java.&amp;nbsp; Since you are dealing with Web Services you client code could also be in .Net, javascript, PHP, Rails, etc.&amp;nbsp; But, in this post we are assuming your client is Java based.&amp;nbsp; If you Object class is in a separate project from your Test project, one thing that will cause you to pull your hair out is you will get : JAXBException stating errors creating marshaller or unmarshaller, unless you place a jaxb.index file with your Object class in the same package. For example, if the Object that you are Serializing is Sample.java with the package com.acme.businessobjects, then you have to place a jaxb.index file with the package com.acme.businessobjects. Within the jaxb.index file just place one line with just the class name: Sample, and that's it.&lt;br /&gt;Here is link to javadoc that discuss this:&amp;nbsp;&lt;a href="http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html"&gt;http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;The best way to understand Jaxb is to create a sample object called Sample, and create a test case&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To demonstrate this issue create 2 projects , one that contains the Sample.java class, and one the contains you Test case. Note: Initially do not place a jaxb.index file with your Sample.java, this way you will see the JaxbException. After you see that you get the JaxbException, then place an jaxb.index file with your Sample.java, and rebuild your project. The second time around, once you have an jaxb.index file, your JAXBException will eliminated.&lt;br /&gt;&lt;/div&gt;&lt;div&gt; The test case uses a schema file named: sample.xsd, this is created using Sun's schemagen tool that comes with Java. From the command line: schemagen path/Sample.java. This creates a file named schema1.xsd, rename this file and copy to your test project folder. For detailed info see: &lt;a href="http://java.sun.com/javaee/5/docs/tutorial/doc/bnbcv.html#bnbcw"&gt;Sun JAXB Tutorial&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;@XmlAccessorType(XmlAccessType.FIELD)&lt;br /&gt;@XmlRootElement&lt;br /&gt;public class Sample {&lt;br /&gt;@XmlElement(name = "value")&lt;br /&gt;private String val;&lt;br /&gt;&lt;br /&gt;public Sample() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Sample(String val) {&lt;br /&gt;this.val = val;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getVal() {&lt;br /&gt;return val;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setVal(String val) {&lt;br /&gt;this.val = val;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;return "Sample [val=" + val + "]";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This test case below tests both Marshalling and Unmarshalling using Jaxb. &lt;/div&gt;&lt;div class="mycode"&gt;public void testGenerateMarshallerToFile() throws JAXBException, FileNotFoundException, SAXException&lt;br /&gt;{&lt;br /&gt;JAXBContext context1 = JAXBContext.newInstance(Sample.class);&lt;br /&gt;&lt;br /&gt;JAXBContext context2 = JAXBContext.newInstance("com.acme.businessobjects");&lt;br /&gt;&lt;br /&gt;Marshaller m = context1.createMarshaller();&lt;br /&gt;m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);&lt;br /&gt;Sample sample = new Sample();&lt;br /&gt;sample.setVal("Hello");&lt;br /&gt;final File f = new File("src/test/java/com/endurotracker/gwt/test/rest/api/sample.xml");&lt;br /&gt;m.marshal(sample, new FileOutputStream(f));&lt;br /&gt;&lt;br /&gt;Unmarshaller um = context2.createUnmarshaller();&lt;br /&gt;&lt;br /&gt;um.setSchema(getSchema("Sample.xsd"));&lt;br /&gt;&lt;br /&gt;Object bce = um.unmarshal(f);&lt;br /&gt;&lt;br /&gt;m.marshal(bce, System.out);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To test your Restlet web services with Jaxb, you will need to create a SampleResource class. Luckily, for you there is such a test in  the org.restlet.test package, so you will only need to download the latest restlet source code. &lt;a href="http://www.restlet.org"&gt;restlet.org&lt;/a&gt; The name of the test class you are interested in is: JaxbIntegrationConverterTestCase&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-5173795480844455598?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/5173795480844455598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2010/01/unit-testing-restful-web-services-using.html#comment-form' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5173795480844455598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5173795480844455598'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2010/01/unit-testing-restful-web-services-using.html' title='Unit Testing Restful Web Services using Restlet and Jaxb'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-5746754033463154306</id><published>2010-01-01T11:01:00.000-08:00</published><updated>2010-01-01T11:01:31.384-08:00</updated><title type='text'>Restful Web Services using Asp.net MVC</title><content type='html'>&lt;p&gt;Microsoft's new Asp.net MVC framework can also easily support Restful Web Services.&lt;br /&gt;Controller actions can be called from Ajax based based websites using Javascript.&lt;br /&gt;For example if you create a controller named APIController with a method:GetUsers,&lt;br /&gt;then a Restful url would be /API/GetUsers. To implement your Restful Web Services using Asp.net MVC, take a look at these excellent write ups,&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2008/10/03/create-rest-api-using-asp-net-mvc-that-speaks-both-json-and-plain-xml.aspx"&gt;create-rest-api-using-asp-net-mvc-that-speaks-both-json-and-plain-xml&lt;/a&gt;, and&lt;br /&gt;&lt;a href="http://shouldersofgiants.co.uk/Blog/post/2008/09/27/Creating-a-RESTful-Web-Service-Using-ASPNet-MVC-Part-1-Introduction.aspx"&gt;Creating-a-RESTful-Web-Service-Using-ASPNet-MVC-Part-1-Introduction&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-5746754033463154306?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/5746754033463154306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2010/01/restful-web-services-using-aspnet-mvc.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5746754033463154306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5746754033463154306'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2010/01/restful-web-services-using-aspnet-mvc.html' title='Restful Web Services using Asp.net MVC'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-1969518310369552599</id><published>2009-12-31T08:52:00.000-08:00</published><updated>2009-12-31T08:53:32.198-08:00</updated><title type='text'>Restful Web Services using Restlet Framework</title><content type='html'>&lt;div&gt;&lt;p&gt;Restlet framework is a Restful Web Service framework written Java.&lt;/p&gt;&lt;a href="http://www.restlet.org/"&gt;restful.org&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;However, Microsoft has worked with the team behind Restlet and has enabled interoperability between Azure ADO.net and Restlet.&lt;/p&gt;&lt;a href="http://blog.noelios.com/2009/02/20/microsoft-selects-restlet-to-show-rest-interoperability/"&gt;microsoft-selects-restlet-to-show-rest-interoperability&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Other big companies like Google also use the Restlet framework for writing Web Services in a Restful way.  I always lean towards projects that are well documented and the Restlet framework has some good documentation including examples, tutorials, and api documents. In addition, if you want to integrate a Spring Web project with Restlet, here is a good write up,&lt;/p&gt;&lt;a href="http://jgoday.wordpress.com/2009/04/10/restlet-with-spring/"&gt;restlet-with-spring&lt;/a&gt;&lt;br /&gt;&lt;p&gt;If your website leverages ajax via javascript, one of the nice things with Restlets is that you can easily call your Restful Web Services using javascript.&lt;/p&gt;&lt;p&gt;Restlets has implemented lots of extensions, for example if you want to write a smartphone app in android to call Restful Web Services, Restlets has an extension for this.&lt;/p&gt;&lt;p&gt;Restlet is extremely flexible and can be called from either a Web client or Web server code.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-1969518310369552599?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/1969518310369552599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/12/restful-web-services-using-restlet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1969518310369552599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1969518310369552599'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/12/restful-web-services-using-restlet.html' title='Restful Web Services using Restlet Framework'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-6146983711827259742</id><published>2009-12-17T18:11:00.000-08:00</published><updated>2009-12-17T18:13:24.204-08:00</updated><title type='text'>Spring MVC with SiteMesh Decoration Framework and Velocity Templates</title><content type='html'>&lt;p&gt;Most developers hate to repeat themselves, so they like to reuse as much code as possible. The folks at OpenSymphony.org who also brought you Quartz developed Sitemesh to utilize the Gang of Four pattern composition.&lt;br /&gt;In short, SiteMesh is a web-page layout and decoration framework. It allows you to &lt;br /&gt;reuse your layouts (header and footer for example) throughout your site, so that&lt;br /&gt;you site has a consistent look and feel.&lt;/p&gt;&lt;p&gt;The general documentation at the &lt;a href="http://www.opensymphony.com/sitemesh/index.html"&gt;SiteMesh Site&lt;/a&gt; site is quite good but I needed to utilize Sitemesh in the following specific scenario, I am using Spring MVC and Velocity Templates.&lt;/p&gt;&lt;p&gt;Since the general install documentation, &lt;a href="http://www.opensymphony.com/sitemesh/install.html"&gt;installation instructions&lt;/a&gt; is very good, I will not repeat it here.  Once you have downloaded and setup your web project, you will have 3 xml config that you will be dealing with, web.xml, sitemesh.xml, and decorators.xml.  In my case I am using Spring MVC and Velocity, so I need to customize my web.xml configuration to handle this setup.  Here is how my web.xml is configured:&lt;br /&gt;&lt;/p&gt;&lt;div class="mycode"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app version=&amp;quot;2.4&amp;quot;&lt;br /&gt;xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot;&lt;br /&gt;xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;display-name&amp;gt;EnduroTracker&amp;lt;/display-name&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;/WEB-INF/applicationContext.xml&lt;br /&gt;&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--SiteMesh--&amp;gt; &lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;sitemesh&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;sitemesh&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.html&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;     &lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--Used to Enable Spring MVC --&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.html&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;  &lt;br /&gt;&lt;br /&gt;&amp;lt;!--Sitemesh--&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;sitemesh-velocity&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;com.opensymphony.module.sitemesh.velocity.VelocityDecoratorServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;sitemesh-velocity&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.vm&amp;lt;/url-pattern&amp;gt;      &lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;homeIndex.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;error-code&amp;gt;500&amp;lt;/error-code&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/error.html&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;If you followed the SiteMesh Install steps at their site and then customized your&lt;br /&gt;web.xml for your Spring MVC web project, you should now have SiteMesh configured correctly to use with Spring MVC and Velocity. &lt;br /&gt;Important to note in your decorators.xml since you are using Velocity,&lt;br /&gt;you will be using *.vm decorator files, here is an example decorators.xml file:&lt;br /&gt;&lt;div class="mycode"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;decorators defaultdir=&amp;quot;/decorators&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!-- Any urls that are excluded will never be decorated by Sitemesh --&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;excludes&amp;gt;&lt;br /&gt;&amp;lt;pattern&amp;gt;/exclude.vm&amp;lt;/pattern&amp;gt;&lt;br /&gt;&amp;lt;pattern&amp;gt;/exclude/*&amp;lt;/pattern&amp;gt;&lt;br /&gt;&amp;lt;/excludes&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;decorator name=&amp;quot;default&amp;quot; page=&amp;quot;default.vm&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;pattern&amp;gt;/*&amp;lt;/pattern&amp;gt;        &lt;br /&gt;&amp;lt;/decorator&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/decorators&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-6146983711827259742?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/6146983711827259742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/12/spring-mvc-with-sitemesh-decoration.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6146983711827259742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6146983711827259742'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/12/spring-mvc-with-sitemesh-decoration.html' title='Spring MVC with SiteMesh Decoration Framework and Velocity Templates'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-4302354133137570392</id><published>2009-11-24T11:19:00.000-08:00</published><updated>2009-11-24T11:24:44.201-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache load balancer CAS 4 Session High Availability'/><title type='text'>Using CAS 4 within a Load Balanced Environment</title><content type='html'>&lt;div&gt;My journey begins with HA which means High Availability.&lt;br /&gt;I'm not crazy about acronyms because given the variety of words in the english language they can mean any combination of things.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;I have 2&amp;nbsp; main requirements/constraints when running my website:&lt;br /&gt;1) Always be load balanced for High Availability,redundancy and also allow easy scalability.&lt;br /&gt;2) Allow use Hibernate across multiple databases. I have a separate database for users (user db), and a separate database for the core of the web application.&lt;br /&gt;&lt;br /&gt;My website is load balanced using Apache, I have a single load balance server , and 2 web servers also running Apache.&lt;br /&gt;They get load balanced via Apache ProxyReverse or mod_proxy module.&lt;br /&gt;&lt;br /&gt;I added a third requirement to my web application, always allow the users to sign in once and sign in with one set of credentials (username/password).&lt;br /&gt;Another words, don't have separate sign up, sign in processes for third party applications like forums that you have tacked onto to your site.&lt;br /&gt;&lt;br /&gt;This third requirement is straight forward and may appear easy to some, but it can be complicated and time consuming to implement.&lt;br /&gt;Luckily, the folks at jasig.org , created CAS , Central Authentication Service, which can be implemented into one's website.&lt;br /&gt;It is Java based, but can be integrated with lots of different website technology stacks like .Net, PHP, Perl, ColdFusion, Ruby on Rails, etc.&lt;br /&gt;&lt;br /&gt;Combining these 3 requirements means that I need to be able to have CAS load balanced across multiple servers and multiple databases.&lt;br /&gt;The standard implementation of CAS stores a user's credentials in the session. However, when CAS is implemented this way, the web site&lt;br /&gt;ends up losing the credentials on redirects, etc.&lt;br /&gt;&lt;br /&gt;To solve this issue CAS 4 (Cas version 4) introduced the concept of Database Session Storage named JpaSessionStorage in CAS.&lt;br /&gt;Due to requirement #2, I had to implement my own Session Storage class that utilizes Spring's JtaTransactionManager rather EntityManager.&lt;br /&gt;This allows for managing transactions over multiple databases. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I created a class called: JpaSessionStorageUsingJtaImpl within the package:org.jasig.cas.server.session, and part of the cas 4 project: cas-server-sessionstorage-jpa.&lt;br /&gt;Here is my code:&lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;package org.jasig.cas.server.session;&lt;br /&gt;&lt;br /&gt;import org.springframework.test.context.transaction.TransactionConfiguration;&lt;br /&gt;import org.springframework.transaction.annotation.Transactional;&lt;br /&gt;import org.springframework.util.Assert;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;&lt;br /&gt;import org.springframework.stereotype.Component;&lt;br /&gt;import org.springframework.stereotype.Repository;&lt;br /&gt;import org.javalid.annotations.validation.CollectionSize;&lt;br /&gt;import org.javalid.annotations.validation.NotNull;&lt;br /&gt;import org.javalid.annotations.validation.MinValue;&lt;br /&gt;import org.jasig.cas.server.authentication.Authentication;&lt;br /&gt;import org.jasig.cas.server.login.LoginRequest;&lt;br /&gt;import org.jasig.cas.server.util.Cleanable;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import org.hibernate.Query;&lt;br /&gt;import org.hibernate.Session;&lt;br /&gt;import org.hibernate.SessionFactory;&lt;br /&gt;import org.hibernate.Transaction;&lt;br /&gt;&lt;br /&gt;import javax.annotation.Resource;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;/***&lt;br /&gt;* Session Storage Implementation that uses Spring's a JtaTransactionManager rather&lt;br /&gt;* than EntityManager. Allows for managing transactions over multiple databases which &lt;br /&gt;* is required in some web application implementations.&lt;br /&gt;* @author David Driscoll&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;@TransactionConfiguration(transactionManager="jtaTransactionManager", defaultRollback=false)&lt;br /&gt;@Transactional&lt;br /&gt;@Repository&lt;br /&gt;/*public class JpaSessionStorageUsingJtaImpl extends AbstractSessionStorageImpl implements Cleanable{*/&lt;br /&gt;public class JpaSessionStorageUsingJtaImpl implements SessionStorage, Cleanable{ &lt;br /&gt;@Resource(name="sessionFactory3")&lt;br /&gt;private org.hibernate.SessionFactory sessionFactory;&lt;br /&gt;&lt;br /&gt;@NotNull&lt;br /&gt;@CollectionSize(mode=CollectionSize.MODE_MINIMUM, minimumSize = 1)&lt;br /&gt;@Autowired(required=false)&lt;br /&gt;private List&lt;org.jasig.cas.server.session.SessionFactory&gt; sessionFactories = new ArrayList&lt;org.jasig.cas.server.session.SessionFactory&gt;();&lt;br /&gt;&lt;br /&gt;/*@Override&lt;br /&gt;@Autowired&lt;br /&gt;protected void setSessionFactories(List&lt;org.jasig.cas.server.session.SessionFactory&gt; sessionFactories)&lt;br /&gt;{&lt;br /&gt;this.sessionFactories = sessionFactories;&lt;br /&gt;}*/&lt;br /&gt;&lt;br /&gt;@MinValue(1)&lt;br /&gt;private long purgeTimeOut = 21600000;&lt;br /&gt;&lt;br /&gt;@MinValue(1)&lt;br /&gt;private int purgeMaxCount = Integer.MAX_VALUE;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public JpaSessionStorageUsingJtaImpl(){}&lt;br /&gt;&lt;br /&gt;@Autowired(required=true)&lt;br /&gt;public JpaSessionStorageUsingJtaImpl(List&lt;org.jasig.cas.server.session.SessionFactory&gt; sessionFactories) {&lt;br /&gt;this.sessionFactories = sessionFactories;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public org.jasig.cas.server.session.Session createSession(&lt;br /&gt;LoginRequest loginRequest, Authentication authentication)&lt;br /&gt;throws InvalidatedSessionException {&lt;br /&gt;try{&lt;br /&gt;if (loginRequest.getOriginalAccess() != null &amp;&amp; loginRequest.getOriginalAccess().getParentSession() != null) {&lt;br /&gt;org.jasig.cas.server.session.Session parentSession = loginRequest.getOriginalAccess().getParentSession();&lt;br /&gt;org.jasig.cas.server.session.Session childSession = parentSession.createDelegatedSession(authentication);&lt;br /&gt;addSession(childSession);&lt;br /&gt;return childSession;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(this.sessionFactories != null){&lt;br /&gt;for ( org.jasig.cas.server.session.SessionFactory sessionFactory : this.sessionFactories) {&lt;br /&gt;org.jasig.cas.server.session.Session session = sessionFactory.getSession(authentication);&lt;br /&gt;&lt;br /&gt;if (session != null) {&lt;br /&gt;addSession(session);&lt;br /&gt;return session;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;throw new IllegalStateException("No SessionFactory configured that can handle this type of Authentication.");&lt;br /&gt;}&lt;br /&gt;catch(Exception ex){&lt;br /&gt;System.out.println("exception in createSession, exception message:" + ex.getMessage());&lt;br /&gt;throw new IllegalStateException("No SessionFactory configured that can handle this type of Authentication.");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void addSession(org.jasig.cas.server.session.Session session) {&lt;br /&gt;Assert.isInstanceOf(JpaSessionImpl.class, session);&lt;br /&gt;this.sessionFactory.getCurrentSession().persist(session);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public org.jasig.cas.server.session.Session destroySession(String sessionId) {&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;Query query = this.sessionFactory.getCurrentSession().createQuery("select s from session s where s.sessionId = :sessionId").setParameter("sessionId", sessionId); &lt;br /&gt;org.jasig.cas.server.session.Session session = (org.jasig.cas.server.session.Session) query.uniqueResult();&lt;br /&gt;this.sessionFactory.getCurrentSession().delete(session);&lt;br /&gt;return session;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public org.jasig.cas.server.session.Session findSessionBySessionId(String sessionId) {&lt;br /&gt;try {&lt;br /&gt;Query query = this.sessionFactory.getCurrentSession().createQuery("select s from session s where s.sessionId = :sessionId").setParameter("sessionId", sessionId); &lt;br /&gt;org.jasig.cas.server.session.Session session = (org.jasig.cas.server.session.Session) query.uniqueResult();&lt;br /&gt;return session; &lt;br /&gt;} catch ( Exception e) {&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public org.jasig.cas.server.session.Session updateSession(org.jasig.cas.server.session.Session session) {&lt;br /&gt;this.sessionFactory.getCurrentSession().update(session);&lt;br /&gt;return session;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public org.jasig.cas.server.session.Session findSessionByAccessId(String accessId) {&lt;br /&gt;try {&lt;br /&gt;Query query = this.sessionFactory.getCurrentSession().&lt;br /&gt;createQuery("select s from session s, IN(s.casProtocolAccesses) c where c.id = :accessId").setParameter("accessId", accessId); &lt;br /&gt;org.jasig.cas.server.session.Session session = (org.jasig.cas.server.session.Session) query.uniqueResult();&lt;br /&gt;return session;&lt;br /&gt;&lt;br /&gt;} catch ( Exception e) {&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void purge() {&lt;br /&gt;Query query = this.sessionFactory.getCurrentSession().&lt;br /&gt;createQuery("delete from session s");&lt;br /&gt;query.executeUpdate();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void prune() {&lt;br /&gt;&lt;br /&gt;Query query = this.sessionFactory.getCurrentSession().&lt;br /&gt;createQuery("Delete From session s where (s.state.creationTime + :timeOut) &gt;= :currentTime or s.state.count &gt; :maxCount").&lt;br /&gt;setParameter("timeOut", this.purgeTimeOut).setParameter("currentTime", System.currentTimeMillis()).setParameter("maxCount", this.purgeMaxCount);&lt;br /&gt;query.executeUpdate();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setPurgeTimeOut(long purgeTimeOut) {&lt;br /&gt;this.purgeTimeOut = purgeTimeOut;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setPurgeMaxCount(int purgeMaxCount) {&lt;br /&gt;this.purgeMaxCount = purgeMaxCount;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;You will need to setup your JTA configuration for your CAS 4 datasource.&lt;br /&gt;See my series of blog posts on setting up Spring with Multiple Databases to setup JTA appropriately, here : &lt;a href="http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases.html"&gt; http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases.html&lt;/a&gt;&lt;br /&gt;CAS 4 uses utilizes autowiring annotations, so you only need to reference this new class in your pom.xml for it to be found and used as the session storage mechanism.&lt;br /&gt;Here is a xml snippet from the pom.xml file:&lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.jasig.cas&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;cas-server-sessionstorage-jpa&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Using CAS 4 within a Load Balanced Environment Completed!&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-4302354133137570392?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/4302354133137570392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/11/using-cas-4-within-load-balanced.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4302354133137570392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4302354133137570392'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/11/using-cas-4-within-load-balanced.html' title='Using CAS 4 within a Load Balanced Environment'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-3281343589308342992</id><published>2009-11-24T10:17:00.000-08:00</published><updated>2009-11-24T10:32:16.433-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jasig CAS roller spring security'/><title type='text'>Single Sign On with CAS Part 2 Integrating with Roller</title><content type='html'>&lt;b&gt;&lt;span style="font-size: small;"&gt;Overview&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;In part 2, we will go over how to integrate CAS 4 Single Sign On with Roller ( a open source blog engine , see roller.apache.com ).&lt;br /&gt;&amp;nbsp;In this usage scenario we authenticate the user using CAS4 which in this case stores Username/password information in a separate User db from Roller's db.&lt;br /&gt;So we will not be authenticating using Roller's db, however we will use Roller's db to determine what the users role / access rights are within the Roller application. (i.e Are they an editor, administrator, or do they not have a role yet).&lt;br /&gt;Since Roller has implemented SSO for LDAP environment, we can utilize this and Roller will automatically create a role for a user if they do not have one yet. The default role is editor for their own blog.&lt;br /&gt;The workflow for Roller integrating CAS 4 is as follows, user goes to a secured page on the roller application site, the user will get redirected to the&lt;br /&gt;CAS 4 application site and be asked to login. After successful login, the user will be redirect back to where they started on the roller application site.&lt;br /&gt;If they checked the remember me check box , then in the future, they will not have to login again until their remember me cookie expires.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setting Up Your Development Environment&lt;/b&gt;&lt;br /&gt;Roller uses Ant for compiling and deployment.&lt;br /&gt;Depending on which IDE you use and what you development style is you may wish&lt;br /&gt;to create a new empty roller_custom java project with Maven enabled if you want to use Maven dependency management instead using Ant and library references. I typically use Eclipse and Maven, so I created an empty roller_custom java project&lt;br /&gt;and a new pom.xml, then enabled maven. This way I will be able to use Eclispe with Maven. I then built Roller using the ant build file (/roller/apps/weblogger/build.xml) to make sure Roller compiles correctly under ant first.&amp;nbsp; To install Roller's jars into your local Maven Repository , you will need to use the experimental ant build file, /roller/build-poms.xml). You will need to download maven-ant-tasks-2.0.10.jar, and install it to roller/tools/buildtime/maven/maven-ant-tasks-2.0.10.jar and make sure to update it reference location in /roller/build-poms.xml. Next, I referenced the Roller's jars and CAS4 client jar in my roller_custom pom.xml file, like so:&lt;br /&gt;&lt;div class="mycode"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;org.apache.roller&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;roller-core&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;            &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;org.apache.roller&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;roller-business&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;            &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;org.apache.roller&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;planet-business&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;            &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;org.apache.roller&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;planet-web&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;            &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;org.apache.roller&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;roller-web&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;            &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;org.jasig.cas&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;cas-client-core&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;3.1.5&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately this next part is time consuming. You will need to reference all the .jars that Roller references in your Pom.xml under /roller/tools, Roller has a lot of references so it is time consuming.&lt;br /&gt;But, with all this hard work, you now have Maven goodness, and easy debugging compatibilty using Eclipse with Jetty if you wish.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;SSO Implementation&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;Out of the box Roller supports SSO with LDAP. To use Spring Security with RememberMeServices we need to update&lt;br /&gt;the class: RollerUserDetailsService.java, to include the specific Role Name Prefix that Spring Security looks for.&lt;br /&gt;Specifically, Spring Security looks for the prefix "ROLE_" in every role name.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Additionally, Roller has a property setting for Autoprovision a user's account, we therefore will use this to automatically create a User if the Account exists in our CAS User db , but not in our Roller db.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Therefore we updated RememberMeServices like this:&lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;public class RollerUserDetailsService implements UserDetailsService {&lt;br /&gt;&lt;br /&gt;//Spring Security uses special required rolePrefix, typically ROLE_&lt;br /&gt;private String rolePrefix = "";&lt;br /&gt;&lt;br /&gt;public RollerUserDetailsService()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Allows a default role prefix to be specified. If this is set to a non-empty value, then it is&lt;br /&gt;* automatically prepended to any roles read in from the db. This may for example be used to add the&lt;br /&gt;* &lt;tt&gt;ROLE_&lt;/tt&gt; prefix expected to exist in role names (by default) by some other Spring Security&lt;br /&gt;* classes, in the case that the prefix is not already present in the db.&lt;br /&gt;*&lt;br /&gt;* @param rolePrefix the new prefix&lt;br /&gt;*/&lt;br /&gt;public void setRolePrefix(String rolePrefix) {&lt;br /&gt;this.rolePrefix = rolePrefix;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected String getRolePrefix() {&lt;br /&gt;return rolePrefix;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public UserDetails loadUserByUsername(String userName)&lt;br /&gt;throws UsernameNotFoundException, DataAccessException {&lt;br /&gt;try {&lt;br /&gt;Weblogger roller = WebloggerFactory.getWeblogger();&lt;br /&gt;UserManager umgr = roller.getUserManager();&lt;br /&gt;User userData = null;  &lt;br /&gt;if (userName.startsWith("http://")) {&lt;br /&gt;if (userName.endsWith("/")) {&lt;br /&gt;userName = userName.substring(0, userName.length() -1 );&lt;br /&gt;}&lt;br /&gt;try {&lt;br /&gt;userData = umgr.getUserByAttribute(&lt;br /&gt;UserAttribute.Attributes.OPENID_URL.toString(),&lt;br /&gt;userName);&lt;br /&gt;} catch (WebloggerException ex) {&lt;br /&gt;throw new DataRetrievalFailureException("ERROR in user lookup", ex);&lt;br /&gt;}&lt;br /&gt;String name;&lt;br /&gt;String password;&lt;br /&gt;GrantedAuthority[] authorities;&lt;br /&gt;&lt;br /&gt;// We are not throwing UsernameNotFound exception in case of&lt;br /&gt;// openid authentication in order to recieve user SREG attributes&lt;br /&gt;// from the authentication filter and save them                &lt;br /&gt;if (userData == null) {&lt;br /&gt;authorities = new GrantedAuthority[1];&lt;br /&gt;GrantedAuthority g = new GrantedAuthorityImpl("openidLogin");&lt;br /&gt;authorities[0] = g;&lt;br /&gt;name = "openid";&lt;br /&gt;password = "openid";&lt;br /&gt;} else {&lt;br /&gt;authorities =  getAuthorities(userData, umgr);&lt;br /&gt;name = userData.getUserName();&lt;br /&gt;password = userData.getPassword();&lt;br /&gt;}&lt;br /&gt;UserDetails usr = new org.springframework.security.userdetails.User(name, password, true, authorities);&lt;br /&gt;return  usr;&lt;br /&gt;&lt;br /&gt;} else {&lt;br /&gt;try {&lt;br /&gt;userData = umgr.getUserByUserName(userName);&lt;br /&gt;} catch (WebloggerException ex) {&lt;br /&gt;throw new DataRetrievalFailureException("ERROR in user lookup", ex);&lt;br /&gt;}&lt;br /&gt;if (userData == null) {&lt;br /&gt;&lt;br /&gt;//determine if autoProvisioning is enabled if so create User&lt;br /&gt;if (WebloggerConfig.getBooleanProperty("users.sso.autoProvision.enabled")) &lt;br /&gt;{&lt;br /&gt;AutoProvision provisioner = RollerContext.getAutoProvision();&lt;br /&gt;if(provisioner != null) {&lt;br /&gt;boolean userProvisioned = provisioner.execute(userName);&lt;br /&gt;if(userProvisioned) {&lt;br /&gt;// try lookup again real quick&lt;br /&gt;try{&lt;br /&gt;userData = umgr.getUserByUserName(userName);&lt;br /&gt;}&lt;br /&gt;catch (WebloggerException e) {&lt;br /&gt;throw new UsernameNotFoundException("ERROR no user: " + userName);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{ &lt;br /&gt;throw new UsernameNotFoundException("ERROR no user: " + userName);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;GrantedAuthority[] authorities =  getAuthorities(userData, umgr);        &lt;br /&gt;return new org.springframework.security.userdetails.User(userData.getUserName(), userData.getPassword(), true, authorities);&lt;br /&gt;&lt;br /&gt;} catch (WebloggerException ex) {&lt;br /&gt;throw new DataAccessResourceFailureException("ERROR: fetching roles", ex);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private GrantedAuthority[] getAuthorities(User userData, UserManager umgr) throws WebloggerException {&lt;br /&gt;List&lt;string&gt; roles = umgr.getRoles(userData);&lt;br /&gt;GrantedAuthority[] authorities = new GrantedAuthorityImpl[roles.size()];&lt;br /&gt;&lt;br /&gt;if(!rolePrefix.isEmpty())&lt;br /&gt;{&lt;br /&gt;authorities = new GrantedAuthorityImpl[roles.size()*2];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int i = 0;&lt;br /&gt;for (String role : roles) {&lt;br /&gt;//add Roller Security Role for use with non-Spring Security Implementations&lt;br /&gt;authorities[i++] = new GrantedAuthorityImpl(role);&lt;br /&gt;//add Spring Security Role&lt;br /&gt;authorities[i++] = new GrantedAuthorityImpl(rolePrefix + role);&lt;br /&gt;}&lt;br /&gt;return authorities;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;div&gt;In addition, since we need to get the Roles for a user from Roller's db so we may need to implement a Custom RememberMeServices class.&lt;br /&gt;Developers will probably need to implement their own custom class, if they created their RememberMe cookie not using the standard Spring Security Remember Me configuration.&lt;br /&gt;Here is a brief code outline (snippet), if you for example you call your class:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;RollerRememberMeServices&lt;/b&gt;. You will need to extend &lt;b&gt;AbstractRememberMeServices&lt;/b&gt; class which is a part of Spring Security ( using Spring Security 2.0) and implement all the required methods.&lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;public class RollerRememberMeServices extends AbstractRememberMeServices{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;One of the key methods is: processAutoLoginCoookie&lt;/b&gt;,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;This method returns UserDetails object, within this method you will need to extract the username from the RememberMe cookie (this will vary depending on what you stored in your cookie value, some people will store username, some will store email, etc).&lt;br /&gt;With the username you can the create a UserDetails object by doing something like this: &lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;UserDetails userDetails = getUserDetailsService().loadUserByUsername(username);&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Configuring those Config Files&lt;br /&gt;Step 1 (optional , only if you wish to use Jetty as your debugging web server),&lt;br /&gt;update your pom.xml file.&lt;br /&gt;&lt;/div&gt;&lt;div class="mycode"&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;                &lt;br /&gt;&amp;lt;artifactId&amp;gt;jetty-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;7.0.0.1beta2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;webAppConfig&amp;gt;&lt;br /&gt;&amp;lt;contextPath&amp;gt;/roller_custom&amp;lt;/contextPath&amp;gt;&lt;br /&gt;&amp;lt;tempDirectory&amp;gt;${project.build.directory}/work&amp;lt;/tempDirectory&amp;gt;&lt;br /&gt;&amp;lt;/webAppConfig&amp;gt;&lt;br /&gt;&amp;lt;connectors&amp;gt;&lt;br /&gt;&amp;lt;connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"&amp;gt;&lt;br /&gt;&amp;lt;port&amp;gt;8090&amp;lt;/port&amp;gt;&lt;br /&gt;&amp;lt;/connector&amp;gt;&lt;br /&gt;&amp;lt;/connectors&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;!--add dependencies as needed like jdbc drivers and logging--&amp;gt;&lt;br /&gt;&amp;lt;!--sample--&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;postgresql&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;postgresql&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;8.4-701.jdbc3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.2.14&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;--&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Step 2: Updated web.xml (added Spring Security and CAS4):&lt;/b&gt;&lt;br /&gt;&lt;div class="mycode"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;display-name&amp;gt;Roller Weblogger&amp;lt;/display-name&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;/WEB-INF/security.xml,&lt;br /&gt;/WEB-INF/jndi.xml&lt;br /&gt;&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.struts2.dispatcher.FilterDispatcher&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- This is really strange, but for some reason it's needed to prevent&lt;br /&gt;some problems with the file uploads not working intermittently --&amp;gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;struts2-cleanup&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.struts2.dispatcher.ActionContextCleanUp&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--new--&amp;gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CAS Single Sign Out Filter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.jasig.cas.client.session.SingleSignOutFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--original filter--&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;targetBeanName&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;springSecurityFilterChain&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--new--&amp;gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;DebugFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.DebugFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;PersistenceSessionFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.PersistenceSessionFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;BootstrapFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.BootstrapFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Most app servers support compression, if yours doesn't then use this one,&lt;br /&gt;but don't forget to uncomment the mapping below too.&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CompressionFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.CompressionFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;RequestMappingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.rendering.filters.RequestMappingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;InitFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.InitFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;IPBanFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.IPBanFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;SchemeEnforcementFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.SchemeEnforcementFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CharEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.apache.roller.weblogger.ui.core.filters.CharEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- ******************************************&lt;br /&gt;Filter mappings - order IS important here.&lt;br /&gt;****************************************** --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;NOTE: Wherever &amp;quot;dispatcher&amp;quot; elements are specified in the filter mappings, they are&lt;br /&gt;required for Servlet API 2.4 containers, such as Tomcat 5+ and Resin 3+, but should be&lt;br /&gt;commented out for Servlet API 2.3 containers, like Tomcat 4.x and Resin 2.x.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- This filter ensures that the request encoding is set to UTF-8 before any&lt;br /&gt;other processing forces request parsing using a default encoding.&lt;br /&gt;Note: Any filters preceding this one MUST not cause request parsing. --&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CharEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Ip Banning is mapped for comment and trackbacks only.&lt;br /&gt;Note: this filter does nothing if an ip ban list is not configured. --&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;IPBanFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/comment/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;IPBanFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/trackback/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Scheme enforcement.  Only here until we get Acegi scheme enforcement working --&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;SchemeEnforcementFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CAS Single Sign Out Filter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Original Security filters - controls secure access to different parts of Roller --&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;BootstrapFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Map everything to the PersistenceSessionFilter.&lt;br /&gt;NOTE: Any filters preceding this one MUST NOT use persistence sessions.--&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;PersistenceSessionFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Init filter.  performs some initialization on first request --&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;InitFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Request mapping.  this is what allows the urls to work --&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;RequestMappingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Most app servers support compression, if yours doesn't then use this one,&lt;br /&gt;but don't forget to uncomment the filter definition above too.&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CompressionFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/page/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;CompressionFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/feed/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Struts2 --&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;struts2-cleanup&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Context Listeners --&amp;gt;&lt;br /&gt;&amp;lt;!--new--&amp;gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.jasig.cas.client.session.SingleSignOutHttpSessionListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;    &lt;br /&gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.apache.roller.weblogger.ui.core.RollerSession&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.apache.roller.weblogger.ui.core.RollerContext&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.apache.tiles.web.startup.TilesListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Servlet Definitions --&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PageServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.PageServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;5&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;FeedServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.FeedServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;5&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;ResourceServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.ResourceServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;5&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;MediaResourceServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.MediaResourceServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;5&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;SearchServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.SearchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;5&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;OpenSearchServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.webservices.opensearch.OpenSearchServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;10&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;CommentServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.CommentServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;7&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;TrackbackServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.TrackbackServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;7&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RSDServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.RSDServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;7&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PlanetFeedServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.PlanetFeedServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;7&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;CommentAuthenticatorServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.CommentAuthenticatorServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;7&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PreviewServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.PreviewServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;9&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PreviewResourceServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.PreviewResourceServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;9&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PreviewThemeImageServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.servlets.PreviewThemeImageServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;9&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.rendering.velocity.deprecated.RedirectServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;9&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;StrutsRedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.struts2.util.StrutsRedirectServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;9&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AtomServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;com.sun.syndication.propono.atom.server.AtomServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;CommentDataServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.struts2.ajax.CommentDataServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;UserDataServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.ui.struts2.ajax.UserDataServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AdminServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.webservices.adminprotocol.AdminServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;TagDataServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.webservices.tagdata.TagDataServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;XmlRpcServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.xmlrpc.webserver.XmlRpcServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&lt;br /&gt;Sets, whether the servlet supports vendor extensions for XML-RPC.&lt;br /&gt;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;enabledForExtensions&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- BEGIN OAUTH --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RequestTokenServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.webservices.oauth.RequestTokenServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AuthorizationServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.webservices.oauth.AuthorizationServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AccessTokenServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.apache.roller.weblogger.webservices.oauth.AccessTokenServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RequestTokenServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/oauth/requestToken&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AuthorizationServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/oauth/authorize&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AccessTokenServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/oauth/accessToken&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- END OAUTH --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Rendering Servlets --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PageServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/page/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;FeedServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/feed/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;ResourceServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/resources/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;MediaResourceServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/media-resources/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;CommentServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/comment/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;TrackbackServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/trackback/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RSDServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/rsd/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;SearchServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/rendering/search/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PlanetFeedServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/planetrss/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;CommentAuthenticatorServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/CommentAuthenticatorServlet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Preview Servlets --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PreviewServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/preview/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PreviewResourceServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/previewresource/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;PreviewThemeImageServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/previewtheme&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Servlets for supporting Ajax --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;CommentDataServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/commentdata/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;UserDataServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/userdata/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Web Service Servlets --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;XmlRpcServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/xmlrpc&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AtomServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/app/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;AdminServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/rap/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;TagDataServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/tagdata/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;OpenSearchServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-services/opensearch/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Redirect Support for pre-3.0 urls --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/language/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/comments/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/resources/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/rsd/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/flavor/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/rss/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/atom/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/page/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/search/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/xmlrpc/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/editor/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;RedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/admin/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Redirect support for some old struts1 urls --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;StrutsRedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/yourWebsites.do&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;StrutsRedirectServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/commentManagement.do&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;session-config&amp;gt;&lt;br /&gt;&amp;lt;session-timeout&amp;gt;30&amp;lt;/session-timeout&amp;gt;&lt;br /&gt;&amp;lt;/session-config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;home.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;exception-type&amp;gt;java.lang.Exception&amp;lt;/exception-type&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/roller-ui/errors/error.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;error-code&amp;gt;403&amp;lt;/error-code&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/roller-ui/errors/403.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;error-code&amp;gt;404&amp;lt;/error-code&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/roller-ui/errors/404.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- jndi resources --&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;resource-ref&amp;gt;&lt;br /&gt;&amp;lt;res-ref-name&amp;gt;jdbc/rollerdb&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;&amp;lt;res-type&amp;gt;javax.sql.DataSource&amp;lt;/res-type&amp;gt;&lt;br /&gt;&amp;lt;res-auth&amp;gt;Container&amp;lt;/res-auth&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&amp;lt;resource-ref&amp;gt;&lt;br /&gt;&amp;lt;res-ref-name&amp;gt;mail/Session&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;&amp;lt;res-type&amp;gt;javax.mail.Session&amp;lt;/res-type&amp;gt;&lt;br /&gt;&amp;lt;res-auth&amp;gt;Container&amp;lt;/res-auth&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&amp;lt;!-- BEGIN: example config. for using Container Managed Authentication&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;Weblog admin and editor resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/createWeblog.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-user&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;Weblog admin and editor HTTPS resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/login-redirect.jsp&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/login-redirect.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/userdata&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/membersInvite.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/authoring/membersInvite!save.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-user&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;transport-guarantee&amp;gt;CONFIDENTIAL&amp;lt;/transport-guarantee&amp;gt;&lt;br /&gt;&amp;lt;/user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;Global Admin resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/admin/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/rewrite-status.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;Gobal Admin HTTPS resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/admin/userAdmin.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/admin/createUser.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/admin/createUser!save.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/admin/modifyUser.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/admin/modifyUser!save.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;transport-guarantee&amp;gt;CONFIDENTIAL&amp;lt;/transport-guarantee&amp;gt;&lt;br /&gt;&amp;lt;/user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;editor res&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/menu.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-user&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;Editor HTTPS resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/profile.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/profile!save.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-user&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;transport-guarantee&amp;gt;CONFIDENTIAL&amp;lt;/transport-guarantee&amp;gt;&lt;br /&gt;&amp;lt;/user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;web-resource-name&amp;gt;HTTPS resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/login.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/register.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/roller-ui/register!save.rol&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;transport-guarantee&amp;gt;CONFIDENTIAL&amp;lt;/transport-guarantee&amp;gt;&lt;br /&gt;&amp;lt;/user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;login-config&amp;gt;&lt;br /&gt;&amp;lt;auth-method&amp;gt;FORM&amp;lt;/auth-method&amp;gt;&lt;br /&gt;&amp;lt;realm-name&amp;gt;Roller_UserRealm&amp;lt;/realm-name&amp;gt;&lt;br /&gt;&amp;lt;form-login-config&amp;gt;&lt;br /&gt;&amp;lt;form-login-page&amp;gt;/roller-ui/login.rol&amp;lt;/form-login-page&amp;gt;&lt;br /&gt;&amp;lt;form-error-page&amp;gt;/roller-ui/login.rol?error=true&amp;lt;/form-error-page&amp;gt;&lt;br /&gt;&amp;lt;/form-login-config&amp;gt;&lt;br /&gt;&amp;lt;/login-config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-role&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/security-role&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-role&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;weblog-user&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/security-role&amp;gt;&lt;br /&gt;&lt;br /&gt;END: example config. for using Container Managed Authentication --&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Step 3: Updated Security.xml:&lt;/b&gt;&lt;br /&gt;&lt;div class="mycode"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:beans xmlns=&amp;quot;http://www.springframework.org/schema/security&amp;quot;&lt;br /&gt;xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;xmlns:beans=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;xmlns:jee=&amp;quot;http://www.springframework.org/schema/jee&amp;quot;&lt;br /&gt;xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd&lt;br /&gt;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;br /&gt;http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;br /&gt;http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- new --&amp;gt;&lt;br /&gt;&amp;lt;!--access roles : ROLE_USER,ROLE_SUPERVISOR --&amp;gt;&lt;br /&gt;&amp;lt;http entry-point-ref=&amp;quot;casProcessingFilterEntryPoint&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/images/**&amp;quot; filters=&amp;quot;none&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/scripts/**&amp;quot; filters=&amp;quot;none&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/styles/**&amp;quot; filters=&amp;quot;none&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/login-redirect**&amp;quot; access=&amp;quot;ROLE_admin,ROLE_editor&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/login-redirect**&amp;quot; access=&amp;quot;IS_AUTHENTICATED_ANONYMOUSLY,ROLE_admin,ROLE_editor&amp;quot;/&amp;gt;--&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/profile**&amp;quot; access=&amp;quot;ROLE_admin,ROLE_editor&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/createWeblog**&amp;quot; access=&amp;quot;ROLE_admin,ROLE_editor&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/menu**&amp;quot; access=&amp;quot;ROLE_admin,ROLE_editor&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/authoring/**&amp;quot; access=&amp;quot;ROLE_admin,ROLE_editor&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/admin/**&amp;quot; access=&amp;quot;ROLE_admin&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/rewrite-status*&amp;quot; access=&amp;quot;ROLE_admin&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern=&amp;quot;/roller-ui/user.do*&amp;quot; access=&amp;quot;ROLE_USER&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;anonymous /&amp;gt;&lt;br /&gt;&amp;lt;http-basic /&amp;gt;        &lt;br /&gt;&amp;lt;/http&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- ======================== CENTRAL AUTHENTICATION SERVICE (CAS) ======================= --&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--new--&amp;gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;casProcessingFilter&amp;quot; class=&amp;quot;org.springframework.security.ui.cas.CasProcessingFilter&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;custom-filter after=&amp;quot;CAS_PROCESSING_FILTER&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;authenticationManager&amp;quot; ref=&amp;quot;authenticationManager&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;authenticationFailureUrl&amp;quot; value=&amp;quot;/roller-ui/login.rol?error=true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;defaultTargetUrl&amp;quot; value=&amp;quot;/&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;rememberMeServices&amp;quot; ref=&amp;quot;rememberMeServices&amp;quot; /&amp;gt;  &lt;br /&gt;&amp;lt;beans:property name=&amp;quot;filterProcessesUrl&amp;quot; value=&amp;quot;/j_spring_cas_security_check&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;casProcessingFilterEntryPoint&amp;quot; class=&amp;quot;org.springframework.security.ui.cas.CasProcessingFilterEntryPoint&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;loginUrl&amp;quot; value=&amp;quot;http://localhost:8080/cas/login&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;serviceProperties&amp;quot; ref=&amp;quot;serviceProperties&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--new--&amp;gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;casAuthenticationProvider&amp;quot; class=&amp;quot;org.springframework.security.providers.cas.CasAuthenticationProvider&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;custom-authentication-provider /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;userDetailsService&amp;quot; ref=&amp;quot;userRollerService&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;serviceProperties&amp;quot; ref=&amp;quot;serviceProperties&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;ticketValidator&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:bean class=&amp;quot;org.jasig.cas.client.validation.Cas20ServiceTicketValidator&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:constructor-arg index=&amp;quot;0&amp;quot; value=&amp;quot;http://localhost:8080/cas&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&amp;lt;/beans:property&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;key&amp;quot; value=&amp;quot;an_id_for_this_auth_provider_only&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;proxyGrantingTicketStorage&amp;quot; class=&amp;quot;org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;serviceProperties&amp;quot; class=&amp;quot;org.springframework.security.ui.cas.ServiceProperties&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;service&amp;quot; value=&amp;quot;http://localj.endurotracker.com:8090/roller_custom/j_spring_cas_security_check&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;sendRenew&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Read users from Roller API --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;userRollerService&amp;quot;&lt;br /&gt;class=&amp;quot;org.apache.roller.weblogger.ui.core.security.RollerUserDetailsService&amp;quot; &amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;rolePrefix&amp;quot; value=&amp;quot;ROLE_&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--FOR TESTING/DEBUGGING ONLY--&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;user-service id=&amp;quot;userService&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;user name=&amp;quot;rod&amp;quot; password=&amp;quot;rod&amp;quot; authorities=&amp;quot;ROLE_SUPERVISOR,ROLE_USER&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;user name=&amp;quot;dianne&amp;quot; password=&amp;quot;dianne&amp;quot; authorities=&amp;quot;ROLE_SUPERVISOR,ROLE_USER&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;user name=&amp;quot;scott&amp;quot; password=&amp;quot;scott&amp;quot; authorities=&amp;quot;ROLE_SUPERVISOR,ROLE_USER&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/user-service&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--RememberMe Configurations --&amp;gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;rememberMeProcessingFilter&amp;quot; class=&amp;quot;org.springframework.security.ui.rememberme.RememberMeProcessingFilter&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;custom-filter position=&amp;quot;REMEMBER_ME_FILTER&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;authenticationManager&amp;quot; ref=&amp;quot;authenticationManager&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;rememberMeServices&amp;quot; ref=&amp;quot;rememberMeServices&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- your customizations --&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;Activates various annotations to be detected in bean classes:&lt;br /&gt;Spring's @Required and @Autowired, as well as JSR 250's @Resource.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;context:annotation-config /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--Try adding this--&amp;gt;&lt;br /&gt;&amp;lt;aop:aspectj-autoproxy /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Turn on @Required --&amp;gt;&lt;br /&gt;&amp;lt;beans:bean class=&amp;quot;org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;securityService&amp;quot;&lt;br /&gt;class=&amp;quot;yourPackage.SecurityService&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;usersDao&amp;quot; ref=&amp;quot;usersDao&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Note: if your usersDao uses sessionFactory you will need to add sessionFactory bean as well, this is just for illustration purposes--&amp;gt;         &lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;usersDao&amp;quot;&lt;br /&gt;class=&amp;quot;yourPackage.UsersDao&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;sessionFactory&amp;quot; ref=&amp;quot;sessionFactory&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;usersInRolesDao&amp;quot;&lt;br /&gt;class=&amp;quot;yourPackage.UsersInRolesDao&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;sessionFactory&amp;quot; ref=&amp;quot;sessionFactory&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;userService&amp;quot; class=&amp;quot;yourPackage.UserService&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;usersDao&amp;quot; ref=&amp;quot;usersDao&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;authMgr&amp;quot; ref=&amp;quot;authenticationManager&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;userCache&amp;quot; ref=&amp;quot;userCache&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;messageSource&amp;quot; ref=&amp;quot;messageSource&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;userTokenCache&amp;quot; ref=&amp;quot;userTokenCache&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;rememberMeAuthenticationProvider&amp;quot; class=&amp;quot;org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;custom-authentication-provider /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;key&amp;quot; value=&amp;quot;CHANGE_THIS_2&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;authenticationManager&amp;quot; class=&amp;quot;org.springframework.security.providers.ProviderManager&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;providers&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:list&amp;gt;&lt;br /&gt;&amp;lt;beans:ref local=&amp;quot;casAuthenticationProvider&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:bean class=&amp;quot;org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;key&amp;quot; value=&amp;quot;CHANGE_THIS_1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&amp;lt;beans:ref local=&amp;quot;rememberMeAuthenticationProvider&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:list&amp;gt;&lt;br /&gt;&amp;lt;/beans:property&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--NOTE : Don't forget to implement a RollerRememberMeServices class, unless you use the Plain vanilla Spring Security RemberMeServices class --&amp;gt;&lt;br /&gt;&amp;lt;!--plain vanilla using regular Spring Security--&amp;gt;&lt;br /&gt;&amp;lt;!--&amp;lt;bean id=&amp;quot;rememberMeServices&amp;quot; class=&amp;quot;org.springframework.security.ui.rememberme.TokenBasedRememberMeServices&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;property name=&amp;quot;userDetailsService&amp;quot; ref=&amp;quot;usersDao&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&amp;quot;key&amp;quot; value=&amp;quot;CHANGE_THIS_2&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;rememberMeServices&amp;quot; class=&amp;quot;org.apache.roller.weblogger.business.rememberme.RollerRememberMeServices&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;userDetailsService&amp;quot; ref=&amp;quot;userRollerService&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;userService&amp;quot; ref=&amp;quot;userService&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;key&amp;quot; value=&amp;quot;CHANGE_THIS_2&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;parameter&amp;quot; value=&amp;quot;_spring_security_remember_me&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cookieName&amp;quot; value=&amp;quot;SPRING_SECURITY_REMEMBER_ME_COOKIE&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cookieDomain&amp;quot; value=&amp;quot;.yourwebsite.com&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;tokenValiditySeconds&amp;quot; value=&amp;quot;1209600&amp;quot; /&amp;gt;           &lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;passwordEncoder&amp;quot; class=&amp;quot;yourPackage.PasswordEncoder&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;passwordFormatforBean&amp;quot; value=&amp;quot;Hashed&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;userTokenCache&amp;quot; class=&amp;quot;org.springframework.cache.ehcache.EhCacheFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cacheManager&amp;quot; ref=&amp;quot;cacheManager&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cacheName&amp;quot; value = &amp;quot;yourPackage.UserTokenCache&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;cacheManager&amp;quot; class=&amp;quot;org.springframework.cache.ehcache.EhCacheManagerFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;configLocation&amp;quot; value=&amp;quot;classpath:ehcache.xml&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;userCacheBackend&amp;quot; class=&amp;quot;org.springframework.cache.ehcache.EhCacheFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cacheManager&amp;quot; ref=&amp;quot;cacheManager&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cacheName&amp;quot; value=&amp;quot;userCache&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:bean id=&amp;quot;userCache&amp;quot; class=&amp;quot;org.springframework.security.providers.dao.cache.EhCacheBasedUserCache&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:property name=&amp;quot;cache&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;beans:ref local=&amp;quot;userCacheBackend&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/beans:property&amp;gt;&lt;br /&gt;&amp;lt;/beans:bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans:beans&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;b&gt; Integrating Roller with CAS 4 Completed !&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-3281343589308342992?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/3281343589308342992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/11/single-sign-on-with-cas-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/3281343589308342992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/3281343589308342992'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/11/single-sign-on-with-cas-part-2.html' title='Single Sign On with CAS Part 2 Integrating with Roller'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-2340041384812920132</id><published>2009-11-18T19:43:00.000-08:00</published><updated>2009-11-18T20:16:30.846-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CAS SSO Spring Security'/><title type='text'>Single Sign On with CAS and RememberMe Part 1</title><content type='html'>&lt;b&gt;Overview&lt;/b&gt;&amp;nbsp; &lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;As an avid internet user I have a lot of different sites that I use, for most sites I have a separate user account and password.&lt;br /&gt;With lots of accounts, it can be hard to remember all my different user names and passwords.&lt;br /&gt;&amp;nbsp;With Endurotracker.com, we want to make you user experience as enjoyable as possible. So, unlike some sites where you need to 3 different username and passwords one for main site, one for forum , and one for blog engine, we have made so that you only need a Single Sign On or Username/password combo for all the different applications. &lt;br /&gt;&amp;nbsp; In this series of blog entries, I will discuss how I implement Single Sign across 3 different applications, Roller ( a Open Source Blogging Engine),&lt;br /&gt;JForum ( a Open Source Forum Engine), and our main application Endurotracker.com.&lt;br /&gt;&amp;nbsp; The way we implement Single Sign On (SSO) will be to use CAS 4, Central Authentication System 4 written by www.jasig.org and the&lt;br /&gt;Spring Framework, specifically Spring Security formerly Aegis Security.&lt;br /&gt;&amp;nbsp;At a high level the way SSO works is : if a user is not logged in and they go to a secure area of the Roller application, then they will get prompted&lt;br /&gt;to log in (via a redirect to the CAS 4 application), after successful login they get redirected back to where they where in the Roller application.&lt;br /&gt;SSO will be implemented on 3 applications so this type of workflow will occur for the 3 applications, Roller, JForum, and Endurotracker.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setting of CAS4&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;In this section we will go over how CAS4 was setup.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1&lt;/b&gt;: Get CAS4 from jasig.org's SVN trunk repository&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2&lt;/b&gt;: Configure your Eclipse IDE and setup the CAS4 project : cas-server-webapp.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional (but good idea for debugging) , pull in all the CAS4 projects (over a dozen projects).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RememberMe Implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;CAS4 takes advantage of the Open Source framework Spring. Specifically it uses Spring Web Flow and Spring Security.&lt;br /&gt;(see www.springsource.org for full documenation). &lt;br /&gt;In a nutshell, the way we implement RememberMe is by creating a RememberMe cookie and then utilize this cookie to determine&lt;br /&gt;who the user is. If the RememberMe cookie is not found or is expired we force the user to login.&lt;br /&gt;You can use the standard RememberMeServices class from Spring Security or you can create your own RememberMeServices class&lt;br /&gt;if you need a implement things like encrypting your cookies. We implement our own RememberMeServices class to encrypt the values&lt;br /&gt;stored in our cookies. Creating your own RememberMeServices class is optional.&lt;br /&gt;&lt;br /&gt;Add this html snippet to promptForCredentials.jsp which will add a remember me check box to the login form:&lt;br /&gt;&lt;div class="mycode"&gt;&lt;input id="rememberMe" name="rememberMe" type="checkbox" value="true" /&gt; &lt;label for="rememberMe"&gt;Remember Me&lt;/label&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For Spring Web Flow, to store whether the user has checked rememberMe check box, we need to create a small class, CaptchaRememberMeCredentialImpl.java, here is the source (small class):&lt;br /&gt;&lt;br /&gt;&lt;div class="mycode"&gt;@Component&lt;br /&gt;@ValidateDefinition&lt;br /&gt;public class CaptchaRememberMeAuthenticationResponsePluginImpl extends CaptchaAuthenticationResponsePluginImpl implements AuthenticationResponsePlugin {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//WARNING: implement all required methods this is just a SNIPPET for illustration purposes, this code will not compile, you will&lt;br /&gt;// need to implement all required methods and add your imports, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public static final String SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY = "SPRING_SECURITY_REMEMBER_ME_COOKIE";&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void handle(final LoginRequest loginRequest, final AuthenticationResponse response) {&lt;br /&gt;if (response.succeeded()) {&lt;br /&gt;&lt;br /&gt;String username ="";&lt;br /&gt;String password ="";&lt;br /&gt;List&lt;credential&gt; creds = loginRequest.getCredentials();&lt;br /&gt;if(creds.size() &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;CaptchaRememberMeCredentialImpl userCred = (CaptchaRememberMeCredentialImpl) creds.get(0);&lt;br /&gt;username = userCred.getUsername();&lt;br /&gt;password = userCred.getPassword();&lt;br /&gt;&lt;br /&gt;if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//if isRememberMe is false then return (don't set rememberme cookie)&lt;br /&gt;if(userCred.isRememberMe()==false)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//need to implement your own UserDetails Class , see Spring Security's UserDetails javadoc for more info&lt;br /&gt;UserDetails userDetails = getUserDetailsService().loadUserByUsername(username);&lt;br /&gt;if(userDetails != null){&lt;br /&gt;&lt;br /&gt;Users user = userDetails .getUser();&lt;br /&gt;&lt;br /&gt;RequestContext context = RequestContextHolder.getRequestContext();&lt;br /&gt;ExternalContext externalContext = context.getExternalContext();&lt;br /&gt;&lt;br /&gt;//determine what data you wish to store in cookie value&lt;br /&gt;//typically store username or email as the key, or userid possibly&lt;br /&gt;String cookieValue = user.getUserName().toString();&lt;br /&gt;response.getAttributes().put(SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, cookieValue);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/credential&gt;&lt;br /&gt;&lt;/div&gt;To set the cookie we need to implement an Authentication plugin and a cookie creator class.&lt;br /&gt;CAS4 has implemented a plugin architecture that allows developers to create custom plugins. &lt;br /&gt;Once you create a plugin, to get CAS4 to use it you just reference the plugin in the your deployment configuration file (in CAS3 called deployerConfigContext.xml) or if you utilize annotations will get picked up automagically. (i.e @Component, etc)&lt;br /&gt;In this case our plugin will need to get called during the authentication process, so we will extend the CaptchaAuthenticationResponsePluginImpl&lt;br /&gt;and implement AuthenticationResponsePlugin.&lt;br /&gt;In a nutshell the plugin calculates the Cookie's value and stores it in the HttpResponse.&lt;br /&gt;During the workflow after successful authentication the RememberMeCookieCreater class , extracts the Cookie's value from&lt;br /&gt;the HttpResponse and creates new RememberMe Cookie using this value as input.&lt;br /&gt;&lt;br /&gt;&lt;div class="mycode"&gt;@Component&lt;br /&gt;@ValidateDefinition&lt;br /&gt;public class CaptchaRememberMeAuthenticationResponsePluginImpl extends CaptchaAuthenticationResponsePluginImpl implements AuthenticationResponsePlugin {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//WARNING: implement all required methods this is just a SNIPPET for illustration purposes, this code will not compile, you will&lt;br /&gt;// need to implement all required methods and add your imports, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public static final String SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY = "SPRING_SECURITY_REMEMBER_ME_COOKIE";&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void handle(final LoginRequest loginRequest, final AuthenticationResponse response) {&lt;br /&gt;if (response.succeeded()) {&lt;br /&gt;&lt;br /&gt;String username ="";&lt;br /&gt;String password ="";&lt;br /&gt;List&lt;credential&gt; creds = loginRequest.getCredentials();&lt;br /&gt;if(creds.size() &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;CaptchaRememberMeCredentialImpl userCred = (CaptchaRememberMeCredentialImpl) creds.get(0);&lt;br /&gt;username = userCred.getUsername();&lt;br /&gt;password = userCred.getPassword();&lt;br /&gt;&lt;br /&gt;if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//if isRememberMe is false then return (don't set rememberme cookie)&lt;br /&gt;if(userCred.isRememberMe()==false)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//need to implement your own UserDetails Class , see Spring Security's UserDetails javadoc for more info&lt;br /&gt;UserDetails userDetails = getUserDetailsService().loadUserByUsername(username);&lt;br /&gt;if(userDetails != null){&lt;br /&gt;&lt;br /&gt;Users user = userDetails .getUser();&lt;br /&gt;&lt;br /&gt;RequestContext context = RequestContextHolder.getRequestContext();&lt;br /&gt;ExternalContext externalContext = context.getExternalContext();&lt;br /&gt;&lt;br /&gt;//determine what data you wish to store in cookie value&lt;br /&gt;//typically store username or email as the key, or userid possibly&lt;br /&gt;String cookieValue = user.getUserName().toString();&lt;br /&gt;response.getAttributes().put(SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, cookieValue);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/credential&gt;&lt;br /&gt;&lt;/div&gt;We use org.springframework.web.util.CookieGenerator to generate the remember me cookie, and see configuration section further down.&lt;br /&gt;&lt;br /&gt;We then have to configure the Spring Web Flow configuration file, login.xml (locate under /webapp/WEB-INF/login/login.xml) to call this class during our workflow.&lt;br /&gt;&lt;br /&gt;Here is the xml snippets:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;xml snippet 1&lt;/b&gt;, update credentials var to use CaptchaRememberMeCredentialsImpl:&lt;br /&gt;&lt;var class="org.jasig.cas.server.authentication.CaptchaRememberMeCredentialImpl" name="credentials"&gt;&lt;/var&gt;&lt;br /&gt;&amp;lt;var name="credentials" class="org.jasig.cas.server.authentication.CaptchaRememberMeCredentialImpl" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;xml snippet 2&lt;/b&gt;, add rememberme property:&lt;br /&gt;&lt;binder&gt;&amp;lt;binder&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;binding property="username" required="true" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;binding property="password" required="true" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;binding property="captchaResponse" required="false" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;binding property="rememberMe" required="true" /&amp;gt;&lt;br /&gt;&amp;lt;/binder&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;binding property="username" required="true"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;binding property="password" required="true"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;binding property="captchaResponse" required="false"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;binding property="rememberMe" required="true"&gt;&lt;br /&gt;&lt;/binding&gt; &lt;br /&gt;&lt;/binding&gt;&lt;/binding&gt;&lt;/binding&gt;&lt;/binder&gt;&lt;br /&gt;&lt;b&gt;xml snippet 3&lt;/b&gt;:&lt;br /&gt;&amp;lt;transition on="submit" to="determineIfSessionCreated"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;evaluate expression="loginRequest.credentials.add(credentials)" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;evaluate expression="centralAuthenticationService.login(loginRequest)" result="requestScope.loginResponse" result-type="org.jasig.cas.server.login.LoginResponse" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;evaluate expression="sessionCookieCreater.createSessionCookie(loginResponse, null, externalContext)" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--RememberMe Cookie Logical Step Here--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;evaluate expression="rememberMeCookieCreater.createSessionCookie(loginResponse, null, externalContext)" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;evaluate expression="loginRequest.setSessionId(loginResponse.sessionId)" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/transition&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Editing Configuration:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 3&lt;/b&gt;: Edit cas-server-webapp's pom.xml to allow for use of jetty (web server used in eclipse for debugging)&lt;br /&gt;pom.xml Snippet:&lt;br /&gt;&lt;div class="mycode"&gt;&lt;plugin&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;jetty-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;7.0.0.1beta2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webAppConfig&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;contextPath&amp;gt;/cas&amp;lt;/contextPath&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/webAppConfig&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;connectors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/connector&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/connectors&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/plugin&gt;&lt;br /&gt;&lt;plugin&gt;&lt;br /&gt;&lt;/plugin&gt;&lt;br /&gt;&lt;plugin&gt; &lt;/plugin&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Step 4&lt;/b&gt;: Update web.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Update the &lt;context-param&gt; section like this:&lt;br /&gt;&lt;/context-param&gt;&lt;br /&gt;&amp;nbsp;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WEB-INF/cas-servlet.xml,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WEB-INF/spring/applicationContext.xml,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WEB-INF/spring/jcaptcha-configuration.xml,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WEB-INF/spring/testAuthenticationHandler-configuration.xml,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WEB-INF/spring/urlCredentialAuthenticationHandler-configuration.xml,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /WEB-INF/deployerConfigContext.xml,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /WEB-INF/jndi.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 5&lt;/b&gt;: Example cas-servlet.xml (if you run into issues):&lt;beans xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:security="http://www.springframework.org/schema/security" xmlns:util="http://www.springframework.org/schema/util" xmlns:webflow="http://www.springframework.org/schema/webflow-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans                           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd                           http://www.springframework.org/schema/webflow-config                           http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd                           http://www.springframework.org/schema/util                           http://www.springframework.org/schema/util/spring-util-2.5.xsd                           http://www.springframework.org/schema/context                           http://www.springframework.org/schema/context/spring-context.xsd                           http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"&gt;&lt;webflow:flow-registry id="flowRegistry"&gt;&lt;webflow:flow-executor id="flowExecutor"&gt; &lt;bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"&gt;&lt;br /&gt;&amp;nbsp; &lt;property name="order" value="0"&gt; &lt;bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver"&gt; &lt;/bean&gt;&lt;/property&gt;&lt;/bean&gt;&lt;/webflow:flow-executor&gt;&lt;/webflow:flow-registry&gt;&lt;/beans&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:webflow="http://www.springframework.org/schema/webflow-config"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:p="http://www.springframework.org/schema/p"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:util="http://www.springframework.org/schema/util"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:security="http://www.springframework.org/schema/security"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/webflow-config&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/util&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/util/spring-util-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/context&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/context/spring-context.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Web flow 2.0 schema --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webflow:flow-registry id="flowRegistry"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webflow:flow-location path="/WEB-INF/login/login.xml" id="login"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/webflow:flow-registry&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webflow:flow-executor id="flowExecutor" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="order" value="0" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="flowRegistry" ref="flowRegistry" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="flowExecutor" ref="flowExecutor" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="order" value="0" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="prefix" value="/WEB-INF/jsp/" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="suffix" value=".jsp" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Dispatches requests mapped to POJO @Controllers implementations --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Dispatches requests mapped to org.springframework.web.servlet.mvc.Controller implementations --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/beans&amp;gt; &lt;br /&gt;Step 6: Update spring/applicationContext.xml:&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:p="http://www.springframework.org/schema/p"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.authentication"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.login"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.logout"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.session"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.util"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.login"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.session"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:component-scan base-package="org.jasig.cas.server.web"/&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:annotation-config /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--Default Auth. Manager, can override default in deployerConfigContext.xml--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="authenticationManager" class="org.jasig.cas.server.authentication.DefaultAuthenticationManagerImpl"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="basenames"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;org/javalid/core/validator/jv_messages&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;messages&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;org/jasig/cas/server/messages/log&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;org/jasig/cas/server/session/messages/cas_messages&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="casMessageSource" class="org.jasig.cas.server.util.CasMessageSourceAccessor" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/beans&amp;gt; &lt;br /&gt;&lt;b&gt;Step 7&lt;/b&gt;: Example spring/jcaptcha-configuration.xml (current trunk version):&lt;br /&gt;&amp;nbsp;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:p="http://www.springframework.org/schema/p"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService" id="imageCaptchaService" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.jasig.cas.server.authentication.DefaultCaptchaStatusImpl" id="captchaStatus"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.jasig.cas.server.authentication.DefaultCaptchaStatusImplFactory" id="captchaStatusFactory" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="numberOfFailures" value="2" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="numberOfMilliseconds" value="60000" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.jasig.cas.server.authentication.InMemoryCaptchaStatusStorageImpl" id="captchaStatusStorage" /&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 8:&lt;/b&gt; Create deployerConfigContext.xml (main customization config file):&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | deployerConfigContext.xml centralizes into one file some of the declarative configuration that&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | all CAS deployers will need to modify.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | This file declares some of the Spring-managed JavaBeans that make up a CAS deployment.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | The beans declared in this file are instantiated at context initialization time by the Spring&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ContextLoaderListener declared in web.xml.&amp;nbsp; It finds this file because this&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | file is among those declared in the context parameter "contextConfigLocation".&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | By far the most common change you will need to make in this file is to change the last bean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | declaration to replace the default SimpleTestUsernamePasswordAuthenticationHandler with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | one implementing your approach for authenticating usernames and passwords.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; +--&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:p="http://www.springframework.org/schema/p"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:aop="http://www.springframework.org/schema/aop"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:tx="http://www.springframework.org/schema/tx"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:jee="http://www.springframework.org/schema/jee"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:security="http://www.springframework.org/schema/security"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | This bean declares our AuthenticationManager.&amp;nbsp; The CentralAuthenticationService service bean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | declared in applicationContext.xml picks up this AuthenticationManager by reference to its id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | "authenticationManager".&amp;nbsp; Most deployers will be able to use the default AuthenticationManager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | implementation and so do not need to change the class of this bean.&amp;nbsp; We include the whole&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | AuthenticationManager here in the deployerConfigContext.xml so that you can see the things you will&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | need to change in context.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.util.CookieGenerator" id="sessionCookieGenerator"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:cookieName="TGT"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:cookieSecure="false"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.web.util.CookieGenerator" id="rememberMeCookieGenerator"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:cookieName="SPRING_SECURITY_REMEMBER_ME_COOKIE"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:cookieDomain=".endurotracker.com"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:cookieMaxAge="1209600"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p:cookieSecure="false" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--You Can override Auth. Mgr here if you wish--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--This is just a example to use as template--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;bean id="authenticationManager"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.jasig.cas.server.authentication.DefaultAuthenticationManagerImpl"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--You Can override CredentialToPrincipalResolver here if you wish--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--This is just a example to use as template--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;bean class="org.jasig.cas.server.authentication.SimpleUsernamePasswordCredentialToPrincipalResolver" id="usernamePasswordCredentialToPrincipalResolver" /&amp;gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--You Can override UsernamePasswordCredentialsAuthenticationHandler here if you wish--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--This is just a example to use as template--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;bean class="org.jasig.cas.server.authentication.handler.TestUsernamePasswordCredentialsAuthenticationHandler" id="testUsernamePasswordCredentialsAuthenticationHandler"/&amp;gt;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--your custom AuthenticationHandler bean Here--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="yourPackage.YourCustomAuthenticationHandler" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="securityService" ref="securityService" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--Your customizations here--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Activates various annotations to be detected in bean classes:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Spring's @Required and @Autowired, as well as JSR 250's @Resource.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:annotation-config /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aop:aspectj-autoproxy /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Turn on @Required --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="securityService"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="yourpackagename.SecurityService"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="usersDao" ref="usersDao" /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="usersDao"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="yourpackagename.UsersDao"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="sessionFactory" ref="sessionFactory"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--RememberMe Section --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="usersInRolesDao"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="yourpackagename.UsersInRolesDao"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="sessionFactory" ref="sessionFactory"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!--NOTE if you use sessionFactories your will need to configure your sessionFactory bean--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="userService" class="yourPackageName.UserService"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="usersDao" ref="usersDao" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="authMgr" ref="yourCustomAuthenticationManager"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userCache" ref="userCache" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="messageSource" ref="messageSource" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userTokenCache" ref="userTokenCache"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="rememberMeAuthenticationProvider" class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:custom-authentication-provider /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="key" value="CHANGE_THIS_2" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="yourCustomAuthenticationManager" class="org.springframework.security.providers.ProviderManager"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="providers"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="daoAuthenticationProvider" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="key" value="CHANGE_THIS_1" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="rememberMeAuthenticationProvider" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--plain vanilla using regular Spring Security--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="rememberMeServices" class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userDetailsService" ref="usersDao"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="key" value="CHANGE_THIS_2"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--example of custom rememberMeServices class config--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;bean id="rememberMeServices" class="yourPackage.YourCustomRememberMeServices"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userDetailsService" ref="usersDao" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userService" ref="userService" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="usersInRolesDao" ref="usersInRolesDao" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="key" value="CHANGE_THIS_2" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="parameter" value="_spring_security_remember_me" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cookieName" value="SPRING_SECURITY_REMEMBER_ME_COOKIE" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="tokenValiditySeconds" value="1209600" /&amp;gt;&amp;lt;!-- 14 days --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;property name="cookieDomain" value="localhost" /&amp;gt;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cookieDomain" value=".yourwebsite.com" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="daoAuthenticationProvider" class="org.springframework.security.providers.dao.DaoAuthenticationProvider"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:custom-authentication-provider /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userDetailsService" ref="usersDao" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="passwordEncoder" ref="passwordEncoder" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="userCache" ref="userCache" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="passwordEncoder" class="yourPackage.CustomPasswordEncoder"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="passwordFormatforBean" value="Hashed" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="userTokenCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cacheManager" ref="cacheManager" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cacheName" value = "yourPackage.UserTokenCache"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="configLocation" value="classpath:ehcache.xml" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cacheManager" ref="cacheManager" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cacheName" value="userCache" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="userCache" class="org.springframework.security.providers.dao.cache.EhCacheBasedUserCache"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="cache"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="userCacheBackend" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-2340041384812920132?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/2340041384812920132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/11/single-sign-on-with-cas-and-rememberme.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2340041384812920132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2340041384812920132'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/11/single-sign-on-with-cas-and-rememberme.html' title='Single Sign On with CAS and RememberMe Part 1'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-1581410865796819918</id><published>2009-11-18T18:59:00.000-08:00</published><updated>2009-11-18T18:59:48.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new release CAS jasig apache roller SSO'/><title type='text'>New Features Released</title><content type='html'>We have released a new update to &lt;a href="http://www.EnduroTracker.com"&gt;www.EnduroTracker.com&lt;/a&gt;.&lt;br /&gt;In this release, we are making EnduroTracker free as in free beer.&lt;br /&gt;We also added 2 more Social features. The first being user forums where users can discuss endurance training. The second being the ability to create your own blog at &lt;a href="http://www.EnduroTracker.com"&gt;www.EnduroTracker.com&lt;/a&gt;. Some of open source tools that we utilized included Jasig.org's CAS (Centralized Authentiation Service), Apache's Roller blogging engine, and jforum.net's forum.  I plan to have a series of posting discussing how to setup and use CAS in general, and how to use CAS with a load balancer. I also plan to create a blog post on setting up security with Roller. The theme of these future postings being how to implement Single Sign On (SSO) across multiple web applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-1581410865796819918?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/1581410865796819918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/11/new-features-released.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1581410865796819918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1581410865796819918'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/11/new-features-released.html' title='New Features Released'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-8261856406710047485</id><published>2009-08-29T00:49:00.000-07:00</published><updated>2009-09-16T20:30:15.735-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='New Release Endurotracker'/><title type='text'>New Feature Import Data from Garmin Devices</title><content type='html'>Just a quick note, &lt;a href="http://www.Endurotracker.com"&gt;www.Endurotracker.com&lt;/a&gt; has a new feature that lets users quickly import&lt;br /&gt;data from their Garmin devices.&lt;br /&gt;We used the Spring Framework, Hibernate, and Garmin's excellent xml schemas to build this feature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-8261856406710047485?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/8261856406710047485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/08/new-feature-import-data-from-garmin.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8261856406710047485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8261856406710047485'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/08/new-feature-import-data-from-garmin.html' title='New Feature Import Data from Garmin Devices'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-1834411440720688160</id><published>2009-08-12T15:06:00.000-07:00</published><updated>2009-08-17T13:18:11.087-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Multiple Database Java JTA Hibernate JUnit 4.0 Annotations'/><title type='text'>Using Spring with multiple databases Part 5, Unit Testing using JUnit 4 and Annotations</title><content type='html'>One of the great features of the Spring framework is they have create support for Unit Testing in JUnit. Also you have the ability to use Annotations to cut down on the amount of xml you need to get your test code up and running.&lt;br /&gt;Here is a example that I used to test my Login Controller:&lt;br /&gt;&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt;package com.endurotracker.gwt.server.web.controllers;&lt;br /&gt;&lt;br /&gt;import static org.junit.Assert.assertEquals;&lt;br /&gt;import static org.junit.Assert.assertNotNull;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.security.Authentication;&lt;br /&gt;import org.springframework.security.context.SecurityContext;&lt;br /&gt;import org.springframework.security.context.SecurityContextHolder;&lt;br /&gt;import org.springframework.security.context.SecurityContextImpl;&lt;br /&gt;import org.springframework.security.providers.UsernamePasswordAuthenticationToken;&lt;br /&gt;import org.springframework.security.providers.dao.DaoAuthenticationProvider;&lt;br /&gt;import org.springframework.security.providers.dao.cache.EhCacheBasedUserCache;&lt;br /&gt;import org.springframework.security.userdetails.UserDetails;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;import org.springframework.test.context.transaction.TransactionConfiguration;&lt;br /&gt;import org.springframework.transaction.annotation.Transactional;&lt;br /&gt;&lt;br /&gt;import com.endurotracker.gwt.dao.UsersDao;&lt;br /&gt;import com.endurotracker.gwt.model.ServerSideUser;&lt;br /&gt;import com.endurotracker.gwt.model.Users;&lt;br /&gt;import com.endurotracker.gwt.server.service.UserService;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author David&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations = { "/applicationContext.xml","/jndi.xml","/applicationContext-acegi-security.xml" })&lt;br /&gt;@TransactionConfiguration(transactionManager="jtaTransactionManager", defaultRollback=false)&lt;br /&gt;@Transactional&lt;br /&gt;public class LoginControllerTest {&lt;br /&gt; &lt;br /&gt; @Autowired&lt;br /&gt; private DaoAuthenticationProvider daoAuthenticationProvider;&lt;br /&gt; @Autowired&lt;br /&gt; private UsersDao userDetailsService;&lt;br /&gt; @Autowired&lt;br /&gt; private UsersDao usersDao;&lt;br /&gt; @Autowired&lt;br /&gt; private EhCacheBasedUserCache userCache; &lt;br /&gt; &lt;br /&gt; @Autowired&lt;br /&gt; private UserService userService;&lt;br /&gt; @Autowired&lt;br /&gt; LoginController loginController;&lt;br /&gt; &lt;br /&gt; private static final Logger log =   Logger.getLogger(LoginControllerTest.class);&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; @Test&lt;br /&gt; public void testLogin()&lt;br /&gt; {&lt;br /&gt;       UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("admin","pwd");&lt;br /&gt;  &lt;br /&gt;  Authentication auth = daoAuthenticationProvider.authenticate(token);&lt;br /&gt;  &lt;br /&gt;  //set SecurityContext&lt;br /&gt;  SecurityContext context = new SecurityContextImpl();&lt;br /&gt;  context.setAuthentication(auth);&lt;br /&gt;  SecurityContextHolder.setContext(context);&lt;br /&gt;  &lt;br /&gt;  Object obj = auth.getPrincipal();&lt;br /&gt;        String username = "";&lt;br /&gt;&lt;br /&gt;        if (obj instanceof UserDetails) {&lt;br /&gt;            username = ((UserDetails) obj).getUsername();&lt;br /&gt;        } else {&lt;br /&gt;            username = obj.toString();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        //place in Cache&lt;br /&gt;        log.debug("loadUserByUsername " + username);&lt;br /&gt;&lt;br /&gt;        ServerSideUser serverUser = null;&lt;br /&gt;        &lt;br /&gt;        boolean useCache = true;&lt;br /&gt;        &lt;br /&gt;        if (useCache) {&lt;br /&gt;            serverUser = (ServerSideUser) userCache&lt;br /&gt;                    .getUserFromCache(username);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        List&lt;Users&gt; users;&lt;br /&gt;        Users u;&lt;br /&gt;        if (serverUser == null) {&lt;br /&gt;&lt;br /&gt;            users = usersDao.GetByProperty("username", username);&lt;br /&gt;         if(users.size() &gt; 0)&lt;br /&gt;         {&lt;br /&gt;                u = users.get(0);&lt;br /&gt;          userCache.putUserInCache(new ServerSideUser(u));&lt;br /&gt;         }&lt;br /&gt;         else&lt;br /&gt;         {&lt;br /&gt;          u = null;          &lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;  //Test if user can now be found, after being placed in cache  &lt;br /&gt;  Users user = userService.getCurrentUser();&lt;br /&gt;  &lt;br /&gt;  loginController = new LoginController(user);&lt;br /&gt;  &lt;br /&gt;  assertNotNull(loginController);&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Test&lt;br /&gt; public void testShowLogin()&lt;br /&gt; {&lt;br /&gt;  loginController = new LoginController();&lt;br /&gt;  String returnViewname = loginController.showHandler();&lt;br /&gt;  &lt;br /&gt;  assertEquals("showLogin",returnViewname);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Hopefully, these posts will help some people who had very little success previously finding good examples on how to setup Spring with multiple databases (datasources).&lt;br /&gt;I know I did.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-1834411440720688160?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/1834411440720688160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-database_12.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1834411440720688160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1834411440720688160'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-database_12.html' title='Using Spring with multiple databases Part 5, Unit Testing using JUnit 4 and Annotations'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-7140403994729258228</id><published>2009-08-12T14:45:00.000-07:00</published><updated>2009-08-12T15:03:16.683-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Multiple Database Java JTA Hibernate Transactions'/><title type='text'>Using Spring with multiple databases Part 4</title><content type='html'>In your web config file (web.xml) you reference your applicationcontext.xml file and any other configuration file that you need to use.&lt;br /&gt;To configure Atomikos we created a xml file called jndi.xml and reference it in our web.xml file like so:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt; &amp;lt;context-param&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;/WEB-INF/applicationContext.xml,&lt;br /&gt;                     /WEB-INF/jndi.xml&lt;br /&gt;        &amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is how we configured Atomikos Transaction Manager in our jndi.xml file:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt; &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;  Licensed to the Apache Software Foundation (ASF) under one&lt;br /&gt;  or more contributor license agreements.  See the NOTICE file&lt;br /&gt;  distributed with this work for additional information&lt;br /&gt;  regarding copyright ownership.  The ASF licenses this file&lt;br /&gt;  to you under the Apache License, Version 2.0 (the&lt;br /&gt;  &amp;quot;License&amp;quot;); you may not use this file except in compliance&lt;br /&gt;  with the License.  You may obtain a copy of the License at&lt;br /&gt;&lt;br /&gt;    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;&lt;br /&gt;  Unless required by applicable law or agreed to in writing,&lt;br /&gt;  software distributed under the License is distributed on an&lt;br /&gt;  &amp;quot;AS IS&amp;quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY&lt;br /&gt;  KIND, either express or implied.  See the License for the&lt;br /&gt;  specific language governing permissions and limitations&lt;br /&gt;  under the License.&lt;br /&gt;  --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;  xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;  xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;  xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;  xmlns:jee=&amp;quot;http://www.springframework.org/schema/jee&amp;quot;&lt;br /&gt;  xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;br /&gt;    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd&lt;br /&gt;                http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;bean id=&amp;quot;userTransactionService&amp;quot; &lt;br /&gt;      class=&amp;quot;com.atomikos.icatch.config.UserTransactionServiceImp&amp;quot; &lt;br /&gt;      init-method=&amp;quot;init&amp;quot; destroy-method=&amp;quot;shutdownForce&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;        &amp;lt;!-- IMPORTANT: specify all Atomikos properties here --&amp;gt;&lt;br /&gt;        &amp;lt;props&amp;gt;&lt;br /&gt;            &amp;lt;prop key=&amp;quot;com.atomikos.icatch.service&amp;quot;&amp;gt;&lt;br /&gt;              com.atomikos.icatch.standalone.UserTransactionServiceFactory&lt;br /&gt;            &amp;lt;/prop&amp;gt;&lt;br /&gt;            &amp;lt;prop key=&amp;quot;com.atomikos.icatch.enable_logging&amp;quot;&amp;gt;&lt;br /&gt;              false&lt;br /&gt;            &amp;lt;/prop&amp;gt;&lt;br /&gt;        &amp;lt;/props&amp;gt;&lt;br /&gt;       &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;!--JTA Manager--&amp;gt;&lt;br /&gt; &amp;lt;bean id=&amp;quot;AtomikosTransactionManager&amp;quot; class=&amp;quot;com.atomikos.icatch.jta.UserTransactionManager&amp;quot; &lt;br /&gt;    init-method=&amp;quot;init&amp;quot; destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;br /&gt;      &lt;br /&gt;     &amp;lt;!--  &lt;br /&gt;         when close is called, should we force &lt;br /&gt;         transactions to terminate or not? &lt;br /&gt;     --&amp;gt;&lt;br /&gt;     &amp;lt;property name=&amp;quot;forceShutdown&amp;quot; value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;/bean&amp;gt;&lt;br /&gt;  &lt;br /&gt; &amp;lt;!--Also use Atomikos UserTransactionImp, &lt;br /&gt;     needed to configure Spring--&amp;gt; &lt;br /&gt;   &amp;lt;bean id=&amp;quot;AtomikosUserTransaction&amp;quot; class=&amp;quot;com.atomikos.icatch.jta.UserTransactionImp&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;property name=&amp;quot;transactionTimeout&amp;quot; value=&amp;quot;300&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;/bean&amp;gt;&lt;br /&gt;   &lt;br /&gt;    &amp;lt;bean id=&amp;quot;jndi&amp;quot;&lt;br /&gt;        class=&amp;quot;org.apache.xbean.spring.jndi.SpringInitialContextFactory&amp;quot;&lt;br /&gt;        factory-method=&amp;quot;makeInitialContext&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;entries&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;map&amp;gt;&lt;br /&gt;                &amp;lt;entry key=&amp;quot;java:comp/TransactionManager&amp;quot; value-ref=&amp;quot;AtomikosTransactionManager&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;entry key=&amp;quot;java:comp/UserTransaction&amp;quot; value-ref=&amp;quot;AtomikosUserTransaction&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;entry key=&amp;quot;java:comp/UserTransactionService&amp;quot; value-ref=&amp;quot;AtomikosUserTransaction&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/map&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;/beans&amp;gt;   &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the current trunk of Spring 3.0.0, when using the Spring MVC framework , I ended up having to place @Transactional (which tells the JVM to create a transaction) in my controller classes. I would have preferred to have them on my Data Access objects, but my Unit Tests revealed that Transactions only got created in the Spring MVC world when placed on my Controller classes.&lt;br /&gt;Here is a code snippet example:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt; @Controller&lt;br /&gt;@TransactionConfiguration(transactionManager="jtaTransactionManager", defaultRollback=false)&lt;br /&gt;@Transactional&lt;br /&gt;public class WizardController {&lt;br /&gt;&lt;br /&gt; private static final Logger log = Logger&lt;br /&gt;    .getLogger(WizardController.class);&lt;br /&gt; &lt;br /&gt; @Autowired&lt;br /&gt; UserService userService;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In part 5, I will go over how to setup unit tests using JUnit 4 and Spring's Unit Test Annotations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-7140403994729258228?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/7140403994729258228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases_6213.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7140403994729258228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7140403994729258228'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases_6213.html' title='Using Spring with multiple databases Part 4'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-2898023242102174976</id><published>2009-08-12T14:28:00.000-07:00</published><updated>2009-08-12T15:01:59.441-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Multiple Database Java JTA Hibernate Transactions'/><title type='text'>Using Spring with multiple databases Part 3</title><content type='html'>In this part, we setup our SessionFactories in our applicationcontext.xml file.&lt;br /&gt;In our SessionFactories we specify our datasource, our entity classes, and also our hibernate properties. &lt;br /&gt;Since we are using multiple databases, in this case 2 databases, we need to create two SessionFactory configurations.&lt;br /&gt;Here is our first SessionFactory config that we place in applicationcontext.xml:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt; &amp;lt;bean id=&amp;quot;sessionFactory&amp;quot; &lt;br /&gt;   class=&amp;quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;dataSource&amp;quot; ref=&amp;quot;dataSource&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;annotatedClasses&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;list&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;com.endurotracker.gwt.model.Users&amp;lt;/value&amp;gt;&lt;br /&gt;     &lt;br /&gt;   &amp;lt;/list&amp;gt;&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;hibernateProperties&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;props&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.dialect&amp;quot;&amp;gt;org.hibernate.dialect.PostgreSQLDialect&amp;lt;/prop&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.show_sql&amp;quot;&amp;gt;true&amp;lt;/prop&amp;gt;    &lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.connection.isolation&amp;quot;&amp;gt;3&amp;lt;/prop&amp;gt;&lt;br /&gt;       &amp;lt;prop key=&amp;quot;hibernate.current_session_context_class&amp;quot;&amp;gt;jta&amp;lt;/prop&amp;gt;&lt;br /&gt;       &amp;lt;prop key=&amp;quot;hibernate.transaction.factory_class&amp;quot;&amp;gt;com.endurotracker.gwt.transaction.AtomikosJTATransactionFactory&amp;lt;/prop&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.transaction.manager_lookup_class&amp;quot;&amp;gt;com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup&amp;lt;/prop&amp;gt;    &lt;br /&gt;   &amp;lt;/props&amp;gt;&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is our second SessionFactory config that we place in applicationcontext.xml:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt; &amp;lt;!--Hibernate SessionFactory2--&amp;gt;&lt;br /&gt; &amp;lt;bean id=&amp;quot;sessionFactory2&amp;quot; &lt;br /&gt;   class=&amp;quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;dataSource&amp;quot; ref=&amp;quot;dataSource2&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;annotatedClasses&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;list&amp;gt;&lt;br /&gt;      &amp;lt;value&amp;gt;com.endurotracker.gwt.model.Activitytype&amp;lt;/value&amp;gt;&lt;br /&gt;     &amp;lt;/list&amp;gt;&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;hibernateProperties&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;props&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.dialect&amp;quot;&amp;gt;org.hibernate.dialect.PostgreSQLDialect&amp;lt;/prop&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.show_sql&amp;quot;&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.connection.isolation&amp;quot;&amp;gt;3&amp;lt;/prop&amp;gt;&lt;br /&gt;       &amp;lt;prop key=&amp;quot;hibernate.current_session_context_class&amp;quot;&amp;gt;jta&amp;lt;/prop&amp;gt;&lt;br /&gt;       &amp;lt;prop key=&amp;quot;hibernate.transaction.factory_class&amp;quot;&amp;gt;com.endurotracker.gwt.transaction.AtomikosJTATransactionFactory&amp;lt;/prop&amp;gt;&lt;br /&gt;    &amp;lt;prop key=&amp;quot;hibernate.transaction.manager_lookup_class&amp;quot;&amp;gt;com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup&amp;lt;/prop&amp;gt;&lt;br /&gt;  &amp;lt;/props&amp;gt;&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You will notice that we have 2 hibernate properties related to transactions: &lt;br /&gt;hibernate.transaction.factory_class and hibernate.transaction.manager_lookup_class.&lt;br /&gt;Due to a Hibernate bug ( bug HHH-3110), we had to create the following class which we reference as com.endurotracker.gwt.transaction.AtomikosJTATransactionFactory, so you can take this code and create your own class as well and update this property to your class name:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt;public class AtomikosJTATransactionFactory extends JTATransactionFactory{&lt;br /&gt; UserTransaction userTransaction;&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected UserTransaction getUserTransaction() {&lt;br /&gt;  if (this.userTransaction == null) &lt;br /&gt;  {&lt;br /&gt;   this.userTransaction = new UserTransactionImp();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  return this.userTransaction;&lt;br /&gt;    &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In Part 4, we will configure our Atomikos Transaction Manager via Atomikos' Transaction beans, and talk about how to use @Transactional Annotations in our Data Access layer and Controller layer. In Part 5, we will setup some unit tests using JUnit 4 and Spring's unit testing Annotations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-2898023242102174976?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/2898023242102174976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases_12.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2898023242102174976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2898023242102174976'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases_12.html' title='Using Spring with multiple databases Part 3'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-7481607502393855242</id><published>2009-08-12T13:42:00.000-07:00</published><updated>2009-08-17T13:18:30.605-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Multiple Database Java JTA Hibernate'/><title type='text'>Using Spring with multiple databases Part 2</title><content type='html'>If you want to debug the Spring and Hibernate source code, using your SVN client of choice download the prerequisites (or if you use Maven you can update your pom.xml to reference the applicable jar files).&lt;br /&gt;For Spring the version is 3.0.0.Build-SNAPSHOT.&lt;br /&gt;Since, we are using the Trunk (the bleeding edge), it is probably best to be able to debug their code, so I suggest you download the source code. Additionally, you will be able to more easily contribute patches if you like.&lt;br /&gt;&lt;br /&gt;Spring 3.0 Framework Source Control Repository (SVN): &lt;a href="https://src.springframework.org/svn/spring-framework/trunk"&gt;https://src.springframework.org/svn/spring-framework/trunk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hibernate Trunk SVN: &lt;a href="http://anonsvn.jboss.org/repos/hibernate/core/trunk"&gt;http://anonsvn.jboss.org/repos/hibernate/core/trunk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To download Atomikos, go to &lt;a href="http://www.atomikos.com/Main/TransactionsEssentials"&gt;http://www.atomikos.com/Main/TransactionsEssentials&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Atomikos is open source but they have you register prior to downloading the code.&lt;br /&gt;&lt;br /&gt;When developing web applications in Java, you can end up with a lot of lines of xml code in your config files. To alleviate the number of lines of xml configuration code, Spring introduced Annotations which allow you to add Annotations or configuration settings within your classes. The key Annotation that we will be using is @Transactional which tells the JVM to create a transaction for this class or method. Spring also has Annotations like @Controller that tells the JVM that this class is a Controller. This allows developers to cut down on the amount of xml configurations that they need to specify. Unfortunately, we still to have some xml configuration, so let's setup our datasources xml in our applicationcontext.xml file.&lt;br /&gt;&lt;br /&gt;Here is the top section of our xml (applicationcontext.xml) file:&lt;br /&gt;&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt; &amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;  xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;  xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;  xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;  xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;  xmlns:jee=&amp;quot;http://www.springframework.org/schema/jee&amp;quot;&lt;br /&gt;  xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;br /&gt;    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;br /&gt;                http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&amp;quot;&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In order to the Atomikos Transaction Manager, our datasources need to be configured&lt;br /&gt;using Atomikos datasource classes. Using other datasources class types won't work.&lt;br /&gt;Here is an example of how to configure the datasources:&lt;br /&gt;&lt;div class='mycode'&gt;&lt;br /&gt;&amp;lt;!-- using Atomikos DataSources --&amp;gt;&lt;br /&gt;    &amp;lt;bean id=&amp;quot;dataSource&amp;quot; class=&amp;quot;com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;uniqueResourceName&amp;quot;&amp;gt;&amp;lt;value&amp;gt;NONXADBMS&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;user&amp;quot;&amp;gt;&amp;lt;value&amp;gt;admin&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;password&amp;quot;&amp;gt;&amp;lt;value&amp;gt;password&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;url&amp;quot;&amp;gt;&amp;lt;value&amp;gt;jdbc:postgresql://localhost/usersdb&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;driverClassName&amp;quot;&amp;gt;&amp;lt;value&amp;gt;org.postgresql.Driver&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;poolSize&amp;quot;&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;borrowConnectionTimeout&amp;quot;&amp;gt;&amp;lt;value&amp;gt;60&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;   &lt;br /&gt;        &lt;br /&gt;    &amp;lt;bean id=&amp;quot;dataSource2&amp;quot; class=&amp;quot;com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;uniqueResourceName&amp;quot;&amp;gt;&amp;lt;value&amp;gt;NONXADBMS2&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;user&amp;quot;&amp;gt;&amp;lt;value&amp;gt;admin&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;password&amp;quot;&amp;gt;&amp;lt;value&amp;gt;password&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;url&amp;quot;&amp;gt;&amp;lt;value&amp;gt;jdbc:postgresql://localhost/accountingdb&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;driverClassName&amp;quot;&amp;gt;&amp;lt;value&amp;gt;org.postgresql.Driver&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;poolSize&amp;quot;&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name=&amp;quot;borrowConnectionTimeout&amp;quot;&amp;gt;&amp;lt;value&amp;gt;60&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;   &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In part 3, we will setup our SessionFactories.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-7481607502393855242?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/7481607502393855242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7481607502393855242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7481607502393855242'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-database.html' title='Using Spring with multiple databases Part 2'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-843431248215746190</id><published>2009-08-11T14:17:00.000-07:00</published><updated>2009-08-12T14:28:27.016-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Multiple Database Java JTA Hibernate'/><title type='text'>Using Spring with multiple databases Part 1</title><content type='html'>This series of articles is about how to use the Spring framework within your application to reference multiple databases or in Java parlance datasources.&lt;br /&gt;In a previous project, I used NHibernate and ActiveRecord and I was able to relatively painlessly use multiple databases.  In Spring, to use multiple databases it took longer since my googling came up with some examples , but not complete enough that when tested gave me what I needed. In the Spring framework world and in the Java world in general there all several database persistences technologies. There is plain vanilla Hibernate, there is JPA via Hibernate, there is JPA via TopLink, there is Spring's HibernateTemplating, and plenty more.  &lt;br /&gt;To setup Spring with multiple databases, we are going to do the following:&lt;br /&gt;Prerequisite:&lt;br /&gt;Download and setup SpringFramework 3.0 from the Trunk.&lt;br /&gt;Download and setup Hibernate 3.5 from the Trunk.&lt;br /&gt;Download and setup Atomikos Transaction Manager. (optional download sources)&lt;br /&gt;&lt;b&gt;1)&lt;/b&gt; Setup our datasources in our applicationcontext.xml&lt;br /&gt;&lt;b&gt;2)&lt;/b&gt; Setup SessionFactory configurations in our applicationcontext.xml&lt;br /&gt;&lt;b&gt;3)&lt;/b&gt; Setup JTATransactionManager configurations in our applicationcontext.xml&lt;br /&gt;&lt;b&gt;4)&lt;/b&gt; Create a custom JTATransactionFactory class to deal with Hibernate bug: HHH-3110&lt;br /&gt;&lt;b&gt;5)&lt;/b&gt; Configure Atomikos (turn off logging on Atomikos)&lt;br /&gt;&lt;b&gt;6)&lt;/b&gt; Configure Dao and Controllers with @Transactional annotation&lt;br /&gt;  Editors Note: Need @Transactional annotation in Controller , having @Transactional in Dao did not always create a Transaction.&lt;br /&gt;&lt;b&gt;7)&lt;/b&gt; Create Unit Tests&lt;br /&gt;&lt;b&gt;8)&lt;/b&gt; Take a break!&lt;br /&gt;&lt;br /&gt;In part 2, we will setup our datasources. In part 3, we will setup our SessionFactories.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-843431248215746190?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/843431248215746190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/843431248215746190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/843431248215746190'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/08/using-spring-with-multiple-databases.html' title='Using Spring with multiple databases Part 1'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-8791693602037348667</id><published>2009-07-01T12:18:00.000-07:00</published><updated>2009-07-01T12:23:44.745-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSocial Gadgets EnduroTracker.com'/><title type='text'>Add Any Gadget to Your Gmail (including ours)</title><content type='html'>After watching a presensation online at Google I/O , they demonstrated that in addition to being able to add gadgets to you google home page ( www.google.com/igoogle), you can also add gadgets to you gmail page.&lt;br /&gt;Here is how you do it:&lt;br /&gt;To add a gadget to the left nav of your Gmail account, follow these steps:&lt;br /&gt;&lt;br /&gt;   1. Go to the 'Labs' tab under Gmail Settings.&lt;br /&gt;   2. Enable the 'Add any gadget by URL' experiment and click 'Save Changes.'&lt;br /&gt;   3. Now you'll have a 'Gadgets' tab under Settings.&lt;br /&gt;   4. Enter the URL of an OpenSocial gadget spec and click 'Add'.&lt;br /&gt;&lt;br /&gt;   In EnduroTracker.com's case the url is: http://endurosocial.googlecode.com/svn/trunk/trunk/qaendurotrackeroauth.xml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-8791693602037348667?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/8791693602037348667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/07/add-any-gadget-to-your-gmail-including.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8791693602037348667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8791693602037348667'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/07/add-any-gadget-to-your-gmail-including.html' title='Add Any Gadget to Your Gmail (including ours)'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-4259256344823709982</id><published>2009-06-17T15:42:00.000-07:00</published><updated>2009-06-17T15:50:29.309-07:00</updated><title type='text'>On Newsstands now, Wired - July 2009 - Athletes - Track your Data</title><content type='html'>As software developer who works on a site that does exactly this,&lt;br /&gt;I was very pleased to see the cover of Wired this month (July 2009) covering&lt;br /&gt;Athletes who now Track their data using Gps devices, heart rate monitors, etc.&lt;br /&gt;and also use different websites similar to mine (&lt;a href="http://www.EnduroTracker.com"&gt;http://www.EnduroTracker.com&lt;/a&gt; )to plan, track, and analyze their data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-4259256344823709982?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/4259256344823709982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/06/on-newsstands-now-wired-july-2009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4259256344823709982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4259256344823709982'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/06/on-newsstands-now-wired-july-2009.html' title='On Newsstands now, Wired - July 2009 - Athletes - Track your Data'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-4894733542757473404</id><published>2009-06-11T14:25:00.001-07:00</published><updated>2009-06-11T14:27:30.933-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSocial OAuth Gadgets Castle MonoRail'/><title type='text'>Gadgets and Widgets Oh My!</title><content type='html'>In this blog post I thought I would talk about OpenSocial Gadgets since Google starting promoting Gadgets last week by way&lt;br /&gt;of having celebrities share their iGoogle setup with selected Gadgets.&lt;br /&gt;    At a high level a container site like iGoogle (&lt;a title="http://www.google.com/igoogle" href="http://www.google.com/igoogle" id="kekd"&gt;http://www.google.com/igoogle&lt;/a&gt;) let's users add gadgets to their customizable home page.&lt;br /&gt;A gadget is a web application in itself, and can do pretty much anything a standard web page can do (except its real estate/size on page is restricted).&lt;br /&gt;For example, you can add Espn's gadget to your iGoogle page, and it will display headlines from Espn. You can also add things like a weather gadget, and even a Google gmail gadget so you can read your email without leaving iGoogle. As an avid internet user I find that after a while, I can end up with 20 or more browser tabs or browser windows open when I'm browsing thru my favorite sites. However, if all my favorite sites had gadgets I could just have 1 tab open to iGoogle and I browse my favorites from all in one place. It is great for consolidating and streamlining how you use the internet.&lt;br /&gt;Being a fan of making users internet experience better, I took the plunge and developed a OpenSocial Gadget for &lt;a title="http://www.EnduroTracker.com" href="http://www.endurotracker.com/" id="dnrc"&gt;http://www.EnduroTracker.com. &lt;/a&gt;&lt;br /&gt;To add the Gadget to your iGoogle page just click the google icon on the bottom of the site.&lt;br /&gt;If you are developer and want to take the plunge I have a few suggestions.&lt;br /&gt;There is some good documentation out there. The first documentation to read is the igoogle developer's guide, &lt;a title="http://code.google.com/apis/igoogle/docs/igoogledevguide.html" href="http://code.google.com/apis/igoogle/docs/igoogledevguide.html" id="wvkc"&gt;http://code.google.com/apis/igoogle/docs/igoogledevguide.html&lt;/a&gt;&lt;br /&gt;After reading thru the majority of this documentation, it is a good idea to create a simple Hello World gadget using google's sandbox.&lt;br /&gt;    If you need to utilize security/authentication to pull data from your site, then you will need to implement OAuth. It is a good idea to first read the documentation and demos&lt;br /&gt;at &lt;a title="http://oauth.net" href="http://oauth.net/" id="r.xj"&gt;http://oauth.net  . &lt;/a&gt;&lt;br /&gt;A good code example of using OAuth from both a provider and consumer perspective, is &lt;a title="http://lab.madgex.com/oauth-net/" href="http://lab.madgex.com/oauth-net/" id="v336"&gt;http://lab.madgex.com/oauth-net/&lt;/a&gt;&lt;br /&gt;    If you are going down the OAuth path and are choosing to create a Gadget for iGoogle, your site will need to implemented an OAuth Provider.&lt;br /&gt;I have implemented an OAuth provider using the Open Source MVC framework for .Net (C#) Castle MonoRail, if anyone using Castle MonoRail is interested in&lt;br /&gt;viewing or using my OAuth provider code let me know by leaving a comment and I can share it via code.google.com.&lt;br /&gt;In a nutshell, you will need a Container (iGoogle), a OAuth provider (your site), and your Gadget code (an xml file).&lt;br /&gt;Once you have picked your Container (google has one as does yahoo, myspace, etc), written your OAuth provider code, and have a some Gadget code,&lt;br /&gt;you should test all your code locally. This way you can have your own local sandbox to step thru your code as you work out the kinks.&lt;br /&gt;How can I implement a Container like igoogle locally? Well, the short answer is that you can use Shindig which is an open source container.&lt;br /&gt;It is available here: &lt;a title="http://incubator.apache.org/shindig/" href="http://incubator.apache.org/shindig/" id="tyls"&gt;http://incubator.apache.org/shindig/ &lt;/a&gt;&lt;br /&gt;If you want to setup Shindig, see my March 16th blog entry below.&lt;br /&gt;&lt;a title="http://incubator.apache.org/shindig/" href="http://incubator.apache.org/shindig/" id="tyls"&gt;&lt;/a&gt; There are major benefits to using OpenSocial and OAuth. Both projects are standards driven meaning that they work with lots of different sites and vendors&lt;br /&gt;to come up with best standards for all parties involved. This means that lots of sites are using OpenSocial and OAuth. The major players being Google, Yahoo,&lt;br /&gt;Twitter, and MySpace. Once you implemented OpenSocial and OAuth for one of these sites, it will be very easy to integrate with the other sites. This means developers&lt;br /&gt;don't have to write separate integration code for each site. Developers can use the DRY principle (don't repeat yourself).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-4894733542757473404?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/4894733542757473404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/06/gadgets-and-widgets-oh-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4894733542757473404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4894733542757473404'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/06/gadgets-and-widgets-oh-my.html' title='Gadgets and Widgets Oh My!'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-7762422016323816034</id><published>2009-06-04T15:00:00.000-07:00</published><updated>2009-06-04T15:04:07.851-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fedora 9'/><category scheme='http://www.blogger.com/atom/ns#' term='yum'/><category scheme='http://www.blogger.com/atom/ns#' term='setup'/><title type='text'>Nice Article on General Setup of Fedora 9</title><content type='html'>Here is a decent article on how to setup Fedora 9 in general using yum.&lt;br /&gt;&lt;a href="http://www.mjmwired.net/resources/mjm-fedora-f9.html#yum"&gt;http://www.mjmwired.net/resources/mjm-fedora-f9.html#yum&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mjmwired.net/resources/mjm-fedora-f9.html#yum"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-7762422016323816034?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/7762422016323816034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/06/nice-article-on-general-setup-of-fedora.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7762422016323816034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7762422016323816034'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/06/nice-article-on-general-setup-of-fedora.html' title='Nice Article on General Setup of Fedora 9'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-8439958640360239245</id><published>2009-05-28T11:21:00.000-07:00</published><updated>2009-05-28T11:25:09.594-07:00</updated><title type='text'>New Feature Google Gadget</title><content type='html'>We are proud to now offer the ability to view your current weekly mileage statistics on your Google home page by using our EnduroTracker Gadget.&lt;br /&gt;There are 2 ways to add the EnduroTracker Gadget to your Google home page. The first and easiest is to go to &lt;a href="http://www.EnduroTracker.com"&gt;www.EnduroTracker.com&lt;/a&gt;&lt;br /&gt;and click the Google icon on the bottom of the page.&lt;br /&gt;The second way is to log into your Google home page at &lt;a href="http://www.google.com/ig"&gt;www.google.com/ig&lt;/a&gt;, click Add Stuff link on the top right hand side. On the next page, click on the Add Feed or gadget link located on the left side midway down the page. Enter or paste the following url into the input box: http://endurosocial.googlecode.com/svn/trunk/trunk/qaendurotrackeroauth.xml&lt;br /&gt;To personalize the gadget , click the personalize link within the gadget, and login using your EnduroTracker credentials.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Also you can click the link below, to add the EnduroTracker Gadget to your Google home page&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fusion.google.com/add?source=atgs&amp;amp;moduleurl=http%3A//endurosocial.googlecode.com/svn/trunk/trunk/qaendurotrackeroauth.xml" alt="Add EnduroTracker's Gadget to your Personalized Google Start Page" title="Add EnduroTracker's Gadget to your Personalized Google Start Page"&gt;&lt;img src="http://buttons.googlesyndication.com/fusion/add.gif" alt="Add EnduroTracker's Gadget to your Personalized Google Start Page" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-8439958640360239245?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/8439958640360239245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/05/new-feature-google-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8439958640360239245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8439958640360239245'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/05/new-feature-google-gadget.html' title='New Feature Google Gadget'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-2626317688288272018</id><published>2009-05-18T08:35:00.000-07:00</published><updated>2009-05-18T08:37:14.341-07:00</updated><title type='text'>New Amazon EC2 Features</title><content type='html'>Amazon EC2 just added some higher level applications/services&lt;br /&gt;like AutoScaling, Load Balancing, and Monitoring , link : &lt;a href="http://aws.amazon.com/autoscaling/"&gt;http://aws.amazon.com/autoscaling/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Setting up Load Balancing and Monitoring on your own is straight forward, but AutoScaling is not easy.  AutoScaling could be extremely useful to most people using EC2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-2626317688288272018?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/2626317688288272018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/05/new-amazon-ec2-features.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2626317688288272018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/2626317688288272018'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/05/new-amazon-ec2-features.html' title='New Amazon EC2 Features'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-875731629318651676</id><published>2009-03-16T15:04:00.001-07:00</published><updated>2009-04-01T17:14:25.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSocial OAuth Gadgets Shindig Social Developer Java'/><title type='text'>OpenSocial using OAuth and ShinDig</title><content type='html'>&lt;b&gt;OpenSocial &lt;/b&gt;is a standard to allow social websites to communicate with other social websites.&lt;br /&gt;For example developers can create widgets/gadgets that can be placed on their google home page&lt;br /&gt;(http://www.google.com/ig) that get contacts/friends from twitter.com.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Shindig&lt;/b&gt; is a java application that acts as a container for hosting these gadgets.&lt;br /&gt;&lt;b&gt;OAuth&lt;/b&gt; is the authentication standard for authenticating a user across different sites.&lt;br /&gt;For extensive coverage of OAuth see, &lt;a title="http://oauth.net/" href="http://oauth.net/" id="sezr"&gt;http://oauth.net/&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;In this document , I will discuss how to setup a developer's environment so that he/she can&lt;br /&gt;run a sample OpenSocial gadget using OAuth.&lt;br /&gt;&lt;br /&gt;We will need a Consumer website (site where gadget is hosted), and a OAuth Provider site (where gadget gets its data from).&lt;br /&gt;We will be using Shindig as our &lt;b&gt;Container Site&lt;/b&gt;/ &lt;b&gt;OAuth Consumer&lt;/b&gt; for hosting this sample OpenSocial gadget.&lt;br /&gt;In OAuth parlance Shindig is the Consumer site.&lt;br /&gt;We will use oauth code project from google code as our &lt;b&gt;OAuth Provider site&lt;/b&gt;, &lt;a title="http://oauth.googlecode.com" class="exlink mklink" href="http://oauth.googlecode.com/" rel="nofollow"&gt;http://oauth.googlecode.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this example &lt;b&gt;Shindig (Container Site/OAuth Consumer) &lt;/b&gt;will be run on&lt;b&gt; port 8080&lt;/b&gt;.&lt;br /&gt;OAuth.googlecode will be run on &lt;b&gt;port 9090&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Overview of Steps&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Download, compile/package, configure and run (via Jetty WebServer )oauth provider example site on port 9090&lt;br /&gt;from  &lt;a title="http://oauth.googlecode.com" class="exlink mklink" href="http://oauth.googlecode.com/" rel="nofollow"&gt;http://oauth.googlecode.com&lt;/a&gt;&lt;br /&gt;2. Download, compile, configure , and run in Eclipse IDE the Shindig (Consumer/Container site) using Jetty Webserver on&lt;br /&gt;port 8080 via Maven Jetty Plugin.&lt;br /&gt;3. Apply recommended edits/patches to Shindig&lt;br /&gt;4. Startup OAuth Provider Site via command line.&lt;br /&gt;5. Startup Shindig site via Eclipse using External Tools configuration for Jetty.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prerequisite Software:&lt;br /&gt;&lt;/b&gt;1. Download and Install a SVN client (i.e Tortoise SVN)&lt;b&gt; , &lt;/b&gt;&lt;a title="http://tortoisesvn.tigris.org/" href="http://tortoisesvn.tigris.org/" id="n2q."&gt;http://tortoisesvn.tigris.org/ &lt;/a&gt;&lt;br /&gt;2. Download and Install Java (JDK/JRE) 1.5 or later and set the JAVA_HOME environment variable. See, &lt;a title="http://java.sun.com" href="http://java.sun.com/" id="l1b0"&gt;http://java.sun.com&lt;/a&gt;&lt;br /&gt;3. Download and Install Maven (a build tool like ant but with a ton of features) , &lt;a href="http://maven.apache.org/download.html"&gt;http://maven.apache.org/download.html&lt;/a&gt;&lt;br /&gt;2. Download and Install Eclipse IDE , choose Java EE Developers Version from , &lt;a title="http://www.eclipse.org/downloads/" href="http://www.eclipse.org/downloads/" id="x18v"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br /&gt;3. Install the Maven2 Plugin in Eclipse&lt;br /&gt; Steps:&lt;br /&gt;   A. Help -&amp;gt; Software Updates -&amp;gt; Find and Install&lt;br /&gt;   B. Search for new features to Install&lt;br /&gt;   C. Create a new remote update site for Maven 2 plugin&lt;br /&gt;       Name: Maven2 - Sonatype&lt;br /&gt;       Url: http://m2eclipse.sonatype.org/update/&lt;br /&gt;   D. Select the site and click finish&lt;br /&gt;   E. There are optional dependencies on mylyn and subclipse. Get them here if you don't have them.&lt;br /&gt;link: &lt;a title="http://m2eclipse.sonatype.org/update/" href="http://m2eclipse.sonatype.org/update/" id="to77"&gt;http://m2eclipse.sonatype.org/update/&lt;/a&gt;&lt;br /&gt;       Otherwise, just install the Maven Integration plugin.       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Detail Steps for setting up OAuth provider example site&lt;br /&gt;&lt;/b&gt;1. Using your svn client (Tortoise SVN), download the oauth code from  &lt;a class="exlink mklink" href="http://oauth.googlecode.com/svn/code/java" rel="nofollow"&gt;http://oauth.googlecode.com/svn/code/java&lt;/a&gt;&lt;br /&gt;2. Open a command window, and navigate to download location.&lt;br /&gt;3. at command line: mvn&lt;br /&gt;(This will run the default build step for the oauth project, and will compile the code )&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;Detail Steps for setting up Shindig&lt;br /&gt;Note:&lt;/b&gt; Setting up Shindig in Eclipse was time consuming for me , for some reason the Maven plugin&lt;br /&gt;in Eclipse didn't auto detect all the dependencies, and I had to right click on the Shindig and&lt;br /&gt;select Maven - &amp;gt; Add dependecy -&amp;gt; and add each dependency listed in the pom.xml file.&lt;br /&gt;&lt;br /&gt;Most of the steps here are from: &lt;a title="http://incubator.apache.org/shindig/#tab-building" href="http://incubator.apache.org/shindig/#tab-building" id="lisc"&gt;http://incubator.apache.org/shindig/#tab-building&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup new workspace and project&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    Creating a new workspace eliminates the performance cost from existing projects and makes it easier to manage the&lt;br /&gt;    code.&lt;br /&gt;    &lt;ol&gt;&lt;li&gt;File -&amp;gt; Switch Workspace -&amp;gt; Other...&lt;/li&gt;&lt;li&gt;Select directory to store workspace&lt;br /&gt;      &lt;ul&gt;&lt;li&gt;Do not select a parent directory of the shindig source (e.g. ~/src/shindig) as Eclipse won't allow&lt;br /&gt;&lt;/li&gt;&lt;li&gt;you to&lt;br /&gt;        create the Java project.&lt;/li&gt;&lt;li&gt;Something like &lt;code&gt;~/eclipse/workspaces/shindig&lt;/code&gt; would work fine&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;      &lt;/li&gt;&lt;li&gt;File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;      &lt;ol&gt;&lt;li&gt;Name the project. The instructions below will assume "SHINDIG".&lt;/li&gt;&lt;li&gt;Select 'Create project from existing source' and navigate to &lt;code&gt;.../src/shindig/java&lt;/code&gt;&lt;br /&gt;        &lt;/li&gt;&lt;li&gt;Click Finish&lt;/li&gt;&lt;li&gt;If you see a dialog for "Open Associated Perspective", click Ok. Don't worry about the errors after&lt;br /&gt;        loading as they will be fixed in the next step.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;      &lt;/li&gt;&lt;li&gt;Right-click the project, select &lt;code&gt;Maven : Enable Dependency Management&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Right-click the project, select &lt;code&gt;Maven : Update Project Configuration&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Optionally, if you would like to be able to browse or step into the code of your dependent jars when&lt;br /&gt;      debugging, you need the source jars.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Right-click the project, select &lt;code&gt;Maven : Download Sources&lt;/code&gt; and&lt;br /&gt;      Eclipse will automatically know about these sources when debugging.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can browse them under &lt;code&gt;Maven&lt;br /&gt;      Dependencies&lt;/code&gt; in your project.&lt;/li&gt;&lt;li&gt;If you'll be using AllTests to run tests or generate code coverage stats, adjust the project's output folders.&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Project -&amp;gt; Properties -&amp;gt; Java Build Path -&amp;gt; Source&lt;/li&gt;&lt;li&gt;Locate and open &lt;code&gt;SHINDIG/gadgets/src/test/java&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Select &lt;code&gt;Output Folder: (Default Output Folder)&lt;/code&gt; and click Edit...&lt;/li&gt;&lt;li&gt;Select &lt;code&gt;Specific Output Folder&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Enter &lt;code&gt;target/test-classes&lt;/code&gt; and click OK.&lt;/li&gt;&lt;li&gt;Repeat for &lt;code&gt;SHINDIG/social-api/src/test/java&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Debug using Eclipse&lt;br /&gt;&lt;br /&gt;Overview of Debugging&lt;br /&gt;&lt;/b&gt;You will need to setup an External Tools Configuration in Eclipse to enable the Jetty WebServer.&lt;br /&gt;You will also need to setup a Debugging Configuration in Eclipse.&lt;br /&gt;Another reference site is: &lt;a title="http://cwiki.apache.org/WICKET/maven-jetty-plugin.html" href="http://cwiki.apache.org/WICKET/maven-jetty-plugin.html" id="h1ro"&gt;http://cwiki.apache.org/WICKET/maven-jetty-plugin.html&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Setting Up External Tools Configuration&lt;/b&gt;&lt;br /&gt; Select In Eclipse Run -&amp;gt; External Tools -&amp;gt; External Tools Configuration&lt;br /&gt; Select the New Launch Configuration, name it "Maven-Jetty"&lt;br /&gt; In the Main tab, fill in Location box with your Maven execution location. (i.e D:\Maven\bin\mvn.bat)&lt;br /&gt; In the Main tab, fill in the Working Directory of your Shindig project. ( i.e ${workspace_loc:/SHINDIG} )&lt;br /&gt; In the Main tab, fill in the Arguments box with : jetty:run-war -f pom.xml&lt;br /&gt; Select the Enironment tab, click New Variable enter Name : &lt;b&gt;JAVA_HOME&lt;/b&gt;, value: (location of your JAVA_HOME, i.e c:\SUN\sdk\jdk)&lt;br /&gt; click New again, enter Name: &lt;b&gt;MAVEN_OPTS&lt;/b&gt;,&lt;br /&gt;value: &lt;b&gt;-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8080,server=y,suspend=y&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup Debug Configuration&lt;br /&gt;&lt;/b&gt; Select Run - Debug -&amp;gt; Remote Java Application. Click New Launch Configuration icon, name this: " Debug Maven Jetty".&lt;br /&gt;Fill in the dialog by selecting your &lt;b&gt;project: SHINDIG&lt;/b&gt;.&lt;br /&gt;In the connection properties, &lt;b&gt;set Host to: localhost, Port: 8080.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Patches to Shindig Trunk that you should apply yourself:&lt;/b&gt;&lt;br /&gt;Patch #1&lt;br /&gt;Class: OAuthRequest.java, method: fetchRequestToken&lt;br /&gt;Near Line: 327&lt;br /&gt;Edits:&lt;br /&gt;HttpRequest request = new HttpRequest(&lt;br /&gt;     Uri.parse(accessor.consumer.serviceProvider.requestTokenURL));&lt;br /&gt; request.setMethod(accessorInfo.getHttpMethod().toString());&lt;br /&gt; //Bug - Need to Set authtype as well, otherwise AuthType always&lt;br /&gt; //defaults to NONE via the HttpRequest constructor.&lt;br /&gt; request.setAuthType(realRequest.getAuthType());&lt;br /&gt;&lt;br /&gt;Patch #2&lt;br /&gt;Class: OAuthRequest.java, method: createHttpRequest&lt;br /&gt;Near Line: 485&lt;br /&gt;private HttpRequest createHttpRequest(HttpRequest base,&lt;br /&gt;   List&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt; oauthParams) throws OAuthRequestException {&lt;br /&gt;&lt;br /&gt; OAuthParamLocation paramLocation = accessorInfo.getParamLocation();&lt;br /&gt;&lt;br /&gt; // paramLocation could be overriden by a run-time parameter to fetchRequest&lt;br /&gt;&lt;br /&gt; //bug alert: no need afaik to create a new HttpRequest instance,&lt;br /&gt; //since we pass it the base HttpRequest instance in as a parameter&lt;br /&gt; //The use case of having an authType other than NONE is a real use case&lt;br /&gt; //If we leave this line in then the authType always gets overriden to NONE&lt;br /&gt; //via this constructor new HttpRequest(base)&lt;br /&gt; //HttpRequest result = new HttpRequest(base);&lt;br /&gt; HttpRequest result = base;&lt;br /&gt; // If someone specifies that OAuth parameters go in the body, but then sends a request for&lt;br /&gt; // data using GET, we've got a choice.  We can throw some type of error, since a GET request&lt;br /&gt; // can't have a body, or we can stick the parameters somewhere else, like, say, the header.&lt;br /&gt; // We opt to put them in the header, since that stands some chance of working with some&lt;br /&gt; // OAuth service providers.&lt;br /&gt; if (paramLocation == OAuthParamLocation.POST_BODY &amp;amp;&amp;amp;&lt;br /&gt;     !result.getMethod().equals("POST")) {&lt;br /&gt;   paramLocation = OAuthParamLocation.AUTH_HEADER;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; switch (paramLocation) {&lt;br /&gt;   case AUTH_HEADER:&lt;br /&gt;     result.addHeader("Authorization", getAuthorizationHeader(oauthParams));&lt;br /&gt;     break;&lt;br /&gt;&lt;br /&gt;   case POST_BODY:&lt;br /&gt;     String contentType = result.getHeader("Content-Type");&lt;br /&gt;     if (!OAuth.isFormEncoded(contentType)) {&lt;br /&gt;       throw responseParams.oauthRequestException(OAuthError.INVALID_REQUEST,&lt;br /&gt;           "OAuth param location can only be post_body if post body if of " +&lt;br /&gt;           "type x-www-form-urlencoded");&lt;br /&gt;     }&lt;br /&gt;     String oauthData = OAuthUtil.formEncode(oauthParams);&lt;br /&gt;     if (result.getPostBodyLength() == 0) {&lt;br /&gt;       result.setPostBody(CharsetUtil.getUtf8Bytes(oauthData));&lt;br /&gt;     } else {&lt;br /&gt;       result.setPostBody((result.getPostBodyAsString() + '&amp;amp;' + oauthData).getBytes());&lt;br /&gt;     }&lt;br /&gt;     break;&lt;br /&gt;&lt;br /&gt;   case URI_QUERY:&lt;br /&gt;     result.setUri(Uri.parse(OAuthUtil.addParameters(result.getUri().toString(), oauthParams)));&lt;br /&gt;     break;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Startup OAuth Provider Site via command line&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Open a command window, and change directory to download location of oauth&lt;br /&gt;2. at command line: cd example/oauth-provider&lt;br /&gt;( This is the main directory for the sample oauth-provider website )&lt;br /&gt;3. at command line: mvn -Djetty.port=9090 jetty:run-war&lt;br /&gt;(this will run the oauth-provider website using the jetty webserver on port 9090)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Startup Shindig site via Eclipse using External Tools configuration for Jetty&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Prerequisite:&lt;/b&gt; Create consumer key file using OpenSSL from the command line. Download at: &lt;a title="http://www.openssl.org/related/binaries.html" href="http://www.openssl.org/related/binaries.html" id="eaxh"&gt;http://www.openssl.org/related/binaries.html&lt;/a&gt;&lt;br /&gt;1. Open Command Line and run:&lt;br /&gt; openssl req -newkey rsa:1024 -days 365 -nodes -x509 -keyout testkey.pem -out testkey.pem -subj '/CN=mytestkey'&lt;br /&gt;2. From Command Line run:&lt;br /&gt;openssl pkcs8 -in testkey.pem -out oauthkey.pem -topk8 -nocrypt -outform PEM&lt;br /&gt;3. copy oauthkey.pem to : Shindig\java\server\src\main\webapp\WEB-INF&lt;br /&gt;4. Edit Shindig\java\common\conf\shindig.properties and edit shindig.signing.key-name and shindig.signing.key-file&lt;br /&gt;# OAuth confiugration, including the key file for signing requests&lt;br /&gt;# The URL base to use for full OAuth support (three-legged)&lt;br /&gt;shindig.oauth.state-key=&lt;br /&gt;shindig.oauth.base-url=/oauth/&lt;br /&gt;shindig.oauth.authorize-action=/WEB-INF/authorize.jsp&lt;br /&gt;&lt;b&gt;shindig.signing.key-name=mytestkey&lt;br /&gt;shindig.signing.key-file=/WEB-INF/testkey.pem&lt;br /&gt;&lt;br /&gt;Steps:&lt;br /&gt;&lt;/b&gt;1. Assuming you have the Shindig project open in Eclipse,&lt;br /&gt;select Run - &amp;gt; External Tool Configuration -&amp;gt; select &lt;b&gt;"Maven-Jetty"&lt;/b&gt; ( created in the &lt;b&gt;"Setting Up External Tools Configuration" &lt;/b&gt;above)&lt;br /&gt;2. Next if you want to debug and set breakpoints,&lt;br /&gt; select Run -&amp;gt; Debug Configurations -&amp;gt; select &lt;b&gt;" Debug Maven Jetty"&lt;/b&gt; configuration.&lt;br /&gt;( created in the "&lt;b&gt;Setup Debug Configuration&lt;/b&gt;" step above.&lt;br /&gt;&lt;br /&gt;This is a intial draft, so let me know if additional comments or steps should be added.&lt;br /&gt;Have fun with OpenSocial and Shindig!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-875731629318651676?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/875731629318651676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/03/opensocial-using-oauth-and-shindig.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/875731629318651676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/875731629318651676'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/03/opensocial-using-oauth-and-shindig.html' title='OpenSocial using OAuth and ShinDig'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-3271699337919666925</id><published>2009-02-04T11:12:00.001-08:00</published><updated>2009-02-05T12:20:38.902-08:00</updated><title type='text'>Postgresql Spatial Database (GIS) using PostGIS</title><content type='html'>Postgresql is a open source database that has an add-on module named PostGIS.&lt;br /&gt;PostGis adds support for geographic objects. It allows you to spatial enable your databases.&lt;br /&gt;With the onset of websites like Google maps, having the ability to map locations, map routes, etc, is becoming common place.&lt;br /&gt;With PostGis, I am able to quickly and easily determine distances between 2 locations. I can retrieve longitude and latitude values.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing PostGIS&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I am using Fedora 8, so I needed to install PostGis from source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Install from Source Method&lt;/b&gt;&lt;br /&gt;1)  download, configure, make proj (version 4.6.1)&lt;br /&gt;       notes: yum installs files to /usr/share/pgsql/contrib/lwpostgis.sql, postgis_comments.sql, spatial_ref_sys.sql,&lt;br /&gt;       from source files get installed to /usr/share/lwpostgis.sql, lwpostgis_upgrade.sql, spatial_ref_sys.sql&lt;br /&gt;    &lt;br /&gt;2)   After compiling proj from source,&lt;br /&gt;              a) edit /etc/ld.so.conf&lt;br /&gt;                 add /usr/local/lib&lt;br /&gt;             b) ldconfig&lt;br /&gt;             c) recompile PostGis ( if previously installed)&lt;br /&gt;&lt;br /&gt;3) Compiling PostGis from source,&lt;br /&gt;             a) just run ./configure (without options)&lt;br /&gt;             b) then: make&lt;br /&gt;             c) make install&lt;br /&gt;4) createlang plpgsql [yourdatabase]   &lt;br /&gt;5)  psql -d [yourdatabase] -f lwpostgis.sql&lt;br /&gt;6)  psql -d [yourdatabase] -f spatial_ref_sys.sql&lt;br /&gt;    PostGis is found at &lt;a title="http://postgis.refractions.net" href="http://postgis.refractions.net/" id="fj2z"&gt;http://postgis.refractions.net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-3271699337919666925?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/3271699337919666925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/02/postgresql-spatial-database-gis-using.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/3271699337919666925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/3271699337919666925'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/02/postgresql-spatial-database-gis-using.html' title='Postgresql Spatial Database (GIS) using PostGIS'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-9105106750245674587</id><published>2009-02-04T11:01:00.001-08:00</published><updated>2009-02-05T12:23:06.042-08:00</updated><title type='text'>Amazon Flexible Payments Service Part 3, Co-branded Flow</title><content type='html'>In a typical website, you want your customer to have a payment link that starts the process of them paying for services/products that your site has provided to them via Amazon. This typical process end to end is called Co-Branded UI process in Amazon's FPS documentation.&lt;br /&gt;There are 3 roles in the process: Sender, Caller, and Recipient. The sender is the entity sending money. The Caller is the entity calling the Amazon FPS Api. The recipient is the entity who will receives the payment. Amazon uses tokens to provide secure handle to payment instructions.&lt;br /&gt;In this process 3 tokens are used a Caller token, Recipient token, and Sender token.  Your web application will need to create a Caller Token, and Recipient Token.&lt;br /&gt;In the Co-Branded UI process , once you customer chooses a product/service and payment amount, they get redirected to Amazon's FPS website where they log in using their Amazon account, select their payment method. It is here in this part of the process on the Amazon site where the Sender token is created. After confirming their payment method, and amount on the Amazon site, the user gets redirect back to you site. When they are redirected back to your site, Amazon passes back to your site the Sender token. Your site will need to acquire this sender token information, and then your site will need to formally request/submit a payment authorization to Amazon FPS Webservice.&lt;br /&gt;Amazon can then notify you when payment was successful either via a scheduled job that you create that queries Amazon FPS, or via Instant Payment Notification which requires you to setup a Web Service that Amazon calls when payment is successful. One of the undocumented Payment Transaction Statuses that I found is "Initiated". In their WSDL file they only define: "Success", "Failure". This can cause issues if you are not expecting to receive this status of "Initiated", and are only expecting to the 2 values of "Success" or "Failure".&lt;br /&gt;The best way to get comfortable with Amazon FPS in my humble opinion is to review and work thru the examples and sample applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-9105106750245674587?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/9105106750245674587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/02/amazon-flexible-payments-service-part-3.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/9105106750245674587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/9105106750245674587'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/02/amazon-flexible-payments-service-part-3.html' title='Amazon Flexible Payments Service Part 3, Co-branded Flow'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-7050358742103330125</id><published>2009-02-04T10:33:00.001-08:00</published><updated>2009-02-05T12:24:06.466-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon ec2 fps payments setup'/><title type='text'>Amazon Flexible Payments Service Part 2, Setup</title><content type='html'>In order to use Amazon FPS, you will need to create an aws developer account (Amazon Web Services Account) and sign up for Amazon FPS sandbox account.&lt;br /&gt;Follow the steps in the Amazon FPS Getting Started Guide, &lt;a title="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=913&amp;amp;categoryID=125" href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=913&amp;amp;categoryID=125" id="glx1"&gt;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=913&amp;amp;categoryID=125&lt;/a&gt;&lt;br /&gt;After completing these steps, you should setup you local development environment, and work thru some of sample applications.&lt;br /&gt;I ended up working thru the Java sample applications and rewriting them in C# to get a solid understanding of Amazon FPS.&lt;br /&gt;It is important know what your requirements for you payment application are ahead of time, so that you can pick which features of Amazon FPS you want use. Do you want to retrieve your payment notification from Amazon in a scheduled job or Do you want know instantly when a payment transaction is completed?&lt;br /&gt;If you want to know instantly when a payment transaction is completed and don't want have to deal with creating a scheduled job, then use Amazon's IPN feature (Instant Payment Notification).  IPN requires that you setup a Web Service on your web server that Amazon FPS can access to notify you of payments. If you don't want to setup a Web Service for IPN, you will need to go the scheduled job route.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-7050358742103330125?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/7050358742103330125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/02/amazon-flexible-payments-service-setup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7050358742103330125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7050358742103330125'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/02/amazon-flexible-payments-service-setup.html' title='Amazon Flexible Payments Service Part 2, Setup'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-5361280878490420763</id><published>2009-01-07T12:31:00.000-08:00</published><updated>2009-02-05T12:25:23.484-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery nekohtml javascript automated testing screen scraping'/><title type='text'>Small addition to John Resig's Bringing the Browser to the Server</title><content type='html'>After reading John Resig's article: &lt;a href="http://ejohn.org/projects/bringing-the-browser-to-the-server"&gt;http://ejohn.org/projects/bringing-the-browser-to-the-server&lt;/a&gt; which was written over a year ago. I wanted to try out some of things he demonstrated.&lt;br /&gt;By combining Mozilla's Rhino project with a few javascript files, John was able to do&lt;br /&gt;a number of useful things like automated javascript testing and web screen scraping.&lt;br /&gt;He also outlined some pseudo code for creating a web app environment.&lt;br /&gt;The one thing he ran out of time was integrating an html parser into this setup.&lt;br /&gt;At his suggestion I have integrated the nekohtml html parser into this setup.&lt;br /&gt;In order to use this setup you should follow these steps:&lt;br /&gt;&lt;br /&gt;1. Get jquery source code . Via SVN at http://jqueryjs.googlecode.com/svn/trunk/. Important get REVISION 2302&lt;br /&gt;2. Get Rhino ( source code optional), site: &lt;a href="http://www.mozilla.org/rhino/"&gt;http://www.mozilla.org/rhino/&lt;/a&gt;&lt;br /&gt;3. Get Nekohtml source code, site: &lt;a href="http://nekohtml.sourceforge.net/"&gt;http://nekohtml.sourceforge.net/&lt;/a&gt;&lt;br /&gt;4. Edit /jquery/jquery/build/runtest/env.js (starting at line 135)&lt;br /&gt;window.DOMDocument = function(file){&lt;br /&gt;    this._file = file;&lt;br /&gt;   //OLD&lt;br /&gt;    //this._dom = Packages.javax.xml.parsers.&lt;br /&gt;    //    DocumentBuilderFactory.newInstance()&lt;br /&gt;    //    .newDocumentBuilder().parse(file);&lt;br /&gt;&lt;br /&gt;    //NEW&lt;br /&gt;    var parser = new Packages.org.cyberneko.html.parsers.DOMParser();&lt;br /&gt;    var source = new Packages.org.apache.xerces.xni.parser.XMLInputSource(null,null,null,file,"UTF8");&lt;br /&gt;    parser.parse(source);&lt;br /&gt;    this._dom = parser.getDocument();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    if ( !obj_nodes.containsKey( this._dom ) )&lt;br /&gt;        obj_nodes.put( this._dom, this );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;5. You can run your javascript file via the Rhino Debugger App&lt;br /&gt;command line:&lt;br /&gt;java -cp build/nekohtml.jar;build/nekohtmlXni.jar;build/xml-apis.jar;build/xercesImpl.jar;build/xercesSamples.jar;build/js.jar  org.mozilla.javascript.tools.debugger.Main filename.js&lt;br /&gt;&lt;br /&gt;Note: Some further updates to env.js will be necessary to get it to run the html parser outside the Rhino Debugger App.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-5361280878490420763?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/5361280878490420763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2009/01/small-addtion-tojohn-resigs-bringing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5361280878490420763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5361280878490420763'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2009/01/small-addtion-tojohn-resigs-bringing.html' title='Small addition to John Resig&apos;s Bringing the Browser to the Server'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-4068401377277400138</id><published>2008-12-31T13:57:00.000-08:00</published><updated>2009-01-01T09:06:23.625-08:00</updated><title type='text'>New and Improved www.endurotracker.com</title><content type='html'>After 3 months of work, there is a new and improved &lt;a href="http://www.endurotracker.com/"&gt;www.EnduroTracker.com&lt;/a&gt; site available.&lt;br /&gt;This site is targeted towards the triathlete or endurance athlete who want to plan and track their training sessions from any available internet enabled device (PC, iphone, blackberry, etc).&lt;br /&gt;If you have friends who do endurance sports like Triathlons, bike races, road races, or swim races refer them to www.endurotracker.com. ( a triathlon training log site )&lt;br /&gt;On a technical note, &lt;a href="http://www.endurotracker.com/"&gt;www.EnduroTracker.com&lt;/a&gt; is now using substantial more hardware, and is now using several new redundancy strategies to handle large loads, maximize performance, and deal with hardware disaster scenarios. It uses redundant web servers, and redundant database servers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-4068401377277400138?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/4068401377277400138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/12/new-and-improved-wwwendurotrackercom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4068401377277400138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4068401377277400138'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/12/new-and-improved-wwwendurotrackercom.html' title='New and Improved www.endurotracker.com'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-6840764633436991138</id><published>2008-12-19T11:02:00.000-08:00</published><updated>2008-12-19T11:04:37.713-08:00</updated><title type='text'>Host Names in Linux</title><content type='html'>&lt;p&gt;  &lt;strong&gt;Configure the Hostname&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;On the shoulders of giants, this an excerpt from very detailed post on postfix (smtp software) at&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://souptonuts.sourceforge.net/postfix_tutorial.html"&gt;http://souptonuts.sourceforge.net/postfix_tutorial.html&lt;/a&gt;&lt;br /&gt;&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt; The computer that these examples are taken from is "squeezel.squeezel.com", and it exists on IP address 192.168.1.81. The short name is just squeezel. Another computer, on IP address "192.168.1.155" is "tape.squeezel.com". &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;     /etc/hosts&lt;br /&gt;&lt;br /&gt;   # Do not remove the following line, or various programs&lt;br /&gt;   # that require network functionality will fail.&lt;br /&gt;   127.0.0.1       localhost.localdomain           localhost&lt;br /&gt;   192.168.1.81    squeezel.squeezel.com           squeezel&lt;br /&gt;   192.168.1.155   tape.squeezel.com               tape&lt;br /&gt;&lt;/pre&gt; &lt;p&gt; You may also want to edit "/etc/sysconfig/network" and add or check the following. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;pre&gt;    HOSTNAME=squeezel.squeezel.com&lt;br /&gt;&lt;/pre&gt; &lt;p&gt; Finally, to put all changes into effect now, run the following command with root  privileges. &lt;/p&gt;&lt;p&gt;  &lt;/p&gt;&lt;pre&gt;   $ hostname squeezel.squeezel.com&lt;br /&gt;&lt;/pre&gt; &lt;p&gt; Some of the settings in the postfix "main.cf" file depend upon the hostname.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-6840764633436991138?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/6840764633436991138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/12/host-names-in-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6840764633436991138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6840764633436991138'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/12/host-names-in-linux.html' title='Host Names in Linux'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-4516199232826379456</id><published>2008-12-01T11:31:00.000-08:00</published><updated>2009-02-05T12:26:58.994-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon Flexible Payments Service FPS'/><title type='text'>Amazon Flexible Payments Service (FPS) Part I, An Overview</title><content type='html'>Amazon Flexible Payments Service (FPS) is a set of web services that allow developers create applications to move money from one entity to another. Payment can be in the form of credit cards, bank account , or Amazon Payments balance.&lt;br /&gt;Requests can be made either via SOAP or REST. In my case I had to use REST because Mono (.Net on Linux) has not implemented WSE 2 or WSE 3.&lt;br /&gt;Another important feature to be aware of is Instant Payment Notification (IPN).  This frees up a developer from having to implement a scheduled job that queries Amazon FPS for completion of payments. Because IPN will push (publish) a response to your listening website/webservice for you.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;Getting Started Guide: &lt;a href="http://docs.amazonwebservices.com/AmazonFPS/2007-01-08/FPSGettingStartedGuide/"&gt;http://docs.amazonwebservices.com/AmazonFPS/2007-01-08/FPSGettingStartedGuide/&lt;/a&gt;&lt;br /&gt;Developers Guide: &lt;a href="http://docs.amazonwebservices.com/AmazonFPS/2007-01-08/FPSDeveloperGuide/"&gt;http://docs.amazonwebservices.com/AmazonFPS/2007-01-08/FPSDeveloperGuide/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-4516199232826379456?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/4516199232826379456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/12/amazon-flexible-payments-service-fps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4516199232826379456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4516199232826379456'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/12/amazon-flexible-payments-service-fps.html' title='Amazon Flexible Payments Service (FPS) Part I, An Overview'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-1590023186593812235</id><published>2008-11-18T07:31:00.000-08:00</published><updated>2008-11-18T09:13:43.684-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache fedora ssl Amazon EC2'/><title type='text'>Configuring SSL on a Web Server using Apache</title><content type='html'>Here is a link to an article on setting up SSL on an Apache web server.&lt;br /&gt;&lt;a href="http://www.onlamp.com/pub/a/onlamp/2008/03/04/step-by-step-configuring-ssl-under-apache.html"&gt;http://www.onlamp.com/pub/a/onlamp/2008/03/04/step-by-step-configuring-ssl-under-apache.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These are the steps that I followed from the article:&lt;br /&gt;&lt;br /&gt;I am setting up a qa web server , so I did this :&lt;br /&gt;&lt;span id="intelliTxt"&gt;&lt;p&gt;1) " For testing purposes, or for small LANs, &lt;span style="font-weight: bold;"&gt;you can create a self-signed certificate&lt;/span&gt;. This can be done by issuing this command: "&lt;br /&gt;&lt;/p&gt;  &lt;pre&gt;openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 \&lt;br /&gt;-nodes -keyout server.key -out server.crt \&lt;br /&gt;-subj '/O=Company/OU=Department/CN=www.example.com'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; You will need to have setup a self-signing Certificate&lt;br /&gt;Authority on your server.&lt;/span&gt; &lt;span style="font-family:lucida grande;"&gt;This enables you to create your own temporary&lt;br /&gt;certificates for testing purposes.&lt;/span&gt; &lt;span style="font-family:lucida grande;"&gt;See my blog post on setting up&lt;br /&gt;Email/SMTP on Amazon EC2 for how this is done.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;2) &lt;span style="font-weight: bold;"&gt;Next, I installed mod_ssl on Apache:&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;For Fedora, command line: yum install mod_ssl&lt;br /&gt;&lt;br /&gt;3) &lt;span style="font-weight: bold;"&gt;Update /etc/httpd/conf.d/ssl.conf&lt;/span&gt;,&lt;br /&gt;add a reference to your certificate (server.crt) and your key (server.key),&lt;br /&gt;For example:&lt;br /&gt;#   Server Certificate:&lt;br /&gt;# Point SSLCertificateFile at a PEM encoded certificate.  If&lt;br /&gt;# the certificate is encrypted, then you will be prompted for a&lt;br /&gt;# pass phrase.  Note that a kill -HUP will prompt again.  A new&lt;br /&gt;# certificate can be generated using the genkey(1) command.&lt;br /&gt;&lt;br /&gt;SSLCertificateFile /etc/httpd/certs/server.crt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#   Server Private Key:&lt;br /&gt;#   If the key is not combined with the certificate, use this&lt;br /&gt;#   directive to point at the key file.  Keep in mind that if&lt;br /&gt;#   you've both a RSA and a DSA private key you can configure&lt;br /&gt;#   both in parallel (to also allow the use of DSA ciphers, etc.)&lt;br /&gt;&lt;br /&gt;SSLCertificateKeyFile /etc/httpd/certs/server.key&lt;br /&gt;&lt;br /&gt;4)&lt;span style="font-weight: bold;"&gt; Enable Port 443 on your server and firewall&lt;/span&gt;&lt;br /&gt;(Amazon EC2 command line: &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;strong class="userinput"&gt;&lt;code&gt;&lt;span class="command"&gt;&lt;strong&gt;ec2-authorize&lt;/strong&gt;&lt;/span&gt; default -p 443 )&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt; You now have a QA Web server with a temporary certificate that can run web sites&lt;br /&gt;using SSL ( https ). For production Web servers , you will need to purchase a permanent certificate&lt;br /&gt;from a trusted certificate authority like Verisign.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-1590023186593812235?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/1590023186593812235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/11/configuring-ssl-on-web-server-using.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1590023186593812235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1590023186593812235'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/11/configuring-ssl-on-web-server-using.html' title='Configuring SSL on a Web Server using Apache'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-7371271581101958729</id><published>2008-11-17T20:09:00.001-08:00</published><updated>2008-11-17T20:15:08.903-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Email Smtp PostFix Amazon EC2 Relay Gmail'/><title type='text'>Updated Email Setup on Amazon EC2</title><content type='html'>&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial Black,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;SMTP/Email Setup on Amazon EC2 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;b&gt;Summary&lt;/b&gt;:&lt;br /&gt;Create an Smtp server installation on Amazon EC2 that relays email to&lt;br /&gt;your gmail email account. Gmail has a nice email client so this allows us to leverage gmail’s rich features.  Our smtp software package is postfix.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prerequisites:&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;Familiar with create and launching instances using Amazon EC2, and familiar with editing config files in linux.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;Links to&lt;br /&gt;documentation on Amazon EC2 and how to create and launch instances:&lt;/p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;u&gt;&lt;a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84"&gt;http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;   &lt;br /&gt;1&lt;b&gt;. Install Postfix&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;      &lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;For Fedora 8:  &lt;span style="font-family:Courier New,monospace;"&gt;yum install&lt;br /&gt;postfix&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;   &lt;br /&gt;2&lt;b&gt;. Setup/Install Certificate Authority for Self Signing&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;             &lt;br /&gt;&lt;span style="font-family:Courier New,monospace;"&gt;yum install openssl-perl&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;    &lt;br /&gt;3. &lt;b&gt;Create Server Certificate&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;             &lt;br /&gt;cd /et/pki/tls/misc&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;             &lt;br /&gt;./CA.pl -newca&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;    &lt;br /&gt;4&lt;b&gt;.  Copy cert file to postfix folder&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;span style="font-family:Courier New,monospace;"&gt;cp /etc/pki/CA/cacert.pem&lt;br /&gt;/etc/postfix&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;   &lt;br /&gt;5. &lt;b&gt;Create Certificates (self signed certificates for testing&lt;br /&gt;purposes)&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;openssl&lt;br /&gt;genrsa -out enduro.key 1024&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;openssl&lt;br /&gt;req -new -key enduro.key -out enduro.csr    &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;openssl&lt;br /&gt;req -new -x509 -key &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;enduro.key&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;-out &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;enduro&lt;/span&gt;&lt;/span&gt;.pem&lt;br /&gt;-days 1095&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ol start="6"&gt;&lt;br /&gt;&lt;li&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;b&gt;Authorize Port 587&lt;/b&gt;&lt;/p&gt;At desktop/client command line: ec2-authorize default –p 587&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p class="western" style="margin-left: 0.25in; margin-top: 0.19in; margin-bottom: 0.19in;"&gt;7. &lt;b&gt;Update Postfix Config file, master.cf&lt;/b&gt;&lt;/p&gt;            This file is located in /etc/postfix/master.cf.&lt;br /&gt;          You need to specify port so that service runs on port 587&lt;br /&gt;&lt;p style="margin-left: 0.71in; margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;br /&gt;Sample entry:&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-left: 0.71in; margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;br /&gt;#&lt;br /&gt;==========================================================================&lt;br /&gt;#&lt;br /&gt;service type  private unpriv  chroot  wakeup&lt;br /&gt;maxproc command + args&lt;br /&gt;#            &lt;br /&gt;(yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;#&lt;br /&gt;==========================================================================&lt;br /&gt;127.0.0.1:587   &lt;br /&gt;inet  n       -    &lt;br /&gt;n       -    &lt;br /&gt;-       smtpd&lt;/p&gt;&lt;br /&gt;&lt;ol start="8"&gt;&lt;br /&gt;&lt;li&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;b&gt;Edit 2&lt;sup&gt;nd&lt;/sup&gt;&lt;br /&gt;Postfix config file, main.cf&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p style="margin-left: 0.25in; margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;br /&gt;This file is located in /etc/postfix/main.cf&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-left: 0.25in; margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;br /&gt;I will not detail this entire config file because the configuration&lt;br /&gt;details will depend on your environment. But, in a nutshell you want&lt;br /&gt;to do the following: update the relevant hostname and ips in main.cf&lt;br /&gt;and add something like this to end of main.cf:&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;br /&gt;## TLS&lt;br /&gt;Settings&lt;br /&gt;#auth&lt;br /&gt;smtp_sasl_auth_enable=yes&lt;br /&gt;smtp_sasl_password_maps&lt;br /&gt;= hash:/etc/postfix/sasl_passwd&lt;br /&gt;&lt;br /&gt;#tls&lt;br /&gt;smtp_use_tls =&lt;br /&gt;yes&lt;br /&gt;smtp_sasl_security_options =&lt;br /&gt;noanonymous&lt;br /&gt;smtp_sasl_tls_security_options =&lt;br /&gt;noanonymous&lt;br /&gt;smtp_tls_note_starttls_offer = yes&lt;br /&gt;tls_random_source&lt;br /&gt;= dev:/dev/urandom&lt;br /&gt;smtp_tls_scert_verifydepth =&lt;br /&gt;5&lt;br /&gt;smtp_tls_key_file=/etc/postfix/enduro.key&lt;br /&gt;smtp_tls_cert_file=/etc/postfix/enduro.pem&lt;br /&gt;smtpd_tls_ask_ccert&lt;br /&gt;= yes&lt;br /&gt;smtpd_tls_req_ccert =no&lt;br /&gt;smtp_tls_enforce_peername = no&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="western" style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;b&gt;9. Also make sure you have this entry in main.cf&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="western" style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;br /&gt;relayhost = [smtp.gmail.com]:587&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="western" style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;b&gt;10. Using vi or your favorite editor, create the follwing file,&lt;br /&gt;/etc/postfix/sasl_passwd&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="western" style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;&lt;br /&gt; and using this format below for its content, add your email&lt;br /&gt;address and password:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt; #&lt;br /&gt;Contents of sasl_passwd&lt;br /&gt;  #&lt;br /&gt;  [smtp.gmail.com]:587       &lt;br /&gt;  myemail@gmail.com:pa33w0r8&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;11. &lt;b&gt;Now test&lt;br /&gt;this file&lt;/b&gt; by running this simple "hash" key test.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;$&lt;br /&gt;postmap -q [smtp.gmail.com]:587 sasl_passwd&lt;br /&gt; &lt;br /&gt;myemail@gmail.com:pa33w0r8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0.19in;"&gt;12. &lt;b&gt;You'll&lt;br /&gt;need to protect your password so that only the postfix group and root&lt;br /&gt;can read it by changing the access rights as follows:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;$&lt;br /&gt;chown root.postfix sasl_passwd*&lt;br /&gt;  $ chmod 0640 sasl_passwd*&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-left: 0.25in; margin-top: 0.19in; margin-bottom: 0in;"&gt;&lt;br /&gt;( PostFix binary location: /usr/sbin/postfix )&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;13.&lt;b&gt;Start&lt;br /&gt;PostFix&lt;/b&gt;,&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;command line:&lt;br /&gt;postfix start&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;14. &lt;b&gt;Use sendmail&lt;br /&gt;from command line to test:&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;Cmd line&lt;span style="font-family:Courier New,monospace;"&gt;:&lt;br /&gt;sendmail mytargetemail@gmail.com this is test&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;Next: Hit Enter ,&lt;br /&gt;then type a dot, then Hit Enter&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;(Note: make sure&lt;br /&gt;Sendmail is started (cmd line: service sendmail restart)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;(Note: logs errors&lt;br /&gt;to /var/log/maillog)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.19in; margin-bottom: 0in;"&gt;Alternatively Test&lt;br /&gt;Sendmail using  this by creating a text file (mail.txt) in the below&lt;br /&gt;format)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;date:&lt;br /&gt;&lt;i&gt;todays-date&lt;/i&gt;&lt;br /&gt;to: &lt;i&gt;user@domain.com&lt;/i&gt;&lt;br /&gt;subject:&lt;br /&gt;&lt;i&gt;subject&lt;/i&gt;&lt;br /&gt;from: &lt;i&gt;your-name@domain.com&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Body of&lt;br /&gt;message goes here&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;Then call sendmail with&lt;br /&gt;that file as an input:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Command&lt;br /&gt;line: /usr/sbin/sendmail &lt;i&gt;email-address&lt;/i&gt; &amp;lt; &lt;i&gt;mail.txt&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;Or you can use the &lt;i&gt;-t&lt;/i&gt;&lt;br /&gt;option to to tell sendmail to read the header of the message to&lt;br /&gt;figure out who to send it to.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Command&lt;br /&gt;line: /usr/sbin/sendmail -t &amp;lt; &lt;i&gt;mail.txt&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;This will process the&lt;br /&gt;&lt;b&gt;To:&lt;/b&gt; and &lt;b&gt;CC:&lt;/b&gt; lines for you and send the mail to the&lt;br /&gt;correct addresses.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-7371271581101958729?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/7371271581101958729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/11/updated-email-setup-on-amazon-ec2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7371271581101958729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/7371271581101958729'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/11/updated-email-setup-on-amazon-ec2.html' title='Updated Email Setup on Amazon EC2'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-1811276934057236356</id><published>2008-11-12T12:11:00.000-08:00</published><updated>2008-11-17T20:14:29.483-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Docs Blogs BlogSpot Publishing'/><title type='text'>Blogspot Tip of the Day, You can use Google Docs to Publish directly to your blog</title><content type='html'>Blogging Tip of The Day, You can use Google Docs to Publish directly to your blog.&lt;br /&gt;&lt;br /&gt;For example so you are writing a long article (in my case long technical thing), it is much easier&lt;br /&gt;to write something using a word processor like Word or Google Docs.&lt;br /&gt;If you write something in Google Docs, you have the option to "Publish as Web Page"&lt;br /&gt;within this option you can then choose to publish it to your Blog.&lt;br /&gt;If it is to blogspot, you click configure your blogspot settings, enter your info then click Publish to Blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-1811276934057236356?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/1811276934057236356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/11/blogspot-tip-of-day-you-can-use-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1811276934057236356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/1811276934057236356'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/11/blogspot-tip-of-day-you-can-use-google.html' title='Blogspot Tip of the Day, You can use Google Docs to Publish directly to your blog'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-6468660752888430332</id><published>2008-11-12T12:01:00.001-08:00</published><updated>2009-06-04T16:55:41.132-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mono Fedora .Net Framework Open Source'/><title type='text'>Mono on Fedora 9 - Installation/Setup/Configuration</title><content type='html'>Previously, I have setup Mono on Fedora 8 using a prebuilt image.&lt;br /&gt;&lt;br /&gt;See blog post: http://endurotracker.blogspot.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;Install and configure Mono (.net framework) on Fedora 9.&lt;br /&gt;&lt;br /&gt;Notes: Yum did not seem to detect the dependencies of between xsp and mod_mono&lt;br /&gt;if you follow the order of the steps at : http://www.inprose.com/articles/10-enable-aspnet-support-in-fedora-linux.html&lt;br /&gt;You end up with fc9 version of mod_mono, but a fc10 version of xsp which is bad.&lt;br /&gt;You want all your libraries to be a  fc10 version.&lt;br /&gt;Your web server, Apache can be the fc9 version.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Steps:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) Install Apache fc9: yum install httpd&lt;br /&gt;2) Disable SELinux, from UI , click System -&amp;gt; Administration -&amp;gt; SELinux Management ( from linked article above mentions that from command line: setenforce 0 , but I could not get this to work)&lt;br /&gt;3) Install fc10 mod_mono from rawhide repository ( which depends on mono-core, mono-web, and xsp, so this will can installed all at the same time in this step):&lt;br /&gt;  yum install --enablerepo=rawhide mod_mono&lt;br /&gt;4) Grant permissions to apache user to execute and create directories under var/run ( apache runs under user: apache by default), command line: chmod 777 /var/run -R &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5) After the successful install we need to configure Apache to allow it to run Mono applications (typical usage asp.net web pages, and .asmx web services).&lt;br /&gt;In this test case , we are using the test asp.net pages that got installed under /usr/lib/xsp/test when we installed xsp above in the install mod_mono step.&lt;br /&gt;On completion of this step, we can open our browser and go to http://localhost/test to see our Mono Test Page in action.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Edit /etc/httpd/conf/httpd.conf&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Add these entries to the end of the file:&lt;br /&gt;#Test Mono Setup&lt;br /&gt;MonoAutoApplication enabled&lt;br /&gt;MonoServerPath test /usr/bin/mod-mono-server2&lt;br /&gt;Alias test "/usr/lib/xsp/test"&lt;br /&gt;MonoApplications test "/test:/usr/lib/xsp/test"&lt;br /&gt;&lt;location&gt;&lt;br /&gt; MonoSetServerAlias test&lt;br /&gt; SetHandler mono&lt;br /&gt;&lt;/location&gt;&lt;br /&gt;MonoSetEnv MONO_IOMAP=all&lt;pre&gt;&lt;/pre&gt;6) Done! Go to go to http://localhost/test to test your setup.&lt;br /&gt;&lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-6468660752888430332?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/6468660752888430332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/11/mono-on-fedora-9-installationsetupconfi.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6468660752888430332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6468660752888430332'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/11/mono-on-fedora-9-installationsetupconfi.html' title='Mono on Fedora 9 - Installation/Setup/Configuration'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-6677385058848392156</id><published>2008-11-10T11:14:00.000-08:00</published><updated>2008-11-10T11:30:53.447-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon FPS Flexible Payment Service'/><title type='text'>Amazon Flexible Payment Service , A Series of Blog Posts</title><content type='html'>I am planning to write a series of  blog posts detailing my experience&lt;br /&gt;with Amazon's Flexible Payment Service.(&lt;a href="http://aws.amazon.com/fps/"&gt;http://aws.amazon.com/fps/&lt;/a&gt;) Amazon's offering competes with PayPal, Google Checkout, http://www.authorize.net/, and other payment api's.&lt;br /&gt;&lt;br /&gt;I am creating a series of blogs because Amazon's FPS API is a large offering and a single blog post would only skim the surface.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Series topics will include:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Overview of Amazon FPS&lt;/span&gt;, &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Setting up your Environment/Creating your FPS account&lt;/span&gt;,  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Creating Payment Instructions&lt;/span&gt;,&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Creating a database to store submitted transactions&lt;/span&gt;,&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Using Co-Branded UI&lt;/span&gt;,&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Creating Pay Request&lt;/span&gt;,&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Pull Method - Create a Job to Polling Amazon's FPS Service for successful Pay Request&lt;/span&gt;,&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Push Method - Use Amazon Notifications to get Status of Pay Requests&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-6677385058848392156?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/6677385058848392156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/11/amazon-flexible-payment-service-series.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6677385058848392156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/6677385058848392156'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/11/amazon-flexible-payment-service-series.html' title='Amazon Flexible Payment Service , A Series of Blog Posts'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-5009655043457893229</id><published>2008-09-28T21:19:00.000-07:00</published><updated>2008-10-01T10:50:16.707-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JQuery MonoRail'/><title type='text'>JQuery and MonoRail</title><content type='html'>Over the weekend, I made the move from RC3 of Monorail (http://castleproject.org) to the Trunk of Monorail targeting .Net 2.0.&lt;br /&gt;&lt;br /&gt;I took this opportunity because, Ayende (http://ayende.com/blog/) released some code on the Castle project mailing list as well as being added to the Trunk that helps people who prefer JQuery as one of their Javascript library. Ayende shared a JQueryGenerator class and a JQueryElementGenerator class.&lt;br /&gt;&lt;br /&gt;Side Note to avoid conflicts with other javascript libraries add this to you layout template wrapped in the script tag:&lt;br /&gt;       &lt;span style="font-weight:bold;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;          {&lt;br /&gt;          var jQuery = jQuery.noConflict();&lt;br /&gt;          });&lt;br /&gt;       &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I starting using them and created a few personal Unit test classes to test them. These test classes at the moment do not have full coverage, but they are a start.&lt;br /&gt;When targeting the .Net 2.0 framework I ran into an issue with JSGeneratorDispatcher when it called a the hide method on JSQueryGenerator class. The resolution ended up being to add a params attribute to the method signature of methods that have an array in the signature. &lt;span style="font-weight:bold;"&gt;(Important: This is now patched in the trunk)&lt;/span&gt;&lt;br /&gt;For example changing:&lt;br /&gt;public override void Hide(string[] ids)&lt;br /&gt; {&lt;br /&gt;  SelectRelevantElements(ids);&lt;br /&gt;  CodeGenerator.Write(".hide();");&lt;br /&gt; }&lt;br /&gt;To:&lt;br /&gt;public override void Hide(params string[] ids)&lt;br /&gt; {&lt;br /&gt;  SelectRelevantElements(ids);&lt;br /&gt;  CodeGenerator.Write(".hide();");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Steps to use JQuery in MonoRail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I recommend:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1)&lt;/span&gt; Either commenting out the other javascript libraries referenced in your layout view, or adding an alias for JQuery and wrap this in script tag.&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;          {&lt;br /&gt;          var jQuery = jQuery.noConflict();&lt;br /&gt;          });&lt;br /&gt;       &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2)&lt;/span&gt; Add JQuery to you layout:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;script type="text/javascript" src="$siteroot/content/js/jquery-1.2.6.js"&amp;gt; &amp;lt/script&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3)&lt;/span&gt; Use the latest Monorail source code from the Trunk, to take advantage of Javascript Generation using JQuery as you default.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update global.asax.cs&lt;/span&gt; , add :&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;using Castle.MonoRail.Framework.JSGeneration;&lt;br /&gt;using Castle.MonoRail.Framework.JSGeneration.jQuery;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;also add method To Your Global.asax:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;public void Configure(IMonoRailConfiguration config)&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;           config.JSGeneratorConfiguration.AddLibrary("jquery-1.2.6", typeof(JQueryGenerator))&lt;br /&gt;           .AddExtension(typeof(CommonJSExtension))&lt;br /&gt;           .SetAsDefault();&lt;br /&gt;&lt;br /&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3)&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;Create yourself a helper class&lt;/span&gt; for JQuery to make it easier to create Ajax calls, etc. via JQuery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-5009655043457893229?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/5009655043457893229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/09/jquery-and-monorail.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5009655043457893229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5009655043457893229'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/09/jquery-and-monorail.html' title='JQuery and MonoRail'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-8916954274061919264</id><published>2008-08-28T16:25:00.000-07:00</published><updated>2008-11-17T08:42:53.081-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon EC2 PostgreSql'/><title type='text'>Cloud Computing: Setup Postgresql to use Amazon Elastic Block Store (EBS)</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Cloud Computing: Setup Postgresql to use Amazon Elastic Block Store (EBS)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Prerequisites: Familiar with creating and launching instances using Amazon EC2, and familiar with editing config files in linux. Also make sure that Postgresql is installed on your instance, see installation steps at &lt;a href="http://endurotracker.blogspot.com/"&gt;http://endurotracker.blogspot.com&lt;/a&gt; .&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Overview&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;We will follow the same initial steps as outlined on Amazon’s developer website ( &lt;a href="http://developer.amazonwebservices.com/"&gt;http://developer.amazonwebservices.com&lt;/a&gt; ). The latter steps will be specific to Postgresql.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;h3 style="color: rgb(51, 51, 51);"&gt;1) Creating an Amazon EBS Volume&lt;/h3&gt;  &lt;p&gt;In this example, the user calls the CreateVolume API, specifying an 10 GB volume. &lt;/p&gt;  &lt;p class="style9"&gt;&lt;b&gt;$ ec2-create-volume --size 10 --availability-zone us-east-1a&lt;/b&gt; &lt;/p&gt;  &lt;p class="style9"&gt;VOLUME vol-4d826724 858993459200 creating 2008-02-14T00:00:00+0000&lt;b&gt; &lt;/b&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;b&gt;&lt;span style="" lang="FR"&gt;$ ec2-describe-volumes vol-4d826724&lt;/span&gt;&lt;/b&gt;&lt;span style="" lang="FR"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="style91"&gt;&lt;span style="" lang="FR"&gt;VOLUME vol-4d826724 858993459200 available 2008-02-14T00:00:00+0000 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h3 style="color: rgb(51, 51, 51);"&gt;2) Attach the Amazon EBS Volume to an Instance&lt;/h3&gt;  &lt;p&gt;In this example, the user calls the AttachVolume API to attach the volume vol-4d826724 to the instance i-6058a509 and expose it as the device /dev/sdh. &lt;/p&gt;  &lt;p&gt;&lt;span class="style91"&gt;&lt;b&gt;$ ec2-attach-volume vol-4d826724 -i i-6058a509 -d /dev/sdh &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="style9"&gt;ATTACHMENT vol-4d826724 i-6058a509 /dev/sdh attaching 2008-02-14T00:&lt;st1:time minute="0" hour="15"&gt;15:00&lt;/st1:time&gt;+0000&lt;/p&gt;  &lt;h3 style="color: rgb(51, 51, 51);"&gt;3) Describing Volumes and Instances&lt;/h3&gt;  &lt;p&gt;After creating Amazon EBS volumes and attaching them to instances, you can list them using the DescribeVolumes and the DescribeInstances functions.&lt;/p&gt;  &lt;p&gt;To list all volumes owned by the user, including their status, the user invokes the DescribeVolumes function. &lt;/p&gt;  &lt;p&gt;&lt;span class="style91"&gt;&lt;b&gt;$ ec2-describe-volumes &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="style9"&gt;VOLUME vol-4d826724 858993459200 in-use 2008-02-14T00:&lt;st1:time minute="0" hour="0"&gt;00:00&lt;/st1:time&gt;+0000 &lt;/p&gt;  &lt;p class="style9"&gt;ATTACHMENT vol-4d826724 i-6058a509 /dev/sdh attached 2008-02-14T00:&lt;st1:time minute="17" hour="0"&gt;00:17&lt;/st1:time&gt;+0000 &lt;/p&gt;  &lt;p class="style9"&gt;VOLUME vol-50957039 13958643712 available 2008-02-091T00:&lt;st1:time minute="0" hour="0"&gt;00:00&lt;/st1:time&gt;+0000 &lt;/p&gt;  &lt;p class="style9"&gt;VOLUME vol-6682670f 1073741824 in-use 2008-02-11T12:&lt;st1:time minute="0" hour="0"&gt;00:00&lt;/st1:time&gt;+0000 &lt;/p&gt;  &lt;p class="style9"&gt;ATTACHMENT vol-6682670f i-69a54000 /dev/sdh attached 2008-02-11T13:56:00+0000&lt;/p&gt;  &lt;p&gt;The function returns the volume ID, capacity, status (in-use or available) and creation time of each volume. If the volume is attached, an attachment line shows the volume ID, the instance ID to which the volume is attached, the device name exposed to the instance, its status (attaching, attached, detaching, detached) and when it was attached. &lt;/p&gt;  &lt;p&gt;The user can also view volumes that are attached to running instances by using the DescribeInstances function. &lt;/p&gt;  &lt;p class="style9"&gt;&lt;b&gt;$ ec2-describe-instances&lt;/b&gt;&lt;/p&gt;  &lt;p class="style9"&gt;RESERVATION r-e112fc88 416161254515 default&lt;/p&gt;  &lt;p class="style9"&gt;INSTANCE i-3b887c52 ami-3fd13456 ec2-67-202-27-216.compute-1.amazonaws.com domU-12-31-38-00-35-94.compute-1.internalrunning gsg-keypair 0 m1.small 2007-11-26T13:&lt;st1:time minute="35" hour="20"&gt;20:35&lt;/st1:time&gt;+0000 vol-4d826724&lt;/p&gt;  &lt;p class="style9"&gt;RESERVATION r-e612fc8f 416161254515 default&lt;/p&gt;  &lt;p class="style9"&gt;INSTANCE i-21b63c22 ami-3fd13456 ec2-67-202-18-227.compute-1.amazonaws.com domU-12-31-38-00-39-28.compute-1.internalrunning gsg-keypair 0 m1.small 2007-11-26T13:&lt;st1:time minute="51" hour="21"&gt;21:51&lt;/st1:time&gt;+0000 vol-6682670f,vol-50957039&lt;/p&gt;  &lt;p style="font-weight: bold;" class="style9"&gt;4) Create ext3 filesystem on persistence volume (Amazon EBS) and mount the volume&lt;/p&gt;  &lt;p class="style9"&gt;Command line:&lt;span style=""&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style=""&gt;yes | mkfs -t ext3 /dev/sdh&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:11;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;span style=""&gt;Command line&lt;/span&gt;&lt;span style=""&gt;:&lt;b&gt;&lt;span style=""&gt;  &lt;/span&gt;mkdir /mnt/pgsql&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;b&gt;Command Line: &lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;mount /dev/sdh /mnt/pgsql&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="style9"&gt;5) &lt;span style=""&gt; &lt;/span&gt;Stop Postgresql if it is already running on your instance&lt;/p&gt;  &lt;p class="style9"&gt;&lt;span style=""&gt;   &lt;/span&gt;Cmd line: &lt;span style=""&gt;service postgresql stop&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;span style="font-weight: bold;"&gt;6) Copy postgresql folders to /mnt/pgsql&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="style9"&gt;On Fedora 8, the folder is /var/lib/pgsql, copy the contents of the folder to /mnt/pgsql.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="style9"&gt;7) Change the owner of /mnt/pgsql to postgres user, and initial db cluster&lt;/p&gt;  &lt;p class="style9"&gt;Command line: &lt;span style=""&gt;chown –R postgres /mnt/pgsql&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;span style=""&gt;&lt;span style=""&gt;          &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;su –postgres&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;span style=""&gt;&lt;span style=""&gt;          &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;initdb –D /mnt/pgsql/data&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="style9"&gt;&lt;span style="font-weight: bold;"&gt;8) Edit postgresql startup script and change all entries from /var/lib/pgsql to /mnt/pgsql&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="style9"&gt;command line:&lt;span style="font-family:courier new;"&gt; vi /etc/rc.d/init.d/postgresql&lt;/span&gt;&lt;/p&gt;&lt;p class="style9"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;9)&lt;/span&gt; Configure postgres for local access  (see previous postgres setup post) (you will need to edit /mnt/pgsql/data/pg_hba.conf and /mnt/pgsql/data/postgresql.conf)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;10) Start postgresql&lt;/span&gt;&lt;p&gt;&lt;span style=""&gt;command line: service postgresql start &lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;10) Enjoy !&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-8916954274061919264?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/8916954274061919264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/08/cloud-computing-setup-postgresql-to-use.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8916954274061919264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/8916954274061919264'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/08/cloud-computing-setup-postgresql-to-use.html' title='Cloud Computing: Setup Postgresql to use Amazon Elastic Block Store (EBS)'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-5883258121106457223</id><published>2008-08-27T18:08:00.000-07:00</published><updated>2008-12-29T08:33:41.066-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon EC2 PostgreSql'/><title type='text'>DB Cloud Computing: Postgresql Setup on Amazon EC2 using Fedora 8</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:14;"  &gt;Postgresql Setup on Amazon EC2 using Fedora 8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:14;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Prerequisites: Familiar with creating and launching instances using Amazon EC2, and familiar with editing config files in linux.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Links to documentation on Amazon EC2 and how to create and launch instances:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84"&gt;http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;click on Technical documentation link.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Thanks goes to this article: &lt;a href="http://www.postgresonline.com/journal/index.php?/archives/45-An-Almost-Idiots-Guide-to-PostgreSQL-YUM.html"&gt;http://www.postgresonline.com/journal/index.php?/archives/45-An-Almost-Idiots-Guide-to-PostgreSQL-YUM.html&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;There are some things missing from that article that I have addressed here.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.25in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;1)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Create Ami instance from pre-existing instance and launch instance.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 3pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 3pt;"&gt;Use ami-0abe5a63 for example, see url: &lt;a href="http://www.nonhostile.com/mono-on-amazon-ec2.asp"&gt;http://www.nonhostile.com/mono-on-amazon-ec2.asp&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 3pt;"&gt;url: &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1616&amp;amp;categoryID=101"&gt;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1616&amp;amp;categoryID=101&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 3pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.25in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;2)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Logon to your instance using an SSH client (in windows you can use Putty)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: -33pt; text-indent: 33pt;"&gt;3)&lt;span style=""&gt;  &lt;/span&gt;Login as root &lt;/p&gt;  &lt;p class="MsoNormal"&gt;4)&lt;span style=""&gt; Edit /etc/yum/pluginconf.d/fastestmirror.conf and add to the end: exclude=postgresql*&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;(differs from the instructions at &lt;a href="http://yum.pgsqlrpms.org/howtoyum.php" target="_blank"&gt;http://yum.pgsqlrpms.org/howtoyum.php&lt;/a&gt; to prevent your YUM update from getting postgresql from other sources)&lt;/p&gt;5) Select the appropriate repository config file for your OS and choose 8.3 from here and navigating thru: &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;u&gt;&lt;a href="http://yum.pgsqlrpms.org/reporpms/repoview/letter_p.group.html" target="_blank"&gt;http://yum.pgsqlrpms.org/reporpms/repoview/letter_p.group.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;Note the install file - should look something like http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-fedora-8.3-4.noarch.rpm&lt;p class="western" style="margin-bottom: 0in;"&gt;6)  Do a wget of the appropriate one: e.g.&lt;br /&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;wget http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-fedora-8.3-4.noarch.rpm&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;"&gt;7)  Next install the rpm config file with:&lt;br /&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;rpm -ivh &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;pgdg-fedora-8.4-1.noarch.rpm&lt;/span&gt;&lt;/span&gt;  &lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;8)&lt;span style=""&gt;  &lt;/span&gt;Install the things that you want. These are the ones we tend to install &lt;/p&gt;  &lt;pre&gt;&lt;code&gt;yum install postgresql&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;yum install postgresql-server&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;yum install postgis&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;yum install pgadmin3&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Note:On Fedora 8, postgresql default location is /var/lib/pgsql/data&lt;/p&gt;  &lt;p class="MsoNormal"&gt;9) Create a user postgres&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;      &lt;/span&gt;Add command prompt &lt;span style=";font-family:&amp;quot;;" &gt;: useradd postgres&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;10) Set new user’s password&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;      &lt;/span&gt;Add command prompt&lt;span style=";font-family:&amp;quot;;" &gt;: passwd postgres&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;11) Initialize postgreSql &lt;/p&gt;  &lt;p class="MsoNormal"&gt;At command prompt:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;chown postgres /var/lib/pgsql/data&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;su postgres&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;initdb –D /var/lib/pgsql/data &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;12) Configure postgresql for local access&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;From command line ( start up vi and add the 2 entries):&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style="font-size:10;"&gt;vi /var/lib/pgsql/data/pg_hba.conf&lt;/span&gt;&lt;/code&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;br /&gt;&lt;code&gt;- add:local all all trust&lt;/code&gt;&lt;br /&gt;&lt;code&gt;host all all 127.0.0.1 255.255.255.255 trust&lt;/code&gt;&lt;br /&gt;&lt;code&gt;host all all 0.0.0.0 255.255.255.255 reject&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style="font-size:10;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style=";font-family:&amp;quot;;" &gt;13) To configure remote access, &lt;span style=""&gt; &lt;/span&gt;from command line, pass in range of external ips to allow access to:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style="font-size:10;"&gt;vi /var/lib/pgsql/data/postgresql.conf&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style="font-size:10;"&gt;listen_addresses = ‘*’&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style="font-size:10;"&gt;vi /var/lib/pgsql/data/pg_hba.conf&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;code&gt;&lt;span style="font-size:10;"&gt;host all all [start ip range] [end ip range] trust&lt;/span&gt;&lt;/code&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;br /&gt;&lt;/span&gt;14) Assuming you have the AMI tools installed on your desktop, from the command line authorize the default port of 5432, by doing the following:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;c:\amitools\ec2-authorize default –p 5432&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Note: Now you can use the Postgres Admin UI Tools (pgAdmin III) from the machines that you granted remote access to. PgAdmin III allows you to administer Postgresql via a GUI. You can get this tool by installing Postgresql on your Windows desktop(s). I recommend this since it makes administration much easier.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;15) Restart Postgresql, from command line (logged in as root):&lt;/p&gt;  &lt;p class="MsoNormal"&gt;service postgresql restart&lt;/p&gt;  &lt;p class="MsoNormal"&gt;16) Create a db if you like, from command line:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;su – postgres&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;createdb db_name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;17) Create a postgresql username with password for new db.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;From command line: (-U postgres  , means username postgres)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;createuser –P –U postgres &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;18) Restart postgresql&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;19) Test your connection&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;login as root, then from command line:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;psql –U db_username db_name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-5883258121106457223?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/5883258121106457223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/08/db-cloud-computing-postgresql-setup-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5883258121106457223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/5883258121106457223'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/08/db-cloud-computing-postgresql-setup-on.html' title='DB Cloud Computing: Postgresql Setup on Amazon EC2 using Fedora 8'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7816298951182073261.post-4899746409786108936</id><published>2008-08-27T18:07:00.000-07:00</published><updated>2008-11-11T12:12:29.220-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mono Asp.net Amazon EC2 MonoRail Cloud'/><title type='text'>Cloud Computing: Mono Setup on Amazon EC2</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:14;"  &gt;Mono Setup on Amazon EC2 with optional config for MonoRail&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Prerequisites: Familiar with create and launching instances using Amazon EC2, and familiar with editing config files in linux.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Links to documentation on Amazon EC2 and how to create and launch instances:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84"&gt;http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;click on Technical documentation link.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;For porting application to Mono see article:&lt;br /&gt;&lt;a href="http://www.mono-project.com/Guide:_Porting_ASP.NET_Applications"&gt;http://www.mono-project.com/Guide:_Porting_ASP.NET_Applications&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 51pt; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;1)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Create Ami instance from pre-existing instance and launch instance.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;Use ami-0abe5a63, see url: &lt;a href="http://www.nonhostile.com/mono-on-amazon-ec2.asp"&gt;http://www.nonhostile.com/mono-on-amazon-ec2.asp&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;url: &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1616&amp;amp;categoryID=101"&gt;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1616&amp;amp;categoryID=101&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 51pt; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;2)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Update Apache on this instance. This instance is a Fedora 8 image with Apache&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=""&gt;  &lt;/span&gt;Edit /etc/httpd/conf/httpd.conf&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;Add these entries to the end to use test app from mono&lt;/b&gt;:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;MonoServerPath default /opt/mono-1.9.1/bin/mod-mono-server2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;Alias / “/opt/mono-1.9.1/lib/xsp/test”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;AddMonoApplications default “/:/opt/mono-1.9.1/lib/xsp/test”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;pre&gt;&lt;location&gt;&lt;/location&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;span style=""&gt; &amp;lt;Location /&amp;gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;" &gt;       &lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;MonoSetServerAlias default&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;span style=""&gt;   &lt;/span&gt;SetHandler mono&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&amp;lt;Location /&amp;gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;Here is other entry example (notice using MonoApplications instead of AddMonoApplications)&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;(not sure why examples differ),&lt;span style=""&gt;  &lt;/span&gt;but both syntax work:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;Alias hellomonoweb “/opt/mono-1.9.1/lib/xsp/hellomonoweb”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;MonoApplications&lt;span style=""&gt;  &lt;/span&gt;“/hellomonoweb:/opt/mono-1.9.1/lib/xsp/hellomonoweb”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&amp;lt;Location /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;SetHandler mono&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/location&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;Important to disable case sensitivity for files and file paths add this entry. This prevents issues like file not found due to differences between Linux and Windows handling of case sensitivity for files and file paths:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;MonoSetEnv MONO_IOMAP=all&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 51pt; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;3)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Optionally, if you are using MonoRail, a .Net implementation of Ruby on Rails ( see castleproject.org), add the following entry to /etc/httpd/conf.d/mod_mono.conf:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 51pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;AddType applications/x-asp-net .rails&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 33pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7816298951182073261-4899746409786108936?l=endurotracker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endurotracker.blogspot.com/feeds/4899746409786108936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://endurotracker.blogspot.com/2008/08/cloud-computing-mono-setup-on-amazon.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4899746409786108936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7816298951182073261/posts/default/4899746409786108936'/><link rel='alternate' type='text/html' href='http://endurotracker.blogspot.com/2008/08/cloud-computing-mono-setup-on-amazon.html' title='Cloud Computing: Mono Setup on Amazon EC2'/><author><name>David</name><uri>http://www.blogger.com/profile/04649792651790612393</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
