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

<channel>
	<title>Swarm of XeBees</title>
	<atom:link href="http://xebee.xebia.in/feed/" rel="self" type="application/rss+xml" />
	<link>http://xebee.xebia.in</link>
	<description>powered by Xebia India</description>
	<lastBuildDate>Thu, 02 Feb 2012 15:10:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Opportunities and Challenges in Social Web Data Mining</title>
		<link>http://xebee.xebia.in/2012/02/02/opportunities-and-challenges-in-social-web-data-mining/</link>
		<comments>http://xebee.xebia.in/2012/02/02/opportunities-and-challenges-in-social-web-data-mining/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 09:34:46 +0000</pubDate>
		<dc:creator>Shruti Khattar</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[data mining]]></category>
		<category><![CDATA[Google Prediction API]]></category>
		<category><![CDATA[social web]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=11222</guid>
		<description><![CDATA[Social Web Analysis focuses on the social, structural,and behavioral aspects of the social network. It is a media which produces up to one third of new Web content. Because the content always grows, is highly competitive and undergoes constant metamorphosis which is  studied by sociologists, physiologists and anthropologists to understand network evolution, belief formation, friendship [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;"> <span face="Times New Roman, serif">Social Web Analysis focuses on the social, structural,and behavioral aspects of the social network. It is a media which produces up to one third of new Web content. Because the content always grows, is highly competitive and undergoes constant metamorphosis which is  studied by sociologists, physiologists and anthropologists to understand network evolution, belief formation, friendship formation, etc. These relations and structural amalgamation influence the behavior and performance of almost all the real world entities. In this blog, I will be taking stock of mining the 'BIG DATA' <span id="more-11222"></span></span></span></p>
<p><strong><span style="font-size: small;" face="Times New Roman, serif"><span size="3"> </span></span></strong></p>
<p><strong><span style="font-size: small;" face="Times New Roman, serif"><span size="3">THE NEW BUZZWORDS FOR CONTENT GENERATION</span></span></strong></p>
<p><span style="font-size: small;"> <a href="http://xebee.xebia.in/2012/02/02/opportunities-and-challenges-in-social-web-data-mining/css-social-media-icons/" rel="attachment wp-att-11231"><img class="alignnone size-full wp-image-11231" title="css-social-media-icons" src="http://xebee.xebia.in/wp-content/uploads/2012/01/css-social-media-icons.png" width="600" height="200" /></a></span></p>
<p><strong><span style="font-size: small;"> </span></strong></p>
<p><strong><span style="font-size: small;"><span face="Times New Roman, serif"><span size="3"><i>Opportunities </i></span></span></span></strong></p>
<p><span style="font-size: small;" face="Times New Roman, serif">Managing the immeasurable data is not easy. But because of its affluence in features and patterns it gives rise to, and a way towards infinite scope of exploring, analyzing and channelizing the output in the desired direction. For example, users can then run Google MapReduce jobs to analyze this data for insight and factors such as new relationships. </span>We can use Google Prediction API is based on pattern matching and recognition approach to generate and filter data. <span style="font-size: small;" face="Times New Roman, serif">Given a set of data examples to train against, you can create applications that can perform the following tasks:</span></p>
<ul>
<li><span style="font-size: small;" face="Times New Roman, serif">Given a user's past viewing habits, predict what other movies or products a user might like.</span></li>
<li><span style="font-size: small;" face="Times New Roman, serif">Categorize emails or blogs as spam or non-spam.</span></li>
<li><span style="font-size: small;" face="Times New Roman, serif">Analyze posted comments about your product to determine whether they have a positive or negative tone.</span></li>
<li><span style="font-size: small;" face="Times New Roman, serif">Guess how much a user might spend on a given day, given his spending history.</span></li>
<li><span style="font-size: small;" face="Times New Roman, serif">Give recommendations on purchases based on his previous transactions</span></li>
</ul>
<p>Step 1 :  <strong>Upload training data </strong> to your Google Cloud Storage account in the bucket space.  This should ideally be in a .txt file or as JSON/GSON. This can be updated as and when needed.</p>
<p>Step 2: <strong>Train the system </strong>TrainingModel's insert method will take the Training data as an input file and analyze it. This is an asynchronous process, so you'll have to query the server periodically to check the status of the training session. Training must be complete before you can start to send queries.</p>
<p>There are 3 ways to interact with Google API:</p>
<ul>
<li>Google API REST client libraries</li>
<li>Apps Script : A JavaScript cloud scripting language</li>
<li>APIs Explorer : An interactive tool that lets you easily try out Google APIs right from your browser</li>
</ul>
<p>Step 3:  Now query the model and it will return the results based on the best guess at the language of your phrase. Each result has a likelihood score associated with it.</p>
<p>Lets dig into the social networking sites. The example of Facebook would be something we all can relate to. The profile of an individual, can provide two types of data. The first one is profile data and the other one is transactional data which can probably be educed from the wall posts, status messages, the communication with friends, the articles they have gone through or read, the apps and the games they have been involved in, the content that they have shared/liked, the pages they have subscribed to, monitoring their activities in timeline and likewise can be used to give meaningful and concrete information to assess the individual s characteristics and traits that can be leveraged for both personal and business gains.</p>
<p><span style="font-size: small;" face="Times New Roman, serif">Blog mining can explore the networking element of blogs, such as the use of hyperlinks between blogs and to outside sources of information. The literary aspect of blogging probes into the personal traits of an individual like nationality, political affiliation, thinking orientation and likewise based on his style. In my opinion, blogs are an important source of sentiment extraction as one is free to give words to their thoughts without sticking to a particular syntactical or semantic boundaries. The nature of posts, the comments that follow, can help in identifying and classifying the like minded people and also in reasoning their interpretations. Ranking the blogs on basis of in-and-out links or number of likes can be used to help determine their significance in the 'BlogSphere'. </span></p>
<p><strong><span style="font-size: small;" face="Times New Roman, serif"><span size="3"><i>Challenges</i></span></span></strong></p>
<p><span style="font-size: small;" face="Times New Roman, serif">Listed below are the weaknesses or limitations for social web mining.</span></p>
<p><span style="font-size: small;" face="Times New Roman, serif"><i>Finding a needle from the haystack</i> : The social web data is heterogeneous and lacks structure. A Web page typically contains a mixture of many kinds of information. The Web is dynamic and the content changes constantly. The arena of social networking data is highly fragmented. </span></p>
<p><span style="font-size: small;" face="Times New Roman, serif"><i>No standards for information retrieval : </i>There are no predefined ways to fetch information or guaranteeing the authenticity of data. </span></p>
<p><span style="font-size: small;" face="Times New Roman, serif"><i>Privacy policies and settings</i>: Media scrutiny, and easy data access to social networking sites is pushing users to designate their profile as private. While this certainly improves privacy, but is a challenge to data mining. </span></p>
<p><span style="font-size: small;" face="Times New Roman, serif"><i>Spam</i> has become a serious problem in blogs and social media, users and to systems that harvest, index and analyze generated content. Two forms of spam are common in blogs. Spam Blogs, or splogs where the entire blog and hosted posts are machine generated, and spam comments where authentic posts feature machine generated comments. They bring a new set of challenges for blog analytics. Similarly, the information derived from social networking sites is not something which can be relied upon completely.<a></a></span></p>
<p><strong><span style="font-size: small;" face="Times New Roman, serif"><span size="3"><i>Conclusion</i></span></span></strong></p>
<p align="left"><span style="font-size: small;" face="Times New Roman, serif">The above mentioned, was the SWOT analysis of social web mining from my point of view. Its versatility will always intrigue researchers and give scope for innovations and algorithms for data mining. But the fact  remains that the Web is a virtual society. It is not only about data, information and services, but also about interactions among people, organizations and automatic systems. They cannot be mapped to actual human responses. However, how close or far it is from the reality will always be a subject of discussion.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/02/02/opportunities-and-challenges-in-social-web-data-mining/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>OpenShift Express &#8212; The Future Of RedHat PaaS</title>
		<link>http://xebee.xebia.in/2012/01/26/openshift-express-the-future-of-redhat-paas/</link>
		<comments>http://xebee.xebia.in/2012/01/26/openshift-express-the-future-of-redhat-paas/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 13:23:42 +0000</pubDate>
		<dc:creator>Shekhar Gulati</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[openshift]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=11145</guid>
		<description><![CDATA[Last couple of days I was at JUDCon India conference held in Bangalore where I gave a session on OpenShift. The JUDCon India was the biggest JUDCon conference ever with more than 800 attendees. Sessions were mainly on topics -- Infinispan, JBoss AS7 , OpenShift, CDI, Rules Engine, and other JBoss tools. I was mainly interested in hearing [...]]]></description>
			<content:encoded><![CDATA[<p>Last couple of days I was at <a data-mce-href="http://www.jboss.org/events/JUDCon/2012/india" href="http://www.jboss.org/events/JUDCon/2012/india">JUDCon India</a> conference held in Bangalore where I gave a session on <a data-mce-href="http://www.slideshare.net/shekhargulati/a-happy-cloud-friendly-java-developer-with-openshift." href="http://www.slideshare.net/shekhargulati/a-happy-cloud-friendly-java-developer-with-openshift.">OpenShift</a>. The JUDCon India was the biggest JUDCon conference ever with more than 800 attendees. Sessions were mainly on topics -- Infinispan, JBoss AS7 , OpenShift, CDI, Rules Engine, and other JBoss tools. I was mainly interested in hearing the thoughts of RedHat guys on OpenShift -- its future, comparison with Cloud Foundry, and when it will be open sourced.<span id="more-11145"></span></p>
<p>The biggest announcement made at the conference was the unification of OpenShift Express and OpenShift Flex Platforms. At first I was disappointed to hear this as I wanted to showcase Flex in my presentation. It was not good to hear one day before the presentation that Flex will not be developed further and will be merged in express.  Someone asked why OpenShift Flex is being abandoned as it has some very good features like AutoScaling, Log Management, MongoDB Replica Sets, Tomcat support,  Cost Calculator and many more. Mark Atwood replied  to this by saying "It was getting difficult to manage two products and two teams which overlap a lot. ". <a href="https://www.redhat.com/openshift/community/author/jimmy-guerrero">Jimmy Guerrero</a> has <a href="http://xebee.xebia.in/2012/01/26/openshift-express-the-future-of-redhat-paas/#comment-7140">commented</a> and shed more light on it.</p>
<blockquote><p>Our motivation for unifying the Flex and Express platforms isn’t because it was difficult to manage two teams and two products, but instead we are being driven by the desire to bring the best features of both platforms into a single user experience called, OpenShift. For us it isn’t the end of Flex, but, rather, the beginning of a single converged solution that is easy to use and has the capabilities that you want.</p>
<p>This way, from the same IDE, GUI or client tools, a user can continue to get the free access to multiple instances and the broad middleware and framework support of Express, coupled with the rich functionality of Flex’s auto-scaling, performance monitoring and log management. And from, your post, it looks like you agree this is best way to go.</p>
<p>&nbsp;</p></blockquote>
<p>In my opinion also this is a right step forward for OpenShift. OpenShift Express has gained more popularity as compared to OpenShift Flex because it is free and easy to use . Express is lightweight, developer oriented, easy to get started with and better suited for creating new applications.  Another reason why I think it is good to have one platform is to avoid porting the applications from one flavor to another. I created a very simple Spring MongoDB application and to make the application run on both platforms I had to change database properties. Also as both the platforms support different cartridges (example RedHat messaging is supported in Flex but not in Express) it would be difficult to port applications across platforms.</p>
<p>Another big news about OpenShift is that it will be open source soon and you will be able to create a private PaaS on your own infrastructure behind company firewalls. I think it is very important for OpenShift if it wants to have the same momentum as Cloud Foundry. This also means that community can add support for cartridges which does not exist in OpenShift.</p>
<p>Overall I think OpenShift is heading in the right direction and it is a wise decision to spend time on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/26/openshift-express-the-future-of-redhat-paas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What made me to choose CXF over Axis2</title>
		<link>http://xebee.xebia.in/2012/01/25/what-made-me-to-choose-cxf-over-axis2/</link>
		<comments>http://xebee.xebia.in/2012/01/25/what-made-me-to-choose-cxf-over-axis2/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 12:11:40 +0000</pubDate>
		<dc:creator>Mukesh Shah</dc:creator>
				<category><![CDATA[Apache CXF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=11063</guid>
		<description><![CDATA[My last assignment required me to expose soap based web service. While exploring I came to know that there are many types of web services, for example JBossWS, GlassFish Metro, Apache CXF, Axis1, Axis2 and likewise. All of them are widely used and were also promising to fulfill most of my requirements. Since I had [...]]]></description>
			<content:encoded><![CDATA[<p>My last assignment required me to expose soap based web service. While exploring I came to know that there are many types of web services, for example  JBossWS, GlassFish Metro, Apache CXF, Axis1, Axis2 and likewise. All of them are widely used and were also promising to fulfill most of my requirements. Since I had to deploy my web service on tomcat web container, I shortlisted Axis2 and Apache CXF for comparison. While working on POC for their comparison, factors mentioned below helped me to choose the appropriate.</p>
<p><strong>Factors in favor of CXF</strong><br />
<span id="more-11063"></span></p>
<ol>
<li>I do not have to download any soap engine as we do when we use Axis2.</li>
<li>Deployment of axis2 is not as easy as CXF because there is no well known plugin available for axis2 which can directly deploy aar file on soap engine.</li>
<li>CXF provides nice and simple integration with service component architecture(SCA) container like Tuscany.</li>
<li>CXF also gives web service standards support, Frontend programming APIs support, Tools support(like xsd to wsdl, wsdl validator, wsdl to soap, wsdl to xml, wsdl to javascript, wsdl to java, java to web service  etc.) and RESTful services support in very simple fashion.</li>
<li>The last but not least is that CXF provides tools to generate java client as well as JavaScript client.</li>
</ol>
<p>Now lets have a glance on the steps which I followed during CXF and Axis2 POCs.</p>
<p><strong>Axis2 POC</strong><br />
Steps followed during POC that describes how to get started with Axis2:-</p>
<p><strong>Step-1:</strong> Download Axis2, which is required as soap engine to process soap based request.<br />
<strong>Step-2:</strong> Create a maven based web project with services. Service class and pom configurations are given below.</p>
<p><strong>service class:</strong></p>
<pre class="brush: plain; title: ; notranslate">
public class StringWebService {
	public String getMessage(String s) {
		return s;
	}
}
</pre>
<p><strong>pom.xml</strong></p>
<pre class="brush: plain; title: ; notranslate">
&lt;dependencies&gt;
		&lt;!--Axis2 Jars --&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;
			&lt;artifactId&gt;axis2&lt;/artifactId&gt;
			&lt;version&gt;1.4&lt;/version&gt;
		&lt;/dependency&gt;
	&lt;/dependencies&gt;
	&lt;build&gt;
		&lt;plugins&gt;
			&lt;plugin&gt;
				&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;
				&lt;artifactId&gt;axis2-aar-maven-plugin&lt;/artifactId&gt;
				&lt;version&gt;1.4.1&lt;/version&gt;
				&lt;configuration&gt;
					&lt;aarName&gt;ws_axis2&lt;/aarName&gt;
				&lt;/configuration&gt;
			&lt;/plugin&gt;
		&lt;/plugins&gt;
	&lt;/build&gt;
</pre>
<p>You can use other dependencies as per your requirement. I have used axis2-aar-maven-plugin to build Apache archive (aar) file, to be deployed on soap engine.</p>
<p><strong>Step-3:</strong> Create a services.xml file to expose service name and its operations in src/main/resources/META-INF directory. Also add web.xml in WEB-INF directory as we do in normal web project to define AxisServlet and its mapping.</p>
<p><strong>services.xml</strong></p>
<pre class="brush: plain; title: ; notranslate">
&lt;service name=&quot;WebService&quot;&gt;
	&lt;parameter name=&quot;ServiceClass&quot; locked=&quot;false&quot;&gt;com.test.ws.StringWebService&lt;/parameter&gt;
	&lt;operation name=&quot;getMessage&quot;&gt;
		&lt;messageReceiver class=&quot;org.apache.axis2.rpc.receivers.RPCMessageReceiver&quot;/&gt;
	&lt;/operation&gt;
&lt;/service&gt;
</pre>
<p><strong>web.xml</strong></p>
<pre class="brush: plain; title: ; notranslate">
&lt;web-app&gt;
    &lt;display-name&gt;Apache-Axis2&lt;/display-name&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
        &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;
        &lt;servlet-class&gt;org.apache.axis2.transport.http.AxisServlet&lt;/servlet-class&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/servlet/AxisServlet&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<p><strong>Step-4:</strong> Execute below maven command to build web service.<br />
<strong>mvn clean install axis2-aar:aar</strong><br />
(axis2-aar:aar basically generates the .aar file)</p>
<p><strong>Step-5:</strong> The final step is to deploy .aar file in $CATALINA_HOME/webapps/axis2/WEB-INF/services directory. Now our web service is ready to use.<br />
After deployment you can access wsdl by hitting this url:- http://localhost:8080/axis2/services/WebService?wsdl</p>
<p><strong>CXF POC</strong><br />
Steps followed during POC which describes how to get started with CXF:-</p>
<p><strong>Step-1:</strong> Create maven based web project with services</p>
<p><strong>service class:</strong></p>
<pre class="brush: plain; title: ; notranslate">
@WebService
public class SampleCXFService {
    public String getMessage(String s) {
        return s;
    }
}
</pre>
<p><strong>pom.xml</strong></p>
<p>&nbsp;</p>
<pre class="brush: plain; title: ; notranslate">
&lt;build&gt;
		&lt;plugins&gt;
			&lt;plugin&gt;
				&lt;!-- Plugin for compiling Java code --&gt;
				&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
				&lt;configuration&gt;
					&lt;source&gt;1.5&lt;/source&gt;
					&lt;target&gt;1.5&lt;/target&gt;
				&lt;/configuration&gt;
			&lt;/plugin&gt;
			&lt;plugin&gt;
				&lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
				&lt;version&gt;2.1.1&lt;/version&gt;
				&lt;configuration&gt;
					&lt;warName&gt;ws_cxf&lt;/warName&gt;
				&lt;/configuration&gt;
			&lt;/plugin&gt;
			&lt;plugin&gt;
				&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
				&lt;artifactId&gt;tomcat-maven-plugin&lt;/artifactId&gt;
				&lt;configuration&gt;
					&lt;url&gt;http://127.0.0.1:8080/manager&lt;/url&gt;
					&lt;server&gt;TomcatServer&lt;/server&gt;
					&lt;path&gt;/ws_cxf&lt;/path&gt;
					&lt;warFile&gt;target/ws_cxf.war&lt;/warFile&gt;
				&lt;/configuration&gt;
			&lt;/plugin&gt;
		&lt;/plugins&gt;
	&lt;/build&gt;
	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
			&lt;artifactId&gt;cxf-rt-frontend-jaxws&lt;/artifactId&gt;
			&lt;version&gt;2.2.3&lt;/version&gt;
		&lt;/dependency&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
			&lt;artifactId&gt;cxf-rt-transports-http&lt;/artifactId&gt;
			&lt;version&gt;2.2.3&lt;/version&gt;
		&lt;/dependency&gt;
	&lt;/dependencies&gt;
</pre>
<p>You can use other dependencies as per your requirement and to use tomcat-maven-plugin effectively you will have to add below configuration snippet in settings.xml of maven repository. Make sure that username and password exist in your $CATALINA_HOME/conf/tomcat-users.xml file.</p>
<pre class="brush: plain; title: ; notranslate">
&lt;server&gt;
	&lt;id&gt;TomcatServer&lt;/id&gt;
	&lt;username&gt;admin&lt;/username&gt;
	&lt;password&gt;password&lt;/password&gt;
&lt;/server&gt;
</pre>
<p><strong>Step-2:</strong> Create beans.xml configuration file which is basically used to define service endpoint and few configuration file i.e. cxf.xml, cxf-extension-soap.xml and cxf-servlet.xml. Also add web.xml in WEB-INF directory as we do in normal web project to define CXFServlet and its mapping.</p>
<p><strong>beans.xml</strong></p>
<pre class="brush: plain; title: ; notranslate">
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:jaxws=&quot;http://cxf.apache.org/jaxws&quot;
	xsi:schemaLocation=&quot;
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd&quot;&gt;
	&lt;import resource=&quot;classpath:META-INF/cxf/cxf.xml&quot; /&gt;
	&lt;import resource=&quot;classpath:META-INF/cxf/cxf-extension-soap.xml&quot; /&gt;
	&lt;import resource=&quot;classpath:META-INF/cxf/cxf-servlet.xml&quot; /&gt;
	&lt;jaxws:endpoint id=&quot;sampleService&quot;
	  implementor=&quot;com.test.SampleCXFService&quot;
	  address=&quot;/sampleService&quot; /&gt;
&lt;/beans&gt;
</pre>
<p><strong><br />
web.xml</strong></p>
<p>&nbsp;</p>
<pre class="brush: plain; title: ; notranslate">
&lt;web-app&gt;
	&lt;context-param&gt;
		&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
		&lt;param-value&gt;WEB-INF/beans.xml&lt;/param-value&gt;
	&lt;/context-param&gt;
	&lt;listener&gt;
		&lt;listener-class&gt;
			org.springframework.web.context.ContextLoaderListener
		&lt;/listener-class&gt;
	&lt;/listener&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;
		&lt;display-name&gt;CXF Servlet&lt;/display-name&gt;
		&lt;servlet-class&gt;
			org.apache.cxf.transport.servlet.CXFServlet
		&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<p><strong>Step-3:</strong> Now we are ready to deploy our CXF base web service.<br />
Execute below maven command and make sure that your tomcat instance is running.<br />
<strong>mvn clean tomcat:deploy</strong><br />
and for undeploying you can use <strong>mvn tomcat:undeploy</strong><br />
After deployment you can access wsdl by hitting this url:- http://localhost:8080/ws_cxf/sampleService?wsdl url.</p>
<p><strong>Conclusion:</strong><br />
So on the basis of above 2 POCs I concluded that implementing soap based web services is easy in CXF because it takes lesser steps than Axis2. You will not have to download separate soap engine to deploy your application when you choose CXF. It provides simple integration with service component architecture(SCA) container like Tuscany as I have mentioned above also. The last thing which attracted me most is that CXF provides tools to generate JavaScript client also which I didn't find in Axis2.</p>
<p>Please post your question(s) if any.</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/25/what-made-me-to-choose-cxf-over-axis2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Persisting relationship entities in Neo4j</title>
		<link>http://xebee.xebia.in/2012/01/24/persisting-relationship-entities-in-neo4j/</link>
		<comments>http://xebee.xebia.in/2012/01/24/persisting-relationship-entities-in-neo4j/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 20:33:31 +0000</pubDate>
		<dc:creator>Sunil Prakash Inteti</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Neo4j]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring Data]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=10920</guid>
		<description><![CDATA[Neo4j is a high-performance, NOSQL graph database with all the features of a mature and robust database. In Neo4j data gets stored in nodes connected to each other by relationship entities that carry its own properties. These relationships are very important in graphs and helps to traverse the graph and make decisions. This blog discusses [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://neo4j.org/">Neo4j</a> is a high-performance, NOSQL graph database with all the features of a mature and robust database. In Neo4j data gets stored in nodes connected to each other by relationship entities that carry its own properties. These relationships are very important in graphs and helps to traverse the graph and make decisions. This blog discusses the two ways to persist a relationship between nodes and also the scenario's which suits their respective usage. <a href="http://neo4j.org/spring/">Spring-data-neo4j</a> by springsource gives us the flexibility of using the spring programming model when working with neo4j database. The code examples in this blog will be using spring-data-neo4j.<br />
<span id="more-10920"></span><br />
Let's consider a case where we have two NodeEntities Employee and Project. A Employee has a role in a project which is a relationship entity.<br />
Here is the code snippet for these entities and the relationship between them.</p>
<pre class="brush: java; title: ; notranslate">
@NodeEntity
public class Employee {
	@GraphId
	@Indexed
	private Long nodeId;

	@Indexed
	private String name;

	@RelatedToVia(elementClass = Role.class, type=&quot;WORKED_IN&quot;, direction=Direction.BOTH)
	private Set&lt;Role&gt; roles;

 }

@NodeEntity
public class Project {

	@GraphId
	@Indexed
	private Long nodeId;

	@Indexed
	private String name;

	@RelatedTo( elementClass=Employee.class, type=&quot;WORKED_IN&quot;, direction=Direction.BOTH)
	private Set&lt;Employee&gt; teamMembers;
}

@RelationshipEntity(type=&quot;WORKED_IN&quot;)
public class Role {

	@GraphId
	private Long nodeId;

	@Indexed
	private String name;

	@StartNode
	private Employee employee;

	@EndNode
	private Project project;
}
</pre>
<p>1) First way to persist relationship : Using the Neo4jTemplate class to create relationship. For example</p>
<pre class="brush: java; title: ; notranslate">
Role stint = template.createRelationshipBetween(sunil, beachbody, Role.class,
                                                                      &quot;WORKED_IN&quot;, false);
template.save(stint);
 </pre>
<p>createRelationship method takes the two node entities and the relationship class and relation type defined by the RelationshipEntity and a boolean value to allow/disallow duplicate relationships.</p>
<p>2) Second way is to instantiate the role and add it to a employee entity and persist the employee entity. Persisting the entity also persists the Role entity too, thus establishing the link between employee and project nodes.</p>
<pre class="brush: java; title: ; notranslate">
		Employee sunil = new Employee(&quot;Sunil&quot;);
		sunil = employeeRepo.save(sunil);
		Project beachbody = new Project(&quot;Beachbody&quot;);
		Project project = projectRepo.save(beachbody);

		Role stint = sunil.workedIn(beachbody, &quot;Java developer&quot;);
		template.save(sunil);
</pre>
<p>It's curious to know by a simple unit test that the second way is performing almost 30 times better than the first way in persisting just the relationship. I looked at the source code for both the ways, I noticed that the first way fetches the persistent state of both the start and the end nodes and then tries to establish a relation between the two. The second option just tries to create the relation directly on the employee which is already persisted. Clearly given a scenario that we have two persisted nodes and we need to create the relationship we must always go with the option2 in my opinion. This can greatly improve the performance. The only scenario that I can think of using the first option can be that we have to allow duplicate relationships between nodes which can generally happen when relationship entities are very rich ie have a lot of properties.</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/24/persisting-relationship-entities-in-neo4j/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MongoDB Replica Set on OpenShift Flex</title>
		<link>http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/</link>
		<comments>http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 19:25:32 +0000</pubDate>
		<dc:creator>Shekhar Gulati</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[openshift]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=11020</guid>
		<description><![CDATA[As I am preparing for my JUDCon session on OpenShift one topic that I will be covering is setting up MongoDB Replica Set on OpenShift Flex. There are various reasons to setup MongoDB replication. The primary reason for replication is to ensure data survive single or multiple machine failures. The more replicas you have, the [...]]]></description>
			<content:encoded><![CDATA[<p>As I am preparing for my JUDCon session on OpenShift one topic that I will be covering is setting up MongoDB Replica Set on OpenShift Flex. There are various reasons to setup MongoDB replication. The primary reason for replication is to ensure data survive single or multiple machine failures. The more replicas you have, the more likely is your data to survive one or more hardware crashes. With three replicas, you can afford to loose two nodes and still serve the data.Replication also helps to scale reads as you can distribute your read load accross multiple machines. There are two ways to support replication in MongoDB -- Master Slave and Replica Set. Replica Set is the recommended way to do replication and OpenShift only supports replica set.  OpenShift Flex MongoDB replica set is yet not polished so you might face issues in setting up. This blog will show steps to configure a working MongoDB replica set on OpenShift Flex. If you are not aware of MongoDB Replica Set you should first refer to the <a href="http://www.mongodb.org/display/DOCS/Replica+Set+Tutorial">MongoDB documentation</a>. Also you can refer to my blog on<a href="http://whyjava.wordpress.com/2011/12/12/using-mongodb-replica-set-with-spring-mongodb-1-0-0-rc1/"> how to use MongoDB replica set with Spring</a>.<span id="more-11020"></span></p>
<ol>
<li>Login to <a href="https://openshift.redhat.com/flex/flex/index.html">OpenShift Flex console</a> and create a cluster. as shown below in a screenshot. As you can see below I have defined  cluster named replica with 1server and used EC2 medium instance.<a rel="attachment wp-att-11027" href="http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/define-server-cluster/"><img class="alignnone size-medium wp-image-11027" height="300" width="292" title="Define-Server-Cluster" src="http://xebee.xebia.in/wp-content/uploads/2012/01/Define-Server-Cluster-292x300.png" /></a></li>
<li>After cluster has been setup you will see one server running in server tab.  Go to the "Applications" tab and press Add Application. Please select a server cluster , give application name and application version and then press submit button. My settings are shown in screenshot below.<a href="http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/create-application/" rel="attachment wp-att-11030"><img src="http://xebee.xebia.in/wp-content/uploads/2012/01/Create-Application-222x300.png" title="Create-Application" width="222" height="300" class="alignnone size-medium wp-image-11030" /></a><a href="http://whyjava.files.wordpress.com/2012/01/create-application.png"><br />
</a></li>
<li>Next you will see a application named bookshop (or the name you gave to application) under the Applications tab. Name of the application is a hyperlink and on clicking that you will be able to configure the application. So click on the application name and you will see five sub-tabs -- Overview, Components,Files, Configure, and Deploy Changes.</li>
<li>Click on the Components tab to select the components required for running the application. The required components are Tomcat, Java6 and MongoDB 2. <a href="http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/application-components/" rel="attachment wp-att-11031"><img src="http://xebee.xebia.in/wp-content/uploads/2012/01/Application-Components-300x154.png" title="Application-Components" width="300" height="154" class="alignnone size-medium wp-image-11031" /></a><a href="http://whyjava.files.wordpress.com/2012/01/application-components.png"><br />
</a></li>
<li>Next go to the Configure tab to configure the components selected. This view gives us the power to configure the components according to our needs. We will only configure MongoDB components as we need to set up replica set. So click MongoDB-2.0.1 and enable replica sets. Right now you can only can have replica set of only 3 machines. But I think in future you will have the choice to select a replica set from 3-7 machines.<a href="http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/enable-mongodb-replicaset/" rel="attachment wp-att-11032"><img src="http://xebee.xebia.in/wp-content/uploads/2012/01/enable-mongodb-replicaset-300x245.png" title="enable-mongodb-replicaset" width="300" height="245" class="alignnone size-medium wp-image-11032" /></a><a href="http://whyjava.files.wordpress.com/2012/01/enable-mongodb-replicaset.png"><br />
</a></li>
<li>Then go to Deploy Changes tab and deploy the changes and start the application.</li>
<li>After you have started the application you will notice that two more instances are added to the cluster. Please keep patience it takes some minutes (2-5 minutes). After that you will have 3 instance cluster with MongoDB setup.<a href="http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/server-cluster/" rel="attachment wp-att-11033"><img src="http://xebee.xebia.in/wp-content/uploads/2012/01/Server-Cluster-300x128.png" title="Server-Cluster" width="300" height="128" class="alignnone size-medium wp-image-11033" /></a><a href="http://whyjava.files.wordpress.com/2012/01/server-cluster.png"><br />
</a></li>
<li>Please note until this point replica set is not set up and if you ssh into any of the machines you will notice that normal mongod instances are running. To enable replica set you need to deploy a application. I am deploying a simple Spring MongoDB application. You can download the application from my <a href="http://code.google.com/p/shekhar-playground/downloads/list">google code project</a>.</li>
<li>Go to the File tab and upload the bookshop.war and deploy the changes. This will restart the application.</li>
<li>In the Overview tab you will find the url of the application. Append bookshop to the url as bookshop is the context path. The application url will be like <a href="http://replica107550541-1150999735.us-east-1.elb.amazonaws.com/bookshop/">http://replica107550541-1150999735.us-east-1.elb.amazonaws.com/bookshop/</a>. You will be able to do CRUD operations on Book.</li>
<li>There is a bug in the flex code that sometimes it is not able to add a particular node to the replica set. To check that all of the three nodes are added to replica set lets ssh to first instance in our cluster. To do it type ssh admin@107.21.186.11. Replace ip address with your instance ip address.</li>
<li>Next connect to mongo on machine by typing command shown below.
<pre class="brush: plain; title: ; notranslate">
/opt/vostok/cartridges/mongodb-2.0.1/bundle/bin/mongo
</pre>
</li>
<li>If you see the output that you are logged into PRIMARY &gt;. It means replica set is configured.
<pre class="brush: plain; title: ; notranslate">
[admin@ip-10-194-195-117 ~]$ /opt/vostok/cartridges/mongodb-2.0.1/bundle/bin/mongo
MongoDB shell version: 2.0.1
connecting to: test
PRIMARY&gt;
</pre>
</li>
<li>Next we should check that all the three instances are added to replica set. To check do execute rs.status() command. The command and output are shown below.
<pre class="brush: plain; title: ; notranslate">
PRIMARY&gt; rs.status()
{
	&quot;set&quot; : &quot;SET1&quot;,
	&quot;date&quot; : ISODate(&quot;2012-01-22T18:46:02Z&quot;),
	&quot;myState&quot; : 1,
	&quot;members&quot; : [
		{
			&quot;_id&quot; : 0,
			&quot;name&quot; : &quot;10.194.195.117:27017&quot;,
			&quot;health&quot; : 1,
			&quot;state&quot; : 1,
			&quot;stateStr&quot; : &quot;PRIMARY&quot;,
			&quot;optime&quot; : {
				&quot;t&quot; : 1327256835000,
				&quot;i&quot; : 1
			},
			&quot;optimeDate&quot; : ISODate(&quot;2012-01-22T18:27:15Z&quot;),
			&quot;self&quot; : true
		},
		{
			&quot;_id&quot; : 1,
			&quot;name&quot; : &quot;10.212.138.54:27017&quot;,
			&quot;health&quot; : 1,
			&quot;state&quot; : 2,
			&quot;stateStr&quot; : &quot;SECONDARY&quot;,
			&quot;uptime&quot; : 1121,
			&quot;optime&quot; : {
				&quot;t&quot; : 1327256835000,
				&quot;i&quot; : 1
			},
			&quot;optimeDate&quot; : ISODate(&quot;2012-01-22T18:27:15Z&quot;),
			&quot;lastHeartbeat&quot; : ISODate(&quot;2012-01-22T18:46:02Z&quot;),
			&quot;pingMs&quot; : 0
		}
	],
	&quot;ok&quot; : 1
}
</pre>
</li>
<li>The output shows that replica set has two nodes one primary and other secondary. But we created a replica set  consisting of three nodes. This is the bug in OpenShift Flex code which will be fixed in future. For now we can add the third node by rs.add() command. The add() requires the internal ip of the third machine. This ip is not the same ip shown in clusters tab. You have to run ifconig command and get the ip of machine and then add the node to replica set.
<pre class="brush: plain; title: ; notranslate">
rs.add('10.190.206.11')
</pre>
</li>
</ol>
<p>After following all the steps you will have running MongoDB replica set on OpenShift Flex.</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/23/mongodb-replica-set-on-openshift-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML Parsers for iOS: libXML vs KissXML</title>
		<link>http://xebee.xebia.in/2012/01/22/ios-xml-parsers-libxml-vs-kissxml/</link>
		<comments>http://xebee.xebia.in/2012/01/22/ios-xml-parsers-libxml-vs-kissxml/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 20:11:16 +0000</pubDate>
		<dc:creator>Gaurav Srivastava</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[kissxml]]></category>
		<category><![CDATA[libxml]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=10997</guid>
		<description><![CDATA[XML Parsing on iPhone/iPad - Is that something your current sprint revolves around? Well if it does, this blog might help you. While parsing XMLs on device, we need to look into factors like performance and memory consumption. While googling, i found couple of XML parsing APIs including Apple's native NSXMLParser. NSXMLParser looked like this is [...]]]></description>
			<content:encoded><![CDATA[<p>XML Parsing on iPhone/iPad - Is that something your current sprint revolves around? Well if it does, this blog might help you. While parsing XMLs on device, we need to look into factors like performance and memory consumption. While googling, i found couple of XML parsing APIs including Apple's native <a href="http://developer.apple.com/library/mac/#documentation/Coc&lt;/em&gt;oa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html">NSXMLParser</a>. NSXMLParser looked like this is all i need. But my requirement was also to 'write' xmls making sure that i do not compromise on performance and memory. On googling more i found couple of APIs which can provide me XML writing capabilities. I chose to explore <a href="http://xmlsoft.org/">libXML2</a> and <a href="https://github.com/robbiehanson/KissXML">KissXML</a>.</p>
<p><span id="more-10997"></span></p>
<p>You need to have some basic settings in order to use any of these APIs. Open your project build settings and search for following two parameters and enter the respective values:</p>
<ul>
<li><strong>Header Search Paths:</strong> <em>/usr/include/libxml2</em></li>
<li><strong>Other Linker Flags:</strong><em>-lxml2</em></li>
</ul>
<div>and you are good to go!</div>
<p>While the memory consumption by both the APIs are almost same but there is a big difference when it comes to development. libXML2 is written in C, so it's hard to call it as developer-friendly. On the other side, KissXML is written in Objective C, so it's pretty easy to understand and implement as compared to libXML2.</p>
<p>I will show and compare the basic parsing logic provided by both the APIs.</p>
<p><strong>libXML:</strong></p>
<pre class="brush: plain; title: ; notranslate">
	NSString *path = [[NSBundle mainBundle] pathForResource:@&quot;Employee&quot; ofType:@&quot;xml&quot;];
    NSData *xmlData = [NSData dataWithContentsOfFile:path];
    xmlTextReaderPtr reader = xmlReaderForMemory([xmlData bytes],
                                                 [xmlData length],
                                                 [path UTF8String], nil,
                                                 (XML_PARSE_NOBLANKS | XML_PARSE_NOCDATA | XML_PARSE_NOERROR | XML_PARSE_NOWARNING));

    if(!reader) {
        NSLog(@&quot;Error loading XML&quot;);
    }

    NSString *currentNode = nil;
    NSString *nodeValue = nil;

    employeeCollection = [NSMutableArray array];

    NSDictionary *employee = nil;

    char* temp;

    while (true) {
        if (!xmlTextReaderRead(reader)) break;
        switch (xmlTextReaderNodeType(reader)) {
            case XML_READER_TYPE_ELEMENT: {
                temp = (char *) xmlTextReaderConstName(reader);
                currentNode = [NSString stringWithCString:temp encoding:NSUTF8StringEncoding];
                if([currentNode isEqualToString:@&quot;employee&quot;]) {
                    employee = [NSMutableDictionary dictionary];
                    [employeeCollection addObject:employee];
                }
                break;
            }
            case XML_READER_TYPE_TEXT: {
                temp = (char *) xmlTextReaderConstValue(reader);
                nodeValue = [NSString stringWithCString:temp encoding:NSUTF8StringEncoding];
                [employee setValue:nodeValue forKey:currentNode];
                currentNode = nil;
                nodeValue = nil;
                break;
            }
            default:
                break;
        }
    }
</pre>
<p><strong>KissXML:</strong> (using XPath)</p>
<pre class="brush: plain; title: ; notranslate">
	NSString *source = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@&quot;employee&quot; ofType:@&quot;xml&quot;] encoding:NSUTF8StringEncoding error:&amp;error];
	DDXMLDocument *theDocument = [[DDXMLDocument alloc] initWithXMLString:source options:0 error:&amp;error];
    NSMutableArray *employeeList = [[NSMutableArray alloc] init];

	NSArray *employeeXmlResult = [theDocument nodesForXPath:@&quot;/xml/employees/employee&quot; error:&amp;error];

	for (DDXMLElement *employee in employeeXmlResult) {
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        arr = (NSMutableArray *)[employee children];

        NSString *employeeName = [[employee attributeForName:@&quot;name&quot;] stringValue];
        [employeeList insertObject:employeeName atIndex:0];

    }
</pre>
<p>So was there something in both the code snippets that comes into mind at first? May be the developer-friendliness i was talking above? One of the reason i preferred KissXML was this.</p>
<p>One thing which is important to note here is the performance consideration. While i was testing my project with some extra data stubbed at the backend, i found some pause happening while using KissXML. The pause happened when my application received response for that heavy XML. When i replaced the parsing logic with libXML2, i noticed that the pause went unnoticeable. Though the actual data was not at all heavy, so i simply ignored this test. But this could be an important issue which you can look into before going for KissXML.</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/22/ios-xml-parsers-libxml-vs-kissxml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why to choose JMeter for performance testing?</title>
		<link>http://xebee.xebia.in/2012/01/20/why-to-choose-jmeter-for-performance-testing/</link>
		<comments>http://xebee.xebia.in/2012/01/20/why-to-choose-jmeter-for-performance-testing/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 17:56:17 +0000</pubDate>
		<dc:creator>Priyanka</dc:creator>
				<category><![CDATA[Agile Testing]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[performance testing]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=10906</guid>
		<description><![CDATA[During my last project, I was given a task to choose one of the best tools for performance testing among open source tools available in market.  After evaluation and little research I came up with JMeter. I have thought of writing a small blog for those who are new to performance testing and are confused [...]]]></description>
			<content:encoded><![CDATA[<p>During my last project, I was given a task to choose one of the best tools for performance testing<del cite="mailto:Anubhav%20" datetime="2012-01-05T04:12"> </del> among open source tools available in market.  After evaluation and little research I came up with JMeter. I have thought of writing a small blog for those who are new to performance testing and are confused of which tool to use. It’s pretty common that whenever we start looking out for any tool we keep few things in our mind that it should record and playback, allow easy parametrization, generate detailed reports, should be able to simulate a heavy load on a server, analyze overall performance, etc . JMeter would not disappoint you in that sense because it has more than above mentioned features. There are important features of JMeter which have been listed down in this blog. Let's start from first thing which is its installation. It is very easy to install which requires only Java set up on your machine since it is a Java based tool.</p>
<p><span id="more-10906"></span></p>
<p><strong>Installation<br />
</strong></p>
<p>1. Download JMeter  from  link provided below :-</p>
<p>http://jmeter.apache.org/download_jmeter.cgi</p>
<p>2. Unzip it anywhere in your system.</p>
<p>3. Then run jmeter.bat (for Windows) which is kept in its bin folder and start using it.</p>
<p><b>Record and Play<ins cite="mailto:Anubhav%20" datetime="2012-01-05T04:51"> </ins></b></p>
<p>JMeter lets you record your test plan by using its <b>proxy server.</b> Besides recording, you can also exclude non required sampler requests by giving  required regular expressions in its proxy server.</p>
<p><b>Parametrization</b></p>
<p>You can also easily parametrize your test cases by using user-parameter pre-processors or config-elements. <ins cite="mailto:Anubhav%20" datetime="2012-01-05T04:51"></ins></p>
<p><b>Passing data from one Request to other</b></p>
<p>Passing response data from one request to another can be easily done using its powerful post processors like XPath Extractors and Regular Expression<ins cite="mailto:Anubhav%20" datetime="2012-01-05T04:52"> </ins>Extractor.</p>
<p><b>Allow working with multiple types of Requests</b></p>
<p><b> </b></p>
<p>JMeter does not only work with simple HTTP<span style="text-decoration: underline;"> </span>requests but it also works with other requests which includes FTP Request, JDBC Request , LDAP Request , SOAP/XML-RPC Request, etc</p>
<p><b>Allow Customization of test case flow with its Logic Controllers</b></p>
<p>Logic Controllers can be consumed to customize logic to decide when to send requests to cover different scenarios we come across during performance testing. They can modify the requests themselves; cause JMeter to repeat requests, etc. JMeter provides different types of controllers like once-only-controller, interleave controller, etc which have their own functioning and you can decide test plan logic with the help of these controllers. For example, Loop controllers can be used to send request repeatedly many times to put stress on server.</p>
<p><b> </b></p>
<p><b>Remote Testing/Distributed Testing</b></p>
<p><b> </b></p>
<p>It is the most powerful feature of JMeter. JMeter client machine is not able to simulate enough users to stress your server so there is one option exists which is to control multiple remote JMeter engines from a single JMeter GUI client. By running JMeter remotely, you can replicate a test across many low-end computers and thus simulate a larger load on the server. One instance of the JMeter GUI client can control any number of remote JMeter instances, and collect all the data from them. This offers the following features:</p>
<ul>
<li>Saving      of test samples to the local machine</li>
<li>Management      of multiple JMeter Engines from a single machine</li>
<li>No      need to copy the test plan to each server - the client sends it to all the      servers</li>
</ul>
<p><b>Generate Reports</b></p>
<p>Unless you can show effectively, the tests and results you achieve is of little use to others. Tool should be able to collect information, organize it, and present it in form of reports. JMeter has capability to produce nice reports with help of its listeners is a component that shows the results of the samples.</p>
<p><b> </b></p>
<p><b>Allow addition of  Think Time </b></p>
<p>We know that Think time is a time taken by end user of an application between navigation of application pages/screens. It also includes the time taken by end user to fill in any application page. To make test cases realistic it is good practice to include think time in between transaction steps. We can add think time in test cases with the help of different types of timer options available in JMeter for example:- constant timer, random uniform timer which can be added in test cases as per requirement.</p>
<p><b>Contains important browser features like Cache Manager, etc</b></p>
<p>JMeter is not a browser but it simulates like a browser however it does not perform all the actions supported by browsers but it provides some of important browser features like HTTP cache manager, HTTP cookie manager, HTTP header manager. For example: by adding HTTP cookie manager, it ensures that all HTTP requests will share the same cookies.</p>
<p><b>Allow Assertions to be added in each Request</b></p>
<p>Assertions allow the ability to assert facts about responses received from the server being tested. Using an assertion, you can essentially "test" that your application is returning the results you expect it to. Assertions can be added to any controller in a test plan (simply right-click on the controller and add an assertion). As always, these assertions will be attached to any test samples that "pass through" that controller.</p>
<p><b>Provides access to Functions and Bean- shell scripting </b></p>
<p>JMeter has some useful build in functions<ins cite="mailto:Anubhav%20" datetime="2012-01-05T04:59">,</ins> which can compute new values at run-time based on previous response data and Bean Shell function evaluates the script passed to it, and returns the result.</p>
<p>Components used in JMeter seem like a lot of jargon initially but eventually you will get used to these elements and then testing will be a piece of cake .The image below gives the brief description of components used in JMeter.</p>
<p><img src="data:image/png;base64,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" /></p>
<p><strong><br />
</strong></p>
<p><em><strong>Conclusion:-</strong></em></p>
<p>JMeter is good to be used for testing of performance both on static and dynamic resources. It can easily be used to simulate a heavy load on a server to test its strength and to analyze overall performance under different load types. You can use it to make a graphical analysis of performance and get detailed reports under heavy concurrent load. At the conclusion of this blog, lets check below what does score-card of JMeter says:-</p>
<ul>
<li>Ease of use – <b>YES</b></li>
<li>Record and Playback - <b>YES</b></li>
<li>Manual scripting – <b>YES</b></li>
<li>Command Line – <b>YES</b></li>
<li>Analyzing performance- <b>YES</b></li>
<li>Detailed Reports-<strong>Yes</strong><b><br />
</b></li>
<li>Stress Testing- <b>Yes</b></li>
</ul>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/20/why-to-choose-jmeter-for-performance-testing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SOPA in US and Censorship in India: A cocktail to destroy Internet Freedom !</title>
		<link>http://xebee.xebia.in/2012/01/19/sopa-in-us-and-censorship-in-india-a-cocktail-to-destroy-internet-freedom/</link>
		<comments>http://xebee.xebia.in/2012/01/19/sopa-in-us-and-censorship-in-india-a-cocktail-to-destroy-internet-freedom/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 12:28:33 +0000</pubDate>
		<dc:creator>Jiten</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[e-Commerce]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[censorship]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[pipa]]></category>
		<category><![CDATA[sopa]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=10948</guid>
		<description><![CDATA[As US senators mull over the SOPA(Stopping Online Piracy Act) and PIPA(Protecting Intellectual Property Act) bills, the world stands witness to a historic moment. Almost all big IT companies like Google, Wikipedia, Facebook, Mozilla, Godaddy, etc are speaking in one unanimous voice against SOPA and Internet Censorship. The draconian provisions of SOPA/PIPA are bound to [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">As US senators mull over the SOPA(Stopping Online Piracy Act) and PIPA(Protecting Intellectual Property Act) bills, the world stands witness to a historic moment. Almost all big IT companies like Google, Wikipedia, Facebook, Mozilla, Godaddy, etc are speaking in one unanimous voice against SOPA and Internet Censorship. The draconian provisions of SOPA/PIPA are bound to create the deathbed of internet freedom and free speech, and if a careful reading of the proposed legislation is done, one realizes that it is likely to have the same impact on India.<br />
In the disguise of protecting copyrights and stopping piracy its completely clear that the US government is trying to assert its control over the free flow of information on internet  which is some time uncomfortable to them. Giving power to Attorney General to direct search engines like Google to filter particular search results, or asking an ISP to manipulate their DNS  to filter specific IP addresses just at whims and fancies of government all the threatening to accessing information. <span id="more-10948"></span></p>
<p style="text-align: justify;">To make the matters worse on the name of stopping piracy the websites will be held directly responsible for content uploaded by a one of its millions user. And if infringement is proved  then apart from banning whole website its executives would be liable to mountainous fines and prison terms along with the user who uploaded content for upto 5 years. So imagine if a teenager ends up uploading a Michal Jackson video on YouTube he may get 5 year term in jail where as the doctor who killed Michal Jackson could get only 4 years. Or if you post a YouTube video link  of Rockstar movie song on your Facebook wall, entire Facebook website can be blocked for copyright infringement.</p>
<p style="text-align: justify;">To make the matters worse, one of the provisions says if a particular site is banned. Any websites which provides any information about blocked website or softwares it offered can also be blocked. So in a nutshell if a website like Napster is blocked, a website like Wikipedia can also be blocked incase they provided any information about Napster, even if it was merely a hyperlink to Napster’s website And if Wikipedia is banned. all the websites which ever quoted Wikipedia can also be blocked.</p>
<p style="text-align: justify;">Another draconian provisions say that the government through attorney general  can also direct all companies like 'payments gateway  providers', Banks or even the Digital certificate providers to not provide any service to  the blocked website. Now see how will this impact us in India</p>
<ol style="text-align: justify;">
<li>80% of Indian websites are hosted on US based servers with companies  like Godaddy, which are under US jurisdiction and will fall under SOPA.</li>
<li>Websites which are  using  payment gateways provided by US companies will also be affected.</li>
<li>Even if a Indian website is hosted on a Indian server and uses all  Indian payment gateways or banks for its business, If a injunction is  issued by US court against it, US government can ask all the American  websites to remove any information or links about that Indian website  and block its access through all US based ISP's by forcing DNS blockade  through ISP's</li>
<li>Even the Anti SOPA tools like DeSopa would not work because providing  them on any website or using them or providing any information about  them would also become illegal.</li>
<li>All the paid VPNs we use for our privacy or secure surfing would also be  forced to share our data with US government because most of them have their  head offices in US. This may spell disaster for people in countries  like China and Iran who use these methods or overcome illegitimate  government censorships.</li>
<li>Onion surfing (chain proxy) tools like Tor would become useless because at  the one shot US government will have power to ask all US ISP's,   hosting servers to filter any request coming from proxy sites in  disguise of stopping piracy.</li>
</ol>
<p style="text-align: justify;">Internet was born in US but it is not a personal property of US  government. Any type of laws which will be made in US are bound to be  replicated in other countries. And with many governments across the  world facing protest for various reason are already toying the idea of  censoring the information on internet by some or other means. sometimes   by arm twisting, some times by arbitrary court injunctions  or some  times by framing unconstitutional laws. Currently we are witnessing  companies like Facebook,Twitter and Google are landing up in lawsuits in  India on the issue of content filtering and government hardening its  position against companies. Its not a good sign of for the future of  internet, whose freedom we must uphold.</p>
<p style="text-align: justify;">Dissent is a integral part of any democracy. If countries like America  in the aftermath of Wikileaks incidents frame laws to acquire backdoor authority to censor internet in disguise of protecting intellectual property and stopping piracy. They would be doing a great insult to the very<br />
first amendment to their own constitution  guarantying free speech. In India where our fundamental right of freedom of expression is ushering like a diamond hope with every passing year. We must protest any idea or policy  which threatens our freedom to do things on innovation of millennium, Internet,  Which has no boundaries, no laws, no jurisdictions and  no censorships.</p>
<p style="text-align: justify;">So in my opinion we must oppose SOPA or any sort of censorship anywhere, before you are left with a internet with filtered search engines, Blocked websites, no free mp3 songs, No proxies, No free softwares and no Wikipedia and no free code snippets too <img src='http://xebee.xebia.in/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  !</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/19/sopa-in-us-and-censorship-in-india-a-cocktail-to-destroy-internet-freedom/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Software Development Practices that helped me become better</title>
		<link>http://xebee.xebia.in/2012/01/19/software-development-practices-that-helped-me-become-better/</link>
		<comments>http://xebee.xebia.in/2012/01/19/software-development-practices-that-helped-me-become-better/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 20:07:27 +0000</pubDate>
		<dc:creator>Guneet Sahai</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=10927</guid>
		<description><![CDATA[Xebia India takes great pride in paying high amount of attention to writing QUALITY code. “Doing it Right” is almost a religion here. For us the buck does not stop at showing a demo of working software to the client, but also ensuring the underlying code is written in the best possible manner using best [...]]]></description>
			<content:encoded><![CDATA[<p align="JUSTIFY"><span style="color: #000080;" color="#000080"><span style="text-decoration: underline;"><a href="http://xebiaindia.com/" target="_blank">Xebia India</a></span></span> takes great pride in paying high amount of attention to writing QUALITY code. “Doing it Right” is almost a religion here. For us the buck does not stop at showing a demo of working software to the client, but also ensuring the underlying code is written in the best possible manner using best known software development practices.</p>
<p align="JUSTIFY">To achieve this, it needs a different kind of a culture in the organization that encourages people to go after Quality. This is a lot more difficult than it sounds. Most developers at Xebia will agree that we have a slightly different approach to work (Some call it our culture). A lot of developers joining Xebia India experience these differences first hand &amp; in due course of time, unknowingly they end up picking up these practices themselves. In this article, I list below some changes &amp; practices that I have picked up in the last 2 odd years of my relatively short stay here that helped me be a better programmer.</p>
<p align="JUSTIFY"><span id="more-10927"></span></p>
<p align="JUSTIFY"><strong>Time Vs Quality - Quality should win</strong></p>
<p align="JUSTIFY">Here's what I heard from a programmer at a Beer Session once : “Every time I pickup a programming task, a clock starts ticking in my head. It stops (or resets) only after I declare completion of this task”. IMHO this clock is one of the biggest enemy of Quality. The trouble is that if this clock continues ticking for more time then you planned (working on the task), then it gives a very uncomfortable feeling to the programmer; which leads to pressure to complete the task quickly. This usually happens by cutting corners therefore compromising QUALITY.</p>
<p align="JUSTIFY">For me, I had this clock very loud in my head. I always wanted to declare (task) completion faster than anybody else can imagine (<i>I guess this is a result of my competitive schooling</i>).  Clearly for me, speed was more important than quality earlier. I have tried to change that in recent months. I wouldn't say I have reversed the situation, but now have a different meaning to the word completion – For me now DONE means DONE. If there is an obvious improvement that can be made, then the task is NOT DONE..</p>
<p align="JUSTIFY">&nbsp;</p>
<h3>Test the hell out of your code</h3>
<p align="JUSTIFY">When I was younger, I used to be more confident about new code that I write than I am now. I think the confidence came simply because I hadn't seen enough failures of my code. With Time (and with discovered bugs), I became more careful  &amp; started to write more tests around my code – giving me a better sense of security. While I do see people agree with the above, but a lot of developers treat Tests as second class citizens of development practices. Not enough thought on what exactly needs to be tested is given – without that it is highly likely that tests will not be fully beneficial.</p>
<p align="JUSTIFY"><span style="text-decoration: underline;">What works for me:</span> a) Every time, I discover a problem or a bug in my code – I almost always go back and think why didn't my tests detect this problem earlier. Improve the tests so that the leak does not go undetected again. b) I spend some time thinking about what exactly needs to tested in a class/module. This sounds easier than it is, but with time &amp; practice I think my tests are getting better at finding problems.</p>
<p align="JUSTIFY">&nbsp;</p>
<h3><span style="font-family: 'Liberation Sans', sans-serif;" face="Liberation Sans, sans-serif">Bug Fixing – Fix the root cause &amp; avoid applying a patch</span></h3>
<p align="JUSTIFY">I have been in many situations when the first apparent fix turns out to be a patch on the surface of a bigger problem. The root cause can go undetected easily if nobody questions the fix in totality.</p>
<p align="JUSTIFY"><span style="text-decoration: underline;">What works for me</span>: a) Questions like “If this was the problem, then why didn't it appear in situation X?” go a long way in improving the probability of discovering the root cause. b) Upon finding the possible cause, talking to the author of the code may shed more light about the nature of the problem and sometimes gives a different perspective of the problem. c) Good testers already know this – I try &amp; play more with the problem (reproduce it under different situations); not only the understanding of the problem improves, but sometimes the solution itself becomes really apparent.</p>
<p align="JUSTIFY">&nbsp;</p>
<h3 align="LEFT" lang="en-IN"><span style="color: #000000;" color="#000000">Mistakes are not bad </span></h3>
<p align="JUSTIFY">Mistakes are not bad; but hiding them clearly is. On being pointed out for a possible mistake, my head used to go in the defensive mode and it used to try to come up with either problems in the proposed alternate solution or defend the problem in my code. After having grown some white hair, I have now realized there is no need to do that. It becomes a lot easier if I accept that I goofed up and improve the situation from where it is. That way there is more sense of achievement for everybody involved &amp; the overall environment is geared towards problem solving rather than blaming.</p>
<p align="JUSTIFY"><span style="text-decoration: underline;">What works for me</span>: a) While there is no easy way to avoid mistakes, I think more collaboration within a team can  help. If I'm working on an important piece, I try and get opinion of my team mates on my approach before I start coding. b) If somebody presents an alternate way of solving a problem, I weigh pros &amp; cons of both approaches honestly – without being biased about the code that has already been written or about the author of the code. c) Avoid being emotionally attached to <b>your</b> code – there could be better ways to do what your code does.</p>
<p align="JUSTIFY">&nbsp;</p>
<p align="JUSTIFY">Some other practices that I have picked up &amp; I think are helping me but do not need much explanation are listed below.</p>
<h3 lang="en-IN" align="LEFT">Invest Time in upgrading yourself</h3>
<p align="JUSTIFY">There is always something new to learn - A programming language, a new framework, a new tool etc. Have some way of adding items to your “To learn/Study” list. For me knowledge sharing sessions at Xebia (XKE) do just that.</p>
<h3 align="LEFT" lang="en-IN"></h3>
<div>
<h3 align="LEFT" lang="en-IN">Seek company of better/Senior Programmers</h3>
</div>
<div>
<p align="JUSTIFY">Things like Pair Programming with somebody senior is a very enriching experience. It provides an opportunity to learn &amp; grow. I try &amp; grab opportunities like these whenever they come my way.</p>
<p align="JUSTIFY"><span style="font-size: 15px; font-weight: bold;">Keep company of young software developers</span></p>
</div>
<h5><span style="font-size: 13px; font-weight: normal;">Young software developers challenge practices &amp; don't easily accept them unless proven. This  forces me to think about practices that I have been following myself &amp; re-evaluate them again. They can keep me on my toes all the time - That drives the need to improve myself. Besides having young people in the team can reflect positively in the burn-down chart <img src='http://xebee.xebia.in/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></h5>
<div><span style="font-size: 15px; font-weight: bold;">Hide Nothing &amp; Collaborate more</span></div>
<p align="JUSTIFY">Be Transparent &amp; Hide nothing. This sounds easier than it actually is. However if you are really concerned about quality of your work, then quick feedback (from tests &amp; peer coders) is the only way to find problems early. Seeking peer reviews for an important piece of code is a practice that has helped me a lot. I'm usually asking a lot of questions if there is some ambiguity. If there's anything that I don't know – saying that upfront (even to the client) and asking for help is much better than faking knowledge.</p>
<p align="JUSTIFY"><span style="font-size: 15px; font-weight: bold;">Respect to all</span></p>
<p align="JUSTIFY">In today's world nobody can know it all. There will always be somebody who knows more. Years of experience don't really matter. A Freshman out of college might know better about a particular technology than an experienced programmer &amp; there's no harm in acknowledging that fact. Be humble to all. Anybody can teach you a lesson or so in some field. Keep your eyes &amp; ears open.</p>
<p align="JUSTIFY"><strong>Share knowledge</strong></p>
<p align="JUSTIFY">For a developer; with Knowledge comes power (and money). Contrary to popular belief, the more you spread it the more you get. In other words do not ever hold back knowledge; spread it as much as possible. This IMO will encourage others to do the same and the overall environment becomes very learning friendly.</p>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/19/software-development-practices-that-helped-me-become-better/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Using Hibernate SafeHtml Validator In Application Running On OpenShift Express</title>
		<link>http://xebee.xebia.in/2012/01/18/using-hibernate-safehtml-validator-in-application-running-on-openshift-express/</link>
		<comments>http://xebee.xebia.in/2012/01/18/using-hibernate-safehtml-validator-in-application-running-on-openshift-express/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 17:22:35 +0000</pubDate>
		<dc:creator>Shekhar Gulati</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[openshift]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Validation]]></category>
		<category><![CDATA[Spring Roo]]></category>

		<guid isPermaLink="false">http://xebee.xebia.in/?p=10923</guid>
		<description><![CDATA[I use Spring Roo to create sample applications for me. Spring Roo uses JSR 303 (Bean Validation) to validate the entities for invalid values. Today I created a very simple application -- a simple PasteBin clone where you can anonymously create post or share text snippets. I wanted to validate that field post should not [...]]]></description>
			<content:encoded><![CDATA[<p>I use Spring Roo to create sample applications for me. Spring Roo uses JSR 303 (Bean Validation) to validate the entities for invalid values. Today I created a very simple application -- a simple PasteBin clone where you can anonymously create post or share text snippets. I wanted to validate that field post should not contain any Unsafe HTML content in it. So I decided to use Hibernate SafeHtml validator to validate the input field. This post will first show you how to use @SafeHtml validator in an Spring application and then we will deploy the application to OpenShift Express.<span id="more-10923"></span></p>
<p><strong>Create JBoss AS 7 OpenShift Express</strong></p>
<p>Create a jbossas-7.0 OpenShift Express application using rhc-create-app command as shown below.</p>
<pre class="brush: plain; title: ; notranslate">
rhc-create-app -l &lt;rhlogin email&gt; -a pastebin -t jbossas-7.0 -d
</pre>
<p>In case you are not aware of OpenShift Express please refer to the documentation at <a href="https://docs.redhat.com/docs/en-US/OpenShift_Express/1.0/html/User_Guide/index.html">https://docs.redhat.com/docs/en-US/OpenShift_Express/1.0/html/User_Guide/index.html</a></p>
<p><strong>Generate PasteBin clone source using Spring Roo</strong></p>
<p>I am using Spring Roo to create a pastebin clone application and will be using MongoDB as the datastore. In case you are not aware of Spring Roo you can refer to my <a href="http://www.ibm.com/developerworks/views/opensource/libraryview.jsp?search_by=introducing+spring+roo,">IBM DeveloperWorks series on Spring Ro</a>o. But before we create application remove the generated src and pom.xml files using commands shown below.</p>
<pre class="brush: plain; title: ; notranslate">
git rm -rf pom.xml src
git commit -m &quot;removed default files&quot;
</pre>
<p>Now fire the roo shell and execute the following commands to create the application.</p>
<pre class="brush: plain; title: ; notranslate">
project --topLevelPackage com.shekhar.pastebin --projectName pastebin
mongo setup
entity mongo --class ~.domain.Post
field string --fieldName body --notNull --sizeMax 4000
repository mongo --interface ~.repository.PostRepository
service --interface ~.service.PostService
web mvc setup
web mvc all --package ~.web
</pre>
<p><strong>Embed MongoDB Cartridge </strong></p>
<p>After the application has generated add MongoDB cartridge to the application using rhc-ctl-app command as shown below.</p>
<pre class="brush: plain; title: ; notranslate">
rhc-ctl-app -l &lt;rhlogin email&gt; -a pastebin -e add-mongodb-2.0
</pre>
<div></div>
<p><strong>Do Mongo Setup Again</strong></p>
<p>Now that we have embed MongoDB cartridge we should run the mongo setup command again to correctly configure the MongoDB. Fire the roo shell and execute the following line.</p>
<pre class="brush: plain; title: ; notranslate">
mongo setup --databaseName pastebin --username admin --password _cvF8XgIxIzv --host 127.1.27.1 --port 27017
</pre>
<p>Make sure your database.properties file has all the correct value.</p>
<p><strong>Adding HTMLSafe Validator</strong></p>
<p>It is very simple to add HTML validator just add SafeHtml annotation as shown below.</p>
<pre class="brush: java; title: ; notranslate">
package com.shekhar.pastebin.domain;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.layers.repository.mongo.RooMongoEntity;
import org.springframework.roo.addon.tostring.RooToString;
import org.hibernate.validator.constraints.SafeHtml;

@RooJavaBean
@RooToString
@RooMongoEntity
public class Post {

    @NotNull
    @Size(max = 4000)
    @SafeHtml
    private String body;
}
</pre>
<p>Once you have added this annotation if you try and run this on tomcat using mvn tomcat:run you will face <strong>java.lang.ClassNotFoundException : org.jsoup.safety.Whit</strong><strong>elist </strong>while creating a post.</p>
<p>To fix this add jsoup dependency to pom.xml</p>
<pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
	    &lt;groupId&gt;org.jsoup&lt;/groupId&gt;
	    &lt;artifactId&gt;jsoup&lt;/artifactId&gt;
	    &lt;version&gt;1.6.1&lt;/version&gt;
	&lt;/dependency&gt;
</pre>
<p>Now if you try and run again on tomcat you will be able to successfully create a post.</p>
<p><strong>Running on OpenShift Express</strong></p>
<p>Before you commit the code and push to express you need to first define a maven  profile called openshift. OpenShift uses this profile when it run the build in cloud.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;profile&gt;
     &lt;!-- When built in OpenShift the 'openshift' profile will be used when invoking mvn. --&gt;
     &lt;!-- Use this profile for any OpenShift specific customization your app will need. --&gt;
     &lt;!-- By default that is to put the resulting archive into the 'deployments' folder. --&gt;
     &lt;!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html --&gt;
     &lt;id&gt;openshift&lt;/id&gt;
     &lt;build&gt;
        &lt;finalName&gt;demo1&lt;/finalName&gt;
        &lt;plugins&gt;
          &lt;plugin&gt;
            &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
            &lt;version&gt;2.1.1&lt;/version&gt;
            &lt;configuration&gt;
              &lt;outputDirectory&gt;deployments&lt;/outputDirectory&gt;
              &lt;warName&gt;ROOT&lt;/warName&gt;
            &lt;/configuration&gt;
          &lt;/plugin&gt;
        &lt;/plugins&gt;
      &lt;/build&gt;
    &lt;/profile&gt;
</pre>
<p>To push the code on OpenShift Express cloud add the files and commit them as shown below.</p>
<pre class="brush: plain; title: ; notranslate">
git add src pom.xml
git commit -m &quot;adding pastebin application&quot;
</pre>
<p>finally push the code using git push command.</p>
<p>After build has run fine and code deployed to express. Hit the url and try creating a post and you will get "Internal Error". And if you tail the logs using rhc-tail-files command and you will see exception as shown below</p>
<pre class="brush: plain; title: ; notranslate">
org.jsoup.safety.Whitelist from [Module &quot;org.hibernate.validator:main&quot; from local module loader @16aa37a6 (roots: /var/lib/libra/521ca7af66d64093ae386ed99a49a790/linkbin/jbossas-7.0/standalone/configuration/modules,/var/lib/libra/521ca7af66d64093ae386ed99a49a790/linkbin/jbossas-7.0/modules)]
	at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310)
	at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103)
	at java.lang.Class.getDeclaredFields0(Native Method) [:1.6.0_22]
	at java.lang.Class.privateGetDeclaredFields(Class.java:2308) [:1.6.0_22]
	at java.lang.Class.getDeclaredFields(Class.java:1760) [:1.6.0_22]
</pre>
<p>You might thought why this error is coming as you have already added dependency in pom.xml. The reason is that this validation is carried by Hibernate Validator in JBoss AS7 and you need to add JSoup module.</p>
<p><strong>Adding JSoup and Hibernate </strong><strong>Validator Module </strong></p>
<div>To add module go to the directory where your application exists. There will be folder called .openshift inside which there will be folder called config and under which there will be folder called modules. Create the folder structure as shown below<a href="http://whyjava.files.wordpress.com/2012/01/modules.png"><img class="aligncenter size-full wp-image-1641" title="Modules" src="http://whyjava.files.wordpress.com/2012/01/modules.png" width="630" height="139" /></a></div>
<p>We are adding hibernate validator module also because we need to specify the dependency of jsoup in its module.xml.</p>
<p>The module.xml of hibernate validator is shown below</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;module xmlns=&quot;urn:jboss:module:1.0&quot; name=&quot;org.hibernate.validator&quot;&gt;
  &lt;resources&gt;
    &lt;resource-root path=&quot;hibernate-validator-4.2.0.Final.jar&quot;/&gt;
        &lt;!-- Insert resources here --&gt;
  &lt;/resources&gt;

  &lt;dependencies&gt;
    &lt;module name=&quot;javax.api&quot;/&gt;
    &lt;module name=&quot;javax.persistence.api&quot;/&gt;
    &lt;module name=&quot;javax.validation.api&quot;/&gt;
    &lt;module name=&quot;javax.persistence.api&quot;/&gt;
    &lt;module name=&quot;javax.xml.bind.api&quot;/&gt;
    &lt;module name=&quot;org.jboss.logging&quot;/&gt;
    &lt;module name=&quot;org.jboss.common-core&quot;/&gt;
    &lt;module name=&quot;org.joda.time&quot;/&gt;
    &lt;module name=&quot;org.slf4j&quot;/&gt;
    &lt;module name=&quot;org.jsoup&quot;/&gt;
    &lt;module name=&quot;org.apache.xerces&quot; services=&quot;import&quot;/&gt;
    &lt;module name=&quot;sun.jdk&quot; services=&quot;import&quot;/&gt;
  &lt;/dependencies&gt;
&lt;/module&gt;
</pre>
<p>The module.xml of jsoup is shown below.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;module xmlns=&quot;urn:jboss:module:1.0&quot; name=&quot;org.jsoup&quot;&gt;
  &lt;resources&gt;
    &lt;resource-root path=&quot;jsoup-1.6.1.jar&quot;/&gt;
  &lt;/resources&gt;
&lt;/module&gt;
</pre>
<p>Now add the files, commit to git and do git push. This time you will be able to create the post and validate the post. Try and create post with text shown below and you will get message <span style="color: #ff0000;">may have unsafe html content</span></p>
<pre class="brush: plain; title: ; notranslate">
form action=”http://www.hackablesite.com/submit.php” method=”post”&gt;
&lt;input name=”price” type=”text” value=”1000″ /&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://xebee.xebia.in/2012/01/18/using-hibernate-safehtml-validator-in-application-running-on-openshift-express/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.483 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-05 17:41:16 -->

