[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