[jboss-svn-commits] JBL Code SVN: r19587 - in labs/jbossrules/trunk/drools-repository/src: test/java/org/drools/repository and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 16 02:57:01 EDT 2008


Author: michael.neale at jboss.com
Date: 2008-04-16 02:57:01 -0400 (Wed, 16 Apr 2008)
New Revision: 19587

Modified:
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/Response.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/RestAPI.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/remoteapi/RestAPITest.java
Log:
JBRULES-1562 remote REST api

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/Response.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/Response.java	2008-04-15 23:31:48 UTC (rev 19586)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/Response.java	2008-04-16 06:57:01 UTC (rev 19587)
@@ -10,7 +10,6 @@
 
 
 public abstract class Response {
-	abstract String getContentType();
 	abstract void writeData(OutputStream out) throws IOException ;
 	public Calendar lastModified;
 
@@ -18,10 +17,6 @@
 	public static class Text extends Response {
 		String data;
 
-		@Override
-		String getContentType() {
-			return "text/plain";
-		}
 
 		@Override
 		void writeData(OutputStream out) throws IOException {
@@ -33,10 +28,6 @@
 
 		InputStream stream;
 
-		@Override
-		String getContentType() {
-			return "application/octet-stream";
-		}
 
 
 		@Override

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/RestAPI.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/RestAPI.java	2008-04-15 23:31:48 UTC (rev 19586)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/remoteapi/RestAPI.java	2008-04-16 06:57:01 UTC (rev 19587)
@@ -1,16 +1,18 @@
 package org.drools.repository.remoteapi;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
-import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.Calendar;
 import java.util.Iterator;
 
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 import org.drools.repository.RulesRepository;
+import org.drools.repository.RulesRepositoryException;
 import org.drools.repository.remoteapi.Response.Binary;
 import org.drools.repository.remoteapi.Response.Text;
 
@@ -44,9 +46,12 @@
 
 	}
 
-	String[] split(String path) {
+	String[] split(String path) throws UnsupportedEncodingException {
 		if (path.startsWith("/")) path = path.substring(1);
 		String[] bits = path.split("/");
+		for (int i = 0; i < bits.length; i++) {
+			bits[i] = URLDecoder.decode(bits[i], "UTF-8");
+		}
 		return bits;
 	}
 
@@ -58,7 +63,7 @@
 			r.data = pkg.getHeader();
 			return r;
 		} else {
-			String assetName = URLDecoder.decode(resourceFile, "UTF-8").split("\\.")[0];
+			String assetName = resourceFile.split("\\.")[0];
 
 			AssetItem asset = pkg.loadAsset(assetName);
 			if (asset.isBinary()) {
@@ -95,36 +100,103 @@
 		return r;
 	}
 
-	/** post is for new content. */
-	public void post(String path, InputStream in, boolean binary, String comment) {
+	/** post is for new content.
+	 * @throws IOException
+	 * @throws RulesRepositoryException */
+	public void post(String path, InputStream in, boolean binary, String comment) throws RulesRepositoryException, IOException {
 		String[] bits = split(path);
 		if (bits[0].equals("packages")) {
 			String fileName = bits[2];
 			String[] a = fileName.split("\\.");
-			PackageItem pkg = repo.loadPackage(bits[1]);
-			AssetItem asset = pkg.addAsset(a[0], "added remotely");
-			asset.updateFormat(a[1]);
-			if (binary) asset.updateBinaryContentAttachment(in);
-			else {
-				//FAIL !
+			if (a[1].equals("package")) {
+				//new package
+				PackageItem pkg = repo.createPackage(bits[1], "<added remotely>");
+				pkg.updateCheckinComment(comment);
+				pkg.updateHeader(readContent(in));
+				repo.save();
+			} else {
+				//new asset
+				PackageItem pkg = repo.loadPackage(bits[1]);
+				AssetItem asset = pkg.addAsset(a[0], "<added remotely>");
+				asset.updateFormat(a[1]);
+				if (binary) {
+					asset.updateBinaryContentAttachment(in);
+				} else {
+					asset.updateContent(readContent(in));
+				}
+				asset.checkin(comment);
 			}
-			asset.checkin(comment);
-
 		} else {
 			throw new IllegalArgumentException("Unknown rest path for post.");
 		}
 	}
 
-	/** put is for updating content. It will cause a new revision to be created. */
-	public String put(String path, Date lastModified, InputStream in) {
-		return null;
+	private String readContent(InputStream in) throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		final byte[] buf = new byte[1024];
+        int len = 0;
+        while ( (len = in.read( buf )) >= 0 ) {
+            out.write( buf,
+                       0,
+                       len );
+        }
+        return new String(out.toByteArray());
+    }
+
+	/**
+	 * Put is for updating content. It will cause a new revision to be created.
+	 * need to also cope with the .package thing
+	 * @throws IOException
+	 */
+	public void put(String path, Calendar lastModified, InputStream in, String comment) throws IOException {
+		String[] bits = split(path);
+		if (bits[0].equals("packages")) {
+			String fileName = bits[2];
+			String[] a = fileName.split("\\.");
+			PackageItem pkg = repo.loadPackage(bits[1]);
+			if (a[1].equals("package")) {
+				//updating package header
+				if (pkg.getLastModified().after(lastModified)) {
+					throw new RulesRepositoryException("The package was modified by: " + pkg.getLastContributor() + ", unable to write changes.");
+				}
+				pkg.updateHeader(readContent(in));
+				pkg.checkin(comment);
+				repo.save();
+			} else {
+				AssetItem as = pkg.loadAsset(a[0]);
+				if (as.getLastModified().after(lastModified)) {
+					throw new RulesRepositoryException("The asset was modified by: " + as.getLastContributor() + ", unable to write changes.");
+				}
+				if (as.isBinary()) {
+					as.updateBinaryContentAttachment(in);
+				} else {
+					as.updateContent(readContent(in));
+				}
+				as.checkin(comment);
+			}
+
+		} else {
+			throw new IllegalArgumentException("Unknown rest path for put");
+		}
+
 	}
 
 	/**
 	 * Should be pretty obvious what this is for.
+	 * @throws UnsupportedEncodingException
 	 */
-	public String delete(String path) {
-		return null;
+	public void delete(String path) throws UnsupportedEncodingException {
+		String[] bits = split(path);
+		if (bits[0].equals("packages")) {
+			String fileName = bits[2].split("\\.")[0];
+			AssetItem asset = repo.loadPackage(bits[1]).loadAsset(fileName);
+			asset.archiveItem(true);
+			asset.checkin("<removed remotely>");
+		}
+		else {
+			throw new IllegalArgumentException("Unknown rest path for put");
+		}
+
 	}
 
 

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2008-04-15 23:31:48 UTC (rev 19586)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2008-04-16 06:57:01 UTC (rev 19587)
@@ -480,8 +480,8 @@
     }
 
 
-    List iteratorToList(Iterator it) {
-        List list = new ArrayList();
+    public static<T> List<T> iteratorToList(Iterator<T> it) {
+        List<T> list = new ArrayList<T>();
         while(it.hasNext()) {
             list.add( it.next() );
         }

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/remoteapi/RestAPITest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/remoteapi/RestAPITest.java	2008-04-15 23:31:48 UTC (rev 19586)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/remoteapi/RestAPITest.java	2008-04-16 06:57:01 UTC (rev 19587)
@@ -2,8 +2,11 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 import java.util.Properties;
 
 import junit.framework.TestCase;
@@ -12,6 +15,7 @@
 import org.drools.repository.PackageItem;
 import org.drools.repository.RepositorySessionUtil;
 import org.drools.repository.RulesRepository;
+import org.drools.repository.RulesRepositoryTest;
 import org.drools.repository.remoteapi.Response.Binary;
 import org.drools.repository.remoteapi.Response.Text;
 
@@ -55,7 +59,6 @@
 
 		String url = "packages/testRestGetBasics/.package";
 		Response res = api.get(url);
-		assertEquals("text/plain", res.getContentType());
 		assertNotNull(res.lastModified);
 		assertEquals(pkg.getLastModified(), res.lastModified);
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -118,7 +121,129 @@
 
 	}
 
-	public void testSplit() {
+	public void testPost() throws Exception {
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		PackageItem pkg = repo.createPackage("testRestPost", "");
+		pkg.updateHeader("This is some header");
+		repo.save();
+
+		RestAPI api = new RestAPI(repo);
+		ByteArrayInputStream in = new ByteArrayInputStream("abc".getBytes());
+		api.post("/packages/testRestPost/asset1.drl", in, false, "a comment");
+
+		AssetItem a = pkg.loadAsset("asset1");
+		assertEquals("drl", a.getFormat());
+		assertEquals("abc", a.getContent());
+		assertEquals("a comment", a.getCheckinComment());
+		assertFalse(a.isBinary());
+
+		in = new ByteArrayInputStream("qed".getBytes());
+		api.post("/packages/testRestPost/asset2.xls", in, true, "a comment");
+		a = pkg.loadAsset("asset2");
+		assertTrue(a.isBinary());
+		String s = new String(a.getBinaryContentAsBytes());
+		assertEquals("qed", s);
+		assertEquals("a comment", a.getCheckinComment());
+		assertEquals("xls", a.getFormat());
+
+		List<AssetItem> assets = RulesRepositoryTest.iteratorToList(repo.loadPackage("testRestPost").listAssetsByFormat(new String[] {"drl", "xls"}));
+		assertEquals(2, assets.size());
+
+	}
+
+	public void testPostNewPackage() throws Exception {
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		RestAPI api = new RestAPI(repo);
+
+		api.post("/packages/testPostNewPackage/.package", new ByteArrayInputStream("qaz".getBytes()), false, "This is a new package");
+		PackageItem pkg = repo.loadPackage("testPostNewPackage");
+		assertEquals("qaz", pkg.getHeader());
+
+		assertEquals("This is a new package", pkg.getCheckinComment());
+
+
+	}
+
+	public void testPut() throws Exception {
+		//need to test both asset and .package shite.
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		PackageItem pkg = repo.createPackage("testRestPut", "");
+		pkg.updateHeader("This is some header");
+		repo.save();
+
+		AssetItem asset1 = pkg.addAsset("asset1", "");
+		asset1.updateContent("this is content");
+		asset1.updateFormat("drl");
+		asset1.checkin("");
+
+		Calendar cd = asset1.getLastModified();
+
+		AssetItem asset2 = pkg.addAsset("asset2", "");
+		ByteArrayInputStream in = new ByteArrayInputStream("abc".getBytes());
+		asset2.updateBinaryContentAttachment(in);
+		asset2.updateFormat("xls");
+		asset2.checkin("");
+
+		RestAPI api = new RestAPI(repo);
+		Thread.sleep(42);
+		api.put("packages/testRestPut/asset1.drl", Calendar.getInstance(), new ByteArrayInputStream("qaz".getBytes()), "a new comment");
+
+		AssetItem asset1_ = pkg.loadAsset("asset1");
+		assertEquals("qaz", asset1_.getContent());
+		assertEquals("a new comment", asset1_.getCheckinComment());
+		assertTrue(asset1_.getLastModified().after(cd));
+
+		api.put("packages/testRestPut/asset2.xls", Calendar.getInstance(), new ByteArrayInputStream("def".getBytes()), "a new comment");
+		AssetItem asset2_ = pkg.loadAsset("asset2");
+		assertEquals("def", new String(asset2_.getBinaryContentAsBytes()));
+		assertEquals("a new comment", asset2_.getCheckinComment());
+		assertTrue(asset2_.getLastModified().after(cd));
+
+		//now check updating the package header
+		api.put("packages/testRestPut/.package", Calendar.getInstance(), new ByteArrayInputStream("whee".getBytes()), "hey");
+		pkg = repo.loadPackage("testRestPut");
+		assertEquals("whee", pkg.getHeader());
+
+		try {
+			api.put("packages/testRestPut/asset1.drl", cd, new ByteArrayInputStream("qaz".getBytes()), "a new comment");
+			fail("should not be able to do this as it is stale timestamp.");
+		} catch (Exception e) {
+			assertNotNull(e.getMessage());
+		}
+
+		try {
+			api.put("packages/testRestPut/.package", cd, new ByteArrayInputStream("whee".getBytes()), "hey");
+			fail("should not be able to do this as it is stale timestamp.");
+		} catch (Exception e) {
+			assertNotNull(e.getMessage());
+		}
+
+
+	}
+
+	public void testDelete() throws Exception {
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		PackageItem pkg = repo.createPackage("testRestDelete", "");
+		pkg.updateHeader("This is some header");
+		repo.save();
+
+		AssetItem asset1 = pkg.addAsset("asset1", "");
+		asset1.updateContent("this is content");
+		asset1.updateFormat("drl");
+		asset1.checkin("");
+
+		RestAPI api = new RestAPI(repo);
+		api.delete("packages/testRestDelete/asset1.drl");
+
+		List l = RulesRepositoryTest.iteratorToList(pkg.listAssetsByFormat(new String[] {"drl"}));
+		assertEquals(0, l.size());
+
+		l = RulesRepositoryTest.iteratorToList(pkg.listArchivedAssets());
+		assertEquals(1, l.size());
+
+	}
+
+	public void testSplit() throws Exception {
 		RestAPI a = new RestAPI(null);
 		String[] x = a.split("packages/foo/bar");
 		assertEquals(3, x.length);
@@ -132,5 +257,12 @@
 		assertEquals("foo", x[1]);
 		assertEquals("bar", x[2]);
 
+		String p = URLEncoder.encode("some package", "UTF-8");
+		String asset = URLEncoder.encode("some asset", "UTF-8");
+		x = a.split("packages/" + p + "/" + asset);
+		assertEquals("packages", x[0]);
+		assertEquals("some package", x[1]);
+		assertEquals("some asset", x[2]);
+
 	}
 }




More information about the jboss-svn-commits mailing list