0

Webspeed setup on Tomcat

The latest versions of OpenEdge allow simple serialization of temp-tables and prodatasets to JSON, and in this context, Webspeed may become more and more popular as it can serve the JSON result directly, without having to rely on Java/ASP/Whatever.
As I'm mainly working with Java, I always have a servlet container ready to run. But the Progress documentation doesn't mention Tomcat as a deployment plaftorm ; here is this guide !

Step 1 : Download Tomcat

This guide is for Tomcat 6, but any other version should work. So grab Tomcat from http://tomcat.apache.org/download-60.cgi and install it (for the Windows installer version) or extract it (for the standalone ZIP file).
In this documentation, $CATALINA_HOME will represent the installation path.

Step 2 : create a new webapp

Create a new directory in $CATALINA_HOME/webapps. This directory has to called webspeed followed by the version number, i.e. if you're running OpenEdge 11.0, the directory will be $CATALINA_HOME/webapps/webspeed110.
In this documentation, $WEBAPP will represent this directory
In this directory, create a subdirectory WEB-INF (case-sensitive).

Step 3 : copy static files

Copy the content of $DLC/webspeed to $WEBAPP, then copy $DLC/bin/cgiip.exe to $WEBAPP/WEB-INF/cgi (create a subdirectory for it).

Step 4 : create web.xml

The file web.xml is the webapp description file : 
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5"> 

     <servlet>
        <servlet-name>cgi</servlet-name>
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>cgiPathPrefix</param-name>
          <param-value>WEB-INF/cgi</param-value>
        </init-param>
        <init-param>
          <param-name>executable</param-name>
          <param-value></param-value>
        </init-param>
        <init-param>
          <param-name>passShellEnvironment</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>4</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>cgi</servlet-name>
        <url-pattern>/cgi/*</url-pattern>
    </servlet-mapping>
</web-app>

Step 5 : privileged application

Create an XML file in $CATALINA_HOME/conf/Catalina/localhost, with the same name as the webapp directory : if you created in step 2 a directory called webspeed110, then create webspeed110.xml.
The content of this file is :
<Context privileged="true" />

Step 6 : configure your webspeed broker

This is OpenEdge configuration, and it won't be covered here...

Step 7 : play !

Start Tomcat, and go to http://localhost:8080/webspeed110/cgi/cgiip.exe/WService=wsbroker1/workshop
This URL assumes that you're running with the default Webspeed broker wsbroker1.

Bonus step 1 : URL rewriting

Using URL like /webspeed110/cgi/cgiip.exe/WService=wsbroker1/programName can be dangerous, as it gives users the knowledge that CGI is being used and active, allows anybody to change the broker name, and so on...
A Tomcat filter is already available to rewrite URL, available here.
To setup this filter, you'll need to create a new directory $WEBAPP/WEB-INF/lib and drop this JAR file.
Update your web.xml file to declare this filter :
<filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
        <init-param>
            <param-name>confReloadCheckInterval</param-name>
            <param-value>0</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
Then create a file urlrewrite.xml in $WEBAPP/WEB-INF, with this content :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
        "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
    <rule>
        <from>/cgiip/(.*)</from>
        <to>/cgi/cgiip.exe/WService=wsbroker1/$1</to>
    </rule>
 
    <!-- default rules included with urlrewrite -->
    <rule>
        <note>
            The rule means that requests to /test/status/ will be redirected to /rewrite-status
            the url will be rewritten.
        </note>
        <from>/test/status/</from>
        <to type="redirect">%{context-path}/rewrite-status</to>
    </rule>
    
    <outbound-rule>
        <note>
            The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
            the url /rewrite-status will be rewritten to /test/status/.
 
            The above rule and this outbound-rule means that end users should never see the
            url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
            in your pages.
        </note>
        <from>/rewrite-status</from>
        <to>/test/status/</to>
    </outbound-rule>
</urlrewrite>
Restart Tomcat, and then you'll be able to access the workshop at http://localhost:8080/webspeed110/cgiip/workshop

Bonus step 2 : cgi.bat (and a reminder for myself)

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5"> 

     <servlet>
        <servlet-name>cgi</servlet-name>
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>cgiPathPrefix</param-name>
          <param-value>WEB-INF/cgi</param-value>
        </init-param>
        <init-param>
          <param-name>executable</param-name>
          <param-value>c:\windows\system32\cmd.exe</param-value>
        </init-param>
        <init-param>
          <param-name>executable-arg-1</param-name>
          <param-value>/c</param-value>
        </init-param>
        <init-param>
          <param-name>passShellEnvironment</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>4</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>cgi</servlet-name>
        <url-pattern>/cgi/*</url-pattern>
    </servlet-mapping>
</web-app>
With cgi.bat like that :
@echo off
set DLC=C:\Progress\OPENED~1.5
set PROMSGS=%DLC%\promsgs
set WRKDIR=%TEMP%
REM 3055 is default port of wsbroker1
%DLC%\bin\cgiip.exe localhost 3055
Theme by allblogtools.com | Blogger Templates