Re-implemented support for default preferences specified in config.xml, and added functional tests to ensure it works.

git-svn-id: https://svn.apache.org/repos/asf/wookie/trunk@1576042 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/wookie-server/src/main/java/org/apache/wookie/controller/WidgetInstancesController.java b/wookie-server/src/main/java/org/apache/wookie/controller/WidgetInstancesController.java
index 0155fdf..6b749eb 100644
--- a/wookie-server/src/main/java/org/apache/wookie/controller/WidgetInstancesController.java
+++ b/wookie-server/src/main/java/org/apache/wookie/controller/WidgetInstancesController.java
@@ -17,6 +17,8 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Collection;
+import java.util.List;
 import java.util.UUID;
 
 import javax.servlet.ServletException;
@@ -36,9 +38,11 @@
 import org.apache.wookie.helpers.Notifier;
 import org.apache.wookie.helpers.WidgetInstanceHelper;
 import org.apache.wookie.helpers.WidgetRuntimeHelper;
+import org.apache.wookie.services.PreferencesService;
 import org.apache.wookie.services.SharedContextService;
 import org.apache.wookie.services.WidgetMetadataService;
 import org.apache.wookie.w3c.IContent;
+import org.apache.wookie.beans.IPreference;
 import org.apache.wookie.w3c.util.LocalizationUtils;
 
 /**
@@ -125,6 +129,17 @@
 					useDefaultSizes = true;
 				}
 			}
+			
+			//
+			// Set default preferences if there are no preferences associated with this session
+			//
+			IWidget widget = WidgetMetadataService.Factory.getInstance().getWidget(authToken.getWidgetId());
+			Collection<IPreference> existingPreferences = PreferencesService.Factory.getInstance().getPreferences(newToken.getApiKey(), newToken.getWidgetId(), newToken.getContextId(), newToken.getViewerId());
+			if (existingPreferences == null || existingPreferences.size() == 0){
+				for (org.apache.wookie.w3c.IPreference preference: widget.getPreferences()){
+					PreferencesService.Factory.getInstance().setPreference(newToken.getApiKey(), newToken.getWidgetId(), newToken.getContextId(), newToken.getViewerId(), preference.getName(), preference.getValue(), preference.isReadOnly());
+				}				
+			}
 
 			//
 			// Return XML or JSON 
diff --git a/wookie-server/src/test/java/org/apache/wookie/tests/functional/WidgetInstancesControllerTest.java b/wookie-server/src/test/java/org/apache/wookie/tests/functional/WidgetInstancesControllerTest.java
index b0fc3f2..6f7688b 100644
--- a/wookie-server/src/test/java/org/apache/wookie/tests/functional/WidgetInstancesControllerTest.java
+++ b/wookie-server/src/test/java/org/apache/wookie/tests/functional/WidgetInstancesControllerTest.java
@@ -42,7 +42,8 @@
 public class WidgetInstancesControllerTest extends AbstractControllerTest {
 
 	private static String TEST_ID_KEY = "";
-
+	private static final String TEST_DEFAULT_PREFS_WIDGET = "http://wookie.apache.org/defaultpreferences";
+	
 	@BeforeClass
 	public static void setup() throws HttpException, IOException {
 
@@ -70,6 +71,26 @@
 		post.execute(true, false); 
 		int code = post.getStatusCode();
 		assertEquals(201,code);
+		
+		//
+		// Get the prefs test widget
+		//
+		file = new File("src/test/resources/default-preferences.wgt");
+		assertTrue(file.exists());
+
+		//
+		// Add test wgt file to POST
+		//
+		Part[] parts2 = { new FilePart(file.getName(), file) };
+		post.setRequestEntity(new MultipartRequestEntity(parts2, post.getClient()
+				.getParams()));
+
+		//
+		// POST the file to /widgets and check we get 201 (Created)
+		//
+		post.execute(true, false); 
+		code = post.getStatusCode();
+		assertEquals(201,code);
 	}
 
 	@AfterClass
@@ -90,6 +111,9 @@
 
 		delete = new Request("DELETE", TEST_WIDGETS_SERVICE_URL_VALID + "/" + WIDGET_ID_LOCALIZED);
 		delete.execute(true, false);
+		
+		delete = new Request("DELETE", TEST_WIDGETS_SERVICE_URL_VALID + "/" + TEST_DEFAULT_PREFS_WIDGET);
+		delete.execute(true, false);
 	}
 
 	/**
@@ -349,6 +373,37 @@
 	public void resume() {
 		fail("test not written");
 	}
+	
+	/**
+	 * Tests that a new instance has the default preferences set from config.xml
+	 * @throws HttpException
+	 * @throws IOException
+	 */
+	@Test
+	public void getInstanceWithDefaultPreferences() throws HttpException, IOException{
+		Request post = new Request("POST", TEST_INSTANCES_SERVICE_URL_VALID);
+		post.addParameter("api_key", API_KEY_VALID);
+		post.addParameter("widgetid", TEST_DEFAULT_PREFS_WIDGET);
+		post.addParameter("userid", "test");
+		post.addParameter("shareddatakey", "test");
+		post.execute(true, false);
+		int code = post.getStatusCode();
+		assertEquals(200, code);
+		
+		//
+		// Get pref
+		//
+		Request get = new Request("GET", TEST_PROPERTIES_SERVICE_URL_VALID);
+		get.addParameter("api_key", API_KEY_VALID);
+		get.addParameter("widgetid", TEST_DEFAULT_PREFS_WIDGET);
+		get.addParameter("userid", "test");
+		get.addParameter("shareddatakey", "test");	
+		get.addParameter("propertyname", "default");
+		get.execute(true, false);
+		code = get.getStatusCode();
+		assertEquals(200,code);
+		assertEquals("yes", get.getResponseBodyAsString());
+	}
 
 	/**
 	 * Tests that we can clone an instance
diff --git a/wookie-server/src/test/resources/default-preferences.wgt b/wookie-server/src/test/resources/default-preferences.wgt
new file mode 100644
index 0000000..1ce9cf2
--- /dev/null
+++ b/wookie-server/src/test/resources/default-preferences.wgt
Binary files differ