<?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>Trisummit Technologies</title>
	<atom:link href="http://trisummit.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://trisummit.net</link>
	<description></description>
	<lastBuildDate>Fri, 23 Dec 2011 20:45:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating a Web Service in Jive SBS 4.5.X Extending Rest</title>
		<link>http://trisummit.net/2011/12/23/creating-a-web-service-in-jive-sbs-4-5-x-extending-rest/</link>
		<comments>http://trisummit.net/2011/12/23/creating-a-web-service-in-jive-sbs-4-5-x-extending-rest/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 20:24:34 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=550</guid>
		<description><![CDATA[There is not a whole lot of documentation out there on this subject out on the Web.  Nevertheless, there is one document that is available on the Jive Software community which gives a real good start.
https://community.jivesoftware.com/docs/DOC-28795
This actually is a much better document than came with the 4.0 Jive SBS Developer&#8217;s Traning Course which gave me a broken build [...]]]></description>
			<content:encoded><![CDATA[<p>There is not a whole lot of documentation out there on this subject out on the Web.  Nevertheless, there is one document that is available on the Jive Software community which gives a real good start.</p>
<p><a href="https://community.jivesoftware.com/docs/DOC-28795">https://community.jivesoftware.com/docs/DOC-28795</a></p>
<p>This actually is a much better document than came with the 4.0 Jive SBS Developer&#8217;s Traning Course which gave me a broken build which crashed the server when deployed.  Still, some items are left out of this document leaving.  I hope to fill the void with this document.</p>
<p>The first thing you need to do is to create a generic maven structured plugin &#8211; a process not covered in this document. Nevertheless, I will include the contents of my POM file here.</p>
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!&#8211;<br />
  ~  $Revision: 96475 $<br />
  ~  $Date: 2009-11-02 16:51:02 -0800 (Mon, 02 Nov 2009) $<br />
  ~<br />
  ~  Copyright (C) 1999-${YEAR} Jive Software. All rights reserved.<br />
  ~<br />
  ~  This software is the proprietary information of Jive Software. Use is subject to license terms.<br />
  &#8211;&gt;<br />
&lt;project xmlns=&#8221;<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a>&#8221; xmlns:xsi=&#8221;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;<br />
         xsi:schemaLocation=&#8221;<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a> <a href="http://maven.apache.org/maven-v4_0_0.xsd">http://maven.apache.org/maven-v4_0_0.xsd</a>&#8220;&gt;<br />
    &lt;!&#8211;<br />
     These parameters were pased in via the commandline when this pom was created by the archetype.<br />
      &#8211;&gt;<br />
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br />
    &lt;groupId&gt;JiveWebServiceDemo&lt;/groupId&gt;<br />
    &lt;artifactId&gt;JiveWebServiceDemo&lt;/artifactId&gt;<br />
    &lt;name&gt;JiveWebServiceDemo&lt;/name&gt;<br />
    &lt;version&gt;1.0&lt;/version&gt;<br />
    &lt;packaging&gt;jar&lt;/packaging&gt;<br />
    &lt;url&gt;http://www.jivesoftware.com&lt;/url&gt;</p>
<p>    &lt;build&gt;<br />
        &lt;finalName&gt;${final.name}&lt;/finalName&gt;<br />
        &lt;plugins&gt;<br />
            &lt;!&#8211; For compilation&#8211;&gt;<br />
            &lt;plugin&gt;<br />
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
                &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;<br />
                &lt;version&gt;2.3.2&lt;/version&gt;<br />
                &lt;configuration&gt;<br />
                    &lt;source&gt;1.6&lt;/source&gt;<br />
                    &lt;target&gt;1.6&lt;/target&gt;<br />
                &lt;/configuration&gt;<br />
            &lt;/plugin&gt;<br />
            &lt;!&#8211; Weave transactions into the plugin &#8211;&gt;<br />
            &lt;plugin&gt;<br />
                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />
                &lt;artifactId&gt;aspectj-maven-plugin&lt;/artifactId&gt;<br />
                &lt;version&gt;1.3&lt;/version&gt;<br />
                &lt;configuration&gt;<br />
                    &lt;aspectLibraries&gt;<br />
                        &lt;aspectLibrary&gt;<br />
                            &lt;groupId&gt;org.springframework&lt;/groupId&gt;<br />
                            &lt;artifactId&gt;spring-aspects&lt;/artifactId&gt;<br />
                        &lt;/aspectLibrary&gt;<br />
                    &lt;/aspectLibraries&gt;<br />
                    &lt;source&gt;1.6&lt;/source&gt;<br />
                &lt;/configuration&gt;<br />
                &lt;executions&gt;<br />
                    &lt;execution&gt;<br />
                        &lt;goals&gt;<br />
                            &lt;goal&gt;compile&lt;/goal&gt;<br />
                        &lt;/goals&gt;<br />
                    &lt;/execution&gt;<br />
               &lt;/executions&gt;<br />
            &lt;/plugin&gt;</p>
<p>            &lt;plugin&gt;<br />
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
                &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;<br />
                &lt;version&gt;2.2&lt;/version&gt;<br />
                &lt;executions&gt;<br />
                    &lt;execution&gt;<br />
                        &lt;id&gt;assembly&lt;/id&gt;<br />
                        &lt;phase&gt;package&lt;/phase&gt;<br />
                        &lt;goals&gt;&lt;goal&gt;single&lt;/goal&gt;&lt;/goals&gt;<br />
                        &lt;configuration&gt;<br />
                            &lt;appendAssemblyId&gt;false&lt;/appendAssemblyId&gt;<br />
                            &lt;descriptors&gt;<br />
                                &lt;descriptor&gt;${basedir}/src/main/assembly/assembly-plugin.xml&lt;/descriptor&gt;<br />
                            &lt;/descriptors&gt;<br />
                        &lt;/configuration&gt;<br />
                    &lt;/execution&gt;<br />
                &lt;/executions&gt;<br />
            &lt;/plugin&gt;<br />
            &lt;plugin&gt;<br />
                &lt;groupId&gt; org.apache.maven.plugins&lt;/groupId&gt;<br />
                &lt;artifactId&gt;maven-antrun-plugin&lt;/artifactId&gt;<br />
                &lt;version&gt;1.6&lt;/version&gt;<br />
                &lt;executions&gt;<br />
                    &lt;execution&gt;<br />
                        &lt;!&#8211; Unpackages this SBS plugin.  That way it can be used in conjunction with the -DpluginDirs= property, which<br />
                             bypasses the standard plugin installation (which happens via the admin console), by pointing to exploded plugin jar created by this. &#8211;&gt;<br />
                        &lt;id&gt;explode-sbs-plugin&lt;/id&gt;<br />
                        &lt;phase&gt;package&lt;/phase&gt;<br />
                        &lt;goals&gt;<br />
                            &lt;goal&gt;run&lt;/goal&gt;<br />
                        &lt;/goals&gt;<br />
                        &lt;configuration&gt;<br />
                            &lt;tasks&gt;<br />
                               &lt;mkdir dir=&#8221;${basedir}/target/${final.name}&#8221; /&gt;<br />
                               &lt;unjar src=&#8221;${basedir}/target/${final.name}.jar&#8221; dest=&#8221;${basedir}/target/${final.name}&#8221; /&gt;<br />
                            &lt;/tasks&gt;<br />
                        &lt;/configuration&gt;<br />
                    &lt;/execution&gt;<br />
                &lt;/executions&gt;<br />
            &lt;/plugin&gt;<br />
            &lt;plugin&gt;<br />
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
                &lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;<br />
                &lt;version&gt;2.1.2&lt;/version&gt;<br />
                &lt;executions&gt;<br />
                    &lt;execution&gt;<br />
                        &lt;id&gt;attach-sources&lt;/id&gt;<br />
                        &lt;phase&gt;verify&lt;/phase&gt;<br />
                        &lt;goals&gt;<br />
                            &lt;goal&gt;jar&lt;/goal&gt;<br />
                        &lt;/goals&gt;<br />
                    &lt;/execution&gt;<br />
                &lt;/executions&gt;<br />
            &lt;/plugin&gt;<br />
            &lt;!&#8211; For unit testing &#8211;&gt;<br />
            &lt;plugin&gt;<br />
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
                &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;<br />
                &lt;version&gt;2.6&lt;/version&gt;<br />
                &lt;configuration&gt;<br />
                    &lt;excludes&gt;<br />
                        &lt;exclude&gt;**/selenium/*Test.java&lt;/exclude&gt;<br />
                    &lt;/excludes&gt;<br />
                    &lt;argLine&gt;-Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m&lt;/argLine&gt;<br />
                &lt;/configuration&gt;<br />
            &lt;/plugin&gt;</p>
<p>        &lt;/plugins&gt;<br />
    &lt;/build&gt;<br />
    &lt;dependencies&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;com.jivesoftware&lt;/groupId&gt;<br />
           &lt;artifactId&gt;jive-sbs-public&lt;/artifactId&gt;   <br />
           &lt;version&gt;4.5.5.2&lt;/version&gt;<br />
           &lt;type&gt;jar&lt;/type&gt;<br />
           &lt;scope&gt;provided&lt;/scope&gt;<br />
       &lt;/dependency&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;com.jivesoftware&lt;/groupId&gt;<br />
           &lt;artifactId&gt;jive-sbs-public-all&lt;/artifactId&gt;<br />
           &lt;version&gt;4.5.5.2&lt;/version&gt;<br />
           &lt;type&gt;pom&lt;/type&gt;<br />
           &lt;scope&gt;provided&lt;/scope&gt;<br />
       &lt;/dependency&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;javax.servlet&lt;/groupId&gt;<br />
           &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;<br />
           &lt;version&gt;2.3&lt;/version&gt;<br />
           &lt;type&gt;jar&lt;/type&gt;<br />
           &lt;scope&gt;provided&lt;/scope&gt;<br />
       &lt;/dependency&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;junit&lt;/groupId&gt;<br />
           &lt;artifactId&gt;junit&lt;/artifactId&gt;<br />
           &lt;version&gt;4.4&lt;/version&gt;<br />
           &lt;scope&gt;test&lt;/scope&gt;<br />
       &lt;/dependency&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;org.objenesis&lt;/groupId&gt;<br />
           &lt;artifactId&gt;objenesis&lt;/artifactId&gt;<br />
           &lt;version&gt;1.0&lt;/version&gt;<br />
           &lt;scope&gt;test&lt;/scope&gt;<br />
       &lt;/dependency&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;cglib&lt;/groupId&gt;<br />
           &lt;artifactId&gt;cglib&lt;/artifactId&gt;<br />
           &lt;version&gt;2.1&lt;/version&gt;<br />
           &lt;scope&gt;test&lt;/scope&gt;<br />
       &lt;/dependency&gt;<br />
       &lt;dependency&gt;<br />
           &lt;groupId&gt;org.jmock&lt;/groupId&gt;<br />
           &lt;artifactId&gt;jmock-junit4&lt;/artifactId&gt;<br />
           &lt;version&gt;2.4.0&lt;/version&gt;<br />
           &lt;scope&gt;test&lt;/scope&gt;<br />
   &lt;/dependency&gt;<br />
      &lt;dependency&gt;<br />
           &lt;groupId&gt;org.powermock&lt;/groupId&gt;<br />
           &lt;artifactId&gt;powermock-module-junit4&lt;/artifactId&gt;<br />
           &lt;version&gt;1.4.8&lt;/version&gt;<br />
           &lt;scope&gt;test&lt;/scope&gt;<br />
 &lt;/dependency&gt;<br />
 &lt;dependency&gt;<br />
          &lt;groupId&gt;org.powermock&lt;/groupId&gt;<br />
          &lt;artifactId&gt;powermock-api-mockito&lt;/artifactId&gt;<br />
          &lt;version&gt;1.4.8&lt;/version&gt;<br />
          &lt;scope&gt;test&lt;/scope&gt;<br />
 &lt;/dependency&gt;<br />
 &lt;dependency&gt;<br />
          &lt;groupId&gt;org.mockito&lt;/groupId&gt;<br />
          &lt;artifactId&gt;mockito-all&lt;/artifactId&gt;<br />
     &lt;version&gt;1.8.5&lt;/version&gt;<br />
     &lt;scope&gt;test&lt;/scope&gt;<br />
 &lt;/dependency&gt;<br />
 &lt;dependency&gt;<br />
         &lt;groupId&gt;log4j&lt;/groupId&gt;<br />
         &lt;artifactId&gt;log4j&lt;/artifactId&gt;<br />
         &lt;version&gt;1.2.14&lt;/version&gt;<br />
    &lt;/dependency&gt;<br />
 &lt;dependency&gt;<br />
   &lt;groupId&gt;org.codehaus.jra&lt;/groupId&gt;<br />
   &lt;artifactId&gt;jra&lt;/artifactId&gt;<br />
   &lt;version&gt;1.0-alpha-4&lt;/version&gt;<br />
    &lt;/dependency&gt;<br />
           <br />
          <br />
   &lt;/dependencies&gt;<br />
    &lt;!&#8211;<br />
     This is where you set the Jive SBS version your plugin is compiled against.<br />
      &#8211;&gt;<br />
    &lt;properties&gt;<br />
        &lt;sbs.version&gt;4.5.5.2&lt;/sbs.version&gt;<br />
        &lt;final.name&gt;${project.artifactId}-${project.version}-${sbs.version}&lt;/final.name&gt;<br />
        &lt;build.number&gt;${env.BUILD_NUMBER}&lt;/build.number&gt;<br />
        &lt;build.project.name&gt;${env.TEAMCITY_PROJECT_NAME}&lt;/build.project.name&gt;       <br />
    &lt;/properties&gt;<br />
&lt;/project&gt; </p></blockquote>
<p> </p>
<p>The Struts file needs not additions or changes.  The webservices do not make use of the struts.xml file.  The plugin.xml file needs to be updated as any other Jive plugin needs updated.  The schema.xml file also is not needed unless database changes are being done.</p>
<p>The spring.xml file does need modifications.  Here is a working spring file for this demo.</p>
<blockquote>
<div><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;beans xmlns=&#8221;<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>&#8221;<br />
       xmlns:xsi=&#8221;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;<br />
       xmlns:jaxws=&#8221;<a href="http://cxf.apache.org/jaxws">http://cxf.apache.org/jaxws</a>&#8221;<br />
       xmlns:util=&#8221;<a href="http://www.springframework.org/schema/util">http://www.springframework.org/schema/util</a>&#8221;<br />
       xsi:schemaLocation=&#8221;<br />
        <a href="http://www.springframework.org/schema/util">http://www.springframework.org/schema/util</a><br />
        <a href="http://www.springframework.org/schema/util/spring-util-2.5.xsd">http://www.springframework.org/schema/util/spring-util-2.5.xsd</a>  <br />
        <a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a><br />
        <a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</a><br />
        <a href="http://cxf.apache.org/jaxws">http://cxf.apache.org/jaxws</a><br />
        <a href="http://cxf.apache.org/schemas/jaxws.xsd">http://cxf.apache.org/schemas/jaxws.xsd</a>&#8220;  <br />
       default-autowire=&#8221;no&#8221; default-init-method=&#8221;init&#8221; default-destroy-method=&#8221;destroy&#8221;&gt;</span></span></div>
<div><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;">    &lt;bean id=&#8221;demoServiceImpl&#8221;&gt;<br />
      &lt;property name=&#8221;communityManager&#8221; ref=&#8221;communityManager&#8221; /&gt;<br />
      &lt;property name=&#8221;documentManager&#8221; ref=&#8221;documentManager&#8221; /&gt;<br />
      &lt;property name=&#8221;wsUtil&#8221; ref=&#8221;wsUtil&#8221; /&gt;<br />
    &lt;/bean&gt;<br />
    &lt;jaxws:endpoint id=&#8221;demoRestService&#8221;<br />
                    address=&#8221;/rest/demoService&#8221;<br />
                    bindingUri=&#8221;<a href="http://apache.org/cxf/binding/http">http://apache.org/cxf/binding/http</a>&#8220;&gt;<br />
        &lt;jaxws:implementor&gt;<br />
            &lt;ref bean=&#8221;demoServiceImpl&#8221; /&gt;<br />
        &lt;/jaxws:implementor&gt;<br />
         &lt;jaxws:serviceFactory&gt;<br />
            &lt;ref bean=&#8221;wrappedServiceFactory&#8221; /&gt;<br />
         &lt;/jaxws:serviceFactory&gt;<br />
    &lt;/jaxws:endpoint&gt;<br />
&lt;/beans&gt;</span></span></div>
<div><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;"> </span></span></div>
<div><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;"> </span></span></div>
<div><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;"> </span></span></div>
<div><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;"> </span></span></div>
<p><span style="color: #008080; font-size: x-small;"><span style="color: #008080; font-size: x-small;"> </p>
<p> </p>
<p></span></span></p></blockquote>
<p>With this spring.xml file properly in place, now we need to create an interface and a class that will define the webservice calls.</p>
<blockquote>
<div><strong><span style="color: #7f0055; font-size: x-small;"><span style="color: #7f0055; font-size: x-small;"> </span></span></strong></div>
<p> </p>
<div><strong><span style="color: #7f0055; font-size: x-small;"><span style="color: #7f0055; font-size: x-small;">package com.jivesoftware.community.webservices;</span></span></strong></div>
<div><strong><span style="color: #7f0055; font-size: x-small;"><span style="color: #7f0055; font-size: x-small;">import javax.jws.WebService;<br />
import javax.jws.WebMethod;<br />
import javax.jws.WebParam;<br />
import org.codehaus.jra.*;<br />
import java.util.List;</span></span></strong></div>
<div><strong><span style="color: #7f0055; font-size: x-small;"><span style="color: #7f0055; font-size: x-small;">@WebService(portName=&#8221;DemoServicePort&#8221;, serviceName = &#8220;DemoService&#8221;,<br />
 targetNamespace = &#8220;<a href="http://jivesoftware.com/clearspace/webservices">http://jivesoftware.com/clearspace/webservices</a>&#8220;)<br />
public interface DemoService {<br />
 <br />
    /**<br />
 * <a href="http://alvjpxw05:8080/rpc/rest/demoService/GetReply">http://alvjpxw05:8080/rpc/rest/demoService/GetReply</a><br />
    */<br />
 @WebMethod<br />
 @Get<br />
 @HttpResource(location=&#8221;/GetReply&#8221;)<br />
 public String getMyReply();</span></span></strong></div>
<p><strong><span style="color: #7f0055; font-size: x-small;"><span style="color: #7f0055; font-size: x-small;">    /**<br />
 * Use Groovy Script to access<br />
    */<br />
 @WebMethod<br />
 @Put<br />
 @HttpResource(location=&#8221;/MyDocumentService&#8221;)<br />
 public List&lt;WSDocument&gt; getMyDocumentsFromCommunity(@WebParam(name = &#8220;community_id&#8221;)int community_id);<br />
}</p>
<p align="left"> </p>
<p><strong><strong><strong><strong><strong><strong><strong><strong><span style="font-size: x-small;"><strong><strong><span style="font-size: x-small;"> </span></strong></strong></span></strong></strong></strong></strong></strong></strong></strong></strong></p>
<p> </p>
<p> </p>
<p></span></span></strong></p></blockquote>
<p>And here is the class which implements the interface.</p>
<blockquote><p>package com.jivesoftware.community.webservices;</p>
<p>import javax.jws.WebParam;<br />
import javax.jws.WebService;<br />
import javax.jws.WebMethod;<br />
import javax.jws.soap.SOAPBinding;<br />
import org.apache.log4j.LogManager;<br />
import org.apache.log4j.Logger;<br />
import org.codehaus.jra.Get;<br />
import org.codehaus.jra.HttpResource;</p>
<p>import java.util.*;</p>
<p>import com.jivesoftware.community.*;<br />
import com.jivesoftware.base.User;<br />
import com.jivesoftware.community.webservices.server.WSUtil;<br />
import com.jivesoftware.community.proxy.DocumentProxy;<br />
import static com.jivesoftware.community.renderer.impl.v2.JAXPUtils.toXmlString;<br />
import com.jivesoftware.util.StringUtils;<br />
import com.jivesoftware.community.renderer.impl.v2.JAXPUtils;<br />
@WebService(portName=&#8221;DemoService&#8221;, serviceName = &#8220;DemoService&#8221;, targetNamespace = &#8220;<a href="http://jivesoftware.com/clearspace/webservices">http://jivesoftware.com/clearspace/webservices</a>&#8220;)<br />
@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)<br />
public class DemoServiceImpl implements DemoService {<br />
  <br />
    private static final Logger log = LogManager.getLogger(DemoServiceImpl.class);<br />
    private CommunityManager communityManager;<br />
    private DocumentManager documentManager;<br />
    private WSUtil wsUtil;</p>
<p> <br />
    @WebMethod<br />
    public String getMyReply() {<br />
     return &#8220;My answers are limited, you must ask the right question.&#8221;;<br />
    }</p>
<p>   <br />
 @WebMethod<br />
    public List&lt;WSDocument&gt; getMyDocumentsFromCommunity(@WebParam(name = &#8220;community_id&#8221;)int community_id) {<br />
       List&lt;WSDocument&gt; list = new Vector&lt;WSDocument&gt;();<br />
       Community community = null;<br />
       try {<br />
          community =  communityManager.getCommunity(community_id);<br />
       }catch (Exception e)<br />
       {<br />
          log.info(e);  <br />
       }<br />
    <br />
       if(community!=null){<br />
         for (Document d :  documentManager.getDocuments(community)) {<br />
            DocumentType dt = d.getDocumentType();<br />
            DocumentProxy dp = (DocumentProxy)d;<br />
            DocumentAttributes attributes = dp.getDocumentAttributes();<br />
            boolean isPublished = attributes.isPublished();<br />
            if(isPublished)<br />
            { <br />
               list.add(wsUtil.convert(d));<br />
            }<br />
         }<br />
      }<br />
      return list; <br />
   }</p>
<p>   public void setCommunityManager(CommunityManager communityManager) {<br />
      this.communityManager = communityManager;<br />
   }</p>
<p>   public void setDocumentManager(DocumentManager documentManager) {<br />
      this.documentManager = documentManager;<br />
   }</p>
<p>   public void setWsUtil(WSUtil wsUtil) {<br />
      this.wsUtil = wsUtil;<br />
   }<br />
}</p></blockquote>
<p>Now compile the plugin and install it into Jive.</p>
<p>To see that the webservice exists, go to the following URL.</p>
<p>There is a URL to know if the webservice exists.</p>
<p>You can use this as a url for the first method which uses GET.<br />
http://myjivesbsserver/rpc/rest/demoService/GetReply</p>
<p>You can use a groovy script to access the second one using the PUT method.</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2011/12/23/creating-a-web-service-in-jive-sbs-4-5-x-extending-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Webservices using Java with Maven</title>
		<link>http://trisummit.net/2011/10/28/building-webservices-using-java/</link>
		<comments>http://trisummit.net/2011/10/28/building-webservices-using-java/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 14:47:43 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=512</guid>
		<description><![CDATA[I recently had the task of creating a webservice in Java. I was disappointed at how difficult it was and how incomplete and error prone the available documentation is. Creating a webservice in Java is not a trivial exercise. There are a lot of little steps. Miss one and it does not work.
Here are a couple [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had the task of creating a webservice in Java. I was disappointed at how difficult it was and how incomplete and error prone the available documentation is. Creating a webservice in Java is not a trivial exercise. There are a lot of little steps. Miss one and it does not work.</p>
<p>Here are a couple of URLs that I found useful:<br />
<a href="http://ws.apache.org/axis/java/user-guide.html" target="_blank">http://ws.apache.org/axis/java/user-guide.html</a></p>
<p><a href="http://axis.apache.org/axis2/java/core/docs/pojoguide.html" target="_blank">http://axis.apache.org/axis2/java/core/docs/pojoguide.html</a></p>
<p>I will now try to explain the greater concepts and give adequate details for you to get it to work.</p>
<p><strong>Proper Setup on Tomcat</strong><br />
Webservices do not run as part of the rest of your web application. They run in thier own servlet space. You will be able to use all of the libraries in your base application and I will later explain how to do this.</p>
<p>You need to download AXIS which after being unzipped gives you your own webapps directory with its own WEB-INF directory. Go ahead and take the time to set this up in Maven so that you can easily compile your war file.  You have to use the WEB-INF directory that comes with the AXIS download.</p>
<p>In my application, I have a war file for ROOT called ROOT.war, and a war file for webservices called axis.war.</p>
<p>Here is my pom.xml file for convenient compilation using maven including all of the dependencies needed for the webservice.<br />
&lt;code&gt;&lt;project xmlns=&#8221;<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a>&#8221; xmlns:xsi=&#8221;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221; xsi:schemaLocation=&#8221;<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a> <a href="http://maven.apache.org/maven-v4_0_0.xsd">http://maven.apache.org/maven-v4_0_0.xsd</a>&#8220;&gt;<br />
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br />
&lt;groupId&gt;WebServices&lt;/groupId&gt;<br />
&lt;artifactId&gt;WebServices&lt;/artifactId&gt;<br />
&lt;version&gt;1.0.0&lt;/version&gt;<br />
&lt;packaging&gt;war&lt;/packaging&gt;<br />
&lt;name&gt;WebServices&lt;/name&gt;<br />
&lt;build&gt;</p>
<p>&lt;plugins&gt;<br />
&lt;plugin&gt;<br />
&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;<br />
&lt;version&gt;2.1&lt;/version&gt;<br />
&lt;configuration&gt; &lt;source&gt;1.6&lt;/source&gt; &lt;target&gt;1.6&lt;/target&gt; &lt;/configuration&gt;<br />
&lt;/plugin&gt;<br />
&lt;/plugins&gt;<br />
&lt;/build&gt;</p>
<p>&lt;dependencies&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;javax.servlet&lt;/groupId&gt;<br />
&lt;artifactId&gt;servlet-api&lt;/artifactId&gt;<br />
&lt;version&gt;2.3&lt;/version&gt;<br />
&lt;type&gt;jar&lt;/type&gt;<br />
&lt;scope&gt;provided&lt;/scope&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;log4j&lt;/groupId&gt;<br />
&lt;artifactId&gt;log4j&lt;/artifactId&gt;<br />
&lt;version&gt;1.2.14&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;com.opensymphony&lt;/groupId&gt;<br />
&lt;artifactId&gt;xwork-core&lt;/artifactId&gt;<br />
&lt;version&gt;2.1.6&lt;/version&gt;<br />
&lt;type&gt;jar&lt;/type&gt;<br />
&lt;scope&gt;compile&lt;/scope&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;ognl&lt;/groupId&gt;<br />
&lt;artifactId&gt;ognl&lt;/artifactId&gt;<br />
&lt;version&gt;2.7.3&lt;/version&gt;<br />
&lt;type&gt;jar&lt;/type&gt;<br />
&lt;scope&gt;compile&lt;/scope&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;freemarker&lt;/groupId&gt;<br />
&lt;artifactId&gt;freemarker&lt;/artifactId&gt;<br />
&lt;version&gt;2.3.9&lt;/version&gt;<br />
&lt;scope&gt;compile&lt;/scope&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;junit&lt;/groupId&gt;<br />
&lt;artifactId&gt;junit&lt;/artifactId&gt;<br />
&lt;version&gt;4.8.1&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;commons-fileupload&lt;/groupId&gt;<br />
&lt;artifactId&gt;commons-fileupload&lt;/artifactId&gt;<br />
&lt;version&gt;1.2.1&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;commons-io&lt;/groupId&gt;<br />
&lt;artifactId&gt;commons-io&lt;/artifactId&gt;<br />
&lt;version&gt;20030203.000550&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.struts&lt;/groupId&gt;<br />
&lt;artifactId&gt;struts2-core&lt;/artifactId&gt;<br />
&lt;version&gt;2.1.8.1&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;commons-httpclient&lt;/groupId&gt;<br />
&lt;artifactId&gt;commons-httpclient&lt;/artifactId&gt;<br />
&lt;version&gt;3.1&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.springframework&lt;/groupId&gt;<br />
&lt;artifactId&gt;spring&lt;/artifactId&gt;<br />
&lt;version&gt;2.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.springframework&lt;/groupId&gt;<br />
&lt;artifactId&gt;spring-webmvc-struts&lt;/artifactId&gt;<br />
&lt;version&gt;2.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.springframework&lt;/groupId&gt;<br />
&lt;artifactId&gt;spring-struts&lt;/artifactId&gt;<br />
&lt;version&gt; 3.0.5.RELEASE&lt;/version&gt;<br />
&lt;/dependency&gt;</p>
<p>&lt;dependency&gt;<br />
&lt;groupId&gt;javax.persistence&lt;/groupId&gt;<br />
&lt;artifactId&gt;persistence-api&lt;/artifactId&gt;<br />
&lt;version&gt;1.0&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;wsdl4j&lt;/groupId&gt;<br />
&lt;artifactId&gt;wsdl4j&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.1&lt;/version&gt;<br />
&lt;/dependency&gt;</p>
<p>&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.ws.commons.axiom&lt;/groupId&gt;<br />
&lt;artifactId&gt;axiom-impl&lt;/artifactId&gt;<br />
&lt;version&gt;1.2.9&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.ws.commons.axiom&lt;/groupId&gt;<br />
&lt;artifactId&gt;axiom-api&lt;/artifactId&gt;<br />
&lt;version&gt;1.2.9&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.neethi&lt;/groupId&gt;<br />
&lt;artifactId&gt;neethi&lt;/artifactId&gt;<br />
&lt;version&gt;2.0.4&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-adb&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-adb-codegen&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-ant-plugin&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-clustering&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-codegen&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-corba&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-fastinfoset&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-jaxbri&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-jaxws&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-jibx&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-json&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-xmlbeans&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;<br />
&lt;artifactId&gt;axis2-mtompolicy&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.5&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;com.sun.xml.ws&lt;/groupId&gt;<br />
&lt;artifactId&gt;jaxws-rt&lt;/artifactId&gt;<br />
&lt;version&gt;2.1.4&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
&lt;dependency&gt;<br />
&lt;groupId&gt;com.sun&lt;/groupId&gt;<br />
&lt;artifactId&gt;tools&lt;/artifactId&gt;<br />
&lt;version&gt;1.5.0&lt;/version&gt;<br />
&lt;scope&gt;system&lt;/scope&gt;<br />
&lt;systemPath&gt;${java.home}/../lib/tools.jar&lt;/systemPath&gt;<br />
&lt;/dependency&gt;<br />
&lt;/dependencies&gt;<br />
&lt;/project&gt;</p>
<p style="text-align: left;">Go ahead and build your war file using the mvn install command.  If you are not familiar with this, then spend time learning Maven from the offical Maven Apache site.</p>
<p style="text-align: left;">Now, go ahead and deploy it on Tomcat so that you can see that your website works at http://mydomain.com/axis/. You should see a nice splash page that looks like this.</p>
<p style="text-align: center;"><a rel="attachment wp-att-515" href="http://trisummit.net/2011/10/28/building-webservices-using-java/axis-home-page/"><img class="size-medium wp-image-515  alignnone" title="axis-home-page" src="http://trisummit.net/wp-content/uploads/2011/10/axis-home-page-300x259.png" alt="axis-home-page" width="300" height="259" /></a></p>
<p><strong>Create the POJO</strong><br />
This apache website at http://axis.apache.org/axis2/java/core/docs/pojoguide.html gives a framework of a webservice with the Weather webservice. I found that certain dependencies did not work so I could not get the example working.  Nevertheless, the concepts of the framework are helpful.</p>
<p>Create your service classes such as WeatherService.java, CalculatorService, or any other service or services you need. These classes becomes the basis of your webservices which will eventually be called with URLs such as <a href="http://mydomain.com/axis/services/WeatherService/">http://mydomain.com/axis/services/WeatherService/</a>, or <a href="http://mydomain.com/axis/services/CalculatorService">http://mydomain.com/axis/services/CalculatorService</a>.</p>
<p>These service classes are to be basic classes.  They can be placed in your normal package structure such as in the com.trisummit.webservices package.  You can add all sorts of dependencies for all available libraries such as logging, jdbc abstraction layers, libraries in your base application, etc.  Your class will need to have a parameterless constructor.  Your class will have public and private methods. Public methods will be exposed in the webservice.  Private methods will not be exposed in your webservice but are available for your programming pleasure to assist in the logic of your public methods.  Your methods can take in whatever parameters you need and return whatever values or classes you want them to return - even container classes of your own creation or just plain Strings.  If you want binary content to be part of your return, return a byte array.</p>
<p><strong>Prepare the WEB-INF Directory</strong></p>
<p>In the maven /src/main/webapp/WEB-INF directory, add a directory called services and add the package directory structure of your Service classes.</p>
<p>WEB-INF/services/WeatherService/net/trisummit/webservices/<br />
WEB-INF/services/CalculatorService/net/trisummit/webservices/</p>
<p>You also need to add a META-INF directory with an appropriate services.xml file for each webservice.</p>
<p>WEB-INF/services/WeatherService/META-INF/<br />
WEB-INF/services/CalculatorService/META-INF/</p>
<p>Here is an example of the services.xml file.</p>
<p>&lt;service name=&#8221;CalculatorService&#8221; scope=&#8221;application&#8221;&gt;<br />
&lt;description&gt;<br />
Authentication POJO Service<br />
&lt;/description&gt;<br />
&lt;messageReceivers&gt;<br />
&lt;messageReceiver   mep=&#8221;<a href="http://www.w3.org/2004/08/wsdl/in-only">http://www.w3.org/2004/08/wsdl/in-only</a>&#8221; /&gt;<br />
&lt;messageReceiver   mep=&#8221;<a href="http://www.w3.org/2004/08/wsdl/in-out">http://www.w3.org/2004/08/wsdl/in-out</a>&#8220;  /&gt;<br />
&lt;/messageReceivers&gt;<br />
&lt;parameter name=&#8221;ServiceClass&#8221;&gt;<br />
net.trisummit.webservices.CalculatorService<br />
&lt;/parameter&gt;<br />
&lt;/service&gt;</p>
<p>Now create the deploy.wsdd file in the services directory at</p>
<p>WEB-INF/services/deploy.wsdd</p>
<p>Here is a sample:</p>
<p><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none"><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none"> </span></span></p>
<p align="left">&lt;deployment xmlns=&#8221;<a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a>&#8221; xmlns:java=&#8221;<a href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</a>&#8220;&gt;<br />
&lt;service name=&#8221;WeatherService&#8221; provider=&#8221;java:RPC&#8221;&gt;<br />
&lt;parameter name=&#8221;className&#8221; value=&#8221;net.trisummit.webservices.WeatherService&#8221;/&gt;<br />
&lt;parameter name=&#8221;allowedMethods&#8221; value=&#8221;*&#8221;/&gt;<br />
&lt;/service&gt;<br />
&lt;service name=&#8221;CalculatorService&#8221; provider=&#8221;java:RPC&#8221;&gt;<br />
&lt;parameter name=&#8221;className&#8221; value=&#8221;net.trisummit.webservices.CalculatorService&#8221;/&gt;<br />
&lt;parameter name=&#8221;allowedMethods&#8221; value=&#8221;*&#8221;/&gt;<br />
&lt;/service&gt;<br />
&lt;/deployment&gt;</p>
<div><span style="font-size: x-small;"> </span></div>
<p>Now you can go ahead and compile the application using the mvn install command.</p>
<p><strong>Restructure and Rebuild</strong></p>
<p>Now you have two more tasks to do before you can send it to the server.  And I already know what your are thinking when you read this&#8230;You have got to be kidding.   You need to place the compiled webservice classes into the target  sections of your maven build.</p>
<p>myapplication/target/mywebservices-app-name/WEB-INF/services/net/trisummit/webservices/WeatherService.class</p>
<p>myapplication/target/mywebservices-app-name/WEB-INF/services/net/trisummit/webservices/CalculatorService.class</p>
<p>Next, you need to take the classes of your dependencies, zip them up, change the extension of the zip file to jar, and copy this jar file in the the target lib directory.</p>
<p>myapplication/target/mywebservices-app-name/WEB-INF/classes/ZIP UP EVERYTHING AFTER THIS AND RENAME TO BE A JAR FILE.</p>
<p>Move your new jar file into the lib directory at myapplication/target/mywebservices-app-name/WEB-INF/lib/</p>
<p>Now rebuild your application again using the mvn install command to create your war file and name your war file axis.war.</p>
<p>Now drop your war file on Tomcat and restart your Tomcat App Server.</p>
<p><strong>Start your Webservice</strong></p>
<p>Just putting this on the webserver does not activate the webservice.  You have one more very unusual step to take.  You have to explicitely start the webservice with a complex command line call which has a significant number of java dependencies.</p>
<p>Create a directory for your webservices dependency jar files &#8211; not your webservices, but the dependencies needed for running any and all webservices.</p>
<p>D:\axis\lib</p>
<p>Drop in all of your axis related jar files &#8211; in fact, add all jar files related to your project including all dependencies.  Then from the command line, execute this command from your services directory, ie <span id="internal-source-marker_0.25452384506857434" style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none"><span id="internal-source-marker_0.25452384506857434" style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none">D:\Tomcat 7.0\webapps\axis\WEB-INF\services\</span></span></p>
<p><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none">java -cp D:\axis\lib\axis2-1.5.5.jar;D:\axis\lib\axis.jar;D:\axis\lib\axis2-saaj-1.5.5.jar;D:\axis\lib\commons-discovery.jar;D:\axis\lib\commons-logging-1.1.jar;D:\axis\lib\jaxrpc.jar;D:\axis\lib\log4j-1.2.14.jar;D:\axis\lib\xerces.jar;D:\axis\lib\xercesImpl.jar;D:\axis\lib\xml-apis.jar;D:\axis\lib\log4j.properties;  org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy.wsdd</span></p>
<p><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none">If you get this message &#8211; <span id="internal-source-marker_0.25452384506857434" style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none">&lt;Admin&gt;Done processing&lt;/Admin&gt; &#8211; you did well.</span></span></p>
<p><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none"><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none">Now test your URLs to see that everything works right.  Go to the axis main page and you should see and be able to test everything you need including links to the wsdl of your webservices.</span></span></p>
<p><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none"><span style="BACKGROUND-COLOR: transparent; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-FAMILY: Arial; COLOR: #000000; FONT-SIZE: 15px; VERTICAL-ALIGN: baseline; FONT-WEIGHT: normal; TEXT-DECORATION: none"><a href="http://mydomain.com/axis/">http://mydomain.com/axis/</a></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2011/10/28/building-webservices-using-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java.lang.reflect.InvocationTargetException with Axis2</title>
		<link>http://trisummit.net/2011/09/16/java-lang-reflect-invocationtargetexception-with-axis2/</link>
		<comments>http://trisummit.net/2011/09/16/java-lang-reflect-invocationtargetexception-with-axis2/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 14:36:27 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=509</guid>
		<description><![CDATA[I used the wsdl2java functionality build the necessary classes for communication with a particular webservice. However, when the webservice stub was called to perform the communication, I was given this error.
java.lang.reflect.InvocationTargetException &#8211; full stack trace given below.
In digging through trying to determine the cause of the problem, I recalled having something like this happen 2 [...]]]></description>
			<content:encoded><![CDATA[<p>I used the wsdl2java functionality build the necessary classes for communication with a particular webservice. However, when the webservice stub was called to perform the communication, I was given this error.</p>
<p>java.lang.reflect.InvocationTargetException &#8211; full stack trace given below.</p>
<p>In digging through trying to determine the cause of the problem, I recalled having something like this happen 2 years ago and what I did to fix the problem. It had to do with not having all of the latest jar files installed to match the AXIS jar files used in the generation of the wsdl2java generated code. In may latest encounter of this problem, it had to do with not having the latest version of the AXIOM jar file.</p>
<p>I had to change my maven POM file from this:<br />
<pre><code>

org.apache.ws.commons.axiom
axiom-api
1.2.8
</code></pre></p>
<p>to<br />
org.apache.ws.commons.axiom<br />
axiom-api<br />
1.2.9</p>
<p>Here is the full stack trace I encountered.</p>
<p>java.lang.reflect.InvocationTargetException<br />
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)<br />
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)<br />
at java.lang.reflect.Method.invoke(Unknown Source)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)<br />
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)<br />
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)<br />
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)<br />
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)<br />
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)<br />
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)<br />
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)<br />
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)<br />
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)<br />
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)<br />
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)<br />
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)<br />
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)<br />
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)<br />
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)<br />
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)<br />
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)<br />
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)<br />
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)<br />
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)<br />
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)<br />
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)<br />
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)<br />
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)<br />
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)<br />
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)<br />
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)<br />
at java.lang.Thread.run(Unknown Source)<br />
Caused by: java.lang.NoClassDefFoundError: org/apache/axiom/om/util/StAXParserConfiguration<br />
at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:64)<br />
at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:197)<br />
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:145)<br />
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:108)<br />
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67)<br />
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354)<br />
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)<br />
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)<br />
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)<br />
at com.quest.QuestSSOServicesSSOServiceStub.getUser(QuestSSOServicesSSOServiceStub.java:5299)<br />
at com.quest.action.RetrieveWebserviceCall.authenticateWithAWS(RetrieveWebserviceCall.java:240)<br />
at com.quest.action.RetrieveWebserviceCall.execute(RetrieveWebserviceCall.java:134)<br />
&#8230; 69 more<br />
Caused by: java.lang.ClassNotFoundException: org.apache.axiom.om.util.StAXParserConfiguration<br />
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)<br />
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)<br />
&#8230; 81 more</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2011/09/16/java-lang-reflect-invocationtargetexception-with-axis2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating Content into Jive SBS</title>
		<link>http://trisummit.net/2011/08/19/migrating-content-into-jive-sbs/</link>
		<comments>http://trisummit.net/2011/08/19/migrating-content-into-jive-sbs/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 11:41:22 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=479</guid>
		<description><![CDATA[The requirement to move content from an external system into Jive SBS is very common. You have discussion forum content and blog content in whatever system (Wordpress, Jive Integrated, Teligent, Dot Net Nuke, PHPBB, etc.) and you need to get it into Jive SBS. And then complicating the situation further is that Jive SBS may [...]]]></description>
			<content:encoded><![CDATA[<p>The requirement to move content from an external system into Jive SBS is very common. You have discussion forum content and blog content in whatever system (Wordpress, Jive Integrated, Teligent, Dot Net Nuke, PHPBB, etc.) and you need to get it into Jive SBS. And then complicating the situation further is that Jive SBS may be in a hosted environment where firewalls will prevent any form of external database connections.</p>
<p>While working with Quest Software, I started the process of doing migrations about one year ago. Prior to speaking with Jive Professional Services, we looked mostly at three options.</p>
<p>1. Use webservices such as REST and SOAP to push in the content.</p>
<p>2. Transfer the content from the originating database into XML. Place the files in a location accessible to Jive SBS such as an external webserver. Then transfer the content in using a custom plugin to parse the XML and use POJOs to push in content into Jive SBS using the various managers made accessible in Jive.</p>
<p>3. Use a plugin and establish a JDBC connection from the old system and the new Jive SBS database. Use application logic in the plugin to prepare the content for entry into the Jive SBS database.</p>
<p>My first experiments were with option 1. There were questions of whether or not one administrator could push in content for any user. It did appear to work successfully &#8211; and that was without rewriting an authentication filter for the webservices. Nevertheless, the slowness of the webservices appeared to be a serious issue. Each call to the REST api took more than a second, and if we were to migrate a very large forum, that would mean the process may need to run for a very long time. It also had the problem of sending out emails to subscribers. Once having an opportunity to discuss migrations with Jive Professional Services, we all agreed that this was not the best approach.</p>
<p>Option 3 was immediately tossed out as an option as Jive SBS was in a hosted environment and firewalls prevented any sort of JDBC connections between the two systems. Furthermore, it is not recommended to do straight dumps into the database of Jive SBS as certain meta-data may not be properly pushed in and the content may not be checked for validity and could cause serious issues in the application.</p>
<p>Option 2 was the perfect solution and in my assessment, even the best solution even when the environment is not hosted. By exporting content into XML, content could be safely and easily smoothed prior to the push. By using the managers made available by jive accessible in doing plugin development, all data can be pushed in using the same methods as used by someone posting direct in the application.</p>
<p>I proceeded and wrote a migration tool to push in wordpress blog content. I completed the blog migration tool and successfully used the tool. Afterwards, I was 2/3 complete with adding functionality to push in discussion forums when a decision from management was made to engage Jive Professional Services to build a reusable utility for migrating discussion forums. Since we had about 30 forums to migrate, management felt the engagement was justified. The cost was $60,000. I frankly opposed the expense as being unnecessary.</p>
<p>I will now proceed to describe both tools and the differences between the two tools.</p>
<p><strong>Tool 1 (Brian&#8217;s Solution):</strong><br />
A console java application is used to push all content into multiple files.</p>
<p>ids.html &#8211; a plain text html file with a line by line list of all thread ids from the external system was created as a master file.<br />
So for this simple example, the ids.html file would simply look like:</p>
<p>24<br />
25<br />
29</p>
<p>Then (a thread id).xml file for each thread (or blog post id) would be created to hold the content of each thread or blog post including comments or follow-on treaded discussion messages for the thread.</p>
<p>Example file names would be:</p>
<p>24.xml<br />
25.xml<br />
29.xml</p>
<p>By using this approach there would never be any scalability issues as no XML file would ever be too large for the plugin to handle.</p>
<p>The files would all get placed onto a webserver where a plugin on JiveSBS could reach into them over the web and stream in the content.</p>
<p>The plugin would grab the accessible managers that are available to all plugin developers and push in the content one message at a time.</p>
<p>Images and attachments would be streamed in. This is done by parsing out source information in the content and reading in the binary stream over the internet and saving it to the system.</p>
<p>A dictionary is established to record all operations. The dictionary is used to create 301 redirects after the fact in an external redirects server. The application could have gone one step further with the dictionary and used to rollback the content in the event of a failure anywhere in the process.</p>
<p>There was one downside to the application which I never resolved was that the smtp mail server would need to be renamed to a non-existent location while the process ran. Not doing so would result in spamming the end users with migration related emails. On the down side, this also meant that users would not receive emails during the time of the migration. Otherwise, the process worked smoothly and quickly. Migrations could be done in quick bursts preferably during non peak hours and not take much time at all.</p>
<p><strong>Tool 2 (Jive PS Solution):</strong><br />
Jive Professional Services put this application together using preexisting code long standing on the Jive team. Thier solution used a groovy script to generate xml files that were placed in a handful of subfolders.</p>
<p>/users/users.xml<br />
/community/community.xml<br />
/msg/msg.xml<br />
/msgcontent/msgcontent.xml<br />
/attachments/ &#8211; a list of xml files specially named including the messageid with the binary value of the attachment stored in the &lt;data&gt; section of the xml.<br />
/images/ &#8211; a list of xml files specially named including the messageid with the binary value of the image stored in the &lt;data&gt; section of the xml.</p>
<p>The files would need to be placed physically on the server with Jive on all nodes of the operating systems, and application logic from the plugin would pull in the content and push it in. The dictionary was used also in this process for the later construction of 301 redirects.</p>
<p>There were some major &#8220;gotcha&#8217;s&#8221; with the application.</p>
<p>1. Once the plugin is installed, the entire Jive SBS system is placed in read only mode resulting in downtime for the application &#8211; something that I believe is very undesireable for an external facing enterprise application. A maintenance page is best put up during this time to avoid end user confusion. Without the maintenance page, users can see content but when they attempt to post content, they recieve a frustrating error message.</p>
<p>2. Each individual subspace has to run as a separate batch. Following the run, the application is required to go through the app restart process which takes ten minutes each time in the hosted environment.</p>
<p>3. Jive Hosting support is required during the migration times for placing files on the Jive server.</p>
<p>4. The application is very finiky and easily breaks over unexpected and difficult to troubleshoot issues usually regarding attachments.</p>
<p>With these constraints, all migrations must be done on Saturdays. And some migrations may take even 8 hours to complete depending on how many subspaces are touched in the process.</p>
<p>My end assessment regarding the Jive migration tool from Jive Professional Services is as follows:<br />
<strong>If you are okay with spending $60,000 for a tool that requires significant amounts of down time &#8211; then go to Jive Professional Services for your migration tool.</strong> The tool will work for you if you do.</p>
<p>Optionally, you can spend significantly less money, and I could build the tool for you which is equally as effective and requires no more downtime than one or two cycles of application restart for plugin installation and plugin unistallation when complete.</p>
<p>So there you have it &#8211; the big picture of two workable systems used to migrate content into Jive SBS.</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2011/08/19/migrating-content-into-jive-sbs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remove Tabs in MediaWiki</title>
		<link>http://trisummit.net/2011/07/11/remove-tabs-in-mediawiki/</link>
		<comments>http://trisummit.net/2011/07/11/remove-tabs-in-mediawiki/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 22:03:46 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=476</guid>
		<description><![CDATA[This is an easy one.  If you need to remove all of the tabs in your Mediawik Wiki site, just go into the css page and modify it as follows:
.pBody {
        font-size: 95%;
        background-color: white;
      [...]]]></description>
			<content:encoded><![CDATA[<p>This is an easy one.  If you need to remove all of the tabs in your Mediawik Wiki site, just go into the css page and modify it as follows:</p>
<p>.pBody {<br />
        font-size: 95%;<br />
        background-color: white;<br />
        color: black;<br />
        border-collapse: collapse;<br />
        border: 1px solid #aaa;<br />
        padding: 0 .8em .3em .5em;<br />
        display:none;<br />
}</p>
<p>Of course, it is the display:none; that removes them from the display.  They are still there, you just can&#8217;t see them anymore.</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2011/07/11/remove-tabs-in-mediawiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Force URLs to be Lowercase</title>
		<link>http://trisummit.net/2010/08/12/how-to-force-urls-to-be-lowercase/</link>
		<comments>http://trisummit.net/2010/08/12/how-to-force-urls-to-be-lowercase/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 15:00:48 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Systems Administration]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=433</guid>
		<description><![CDATA[First off, I do not recommend doing this.  You may have undesireable effects such as images that use upper and lower case names all of a sudden no longer displaying because they must be lower case to work.
The general concensus among members of the SEO community seem to be that there is really no [...]]]></description>
			<content:encoded><![CDATA[<p>First off, I do not recommend doing this.  You may have undesireable effects such as images that use upper and lower case names all of a sudden no longer displaying because they must be lower case to work.</p>
<p>The general concensus among members of the SEO community seem to be that there is really no reason to do this.  There is little to no SEO benefit.  The user experience really is not effected by this.  Nevertheless, as a systems administrator, you may be asked to make this happen &#8211; just in case there is a benefit.</p>
<p>My solution here works on the CentOS Linux operating system.  I have not tested it elsewhere.  It assumes mod_rewrite is installed which by default it is.</p>
<p>You cannot do this from the .htaccess file.  It can only be done by making a change in the httpd.conf file.  At that, it is an entry in the host section for each individual site on your server.</p>
<p>Here is the change.</p>
<p><pre><code>
&lt;VirtualHost an_ip_address:80&gt;
&nbsp;&nbsp;A bunch of virtual host information needed for the site.

&nbsp;&nbsp;RewriteEngine on
&nbsp;&nbsp;RewriteMap lowercase int:tolower
&nbsp;&nbsp;RewriteCond $1 [A-Z]
&nbsp;&nbsp;RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L]

&lt;/VirtualHost&gt;
</code></pre></p>
<p>I found the solution in this discussion thread after striking out from others &#8211;  http://www.daniweb.com/forums/thread46647.html</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2010/08/12/how-to-force-urls-to-be-lowercase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Connecting Jive SBS to an SSL Protected Webservice</title>
		<link>http://trisummit.net/2010/08/09/connecting-jive-sbs-to-an-ssl-protected-webservice/</link>
		<comments>http://trisummit.net/2010/08/09/connecting-jive-sbs-to-an-ssl-protected-webservice/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 21:11:29 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Systems Administration]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=427</guid>
		<description><![CDATA[This was the task.  We are hooking up Jive SBS to an SSO server for authentication and I am writing a plugin to handle this task.  In the plugin, I come to the part of the code where I need to communicate with an external webservice.  In order for java to communicate [...]]]></description>
			<content:encoded><![CDATA[<p>This was the task.  We are hooking up Jive SBS to an SSO server for authentication and I am writing a plugin to handle this task.  In the plugin, I come to the part of the code where I need to communicate with an external webservice.  In order for java to communicate with this webservice, the security certificate must be part of the keystore of the jre and the keystore must be recognized by the application.  By default, Jive SBS does not have an assigned keystore.  </p>
<p>Here is how I resolved it.</p>
<p>1.  Download the security certificate of the webservice using a browser.  You should be able to save the certificate as a .cer or .crt file name.  Then transfer the certificate to your Linux server that is running Jive SBS.  Save this file in a unique place we will call &#8220;somedirectory&#8221;.  If the step of downloading a certificate is new to you, from IE, go to File -> Properties -> Certificates -> Details -> Copy to File.</p>
<p>2.  Run these commands from the Linux console, modified to your environment.</p>
<p>/usr/local/jive/java/bin/keytool -import -alias somename -file /usr/local/jive/etc/httpd/ssl/somename.cer -keystore /usr/local/jive/java/jre/lib/security/cacerts</p>
<p>When it asks for the password, use the default of &#8211; changeit</p>
<p>3.  Test getting a connection using the SSLPoke class &#8211; described below.</p>
<p>4.  Add the truststore into the setenv file located at /usr/local/jive/applications/sbs/bin/setenv.<br />
export JAVA_OPTS=&#8221;\<br />
-XX:+UseParNewGC \<br />
-XX:+UseConcMarkSweepGC \<br />
-XX:CMSInitiatingOccupancyFraction=75 \<br />
-XX:+CMSParallelRemarkEnabled \<br />
-XX:+CMSScavengeBeforeRemark \<br />
-XX:CMSMaxAbortablePrecleanTime=1000 \<br />
-XX:+PrintGCDetails \<br />
-XX:+PrintGCTimeStamps \<br />
-XX:+PrintClassHistogram \<br />
-Djava.awt.headless=true \<br />
-Djava.net.preferIPv4Stack=true \<br />
<strong>-Djavax.net.ssl.trustStore=/somedirectory/keystore.jks \</strong><br />
-Xloggc:${JIVE_LOGS}/${JIVE_NAME}-gc.log&#8221;</p>
<p>Another command I found useful in troubleshooting this issue was as follows:<br />
ps -ef | grep java</p>
<p><strong>Using SSLPoke</strong><br />
I actually picked this up from an attlasian web page so I am not the original author.  But here is the source code.</p>
<p><pre><code>
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

/** Establish a SSL connection to a host and port, writes a byte and
 * prints the response. See
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 */
public class SSLPoke {
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {
&nbsp;&nbsp;&nbsp;&nbsp;if (args.length != 2) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Usage: &quot;+SSLPoke.class.getName()+&quot; &lt;host&gt; &lt;port&gt;&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;try {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream in = sslsocket.getInputStream();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream out = sslsocket.getOutputStream();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Write a test byte to get a reaction :)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (in.available() &gt; 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(in.read());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Successfully connected&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception exception) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception.printStackTrace();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
}
</code></pre></p>
<p>Compile this simple class and test your connection with this expected behavior:</p>
<p>works<br />
java -Djavax.net.ssl.trustStore=/somedirectory/keystore.jks SSLPoke webserviceurl.com 443<br />
Successfully Connected</p>
<p>Does not work<br />
java SSLPoke webserviceurl.com 443</p>
<p>javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path bui                                                                                                                  lding failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find vali                                                                                                                  d certification path to requested target<br />
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)<br />
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)<br />
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:198)<br />
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:192)<br />
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.j                                                                                                                  ava:1074)<br />
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java                                                                                                                  :128)<br />
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:529)<br />
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:465)<br />
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)<br />
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.j                                                                                                                  ava:1120)<br />
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)<br />
        at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)<br />
        at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:73)<br />
        at SSLPoke.main(SSLPoke.java:23)<br />
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security                                                                                                                  .provider.certpath.SunCertPathBuilderException: unable to find valid certification path to re                                                                                                                  quested target<br />
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:294)<br />
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:200)<br />
        at sun.security.validator.Validator.validate(Validator.java:218)<br />
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.ja                                                                                                                  va:126)<br />
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustMana                                                                                                                  gerImpl.java:209)<br />
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustMana                                                                                                                  gerImpl.java:249)<br />
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.j                                                                                                                  ava:1053)<br />
        &#8230; 9 more<br />
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid c                                                                                                                  ertification path to requested target<br />
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.j                                                                                                                  ava:174)<br />
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)<br />
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:289)<br />
        &#8230; 15 more</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2010/08/09/connecting-jive-sbs-to-an-ssl-protected-webservice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Axis2 Jar file entries in the POM.xml File</title>
		<link>http://trisummit.net/2010/07/09/axis2-jar-file-entries-in-the-pom-xml-file/</link>
		<comments>http://trisummit.net/2010/07/09/axis2-jar-file-entries-in-the-pom-xml-file/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 18:44:01 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=413</guid>
		<description><![CDATA[I am using Maven to do my builds for Jive SBS; however, I needed to add the Axis2 jar files to commucate with the Single Sign-on Server.  I added all that were needed to do the perform the wsdl2java functionality.  Here are the dependencies that I added to the pom.xml to grab all [...]]]></description>
			<content:encoded><![CDATA[<p>I am using Maven to do my builds for Jive SBS; however, I needed to add the Axis2 jar files to commucate with the Single Sign-on Server.  I added all that were needed to do the perform the wsdl2java functionality.  Here are the dependencies that I added to the pom.xml to grab all of the jar files.</p>
<p>Please substitute your version with the version number I have included in the POM.</p>
<p><pre><code>
&lt;!--Begin added for Axis --&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-adb&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-adb-codegen&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-ant-plugin&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-clustering&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-codegen&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-corba&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-fastinfoset&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-jaxbri&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-jaxws&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-jibx&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-json&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-xmlbeans&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;dependency&gt;
&nbsp;&nbsp;&lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; 
&nbsp;&nbsp;&lt;artifactId&gt;axis2-mtompolicy&lt;/artifactId&gt; 
&nbsp;&nbsp;&lt;version&gt;1.5.1&lt;/version&gt; 
&lt;/dependency&gt;
&lt;!--End added for Axis --&gt;

</code></pre></p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2010/07/09/axis2-jar-file-entries-in-the-pom-xml-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crowd Authentication Server Review</title>
		<link>http://trisummit.net/2010/04/27/crowd-authentication-server-review/</link>
		<comments>http://trisummit.net/2010/04/27/crowd-authentication-server-review/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 02:29:10 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Systems Administration]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=393</guid>
		<description><![CDATA[I started working with the Crowd application for single sign-on and identity management about four months ago.  I have been quite impressed with it.  The application allows your applications to use a centralized repository for user authentication.  Additionally, it provides an OpenID service for your same users as well.
The Crowd application is [...]]]></description>
			<content:encoded><![CDATA[<p>I started working with the Crowd application for single sign-on and identity management about four months ago.  I have been quite impressed with it.  The application allows your applications to use a centralized repository for user authentication.  Additionally, it provides an OpenID service for your same users as well.</p>
<p>The Crowd application is a java based program which runs on Tomcat.  It is best installed by downloading the stand-alone application from Atlassian and installing it on a dedicated server.  If you do plan to run other java applications on this same server, then you should use a separate instance of Tomcat. </p>
<p>Managing users is rather simple.  It gives you an out of the box directory for you to use as the listing of your users.  It also gives you the ability to integrate with your Active Directory.  And best of all, it allows you to manage the users of your application by allowing the application to draw from the users of the Active Directory and the users of your own directories.  So now you can give contractors access to the applications without adding them to the AD.</p>
<p>Crowd has been well developed to easily integrate with your Java applications that use well known standards such as Acegi.  Getting the other Atlassian products to use Crowd takes about 20 minutes each (if that long).  Set up the application in Crowd and establish the user base and establish the groups used by the application.  Next, go to the application, add the version compatible jar file, make some minor modifications in a couple of xml files and you are good to go &#8211; actual instructions are on the Atlassian site. </p>
<p>I have never seen an implementation of single sign-on go so easily as it does with Jira, Confluence, Fisheye, and Bamboo.  Even getting Subversion over Apache to work with Crowd was not a difficult task.  Crowd integration with all of these applications is well documented.  The next application I need to try this on will be Jive SBS &#8211; this integraton is not well documented except I do know that Jive does make use of Acegi.  I am hoping this will be easy.</p>
<p>Lastly, Crowd will work as an OpenID server for you.  If you are not familiar with OpenID, it is a standard that many applications have adopted.  By logging onto the Crowd OpenID application, you can get a URL that OpenID compliant applications will accept for authentication.  When you drop the url into the third party application the first time, it will send notification to your Crowd server for you to allow Crowd to acknowledge the third party application as a valid application of yours for authentication.  From that time forward, you no longer need to remember your password -just drop in the URL and you are logged in.  I tested the functionality on the Teligent community application and it worked beautifully.</p>
<p>One current weakness is the lack of documentation of getting dotNet applications to work with Crowd.</p>
<p>I really like this Crowd Application.  I intend to continue working with it for some time now.</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2010/04/27/crowd-authentication-server-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VPSLand Review</title>
		<link>http://trisummit.net/2010/04/22/vpsland-review/</link>
		<comments>http://trisummit.net/2010/04/22/vpsland-review/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 03:15:05 +0000</pubDate>
		<dc:creator>Brian Nettles</dc:creator>
				<category><![CDATA[Systems Administration]]></category>

		<guid isPermaLink="false">http://trisummit.net/?p=385</guid>
		<description><![CDATA[I was in need of some external facing virtualized servers and ran across the website at http://vpsland.com.  I was skeptical at first as the specs on the website said nothing about them running on ESX servers.  But I decided to give it a try.  I tried both Fedora virtualized servers and a [...]]]></description>
			<content:encoded><![CDATA[<p>I was in need of some external facing virtualized servers and ran across the website at http://vpsland.com.  I was skeptical at first as the specs on the website said nothing about them running on ESX servers.  But I decided to give it a try.  I tried both Fedora virtualized servers and a CentOS virtualized server.</p>
<p><strong>Performance &#8211; Fedora</strong><br />
My first concern came when I tried to log on to my first server which was on the Fedora operating system.  There seems to be some pretty serious latency between the time you get your user prompt and the time it takes for the password prompt to show up and let you in.  This problem also translated into problems when trying to ftp files to the server. The FTP client would often time out while simply making the initial connection.  Once the connection is made the file transfers worked just fine.</p>
<p>The second issue I had with the fedora server had to do with running PHP / MySQL applications such as OSCommerce.  While static web pages and dynamic web pages from the shopping cart displayed well, when someone tried to add information to the database, it was extremely slow &#8211; even unusable.  My first customer to purchase on my shopping cart while hosted on this server ended up being listed in the shopping cart as having three purchases.  I also discovered that as one uses any php to database operations, the application would seemingly hang for about 30 seconds prior to completing the processing of the data and taking you to the next page.</p>
<p>On the positive side, I had some java based applications sitting on Tomcat that were not serious database consumers.  These applications worked acceptably well in this environment as these apps tended to be more memory intensive and less dependent on processor / disk IO / database performance.</p>
<p><strong>Performance &#8211; CentOS</strong><br />
I tried using one of the CentOS servers.  This server seemed to work better.  The logon latency was much improved.  I did not test my php applications on this CentOS server.  I only tested my java apps with one instance of Tomcat running.  This particular application was Fisheye &#8211; an Atlassian product.  This application works well on this virtual machine.  It is memory intensive and comes close to using the entire 1GB of memory that is allocated to this server.</p>
<p><strong>Customer Service:</strong><br />
In spite of them not giving out thier phone number, I found thier customer support to actually be quite effective.  It is not good for 24/7 support, but if you are okay with submitting a trouble ticket and waiting about 4 hours, they appear to be fairly reliable.</p>
<p><strong>Conclusion:</strong><br />
In the end, my review is mixed.  I continue to be a customer with them as I have the Fisheye application running on the CentOS server.  The rest of my applications I got back onto a dedicated server where they seem to work much better.  If you decide to try thier services, I recommend starting with the CentOS flavor of a virtual server and not use the Fedora servers.</p>
]]></content:encoded>
			<wfw:commentRss>http://trisummit.net/2010/04/22/vpsland-review/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

