wiki:KrakenXmlRpcServlet

Kraken XMLRPC Servlet

Kraken XMLRPC provides declarative XMLRPC service programming. Just implement your XMLRPC service logic and add some annotations like this:

@Component(name = "example-hello-xmlrpc")
@Provides
public class HelloService implements XmlRpcHttpService {
	@XmlRpcMethod(alias = "example", method = "hello")
	public String hello(String name) {
		return "hello, " + name;
	}
}

Kraken HTTP Daemon, Kraken XMLRPC, and Kraken XMLRPC Servlet bundles are used for XMLRPC HTTP service.

XMLRPC Type Mappings

XMLRPC Type Java Type
i4 Integer
int Integer
string String
boolean Boolean
double Double
dateTime.iso8601 Date
base64 byte[]
struct Map<String, Object>
array Object[]

XMLRPC Service Tutorial

Create new Project

Use maven command:

mvn archetype:generate -DarchetypeRepository=http://download.krakenapps.org 
    -DarchetypeGroupId=org.krakenapps -DarchetypeArtifactId=kraken-template -DarchetypeVersion=1.0.1 
    -DgroupId=org.krakenapps.example -DartifactId=xmlrpc -Dversion=1.0.0 
    -Dpackage=org.krakenapps.example.xmlrpc -Dpackaging=jar

Configure pom.xml:

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.krakenapps.example</groupId>
	<artifactId>xmlrpc</artifactId>
	<version>1.0.0</version>
	<packaging>bundle</packaging>
	<name>Kraken XMLRPC Example</name>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>2.0.1</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>org.krakenapps.example.xmlrpc</Bundle-SymbolicName>
						<Export-Package>org.krakenapps.example.xmlrpc</Export-Package>
						<Import-Package>*</Import-Package>
					</instructions>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-ipojo-plugin</artifactId>
				<version>1.4.0</version>
				<executions>
					<execution>
						<goals>
							<goal>ipojo-bundle</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.krakenapps</groupId>
			<artifactId>kraken-api</artifactId>
			<version>1.9.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.annotations</artifactId>
			<version>1.4.0</version>
		</dependency>
		<dependency>
			<groupId>org.krakenapps</groupId>
			<artifactId>kraken-xmlrpc-servlet</artifactId>
			<version>2.0.0</version>
		</dependency>
	</dependencies>
</project>

Configure metadata.xml:

<ipojo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/CURRENT/core.xsd"
	xmlns="org.apache.felix.ipojo">
	<instance component="example-hello-xmlrpc" />
</ipojo>

<instance> config will initiate a HelloService iPOJO component instance.

Add HelloService

package org.krakenapps.example.xmlrpc;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.krakenapps.servlet.xmlrpc.XmlRpcHttpService;
import org.krakenapps.servlet.xmlrpc.XmlRpcMethod;

@Component(name = "example-hello-xmlrpc")
@Provides
public class HelloService implements XmlRpcHttpService {
	@XmlRpcMethod(alias = "example", method = "hello")
	public String hello(String name) {
		return "hello, " + name;
	}
}

@Component and @Provides are iPOJO annotations. @Component declares new component named example-hello-xmlrpc. @Provides exposes HelloService as a XmlRpcHttpService service. XmlRpcMethodRegistry service in kraken-xmlrpc-servlet recognizes new XmlRpcHttpService and add all XMLRPC methods (annotated by @XmlRpcMethod) automatically.

Install Bundle

Install all requirements using kraken-xmlrpc-servlet package:

kraken@bombom kraken-env> pkg.install kraken-xmlrpc-servlet
Resolving {groupId: org.apache.felix, artifactId: org.apache.felix.ipojo, version: 1.4.0}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.apache.felix.ipojo 1.4.0

Resolving {groupId: org.jboss.netty, artifactId: netty, version: 3.2.2.Final}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.jboss.netty 3.2.2.Final

Resolving {groupId: org.krakenapps, artifactId: kraken-ipojo, version: 1.1.0}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.krakenapps.ipojo 1.1.0

Resolving {groupId: org.krakenapps, artifactId: kraken-servlet-api, version: 3.0.0}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.krakenapps.servlet.api 3.0.0

Resolving {groupId: org.krakenapps, artifactId: kraken-httpd, version: 1.0.0}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.krakenapps.httpd 1.0.0

Resolving {groupId: org.krakenapps, artifactId: kraken-xmlrpc, version: 1.1.0}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.krakenapps.xmlrpc 1.1.0

Resolving {groupId: org.krakenapps, artifactId: kraken-xmlrpc-servlet, version: 2.0.0}
  -> trying to download from http://download.krakenapps.org/
  -> resolved
  -> installing: org.krakenapps.servlet.xmlrpc 2.0.0

Starting Bundles
  -> [OK] org.apache.felix.ipojo 1.4.0
  -> [OK] org.krakenapps.ipojo 1.1.0
  -> [OK] org.jboss.netty 3.2.2.Final
  -> [OK] org.krakenapps.servlet.api 3.0.0
  -> [OK] org.krakenapps.httpd 1.0.0
  -> [OK] org.krakenapps.xmlrpc 1.1.0
  -> [OK] org.krakenapps.servlet.xmlrpc 2.0.0

Complete!

Install your example code:

kraken@bombom kraken-env> bundle.install file:///c:/users/xeraph/kraken-example xmlrpc/target/xmlrpc-1.0.0.jar
bundle [8] loaded

Check bundle list and start your bundle:

kraken@bombom kraken-env> bundle.list
[ ID] Symbolic Name                             Version   Status
------------------------------------------------------------------
[  0] org.apache.felix.framework                3.2.2     ACTIVE
[  1] org.apache.felix.ipojo                    1.4.0     ACTIVE
[  2] org.jboss.netty                           3.2.2.Final       ACTIVE
[  3] org.krakenapps.ipojo                      1.1.0     ACTIVE
[  4] org.krakenapps.servlet.api                3.0.0     ACTIVE
[  5] org.krakenapps.httpd                      1.0.0     ACTIVE
[  6] org.krakenapps.xmlrpc                     1.1.0     ACTIVE
[  7] org.krakenapps.servlet.xmlrpc             2.0.0     ACTIVE
[  8] org.krakenapps.example.xmlrpc             1.0.0     INSTALLED
kraken@bombom kraken-env> bundle.start 8
bundle 8 started.

Configuration

Now, you can see your XMLRPC method is loaded:

kraken@bombom kraken-env> xmlrpc-servlet.list
XMLRPC Methods
----------------
example.hello

And there is a HTTP context that serves XMLRPC:

kraken@bombom kraken-env> httpd.contexts
HTTP Contexts
---------------
HTTP Context [xmlrpc, sessions=0]
>>
Servlet Context [xmlrpc]
* Context Path=/
* URL Mappings
  Exact Mappings
    /xmlrpc => Servlet xmlrpc
  Servlet xmlrpc
WebSocket path [/websocket], sessions [0]

However, it is still not exposed to the internet. Open web server port and bind XMLRPC http context:

kraken@bombom kraken-env> httpd.open 80
opened http server
kraken@bombom kraken-env> httpd.addVirtualHost 80 xmlrpc
added

Final configuration state should be:

kraken@bombom kraken-env> httpd.bindings
Port Bindings
---------------------
0.0.0.0/0.0.0.0:80
  virtual host: [.*], context: xmlrpc

If you connect  http://localhost/xmlrpc, you will see following error message (XMLRPC use only POST method):

Test

You can use kraken xmlrpc client for test:

kraken@bombom kraken-env> xmlrpc-client.call http://localhost/xmlrpc example.hello 'xeraph'
"hello, xeraph"

Maven Configuration

<dependency>
  <groupId>org.krakenapps</groupId>
  <artifactId>kraken-xmlrpc-servlet</artifactId>
  <version>2.0.0</version>
</dependency>

Release

  • 2.0.0 (2012-01-25)
    • depends new kraken-httpd 1.0.0

Attachments