[jboss-svn-commits] JBL Code SVN: r23487 - in labs/jbossrules/trunk: drools-atom and 12 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Oct 17 03:40:29 EDT 2008
Author: jervisliu
Date: 2008-10-17 03:40:29 -0400 (Fri, 17 Oct 2008)
New Revision: 23487
Added:
labs/jbossrules/trunk/drools-atom/
labs/jbossrules/trunk/drools-atom/pom.xml
labs/jbossrules/trunk/drools-atom/src/
labs/jbossrules/trunk/drools-atom/src/main/
labs/jbossrules/trunk/drools-atom/src/main/java/
labs/jbossrules/trunk/drools-atom/src/main/java/org/
labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/
labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/
labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/AtomRulesRepository.java
labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundDetails.java
labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundFault.java
labs/jbossrules/trunk/drools-atom/src/test/
labs/jbossrules/trunk/drools-atom/src/test/java/
labs/jbossrules/trunk/drools-atom/src/test/java/org/
labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/
labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/
labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/AtomRulesRepositoryServer.java
labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/ClientServerAtomRulesRepositoryTest.java
labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/resources/
labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/resources/expected_get_packages.txt
Modified:
labs/jbossrules/trunk/pom.xml
Log:
experimental codes to support AtomPub interface on top of RulesRepository. Using Apache CXF, but can switch to other JAX-RS (JSR-311) implementations very easily, such as Jersey or RESTeasy.
Added: labs/jbossrules/trunk/drools-atom/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-atom/pom.xml (rev 0)
+++ labs/jbossrules/trunk/drools-atom/pom.xml 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <!-- README: if you have problems running the build.
+ you may need to go up one directory, and run "mvn install" to
+ make sure all the deps are ready.
+
+ If by chance the slackers who maintain the other projects have left the build slight broken,
+ you can skip the tests by doing:
+
+ "mvn -Dmaven.test.skip=true install" and it should work.
+
+ -->
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>drools</artifactId>
+ <groupId>org.drools</groupId>
+ <version>5.0.0.SNAPSHOT</version>
+ </parent>
+
+ <artifactId>drools-atom</artifactId>
+
+ <build>
+ <finalName>drools-atom</finalName>
+ </build>
+
+ <dependencies>
+ <!-- Internal dependencies -->
+
+ <!-- first the deps for the repo API itself (Jackrabbit based) -->
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-repository</artifactId>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-compiler</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-decisiontables</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-verifier</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-servlet_2.5_spec</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <!-- jackrabbit (this really should come from repository, not sure why not)
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.tmatesoft</groupId>
+ <artifactId>svnkit</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </dependency>
+ -->
+
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+ <version>2.2-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-bindings-http</artifactId>
+ <version>2.2-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-transports-http-jetty</artifactId>
+ <version>2.2-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-testutils</artifactId>
+ <version>2.2-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.4</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <version>3.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
Added: labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/AtomRulesRepository.java
===================================================================
--- labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/AtomRulesRepository.java (rev 0)
+++ labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/AtomRulesRepository.java 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1,152 @@
+
+package org.drools.atom;
+
+
+import java.net.URI;
+
+import javax.ws.rs.ConsumeMime;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.ProduceMime;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.factory.Factory;
+import org.apache.abdera.model.Content;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.model.Feed;
+import org.drools.repository.PackageItem;
+import org.drools.repository.PackageIterator;
+import org.drools.repository.RulesRepository;
+import org.drools.repository.RulesRepositoryException;
+
+
+ at Path("/repository/")
+public class AtomRulesRepository {
+ public RulesRepository repository;
+
+ private HttpHeaders headers;
+
+ public AtomRulesRepository() {
+ }
+
+ @Context
+ public void setHttpHeaders(HttpHeaders theHeaders) {
+ headers = theHeaders;
+ }
+
+ @GET
+ @Path("/packages")
+ @ProduceMime({"application/json", "application/atom+xml" })
+ public Feed getPackagesAsFeed(@Context UriInfo uParam) {
+ System.out.println("----invoking getPackagesAsFeed");
+
+ Factory factory = Abdera.getNewFactory();
+ Feed f = factory.newFeed();
+ f.setBaseUri(uParam.getAbsolutePath().toString());
+
+ f.setTitle("Packages");
+ //f.setId("");
+ //f.addAuthor("");
+
+ boolean archive = false;
+ PackageIterator pkgs = repository.listPackages();
+ pkgs.setArchivedIterator(archive);
+ while (pkgs.hasNext()) {
+ PackageItem pkg = (PackageItem) pkgs.next();
+ Entry e = createPackageItemEntry(pkg, uParam);
+
+ f.addEntry(e);
+ }
+
+ return f;
+ }
+
+ @GET
+ @Path("/packages/{packageName}/")
+ @ProduceMime({"application/atom+xml", "application/json" })
+ public Entry getPackageAsEntry(@PathParam("packageName") String packageName, @Context UriInfo uParam) throws PackageNotFoundFault {
+ System.out.println("----invoking getPackageAsEntry with name: " + packageName);
+
+ try {
+ PackageItem packageItem = repository.loadPackage(packageName);
+ return createDetailedPackageItemEntry(packageItem, uParam);
+ } catch (RulesRepositoryException e) {
+ PackageNotFoundDetails details = new PackageNotFoundDetails();
+ details.setName(packageName);
+ throw new PackageNotFoundFault(details);
+ }
+ }
+
+ @POST
+ @Path("/packages/feed")
+ @ConsumeMime("application/atom+xml")
+ public Response addPackageAsEntry(Entry e, @Context UriInfo uParam) {
+ try {
+ String packageName = e.getTitle();
+
+ PackageItem packageItem = repository.createPackage(packageName, "desc");
+
+ URI uri =
+ uParam.getBaseUriBuilder().path("repository", "packages",
+ packageItem.getName()).build();
+ return Response.created(uri).entity(e).build();
+ } catch (Exception ex) {
+ return Response.serverError().build();
+ }
+ }
+
+ private static Entry createPackageItemEntry(PackageItem pkg, UriInfo baseUri) {
+ Factory factory = Abdera.getNewFactory();
+
+ Entry e = factory.getAbdera().newEntry();
+ if (baseUri != null) {
+ e.setBaseUri(baseUri.getAbsolutePath().toString());
+ }
+ e.setTitle(pkg.getName());
+ URI uri =
+ baseUri.getBaseUriBuilder().path("repository", "packages",
+ pkg.getName()).build();
+ e.addLink(uri.toString());
+
+ return e;
+ }
+
+ private static Entry createDetailedPackageItemEntry(PackageItem pkg, UriInfo baseUri) {
+ Factory factory = Abdera.getNewFactory();
+
+ Entry e = factory.getAbdera().newEntry();
+ if (baseUri != null) {
+ e.setBaseUri(baseUri.getAbsolutePath().toString());
+ }
+ e.setTitle(pkg.getName());
+ e.setId(pkg.getUUID());
+ URI uri =
+ baseUri.getBaseUriBuilder().path("repository", "packages",
+ pkg.getName()).build();
+ e.addLink(uri.toString());
+ e.setUpdated(pkg.getLastModified().getTime());
+
+ //What content to return?
+ e.setContentElement(factory.newContent());
+ e.getContentElement().setContentType(Content.Type.TEXT);
+ e.getContentElement().setValue("description=" + pkg.getDescription() + ", archived=" + pkg.isArchived());
+
+ return e;
+ }
+
+ public RulesRepository getRulesRepository() {
+ return repository;
+ }
+
+ public void setRulesRepository(RulesRepository repository) {
+ this.repository = repository;
+ }
+ }
+
+
Added: labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundDetails.java
===================================================================
--- labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundDetails.java (rev 0)
+++ labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundDetails.java 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1,17 @@
+package org.drools.atom;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+ at XmlRootElement
+public class PackageNotFoundDetails {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundFault.java
===================================================================
--- labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundFault.java (rev 0)
+++ labs/jbossrules/trunk/drools-atom/src/main/java/org/drools/atom/PackageNotFoundFault.java 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1,17 @@
+package org.drools.atom;
+
+import javax.xml.ws.WebFault;
+
+ at WebFault
+public class PackageNotFoundFault extends Exception {
+ private PackageNotFoundDetails details;
+
+ public PackageNotFoundFault(PackageNotFoundDetails details) {
+ super();
+ this.details = details;
+ }
+
+ public PackageNotFoundDetails getFaultInfo() {
+ return details;
+ }
+}
Added: labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/AtomRulesRepositoryServer.java
===================================================================
--- labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/AtomRulesRepositoryServer.java (rev 0)
+++ labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/AtomRulesRepositoryServer.java 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1,50 @@
+
+package org.drools.atom;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.jaxrs.provider.AtomEntryProvider;
+import org.apache.cxf.jaxrs.provider.AtomFeedProvider;
+import org.apache.cxf.testutil.common.AbstractTestServerBase;
+import org.drools.repository.RepositorySessionUtil;
+import org.drools.repository.RulesRepository;
+
+public class AtomRulesRepositoryServer extends AbstractTestServerBase{
+
+ protected void run() {
+ JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+ sf.setResourceClasses(AtomRulesRepository.class);
+ List providers = new ArrayList();
+ providers.add(new AtomFeedProvider());
+ providers.add(new AtomEntryProvider());
+ sf.setProviders(providers);
+
+ AtomRulesRepository atomRepo = new AtomRulesRepository();
+ RulesRepository repo = RepositorySessionUtil.getRepository();
+ repo.createPackage("testPackage1", "desc1");
+ atomRepo.setRulesRepository(repo);
+ // default lifecycle is per-request, change it to singleton
+ sf.setResourceProvider(AtomRulesRepository.class,
+ new SingletonResourceProvider(atomRepo));
+ sf.setAddress("http://localhost:9080/");
+
+ sf.create();
+ }
+
+ public static void main(String[] args) {
+ try {
+ AtomRulesRepositoryServer s = new AtomRulesRepositoryServer();
+
+ s.start();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ System.exit(-1);
+ } finally {
+ System.out.println("done!");
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/ClientServerAtomRulesRepositoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/ClientServerAtomRulesRepositoryTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/ClientServerAtomRulesRepositoryTest.java 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1,99 @@
+
+package org.drools.atom;
+
+import java.io.InputStream;
+import java.util.List;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.model.Feed;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.io.CachedOutputStream;
+import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ClientServerAtomRulesRepositoryTest extends AbstractClientServerTestBase {
+
+ private Abdera abdera = new Abdera();
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ assertTrue("server did not launch correctly",
+ launchServer(AtomRulesRepositoryServer.class));
+ }
+
+ @Test
+ public void testGetPackages() throws Exception {
+ String endpointAddress =
+ "http://localhost:9080/repository/packages";
+ GetMethod get = new GetMethod(endpointAddress);
+ get.setRequestHeader("Content-Type", "*/*");
+ //get.setRequestHeader("Accept", type);
+ HttpClient httpClient = new HttpClient();
+ try {
+ httpClient.executeMethod(get);
+ String response = getStringFromInputStream(get.getResponseBodyAsStream());
+ String expected = getStringFromInputStream(
+ getClass().getResourceAsStream("resources/expected_get_packages.txt"));
+
+ assertEquals(response, expected);
+ } finally {
+ get.releaseConnection();
+ }
+ }
+
+ @Test
+ public void testGetPackagesUsingAbdera() throws Exception {
+ String endpointAddress =
+ "http://localhost:9080/repository/packages";
+ GetMethod get = new GetMethod(endpointAddress);
+ get.setRequestHeader("Content-Type", "*/*");
+
+ HttpClient httpClient = new HttpClient();
+ try {
+ httpClient.executeMethod(get);
+ Document<Feed> doc = abdera.getParser().parse(
+ get.getResponseBodyAsStream());
+ Feed feed = doc.getRoot();
+
+ assertEquals("http://localhost:9080/repository/packages", feed
+ .getBaseUri().toString());
+ assertEquals("Packages", feed.getTitle());
+ List<Entry> entries = feed.getEntries();
+ assertEquals(entries.size(), 2);
+ } finally {
+ get.releaseConnection();
+ }
+ }
+
+ @Test
+ public void testGetPackage() throws Exception {
+ String endpointAddress =
+ "http://localhost:9080/repository/packages/testPackage1";
+ GetMethod get = new GetMethod(endpointAddress);
+ get.setRequestHeader("Content-Type", "*/*");
+ //get.setRequestHeader("Accept", type);
+ HttpClient httpClient = new HttpClient();
+ try {
+ httpClient.executeMethod(get);
+ String response = getStringFromInputStream(get.getResponseBodyAsStream());
+ //System.out.print(response);
+ assertTrue(response.indexOf("testPackage1") > 0);
+ assertTrue(response.indexOf("description=desc1, archived=false") > 0);
+ } finally {
+ get.releaseConnection();
+ }
+ }
+
+ private String getStringFromInputStream(InputStream in) throws Exception {
+ CachedOutputStream bos = new CachedOutputStream();
+ IOUtils.copy(in, bos);
+ in.close();
+ bos.close();
+ return bos.getOut().toString();
+ }
+}
Added: labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/resources/expected_get_packages.txt
===================================================================
--- labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/resources/expected_get_packages.txt (rev 0)
+++ labs/jbossrules/trunk/drools-atom/src/test/java/org/drools/atom/resources/expected_get_packages.txt 2008-10-17 07:40:29 UTC (rev 23487)
@@ -0,0 +1 @@
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:xml="http://www.w3.org/XML/1998/namespace" xml:base="http://localhost:9080/repository/packages"><title type="text">Packages</title><entry xml:base="http://localhost:9080/repository/packages"><title type="text">defaultPackage</title><link href="http://localhost:9080/repository/packages/defaultPackage" /></entry><entry xml:base="http://localhost:9080/repository/packages"><title type="text">testPackage1</title><link href="http://localhost:9080/repository/packages/testPackage1" /></entry></feed>
\ No newline at end of file
Modified: labs/jbossrules/trunk/pom.xml
===================================================================
--- labs/jbossrules/trunk/pom.xml 2008-10-17 06:56:13 UTC (rev 23486)
+++ labs/jbossrules/trunk/pom.xml 2008-10-17 07:40:29 UTC (rev 23487)
@@ -369,7 +369,20 @@
<version>1.0-beta-2</version>
</extension>
</extensions>
-
+ <testResources>
+ <testResource>
+ <directory>src/test/java</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources</directory>
+ <includes>
+ <include>**</include>
+ </includes>
+ </testResource>
+ </testResources>
<pluginManagement>
<plugins>
<!--
More information about the jboss-svn-commits
mailing list