Author: krispopat
Date: Tue Mar 20 12:20:33 2012
New Revision: 1302857

URL: http://svn.apache.org/viewvc?rev=1302857&view=rev
Log:
Adds support for the properties part of the REST API plus relevant tests.

Modified:
    
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/TestWookieConnectorService.java
    
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
    
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
    
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/IWookieConnectorService.java
    
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WidgetInstance.java
    
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WookieServerConnection.java

Modified: 
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/TestWookieConnectorService.java
URL: 
http://svn.apache.org/viewvc/incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/TestWookieConnectorService.java?rev=1302857&r1=1302856&r2=1302857&view=diff
==============================================================================
--- 
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/TestWookieConnectorService.java
 (original)
+++ 
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/TestWookieConnectorService.java
 Tue Mar 20 12:20:33 2012
@@ -67,7 +67,7 @@ public class TestWookieConnectorService 
     if (instance == null) {
       try {
         new URL("http://localhost:8080/wookie";).openStream();
-        instance = new 
TestWookieConnectorService("http://localhost:8080/wookie";, "TEST.", 
"myshareddata");
+        instance = new 
TestWookieConnectorService("http://localhost:8080/wookie";, "TEST", 
"myshareddata");
       } catch (ConnectException e) {
         // assume localhost is not running so run against bombax
         instance = new 
TestWookieConnectorService("http://bombax.oucs.ox.ac.uk:8888/wookie";, "TEST", 
"myshareddata");

Modified: 
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
URL: 
http://svn.apache.org/viewvc/incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java?rev=1302857&r1=1302856&r2=1302857&view=diff
==============================================================================
--- 
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
 (original)
+++ 
incubator/wookie/trunk/connector/java/src-test/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
 Tue Mar 20 12:20:33 2012
@@ -45,6 +45,8 @@ public class WookieConnectorService {
     assertNotNull("Test user is null", service.getUser("testuser"));
   }
   
+  
+  
   @Test
   public void getAvailableWidgets() throws WookieConnectorException {
     HashMap<String, Widget> widgets = service.getAvailableWidgets();
@@ -68,7 +70,7 @@ public class WookieConnectorService {
        User user = new User("test1","test user 1");
     service.addParticipant(instance, user);
     User[] users = service.getUsers(instance);
-    assertTrue("Wrong number of users returned",users.length==2);
+    assertTrue("Wrong number of users returned",users.length>2);
     assertTrue("Wrong user returned", 
users[0].getLoginName().equals("testuser"));
     assertTrue("Wrong user returned", users[1].getLoginName().equals("test1"));
   }
@@ -84,4 +86,24 @@ public class WookieConnectorService {
     user = users[users.length-1];
     assertTrue("Incorrect thumbnail", 
user.getThumbnailUrl().equals("http://bar.com/icon.png";));
   }
+  
+  @Test
+  public void properties() throws WookieConnectorException, IOException{
+           HashMap<String, Widget> widgets = service.getAvailableWidgets();
+           WidgetInstance instance = 
service.getOrCreateInstance((Widget)widgets.values().toArray()[0]);
+           assertNotNull("Retrieved widget instance is null", instance);
+           service.setPropertyForInstance(instance, true, "test_property2", 
"test data");
+           String data = service.getPropertyForInstance(instance, 
"test_property2");
+           assertNotNull ( "Data from property is null", data );
+           service.updatePropertyForInstance(instance, true, "test_property2", 
"new test data");
+           data = service.getPropertyForInstance(instance, "test_property2");
+           assertTrue ("Property data did not update", data.equals("new test 
data"));
+           service.deletePropertyForInstance(instance, true, "test_property2");
+           data = service.getPropertyForInstance(instance, "test_property2");
+           assertTrue("The property was not deleted", (data == null));
+  }
+  
+  
+ 
+  
 }

Modified: 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
URL: 
http://svn.apache.org/viewvc/incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java?rev=1302857&r1=1302856&r2=1302857&view=diff
==============================================================================
--- 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
 (original)
+++ 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
 Tue Mar 20 12:20:33 2012
@@ -13,12 +13,18 @@
  */
 package org.apache.wookie.connector.framework;
 
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
+import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
+import java.net.ProtocolException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLEncoder;
@@ -28,6 +34,9 @@ import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+//import org.apache.commons.httpclient.HttpClient;
+//import org.apache.commons.httpclient.HttpException;
+//import org.apache.commons.httpclient.methods.DeleteMethod;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -44,9 +53,9 @@ public abstract class AbstractWookieConn
        
        WidgetInstances instances = new WidgetInstances();
 
-       public AbstractWookieConnectorService(String url, String apiKey,
-                       String sharedDataKey) throws WookieConnectorException {
-               setConnection(new WookieServerConnection(url, apiKey, 
sharedDataKey));
+       public AbstractWookieConnectorService(String url, String apiKey, String 
sharedDataKey) throws WookieConnectorException {
+               WookieServerConnection thisConnection = new 
WookieServerConnection (url, apiKey, sharedDataKey);
+               setConnection(thisConnection);
        }
        
        
@@ -62,7 +71,7 @@ public abstract class AbstractWookieConn
        
 
        public void setConnection(WookieServerConnection newConn) {
-               logger.debug("Setting wookie connection to " + conn);
+               logger.debug("Setting wookie connection to: " + newConn);
                this.conn = newConn;
        }
        
@@ -85,43 +94,160 @@ public abstract class AbstractWookieConn
        }
 
        public void setPropertyForInstance(WidgetInstance instance,
-                                                                               
String propertyType, String fName,
-                                                                               
String fValue) throws WookieConnectorException {
+                                                                               
boolean is_public, String fName,
+                                                                               
String fValue) throws WookieConnectorException, IOException {
                String queryString;
                try {
-                       if (!propertyType.equals("setpublicproperty") && 
!propertyType.equals("setpersonalproperty")) {
-                               logger.error("Incorrect requestId parameter.  
Must be either 'setpublicproperty' or 'setprivateproperty'");
-                               throw new Exception();
+                       queryString = createInstanceParams(instance);
+                       //queryString = "id_key=";
+                       //queryString += URLEncoder.encode(instance.getIdKey(), 
"UTF-8");
+                       //queryString += "&api_key=";
+                       //queryString += 
(URLEncoder.encode(getConnection().getApiKey(), "UTF-8"));
+                       queryString += "&is_public=";
+                       if ( is_public ) {
+                               queryString += "true";
+                       }
+                       else {
+                               queryString += "false";
                        }
-                       queryString = new String("?requestid=" + propertyType + 
"&api_key=");
-                       queryString += 
(URLEncoder.encode(getConnection().getApiKey(),"UTF-8"));
-                       queryString += ("&shareddatakey=");
-                       queryString += 
(URLEncoder.encode(getConnection().getSharedDataKey(), "UTF-8"));
-                       queryString += ("&userid=");
-                       queryString += 
(URLEncoder.encode(getCurrentUser().getLoginName(), "UTF-8"));
-                       queryString += ("&widgetid=");
-                       queryString += (URLEncoder.encode(instance.getId(), 
"UTF-8"));
                        queryString += ("&propertyname=");
                        queryString += (URLEncoder.encode(fName, "UTF-8"));
                        queryString += ("&propertyvalue=");
                        queryString += (URLEncoder.encode(fValue, "UTF-8"));
+                       logger.debug(queryString);
                }
                catch (UnsupportedEncodingException e) {
                        throw new WookieConnectorException("Must support UTF-8 
encoding", e);
                }
-               catch (Exception e) {
-                       throw new WookieConnectorException("Cannot set property 
type:" + fName + " using requestId " + propertyType, e);
+               URL url = null;
+               try {
+                       url = new URL(conn.getURL() + "/properties");
+                       
+                       //url = new URL(conn.getURL() + "/WidgetServiceServlet" 
+ queryString);
+                       HttpURLConnection urlConn = (HttpURLConnection) 
url.openConnection();
+                       urlConn.setRequestMethod("POST");
+                       urlConn.setDoOutput(true);
+                       
+                       OutputStreamWriter out = new 
OutputStreamWriter(urlConn.getOutputStream());
+                       out.write(queryString);
+                       out.close();            
+                       if (urlConn.getResponseCode() > 201) {
+                               throw new 
IOException(urlConn.getResponseMessage());
+                       }
+               }
+               catch (MalformedURLException e) {
+                       throw new RuntimeException( "URL for supplied Wookie 
Server is malformed", e);
+               }
+       }
+       
+       
+       public String getPropertyForInstance ( WidgetInstance instance, String 
propertyName ) throws WookieConnectorException, IOException {
+               String queryString = createInstanceParams(instance);
+               try {
+                       queryString += "&propertyname=";
+                       queryString += URLEncoder.encode(propertyName, "UTF-8");
+               }
+               catch (UnsupportedEncodingException e) {
+                       throw new WookieConnectorException ("Must support UTF-8 
encoding", e);
                }
                URL url = null;
                try {
-                       url = new URL(conn.getURL() + "/WidgetServiceServlet" + 
queryString);
-                       HttpURLConnection conn = (HttpURLConnection) 
url.openConnection();
-                       if (conn.getResponseCode() > 200) {
-                               throw new 
IOException(conn.getResponseMessage());
+                       url = new URL(conn.getURL() + "/properties?" + 
queryString);
+                       HttpURLConnection urlConn = 
(HttpURLConnection)url.openConnection();
+                       InputStream s = urlConn.getInputStream();
+                       String property = convertISToString(s);
+                       if ( urlConn.getResponseCode() == 
HttpURLConnection.HTTP_NOT_FOUND) {
+                               // should mean the property isn't there so just 
return null
+                               // TODO - do we need to throw an exception here?
+                               return null;
                        }
+                       return property;
                }
-               catch (Exception e) {
-                       throw new WookieConnectorException("Unable to set 
property ", e);
+               catch (FileNotFoundException e) {
+                       // catch file not found exception generated if resource 
is not found and return null
+                       return null;
+               }
+               catch (MalformedURLException e) {
+                       throw new RuntimeException("URL for supplied Wookie 
Server is malformed", e);
+               } 
+       }
+       
+       
+       public void updatePropertyForInstance (WidgetInstance instance, boolean 
is_public, String propertyName, String data ) throws WookieConnectorException, 
IOException {
+               String putString;
+               try {
+                       
+                       putString = createInstanceParams(instance);
+                       putString += "&is_public=";
+                       if ( is_public ) {
+                               putString += "true";
+                       }
+                       else {
+                               putString += "false";
+                       }
+                       putString += "&propertyname=";
+                       putString += URLEncoder.encode(propertyName, "UTF-8");
+                       putString += ("&propertyvalue=");
+                       putString += (URLEncoder.encode(data, "UTF-8"));
+               }
+               catch (UnsupportedEncodingException e) {
+                       throw new WookieConnectorException("Must support UTF-8 
encoding", e);
+               }
+               URL url = null;
+               try {
+                       //url = new URL(conn.getURL() + 
"/properties?api_key="+URLEncoder.encode(conn.getApiKey(), "UTF-8"));
+                       url = new URL(conn.getURL() + "/properties?"+putString);
+                       //url = new URL(conn.getURL() + "/WidgetServiceServlet" 
+ queryString);
+                       HttpURLConnection urlConn = (HttpURLConnection) 
url.openConnection();
+                       urlConn.setRequestMethod("PUT");
+                       urlConn.connect();
+                       //urlConn.setRequestProperty("Content-Type", 
"application/x-www-form-urlencoded");
+
+                       //urlConn.setDoOutput(true);
+                       
+                       //OutputStreamWriter out = new 
OutputStreamWriter(urlConn.getOutputStream());
+                       //out.write(putString);
+                       //out.close();          
+                       if (urlConn.getResponseCode() > 201) {
+                               throw new 
IOException(urlConn.getResponseMessage());
+                       }
+                       
+               }
+               catch (MalformedURLException e) {
+                       throw new WookieConnectorException("URL for supplied 
Wookie Server is malformed", e);
+               }
+       }
+       
+       
+       
+       public void deletePropertyForInstance ( WidgetInstance instance, 
boolean is_public, String propertyName ) throws WookieConnectorException, 
IOException {
+               String deleteString = createInstanceParams(instance);
+               try {
+                       deleteString += "&is_public=";
+                       if ( is_public ) {
+                               deleteString += "true";
+                       }
+                       else {
+                               deleteString += "false";
+                       }
+                       deleteString += "&propertyname=";
+                       deleteString += URLEncoder.encode(propertyName, 
"UTF-8");
+               }
+               catch (UnsupportedEncodingException e) {
+                       throw new WookieConnectorException("Must support UTF-8 
encoding", e);
+               }
+               try {
+                       URL url = new 
URL(conn.getURL()+"/properties?"+deleteString);
+                       HttpURLConnection connection = (HttpURLConnection) 
url.openConnection();
+                       connection.setRequestMethod("DELETE");
+                       connection.connect();
+                       int code = connection.getResponseCode();
+                       if (code > 202 ) {
+                               throw new IOException 
(connection.getResponseMessage());
+                       }
+               }
+               catch ( MalformedURLException e ) {
+                       throw new WookieConnectorException ("URL for Wookie 
Server is malfomed", e);
                }
        }
 
@@ -129,7 +255,7 @@ public abstract class AbstractWookieConn
                URL url;
                WidgetInstance instance;
                try {
-                       StringBuilder postdata = new StringBuilder("api_key=");
+                       StringBuilder postdata = new 
StringBuilder("requestid=getwidget&api_key=");
                        
postdata.append(URLEncoder.encode(getConnection().getApiKey(), "UTF-8"));
                        postdata.append("&shareddatakey=");
                        
postdata.append(URLEncoder.encode(getConnection().getSharedDataKey(), "UTF-8"));
@@ -138,20 +264,23 @@ public abstract class AbstractWookieConn
                        postdata.append("&widgetid=");
                        postdata.append(URLEncoder.encode(guid, "UTF-8"));
 
-                       logger.debug("Makeing Wookie REST query using: " + 
postdata);
-
-                       url = new URL(conn.getURL() + "/widgetinstances");
-                       URLConnection urlConn = url.openConnection();
+                       logger.debug("Making Wookie REST query using: " + 
postdata);
+            
+                       url = new URL(conn.getURL() + 
"/WidgetServiceServlet?"+postdata);
+                       HttpURLConnection urlConn = 
(HttpURLConnection)url.openConnection();
                        urlConn.setDoOutput(true);
-                       OutputStreamWriter wr = new 
OutputStreamWriter(urlConn.getOutputStream());
-                       wr.write(postdata.toString());
-                       
-                       wr.flush();
+                       urlConn.setDoInput(true);
+                       InputStream is = urlConn.getInputStream();
 
-                       instance = parseInstance(guid, getURLDoc(url));
+                       if (urlConn.getResponseCode() > 200) {
+                               throw new 
IOException(urlConn.getResponseMessage());
+                       }
+                       DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
+                       DocumentBuilder docb = dbf.newDocumentBuilder();
+                       Document parsedDoc = docb.parse(is);
+                       instance = parseInstance(guid, parsedDoc);
                        instances.put(instance);
 
-                       wr.close();
 
                        addParticipant(instance, getCurrentUser());
                        
@@ -189,7 +318,9 @@ public abstract class AbstractWookieConn
                String title = getNodeTextContent(rootEl, "title");
                String height = getNodeTextContent(rootEl, "height");
                String width = getNodeTextContent(rootEl, "width");
-               WidgetInstance instance = new WidgetInstance(url, widgetId, 
title, height, width);
+               String idKey = getNodeTextContent(rootEl, "identifier");
+               WidgetInstance instance = new WidgetInstance(url, widgetId, 
title, height, width, idKey);
+               logger.debug(instance.toString());
                return instance;
        }
 
@@ -388,8 +519,10 @@ public abstract class AbstractWookieConn
        }
        
        
+       
+       
        private String getNodeTextContent(Element e, String subElementName ) {
-               NodeList nl = e.getElementsByTagName("description");
+               NodeList nl = e.getElementsByTagName(subElementName);
                if ( nl.getLength() > 0 ) {
                        Node n = nl.item(0);
                        if ( n != null ) {
@@ -399,6 +532,9 @@ public abstract class AbstractWookieConn
                return "";
        }
 
+       
+       
+       
        /**
         * Gets the input stream and parses it to a document
         * 
@@ -417,8 +553,39 @@ public abstract class AbstractWookieConn
                DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
                DocumentBuilder docb = dbf.newDocumentBuilder();
                Document parsedDoc = docb.parse(is);
-               is.close();
                return parsedDoc;
        }
-
+       
+       private String createInstanceParams ( WidgetInstance instance ) throws 
WookieConnectorException {
+               String queryString;
+               try {
+                       queryString = new String("api_key=");
+                       queryString += 
(URLEncoder.encode(getConnection().getApiKey(), "UTF-8"));
+                       queryString += ("&shareddatakey=");
+                       queryString += 
(URLEncoder.encode(getConnection().getSharedDataKey(), "UTF-8"));
+                       queryString += ("&userid=");
+                       queryString += 
(URLEncoder.encode(getCurrentUser().getLoginName(), "UTF-8"));
+                       queryString += ("&widgetid=");
+                       queryString += (URLEncoder.encode(instance.getId(), 
"UTF-8"));
+               }
+               catch (UnsupportedEncodingException e) {
+                       throw new WookieConnectorException("Must support UTF-8 
encoding", e);
+               }
+               return queryString;
+       }
+       
+       private String convertISToString (InputStream is ) throws IOException {
+               StringWriter writer = new StringWriter();
+               
+               char buff[] = new char[1024];
+               
+               BufferedReader reader = new BufferedReader(new 
InputStreamReader(is, "UTF-8"));
+               int n;
+               while ((n = reader.read(buff)) != -1 ) {
+                       writer.write(buff,0,n);
+               }
+               writer.close();
+               return writer.toString();
+               
+       }
 }

Modified: 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/IWookieConnectorService.java
URL: 
http://svn.apache.org/viewvc/incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/IWookieConnectorService.java?rev=1302857&r1=1302856&r2=1302857&view=diff
==============================================================================
--- 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/IWookieConnectorService.java
 (original)
+++ 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/IWookieConnectorService.java
 Tue Mar 20 12:20:33 2012
@@ -123,5 +123,7 @@ public interface IWookieConnectorService
    * @return
    */
   public WidgetInstances getInstances();
+  
+  
 
 }
\ No newline at end of file

Modified: 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WidgetInstance.java
URL: 
http://svn.apache.org/viewvc/incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WidgetInstance.java?rev=1302857&r1=1302856&r2=1302857&view=diff
==============================================================================
--- 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WidgetInstance.java
 (original)
+++ 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WidgetInstance.java
 Tue Mar 20 12:20:33 2012
@@ -23,17 +23,24 @@ public class WidgetInstance {
   String url;
 
   String id;
+  String idKey;
   String title;
   String height;
   String width;
 
   public WidgetInstance(String url, String id, String title, String height,
-      String width) {
+      String width, String idKey) {
     setId(id);
     setUrl(url);
     setTitle(title);
     setHeight(height);
     setWidth(width);
+    setIdKey ( idKey );
+  }
+  
+  
+  public String toString ( ) {
+         return "id: "+id+"  idKey:"+idKey+"  title: "+title+"  height: 
"+height+"  width: "+width;
   }
   
   public String getUrl() {
@@ -51,6 +58,16 @@ public class WidgetInstance {
   public void setId(String id) {
     this.id = id;
   }
+  
+  public String getIdKey() {
+         return idKey;
+  }
+  
+  
+  public void setIdKey ( String idKey )
+  {
+         this.idKey = idKey;
+  }
 
   public String getTitle() {
     return title;

Modified: 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WookieServerConnection.java
URL: 
http://svn.apache.org/viewvc/incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WookieServerConnection.java?rev=1302857&r1=1302856&r2=1302857&view=diff
==============================================================================
--- 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WookieServerConnection.java
 (original)
+++ 
incubator/wookie/trunk/connector/java/src/org/apache/wookie/connector/framework/WookieServerConnection.java
 Tue Mar 20 12:20:33 2012
@@ -26,8 +26,6 @@ import org.slf4j.LoggerFactory;
  */
 public class WookieServerConnection implements Serializable {
   private static final long serialVersionUID = 1L;
-  private static final Logger logger = LoggerFactory
-      .getLogger(WookieServerConnection.class);
   private String url;
   private String apiKey = "TEST";
   private String sharedDataKey = "mysharedkey";


Reply via email to