You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wookie.apache.org by sc...@apache.org on 2009/12/12 23:11:08 UTC

svn commit: r889989 - in /incubator/wookie/trunk: src-tests/org/apache/wookie/tests/functional/ src/org/apache/wookie/ src/org/apache/wookie/controller/ src/org/apache/wookie/exceptions/

Author: scottbw
Date: Sat Dec 12 22:11:08 2009
New Revision: 889989

URL: http://svn.apache.org/viewvc?rev=889989&view=rev
Log:
Refactored the PropertiesController to use the abstract Controller base class, implemented the delete method, and added a new suite of functional tests that checks calls to the Properties API. Implementing this required some small changes to Controller, and a new UnauthorizedAccessException class to flag authn issues. The core business methods of the PropertiesController are reused by WidgetAdminServlet and WidgetServiceServlet, and so these needed to be updated to reflect the changes.

Added:
    incubator/wookie/trunk/src-tests/org/apache/wookie/tests/functional/PropertiesControllerTest.java
    incubator/wookie/trunk/src/org/apache/wookie/exceptions/UnauthorizedAccessException.java
Modified:
    incubator/wookie/trunk/src/org/apache/wookie/WidgetAdminServlet.java
    incubator/wookie/trunk/src/org/apache/wookie/WidgetServiceServlet.java
    incubator/wookie/trunk/src/org/apache/wookie/controller/Controller.java
    incubator/wookie/trunk/src/org/apache/wookie/controller/PropertiesController.java
    incubator/wookie/trunk/src/org/apache/wookie/controller/WidgetServicesController.java

Added: incubator/wookie/trunk/src-tests/org/apache/wookie/tests/functional/PropertiesControllerTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src-tests/org/apache/wookie/tests/functional/PropertiesControllerTest.java?rev=889989&view=auto
==============================================================================
--- incubator/wookie/trunk/src-tests/org/apache/wookie/tests/functional/PropertiesControllerTest.java (added)
+++ incubator/wookie/trunk/src-tests/org/apache/wookie/tests/functional/PropertiesControllerTest.java Sat Dec 12 22:11:08 2009
@@ -0,0 +1,241 @@
+package org.apache.wookie.tests.functional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class PropertiesControllerTest extends AbstractControllerTest {
+	
+	@BeforeClass
+	public static void setup(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        PostMethod post = new PostMethod(TEST_INSTANCES_SERVICE_URL_VALID);
+	        post.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&shareddatakey=propstest");
+	        client.executeMethod(post);
+	        int code = post.getStatusCode();
+	        assertEquals(201,code);
+	        post.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	e.printStackTrace();
+	    	fail("post failed");
+	    }
+	}
+	
+	@Test
+	public void setPreference(){
+		// Set some shared data
+	    try {
+	        HttpClient client = new HttpClient();
+	        PostMethod post = new PostMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        post.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=false&shareddatakey=propstest&propertyname=pass&propertyvalue=pass");
+	        client.executeMethod(post);
+	        int code = post.getStatusCode();
+	        assertEquals(201,code);
+	        post.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("set shared data failed");
+	    }	 
+	    
+	    try {
+	        HttpClient client = new HttpClient();
+	        GetMethod get = new GetMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        get.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&shareddatakey=propstest&propertyname=pass");
+	        client.executeMethod(get);
+	        int code = get.getStatusCode();
+	        assertEquals(200, code);
+	        String resp = get.getResponseBodyAsString();
+	        assertEquals("pass",resp);
+	        get.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("get preference failed");
+	    }		
+	}
+	
+	@Test
+	public void setSharedData(){
+		// Set some shared data
+	    try {
+	        HttpClient client = new HttpClient();
+	        PostMethod post = new PostMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        post.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyname=cat&propertyvalue=garfield");
+	        client.executeMethod(post);
+	        int code = post.getStatusCode();
+	        assertEquals(201,code);
+	        post.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("set shared data failed");
+	    }	 
+	    
+	    try {
+	        HttpClient client = new HttpClient();
+	        GetMethod get = new GetMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        get.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&shareddatakey=propstest&propertyname=cat");
+	        client.executeMethod(get);
+	        int code = get.getStatusCode();
+	        assertEquals(200, code);
+	        String resp = get.getResponseBodyAsString();
+	        assertEquals("garfield",resp);
+	        get.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("get property failed");
+	    }	
+	}
+	
+	@Test
+	public void updateProperty(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        PutMethod put = new PutMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        put.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyname=cat&propertyvalue=felix");
+	        client.executeMethod(put);
+	        int code = put.getStatusCode();
+	        assertEquals(200,code);
+	        put.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("set shared data failed");
+	    }	 
+	    
+	    try {
+	        HttpClient client = new HttpClient();
+	        GetMethod get = new GetMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        get.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&shareddatakey=propstest&propertyname=cat");
+	        client.executeMethod(get);
+	        int code = get.getStatusCode();
+	        assertEquals(200, code);
+	        String resp = get.getResponseBodyAsString();
+	        assertEquals("felix",resp);
+	        get.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("get property failed");
+	    }	
+		
+	}
+	
+	@Test
+	public void removeProperty(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        DeleteMethod delete = new DeleteMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        delete.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyname=cat");
+	        client.executeMethod(delete);
+	        int code = delete.getStatusCode();
+	        assertEquals(200,code);
+	        delete.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("delete failed");
+	    }			
+	}
+	
+	@Test
+	public void removePropertyNonExisting(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        DeleteMethod delete = new DeleteMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        delete.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyname=bogus");
+	        client.executeMethod(delete);
+	        int code = delete.getStatusCode();
+	        assertEquals(404,code);
+	        delete.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("delete failed");
+	    }			
+	}
+	
+	@Test
+	public void setPropertyNoName(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        PostMethod post = new PostMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        post.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyvalue=garfield");
+	        client.executeMethod(post);
+	        int code = post.getStatusCode();
+	        assertEquals(400,code);
+	        post.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("set shared data failed");
+	    }	
+	}
+	
+	@Test
+	public void setPropertyEmptyName(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        PostMethod post = new PostMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        post.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyname=&propertyvalue=garfield");
+	        client.executeMethod(post);
+	        int code = post.getStatusCode();
+	        assertEquals(400,code);
+	        post.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("set shared data failed");
+	    }	
+	}
+	
+	@Test
+	public void setPropertyWhitespaceName(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        PostMethod post = new PostMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        post.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&is_public=true&shareddatakey=propstest&propertyname=    &propertyvalue=garfield");
+	        client.executeMethod(post);
+	        int code = post.getStatusCode();
+	        assertEquals(400,code);
+	        post.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("set shared data failed");
+	    }	
+	}
+	
+	@Test
+	public void getPropertyInvalidAPIKey(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        GetMethod get = new GetMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        get.setQueryString("api_key="+API_KEY_INVALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&shareddatakey=propstest&propertyname=cat");
+	        client.executeMethod(get);
+	        int code = get.getStatusCode();
+	        assertEquals(401, code);
+	        get.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("get property failed");
+	    }	
+	}
+	
+	@Test
+	public void getPropertyInvalidName(){
+	    try {
+	        HttpClient client = new HttpClient();
+	        GetMethod get = new GetMethod(TEST_PROPERTIES_SERVICE_URL_VALID);
+	        get.setQueryString("api_key="+API_KEY_VALID+"&widgetid="+WIDGET_ID_VALID+"&userid=test&shareddatakey=propstest&propertyname=madeupname");
+	        client.executeMethod(get);
+	        int code = get.getStatusCode();
+	        assertEquals(404, code);
+	        get.releaseConnection();
+	    }
+	    catch (Exception e) {
+	    	fail("get property failed");
+	    }	
+	}
+
+}

Modified: incubator/wookie/trunk/src/org/apache/wookie/WidgetAdminServlet.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/WidgetAdminServlet.java?rev=889989&r1=889988&r2=889989&view=diff
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/WidgetAdminServlet.java (original)
+++ incubator/wookie/trunk/src/org/apache/wookie/WidgetAdminServlet.java Sat Dec 12 22:11:08 2009
@@ -37,6 +37,7 @@
 import org.apache.wookie.exceptions.BadManifestException;
 import org.apache.wookie.exceptions.BadWidgetZipFileException;
 import org.apache.wookie.exceptions.InvalidContentTypeException;
+import org.apache.wookie.exceptions.InvalidParametersException;
 import org.apache.wookie.exceptions.InvalidStartFileException;
 import org.apache.wookie.exceptions.ResourceDuplicationException;
 import org.apache.wookie.exceptions.ResourceNotFoundException;
@@ -111,6 +112,8 @@
 			session.setAttribute("message_value", localizedMessages.getString("WidgetAdminServlet.0")); //$NON-NLS-1$ //$NON-NLS-2$
 		} catch (ResourceDuplicationException e) {
 			session.setAttribute("error_value", localizedMessages.getString("WidgetAdminServlet.1")); //$NON-NLS-1$ //$NON-NLS-2$ 
+		} catch (InvalidParametersException e) {
+			session.setAttribute("error_value", localizedMessages.getString("WidgetAdminServlet.1")); //$NON-NLS-1$ //$NON-NLS-2$ 
 		}
 	}
 

Modified: incubator/wookie/trunk/src/org/apache/wookie/WidgetServiceServlet.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/WidgetServiceServlet.java?rev=889989&r1=889988&r2=889989&view=diff
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/WidgetServiceServlet.java (original)
+++ incubator/wookie/trunk/src/org/apache/wookie/WidgetServiceServlet.java Sat Dec 12 22:11:08 2009
@@ -24,6 +24,8 @@
 import org.apache.wookie.controller.ParticipantsController;
 import org.apache.wookie.controller.PropertiesController;
 import org.apache.wookie.controller.WidgetInstancesController;
+import org.apache.wookie.exceptions.InvalidParametersException;
+import org.apache.wookie.exceptions.UnauthorizedAccessException;
 import org.apache.wookie.helpers.WidgetKeyManager;
 
 /**
@@ -64,12 +66,16 @@
 				else if(requestId.equals("resumewidget")){ //$NON-NLS-1$
 					WidgetInstancesController.doResumeWidget(request, response);
 				}
-				else if(requestId.equals("setpublicproperty")){ //$NON-NLS-1$
-					PropertiesController.doSetProperty(request, response, false);
+				else if(requestId.equals("setpublicproperty") || requestId.equals("setpersonalproperty")){ //$NON-NLS-1$
+					try {
+						PropertiesController.createOrUpdate(request);
+						response.setStatus(HttpServletResponse.SC_OK);
+					} catch (UnauthorizedAccessException e) {
+						response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+					} catch (InvalidParametersException e){
+						response.sendError(HttpServletResponse.SC_BAD_REQUEST);
+					}
 				}		
-				else if(requestId.equals("setpersonalproperty")){ //$NON-NLS-1$
-					PropertiesController.doSetProperty(request, response, true );
-				}
 				else if(requestId.equals("addparticipant")){ //$NON-NLS-1$
 					ParticipantsController.addParticipant(request, response );
 				}

Modified: incubator/wookie/trunk/src/org/apache/wookie/controller/Controller.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/controller/Controller.java?rev=889989&r1=889988&r2=889989&view=diff
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/controller/Controller.java (original)
+++ incubator/wookie/trunk/src/org/apache/wookie/controller/Controller.java Sat Dec 12 22:11:08 2009
@@ -26,6 +26,7 @@
 import org.apache.wookie.exceptions.InvalidParametersException;
 import org.apache.wookie.exceptions.ResourceDuplicationException;
 import org.apache.wookie.exceptions.ResourceNotFoundException;
+import org.apache.wookie.exceptions.UnauthorizedAccessException;
 
 /**
  * Base class of RESTful controllers with common utility methods
@@ -54,10 +55,16 @@
 				response.setStatus(HttpServletResponse.SC_OK);
 			} catch (ResourceNotFoundException e) {
 				response.sendError(HttpServletResponse.SC_NOT_FOUND);
+			} catch (UnauthorizedAccessException e){
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
 			}
 		} else {
-			index(request, response);
-			response.setStatus(HttpServletResponse.SC_OK);
+			try {
+				index(request, response);
+				response.setStatus(HttpServletResponse.SC_OK);
+			} catch (UnauthorizedAccessException e){
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+			}
 		}
 	}
 	
@@ -73,6 +80,10 @@
 			response.setStatus(HttpServletResponse.SC_OK);
 		} catch (ResourceNotFoundException e) {
 			response.sendError(HttpServletResponse.SC_NOT_FOUND);
+		} catch (UnauthorizedAccessException e){
+			response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+		} catch (InvalidParametersException e){
+			response.sendError(HttpServletResponse.SC_BAD_REQUEST);
 		}
 	}
 
@@ -83,15 +94,16 @@
 	protected void doPost(HttpServletRequest request, HttpServletResponse response)
 			throws ServletException, IOException {
 		String name = locateRESTname(request);
-		if (name == null || name.trim().equals("")) {response.sendError(HttpServletResponse.SC_NOT_FOUND); return;} // no resource
 		try {
 			create(name, request);
+			response.setStatus(HttpServletResponse.SC_CREATED);
 		} catch (ResourceDuplicationException e) {
 			response.sendError(HttpServletResponse.SC_CONFLICT);// already exists with same name - need error message for this
 		} catch (InvalidParametersException e){
 			response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
+		} catch (UnauthorizedAccessException e){
+			response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
 		}
-		response.setStatus(201);
 	}
 
 	/* (non-Javadoc)
@@ -107,7 +119,9 @@
 		} catch (ResourceNotFoundException e) {
 			response.sendError(HttpServletResponse.SC_NOT_FOUND);
 		} catch (InvalidParametersException e){
-		response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
+			response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
+		} catch (UnauthorizedAccessException e){
+			response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
 		}
 	}
 	
@@ -119,7 +133,7 @@
 	 * @param request
 	 * @param response
 	 */
-	protected void show(String resource_id, HttpServletRequest request, HttpServletResponse response) throws ResourceNotFoundException, IOException{
+	protected void show(String resource_id, HttpServletRequest request, HttpServletResponse response) throws ResourceNotFoundException, UnauthorizedAccessException,IOException{
 	}
 
 	/**
@@ -128,7 +142,7 @@
 	 * @param request
 	 * @param response
 	 */
-	protected void index(HttpServletRequest request, HttpServletResponse response) throws IOException{
+	protected void index(HttpServletRequest request, HttpServletResponse response) throws UnauthorizedAccessException, IOException{
 	}
 	
 	/**
@@ -138,7 +152,7 @@
 	 @return true if the resource was successfully created
 	 * @throws ResourceDuplicationException
 	 */
-	protected boolean create(String resource_id, HttpServletRequest request) throws ResourceDuplicationException, InvalidParametersException{return false;};
+	protected boolean create(String resource_id, HttpServletRequest request) throws ResourceDuplicationException, InvalidParametersException, UnauthorizedAccessException{return false;};
 	
 	/**
 	 * Delete a resource
@@ -146,7 +160,7 @@
 	 * @return true if the resource was successfully deleted
 	 * @throws ResourceNotFoundException
 	 */
-	protected boolean remove(String resource_id, HttpServletRequest request) throws ResourceNotFoundException{return false;};
+	protected boolean remove(String resource_id, HttpServletRequest request) throws ResourceNotFoundException,UnauthorizedAccessException,InvalidParametersException{return false;};
 	
 	/**
 	 * Update a resource
@@ -154,7 +168,7 @@
 	 * @param request
 	 * @throws ResourceNotFoundException
 	 */
-	protected void update(String resource_id, HttpServletRequest request) throws ResourceNotFoundException,InvalidParametersException{};
+	protected void update(String resource_id, HttpServletRequest request) throws ResourceNotFoundException,InvalidParametersException,UnauthorizedAccessException{};
 	
 	// Utilities
 

Modified: incubator/wookie/trunk/src/org/apache/wookie/controller/PropertiesController.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/controller/PropertiesController.java?rev=889989&r1=889988&r2=889989&view=diff
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/controller/PropertiesController.java (original)
+++ incubator/wookie/trunk/src/org/apache/wookie/controller/PropertiesController.java Sat Dec 12 22:11:08 2009
@@ -22,151 +22,140 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.log4j.Logger;
-import org.apache.wookie.Messages;
 import org.apache.wookie.beans.Preference;
 import org.apache.wookie.beans.SharedData;
 import org.apache.wookie.beans.WidgetInstance;
+import org.apache.wookie.exceptions.InvalidParametersException;
+import org.apache.wookie.exceptions.ResourceDuplicationException;
+import org.apache.wookie.exceptions.ResourceNotFoundException;
+import org.apache.wookie.exceptions.UnauthorizedAccessException;
 import org.apache.wookie.helpers.Notifier;
 import org.apache.wookie.helpers.WidgetKeyManager;
-import org.apache.wookie.server.LocaleHandler;
 
 /**
  * REST implementation for widgetInstance
  *
  * POST: creates or updates a property for an instance
- * GET, PUT, DELETE: not implemented
+ * GET: returns the value of a specified property for an instance
+ * PUT : creates or updates a property for an instance
+ * DELETE: deletes a property
  */
-public class PropertiesController extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
+public class PropertiesController extends Controller {
 
 	private static final long serialVersionUID = 308590474406800659L;		
 	static Logger _logger = Logger.getLogger(PropertiesController.class.getName());	
 
-	/* (non-Javadoc)
-	 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+	/**
+	 * We only override doGet to allow tunneling requests through GET 
+	 * for legacy clients
 	 */
 	@Override
-	protected void doPost(HttpServletRequest request, HttpServletResponse response)
-	throws ServletException, IOException {
-		boolean setpersonal = true;
-		if (!WidgetKeyManager.isValidRequest(request)){
-			response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-		} else {
-			String is_public = request.getParameter("is_public"); //$NON-NLS-1$		
-			if (is_public != null){
-				if (is_public.equals("true")|| is_public.equals("1")){
-					setpersonal = false;
-				}
+	protected void doGet(HttpServletRequest request,
+			HttpServletResponse response) throws ServletException, IOException {
+		String requestId = request.getParameter("requestid");//$NON-NLS-1$
+		// If the request id is not null, show otherwise index
+		if (requestId != null && requestId.length() > 0) {
+			try {
+				createOrUpdate(request);
+			} catch (InvalidParametersException e) {
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST);
+			} catch (UnauthorizedAccessException e){
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
 			}
-		}
-		doSetProperty(request, response, setpersonal);
-	}
-
-
-
-	/* (non-Java-doc)
-	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
-	 */
-	protected void doGet(HttpServletRequest request, HttpServletResponse response){					
-		if (!WidgetKeyManager.isValidRequest(request)){
-			response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
 		} else {
 			try {
-				String requestId = request.getParameter("requestid"); //$NON-NLS-1$
-				if (requestId == null || requestId.equals("")){
-					doGetProperty(request, response);
-				} else {
-					if(requestId.equals("setpublicproperty")){ //$NON-NLS-1$
-						doSetProperty(request, response, false);
-					}		
-					else if(requestId.equals("setpersonalproperty")){ //$NON-NLS-1$
-						doSetProperty(request, response, true );
-					}
-					else {
-						response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
-					}
-				}
-			} catch (Exception ex) {	
-				ex.printStackTrace();
-				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+				show(null, request, response);
+				response.setStatus(HttpServletResponse.SC_OK);
+			} catch (ResourceNotFoundException e) {
+				response.sendError(HttpServletResponse.SC_NOT_FOUND);
+			} catch (UnauthorizedAccessException e){
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
 			}
 		}
 	}
 
-
-	/// Implementation
-	
-
-	/**
-	 * Get a property for an instance
-	 * @param request
-	 * @param response
-	 */
-	public static void doGetProperty(HttpServletRequest request, HttpServletResponse response){
+	@Override
+	protected void show(String resourceId, HttpServletRequest request,
+			HttpServletResponse response) throws ResourceNotFoundException,
+			UnauthorizedAccessException, IOException {
+		if (!WidgetKeyManager.isValidRequest(request)) throw new UnauthorizedAccessException();
 		WidgetInstance instance = WidgetInstancesController.findWidgetInstance(request);
-		if (instance == null){
-			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-		}
-		String propertyName = request.getParameter("propertyname"); //$NON-NLS-1$
-		if (propertyName == null || propertyName.trim().equals("")){
-			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-		}	
-		
+		if (instance == null) throw new ResourceNotFoundException();
+		String name = request.getParameter("propertyname"); //$NON-NLS-1$
+		if (name == null || name.trim().equals("")) throw new ResourceNotFoundException();
 		String value = null;
-		Preference pref = Preference.findPreferenceForInstance(instance, propertyName);
+		// Note that preferences and shared data keys may be the same!
+		// We let the shared data values override.
+		Preference pref = Preference.findPreferenceForInstance(instance, name);
 		if (pref != null) value = pref.getDvalue();
-		SharedData data = SharedData.findSharedDataForInstance(instance, propertyName);
+		SharedData data = SharedData.findSharedDataForInstance(instance, name);
 		if (data != null) value = data.getDvalue();
+		if (value == null) throw new ResourceNotFoundException();
+		PrintWriter out = response.getWriter();
+		out.write(value);
+	}
+
+	@Override
+	protected boolean remove(String resourceId, HttpServletRequest request)
+			throws ResourceNotFoundException,UnauthorizedAccessException,InvalidParametersException {
+		if (!WidgetKeyManager.isValidRequest(request)) throw new UnauthorizedAccessException();
+		if (request.getParameter("value") != null) throw new InvalidParametersException();//$NON-NLS-1$
+		String name = request.getParameter("propertyname"); //$NON-NLS-1$
+		WidgetInstance instance = WidgetInstancesController.findWidgetInstance(request);
+		if (instance == null) throw new InvalidParametersException();
+		if (name == null || name.trim().equals("")) throw new InvalidParametersException();
 		
-		if (value == null){
-			response.setStatus(HttpServletResponse.SC_NOT_FOUND);	
-			return;
-		}
-		try {
-			PrintWriter out = response.getWriter();
-			out.write(value);
-			response.setStatus(HttpServletResponse.SC_OK);
-		} catch (IOException e) {
-			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+		boolean found = false;
+		if (isPublic(request)){ 
+			found = updateSharedDataEntry(instance, name, null, false);
+			Notifier.notifyWidgets(request.getSession(), instance, Notifier.STATE_UPDATED);
+		} else {
+			found = updatePreference(instance, name, null);
 		}
+		if (!found) throw new ResourceNotFoundException();
+		return true;
+	}	
+
+	@Override
+	protected boolean create(String resourceId, HttpServletRequest request)
+			throws ResourceDuplicationException, InvalidParametersException,
+			UnauthorizedAccessException {
+		createOrUpdate(request);
+		return true;
 	}
 
+	@Override
+	protected void update(String resourceId, HttpServletRequest request)
+			throws ResourceNotFoundException, InvalidParametersException,UnauthorizedAccessException {
+		createOrUpdate(request);
+	}
+		
 	/**
-	 * 
+	 * Creates or updates a property for the given request
 	 * @param request
-	 * @param response
-	 * @param isPersonalProperty - If the boolean is set to true, then a preference will be set otherwise its shareddata
-	 * @throws ServletException
-	 * @throws IOException
+	 * @return true if the property was created, false if updated
+	 * @throws InvalidParametersException
+	 * @throws UnauthorizedAccessException
 	 */
-	public static void doSetProperty (HttpServletRequest request, HttpServletResponse response, boolean isPersonalProperty) throws ServletException, IOException {		
-		Messages localizedMessages = LocaleHandler.localizeMessages(request);
-		String propertyName = request.getParameter("propertyname"); //$NON-NLS-1$
-		String propertyValue = request.getParameter("propertyvalue"); //$NON-NLS-1$
+	public static void createOrUpdate(HttpServletRequest request)
+	throws InvalidParametersException,UnauthorizedAccessException {
+		if (!WidgetKeyManager.isValidRequest(request)) throw new UnauthorizedAccessException();
+		String name = request.getParameter("propertyname"); //$NON-NLS-1$
+		String value = request.getParameter("propertyvalue"); //$NON-NLS-1$
 		WidgetInstance instance = WidgetInstancesController.findWidgetInstance(request);
-		if(instance != null){
-			boolean found = false;
-			if(isPersonalProperty){
-				found = updatePreference(instance, propertyName, propertyValue);
-			}else{
-				found = updateSharedDataEntry(instance, propertyName, propertyValue, false);
-				Notifier.notifyWidgets(request.getSession(), instance, Notifier.STATE_UPDATED);
-			}	
-			if (!found){
-				response.setStatus(HttpServletResponse.SC_CREATED);
-			} else {
-				response.setStatus(HttpServletResponse.SC_OK);
-			}
-		}
-		else{
-			response.sendError(HttpServletResponse.SC_BAD_REQUEST, localizedMessages.getString("WidgetServiceServlet.3")); //$NON-NLS-1$ 
+		if (instance == null) throw new InvalidParametersException();
+		if (name == null || name.trim().equals("")) throw new InvalidParametersException();
+		
+		if (isPublic(request)){ 
+			updateSharedDataEntry(instance, name, value, false);
+			Notifier.notifyWidgets(request.getSession(), instance, Notifier.STATE_UPDATED);
+		} else {
+			updatePreference(instance, name, value);
 		}
 	}
-	
-	
-	///// Business Methods
-	
+
 	/**
-	 * 
+	 * Update a preference entry
 	 * @param widgetInstance
 	 * @param name
 	 * @param value
@@ -196,6 +185,14 @@
         return found;
 	}
 	
+	/**
+	 * Update a shared data entry
+	 * @param widgetInstance
+	 * @param name
+	 * @param value
+	 * @param append
+	 * @return
+	 */
 	public synchronized static boolean updateSharedDataEntry(WidgetInstance widgetInstance, String name, String value, boolean append){
 		boolean found=false;
 		for (SharedData sharedData : SharedData.findSharedDataForInstance(widgetInstance)){
@@ -230,5 +227,14 @@
 		return found;
 	}
 
+	/// Utilities
+	
+	private static boolean isPublic(HttpServletRequest request){
+		String is_public = request.getParameter("is_public"); //$NON-NLS-1$	
+		if (is_public != null && is_public.equals("true")|| is_public.equals("1")) return true;
+		String requestId = request.getParameter("requestid"); //$NON-NLS-1$
+		if (requestId != null && requestId.equals("setpublicproperty")) return true;
+		return false;
+	}
 
 }
\ No newline at end of file

Modified: incubator/wookie/trunk/src/org/apache/wookie/controller/WidgetServicesController.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/controller/WidgetServicesController.java?rev=889989&r1=889988&r2=889989&view=diff
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/controller/WidgetServicesController.java (original)
+++ incubator/wookie/trunk/src/org/apache/wookie/controller/WidgetServicesController.java Sat Dec 12 22:11:08 2009
@@ -73,7 +73,7 @@
 	 */
 	@Override
 	protected boolean create(String resourceId, HttpServletRequest request)
-			throws ResourceDuplicationException {
+			throws ResourceDuplicationException,InvalidParametersException {
 		return create(resourceId);
 	}
 	
@@ -82,7 +82,8 @@
 	 * @return
 	 * @throws ResourceDuplicationException
 	 */
-	public static boolean create(String resourceId) throws ResourceDuplicationException{
+	public static boolean create(String resourceId) throws ResourceDuplicationException,InvalidParametersException{
+		if (resourceId == null || resourceId.trim().equals("")) throw new InvalidParametersException();
 		WidgetService ws;
 		try {
 			ws = getWidgetService(resourceId);

Added: incubator/wookie/trunk/src/org/apache/wookie/exceptions/UnauthorizedAccessException.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/exceptions/UnauthorizedAccessException.java?rev=889989&view=auto
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/exceptions/UnauthorizedAccessException.java (added)
+++ incubator/wookie/trunk/src/org/apache/wookie/exceptions/UnauthorizedAccessException.java Sat Dec 12 22:11:08 2009
@@ -0,0 +1,22 @@
+/*
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wookie.exceptions;
+
+import javax.servlet.ServletException;
+
+public class UnauthorizedAccessException extends ServletException {
+
+	private static final long serialVersionUID = -3405334294170103612L;
+
+}