[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