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 2010/06/16 16:16:40 UTC

svn commit: r955236 [2/10] - in /incubator/wookie/branches/pluggablepersistence: ./ WebContent/WEB-INF/ WebContent/admin/ WebContent/webmenu/ ant/ etc/ddl-schema/ etc/tomcat/ etc/tomcat/conf/ parser/java/src/org/apache/wookie/w3c/util/ scripts/ scripts...

Modified: incubator/wookie/branches/pluggablepersistence/ivy.xml
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/ivy.xml?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/ivy.xml (original)
+++ incubator/wookie/branches/pluggablepersistence/ivy.xml Wed Jun 16 14:16:36 2010
@@ -5,6 +5,7 @@
       <conf name="deploy" description="Provide the necessary files and libraries to deploy in a production environment"/>
 	  <conf name="dev" extends="deploy" description="Provide the necessary files and libraries to run in standalone (development) mode"/>
 	  <conf name="test" extends="dev" visibility="private" description="for our testing frameowrk"/>
+	  <conf name="ddlutils" visibility="private" description="Provide the necessary libraries to invoke DDLUtils schema generation"/>
 	</configurations>
     
     <dependencies>
@@ -52,34 +53,51 @@
         </dependency>
         <dependency org="org.json" name="json" rev="20080701" conf="deploy->default">
         </dependency>
-        <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="deploy->default">
+        <dependency org="org.apache.openjpa" name="openjpa-all" rev="2.0.0" conf="deploy->default">
         </dependency>
-        
+        <dependency org="commons-pool" name="commons-pool" rev="1.3" conf="deploy->default">
+		</dependency>        
+        <dependency org="javax.jcr" name="jcr" rev="1.0" conf="deploy->default">
+        </dependency>
+        <dependency org="org.apache.jackrabbit" name="jackrabbit-core" rev="1.5.3" conf="deploy->default">
+        </dependency>
+        <dependency org="org.apache.jackrabbit" name="jackrabbit-jcr-commons" rev="1.5.3" conf="deploy->default">
+        </dependency>
+        <dependency org="org.apache.jackrabbit" name="jackrabbit-ocm" rev="1.5.3" conf="deploy->default">
+        </dependency>
+
         <!-- Libraries used in a development/test environment but not in deployment -->
+        <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="dev->default">
+        </dependency>
         <dependency org="org.mortbay.jetty" name="jetty" rev="6.1.3" conf="dev->default">
         </dependency>
         <dependency org="org.mortbay.jetty" name="jetty-util" rev="6.1.3" conf="dev->default">
         </dependency>
+        <dependency org="org.mortbay.jetty" name="jetty-plus" rev="6.1.3" conf="dev->default">
+        </dependency>
+        <dependency org="org.mortbay.jetty" name="jetty-naming" rev="6.1.3" conf="dev->default">
+        </dependency>
         <dependency org="org.mortbay.jetty" name="jsp-2.1" rev="6.1.3" conf="dev->default">
         </dependency>
         <dependency org="org.mortbay.jetty" name="jsp-api-2.1" rev="6.1.3" conf="dev->default">
         </dependency>
-       <!--<dependency org="org.mortbay.jetty" name="servlet-api-2.5" rev="6.1.3" conf="dev->default">
-        </dependency>-->
+        <dependency org="c3p0" name="c3p0" rev="0.9.1.2" conf="dev->default">
+		</dependency>
         <dependency org="org.apache.derby" name="derby" rev="10.4.2.0" conf="dev->default">
 		</dependency>
 		
 		<!-- Libraries used in testing -->
         <dependency org="junit" name="junit" rev="4.7" conf="test->default">
         </dependency>
+        <dependency org="directory-naming" name="naming-java" rev="0.8" conf="test->default">
+		</dependency>
+        <dependency org="commons-dbcp" name="commons-dbcp" rev="1.2.2" conf="test->default">
+		</dependency>
         
-        
-        <!-- Libraries with incompatible open source licences -->
-        <dependency org="org.hibernate" name="hibernate-c3p0" rev="3.3.1.GA" conf="deploy->default">
-        </dependency>
-        <dependency org="org.hibernate" name="hibernate-core" rev="3.3.1.GA" conf="deploy->default,optional">
+		<!-- DDLUtils Library -->
+        <dependency org="org.apache.ddlutils" name="ddlutils" rev="1.0" conf="ddlutils->default">
         </dependency>
-        <dependency org="mysql" name="mysql-connector-java" rev="5.1.6" conf="deploy->default">
+        <dependency org="log4j" name="log4j" rev="1.2.14" conf="ddlutils->default">
         </dependency>
         
         <exclude module="juel-api"/>

Modified: incubator/wookie/branches/pluggablepersistence/parser/java/src/org/apache/wookie/w3c/util/LocalizationUtils.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/parser/java/src/org/apache/wookie/w3c/util/LocalizationUtils.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/parser/java/src/org/apache/wookie/w3c/util/LocalizationUtils.java (original)
+++ incubator/wookie/branches/pluggablepersistence/parser/java/src/org/apache/wookie/w3c/util/LocalizationUtils.java Wed Jun 16 14:16:36 2010
@@ -15,6 +15,7 @@ package org.apache.wookie.w3c.util;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 
@@ -36,8 +37,8 @@ public class LocalizationUtils {
 	/**
 	 * Returns the first (best) match for an element given the set of locales, or null
 	 * if there are no suitable elements.
-	 * @param locales
 	 * @param elements
+	 * @param locales
 	 * @return an ILocalizedElement, or null if there are no valid entries
 	 */
 	public static ILocalizedElement getLocalizedElement(ILocalizedElement[] elements,String[] locales){
@@ -48,10 +49,25 @@ public class LocalizationUtils {
 	}
 	
 	/**
+	 * Returns the first (best) match for an element given the set of locales, or null
+	 * if there are no suitable elements.
+	 * @param elements collection
+	 * @param locales
+	 * @return an ILocalizedElement, or null if there are no valid entries
+	 */
+	public static ILocalizedElement getLocalizedElement(Collection<? extends ILocalizedElement> elements, String[] locales){
+		if (elements == null) return null;
+		ILocalizedElement[] elementsArray = processElementsByLocales(elements,locales);
+		if (elementsArray.length == 0) return null;
+		return elementsArray[0];
+	}
+	
+	/**
 	 * Filters and sorts a list of localized elements using the given locale list; only localized elements
 	 * are returned unless no appropriate localized elements are found, in which case nonlocalized elements
 	 * are returned
 	 * 
+	 * @param elements
 	 * @param locales
 	 * @return the sorted and filtered set of elements
 	 */
@@ -63,6 +79,23 @@ public class LocalizationUtils {
 	}
 	
 	/**
+	 * Filters and sorts a list of localized elements using the given locale list; only localized elements
+	 * are returned unless no appropriate localized elements are found, in which case nonlocalized elements
+	 * are returned
+	 * 
+	 * @param elements collection
+	 * @param locales
+	 * @return the sorted and filtered set of elements
+	 */
+	public static ILocalizedElement[] processElementsByLocales(Collection<? extends ILocalizedElement> elements,String[] locales){
+		if (elements == null) return null;
+		List<ULocale> localesList = getProcessedLocaleList(locales);
+        ILocalizedElement[] elementsArray = elements.toArray(new ILocalizedElement[elements.size()]);
+		Arrays.sort(elementsArray, new LocaleComparator(localesList));
+		return filter(elementsArray,localesList);
+	}
+	
+	/**
 	 * Sorts an array of localized elements using default locales (*). This places
 	 * any localized elements first, then any unlocalized elements
 	 * @return

Modified: incubator/wookie/branches/pluggablepersistence/readme.txt
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/readme.txt?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/readme.txt (original)
+++ incubator/wookie/branches/pluggablepersistence/readme.txt Wed Jun 16 14:16:36 2010
@@ -31,8 +31,8 @@ This will downloaded the latest source c
 
 You then need to enter:
 
-cd PROJECT_HOME_DIRECTORY
-ant
+> cd PROJECT_HOME_DIRECTORY
+> ant
 
 The first time you run this command all dependencies will be downloaded so you must be online and 
 it will take some time. Subsequent builds will be much faster.
@@ -42,11 +42,13 @@ You can run Wookie in a number of differ
 Running Wookie in "standalone" mode
 ===================================
 The quickest way to run Wookie is in "standalone" mode; in this mode Wookie uses a local database 
-and embedded server. This is a good way to experiment with Wookie in development.
+and embedded server. This is a good way to experiment with Wookie in development. Note that by
+default the database is cleared and initialized on every launch.
 
 To run Wookie in standalone mode:
 
-ant run
+> cd PROJECT_HOME_DIRECTORY
+> ant run
 
 The first command will download any required libraries for Wookie. The second will start a server 
 running on port 8080. To access it, go to http://localhost:8080/wookie
@@ -56,59 +58,82 @@ To access the administration menu (http:
 
 If you want to start with a completely clean build then use:
 
-ant clean-build run
-
-If you want to clean the database use:
-
-ant clean-db
+> cd PROJECT_HOME_DIRECTORY
+> ant clean-build run
 
 Running Wookie in debug mode
 ============================
 You can start Wookie in debug mode using JDSPA with the following command:
 
-ant -Djvmargs="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" run
+> cd PROJECT_HOME_DIRECTORY
+> ant -Djvmargs="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" run
 
-Running Wookie with Tomcat and MySQL
-====================================
-The following will compile and run the server in Tomcat with a MySQL database. The database tables will be set up automatically, however you must have previously created a database called "widgetdb" with username "java" and password "java". (If you want to change the database connection settings, then you need to alter the scripts/mysql/hibernate.cfg.xml.)
+Once the server is running connect your debugger to port 8000. If "suspend=y" is used, it will will block, waiting for a debug connection before starting the server.
 
-First, you need to edit the "build.properties" file as follows:
+Running Wookie with Tomcat and an external RDBMS
+================================================
+The following will compile and run the server in Tomcat with a specified RDBMS using JPA persistence. The database schema can be defined and populated on launch, however you must have previously done the following:
 
-uncomment "project.using.mysql=true" and comment out "project.using.derby=true"
-set "servletEngine.webapp.dir=" to the location of your tomcat webapps directory.
+1. Obtained a JDBC driver jar file for the database,
+2. created an empty database for Wookie's persistent storage, and
+3. have valid database credentials to access it.
 
-Next you need to setup the MySQL tables by running:
+Make the following changes to configure build.properties, (substituting CATALINA_HOME with the absolute or relative path to Tomcat's installation directory and specifying the database driver, url, type and credentials connection information):
 
-ant clean-db
+widget.deploy.dir=CATALINA_HOME/webapps/wookie/deploy
+servletEngine.webapp.dir=CATALINA_HOME/webapps
+servletEngine.container.lib.dir=CATALINA_HOME/lib
+servletEngine.context.conf.dir=CATALINA_HOME/conf/Catalina/localhost
+wookie.persistence.manager.type=jpa
+wookie.db.user=java
+wookie.db.password=java
+wookie.db.driver=com.mysql.jdbc.Driver
+wookie.db.uri=jdbc:mysql://localhost:3306/widgetdb
+wookie.db.type=mysql
+jdbc.driver.path=../mysql-connector-java-5.1.7.jar
 
-If you have previously used Wookie in standalone deployment, to ensure the right scripts are included in the build you need to run:
+The wookie.db.type setting can accept the following values: db2, derby, hsqldb, mssql, mysql, mysql5, oracle, oracle9, oracle10, postgresql, and sybase. The jdbc.driver.path setting can be absolute or relative file path to the driver jar archive.
 
-ant clean-build
+To ensure the configuration changes are propagated into the Wookie build artifacts, perform a full clean build after changing build.properties:
 
-Then to build and deploy the webapp, run:
+> cd PROJECT_HOME_DIRECTORY
+> ant clean-build deploy-webapp
 
-ant deploy-webapp
+To force Wookie to define or reset the database schema on the first start, use the following commands to start the Tomcat server:
 
-To access the administration menu (http://localhost:8080/wookie/admin) use the username 'java' and password 'java'.
+> cd PROJECT_HOME_DIRECTORY
+> export CATALINA_OPTS="-Dwidget.persistence.manager.initstore=true"
+> CATALINA_HOME/bin/startup.sh
 
-If you want to start with a completely clean build then use:
+To shutdown the Wookie Tomcat server and clear the initialization flag:
 
-ant clean-build deploy-webapp
+> cd PROJECT_HOME_DIRECTORY
+> CATALINA_HOME/bin/shutdown.sh
+> export CATALINA_OPTS=
 
-If you want to clean the database use:
+There are also SQL scripts for all of the valid database configurations built as part of Wookie that can be used to initialize the database schema manually if desired.
 
-ant clean-db
+Running Wookie using embedded Jackrabbit JCR
+============================================
+The folloing property is used to switch the standalone or Tomcat deployed servers to utilize JCR for persistence via an embedded JCR instance:
 
-By default Wookie connects to MySQL using Hibernate and the C3P0 connection pooler.
+wookie.persistence.manager.type=jcr
 
-Once the server is running connect your debugger to port 8000. If "suspend=y" is used, it will will block, waiting for a debug connection before starting the server.
+Additional properties must be configured to specify the desired JCR root node path and credentials for tomcat deployments:
+
+wookie.repository.user=java
+wookie.repository.password=java
+wookie.repository.rootpath=/wookie
+wookie.repository.workspace=default
+
+These replace the wookie.db.* and jdbc.drive.path settings above, but otherwise the instructions apply for the JCR configuration.
 
 Running Wookie with other configurations
 ========================================
-Other configurations of Wookie can also be run; the main requirements are a servlet container and a database. The setup information for databases can be found in the /scripts directory. How these are loaded into configurations is defined in build.xml; the main requirement is to define connection details in scripts/database/hibernate.cfg.xml and to define the database setup script in scripts/database/widgetdb.sql.
+Other configurations of Wookie can also be run; the main requirements are a servlet container and a database. The deployment and configuration operations can be determined by reviewing build.xml and build.properties. With some tweaking, the deploy-webapp task can be used to deploy Wookie to most any servlet container application.
 
-The deploy-webapp task can be used to deploy Wookie to any servlet container application.
+Both the RDBMS and JCR versions of Wookie depend only on container defined JNDI resources. Alternate persistence configurations are made by selecting the persistence manager component and supplying the required resource.
 
 Building and deploying widgets
 ==============================
-See http://incubator.apache.org/wookie/building-widgets.html
\ No newline at end of file
+See http://incubator.apache.org/wookie/building-widgets.html

Added: incubator/wookie/branches/pluggablepersistence/src-tests/jndi.properties
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/jndi.properties?rev=955236&view=auto
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/jndi.properties (added)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/jndi.properties Wed Jun 16 14:16:36 2010
@@ -0,0 +1,14 @@
+# 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.
+
+java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory
+java.naming.factory.url.pkgs=org.apache.naming

Added: incubator/wookie/branches/pluggablepersistence/src-tests/log4j.xml
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/log4j.xml?rev=955236&view=auto
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/log4j.xml (added)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/log4j.xml Wed Jun 16 14:16:36 2010
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  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.
+-->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+  <appender name="console" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} %-5p [%C.%M():%L] %m%n"/>
+    </layout>
+  </appender>
+
+  <category additivity="false" name="org.apache.wookie">
+    <level value="DEBUG"/>
+    <appender-ref ref="console"/>
+  </category>
+
+  <category additivity="false" name="org.apache.jackrabbit">
+    <level value="WARN"/>
+    <appender-ref ref="console"/>
+  </category>
+
+  <category additivity="false" name="org.apache.openjpa">
+    <level value="DEBUG"/>
+    <appender-ref ref="console"/>
+  </category>
+
+  <root>
+    <level value="INFO"/>
+    <appender-ref ref="console"/>
+  </root>
+
+</log4j:configuration>

Modified: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/AccessRequestTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/AccessRequestTest.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/AccessRequestTest.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/AccessRequestTest.java Wed Jun 16 14:16:36 2010
@@ -18,43 +18,43 @@ import static org.junit.Assert.assertTru
 
 import java.net.URI;
 
-import org.apache.wookie.beans.AccessRequest;
+import org.apache.wookie.beans.IAccessRequest;
+import org.apache.wookie.beans.jpa.impl.AccessRequestImpl;
 import org.junit.Test;
 
-
 public class AccessRequestTest {
 
 	@Test
 	public void wildcardTest() throws Exception{
-		AccessRequest ar = new AccessRequest();
+		IAccessRequest ar = new AccessRequestImpl();
 		ar.setOrigin("*");
 		assertTrue(ar.isAllowed(new URI("http://incubator.apache.org")));
 	}
 	
 	@Test
 	public void basicTest() throws Exception{
-		AccessRequest ar = new AccessRequest();
+		IAccessRequest ar = new AccessRequestImpl();
 		ar.setOrigin("http://incubator.apache.org");
 		assertTrue(ar.isAllowed(new URI("http://incubator.apache.org")));
 	}
 	
 	@Test
 	public void pathsTest() throws Exception{
-		AccessRequest ar = new AccessRequest();
+		IAccessRequest ar = new AccessRequestImpl();
 		ar.setOrigin("http://incubator.apache.org");
 		assertTrue(ar.isAllowed(new URI("http://incubator.apache.org/test")));
 	}
 	
 	@Test
 	public void schemesTest() throws Exception{
-		AccessRequest ar = new AccessRequest();
+		IAccessRequest ar = new AccessRequestImpl();
 		ar.setOrigin("http://incubator.apache.org");
 		assertFalse(ar.isAllowed(new URI("https://incubator.apache.org/test")));
 	}
 	
 	@Test
 	public void subDomainsTest() throws Exception{
-		AccessRequest ar = new AccessRequest();
+		IAccessRequest ar = new AccessRequestImpl();
 		ar.setOrigin("http://apache.org");
 		ar.setSubdomains(true);
 		assertTrue(ar.isAllowed(new URI("http://incubator.apache.org")));
@@ -64,7 +64,7 @@ public class AccessRequestTest {
 	
 	@Test
 	public void noSubDomainsTest() throws Exception{
-		AccessRequest ar = new AccessRequest();
+		IAccessRequest ar = new AccessRequestImpl();
 		ar.setOrigin("http://apache.org");
 		ar.setSubdomains(false);
 		assertTrue(ar.isAllowed(new URI("http://apache.org")));

Modified: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/FeatureLoaderTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/FeatureLoaderTest.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/FeatureLoaderTest.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/FeatureLoaderTest.java Wed Jun 16 14:16:36 2010
@@ -13,20 +13,16 @@
  */
 package org.apache.wookie.tests;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 import org.junit.Test;
 
-import org.apache.wookie.beans.ServerFeature;
 import org.apache.wookie.feature.FeatureLoader;
 
-
 public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void nullTest() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature(null, null);
+		FeatureLoader.validateFeature(null, null);
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -34,8 +30,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void nullTest2() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature(null, "fail");
+		FeatureLoader.validateFeature(null, "fail");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -43,8 +38,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void nullTest3() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("fail:", null);
+		FeatureLoader.validateFeature("fail:", null);
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -52,8 +46,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void badClass() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("fail:", "org.apache.wookie.NoSuchClass");
+		FeatureLoader.validateFeature("fail:", "org.apache.wookie.NoSuchClass");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -61,8 +54,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void badClass2() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("fail:", "");
+		FeatureLoader.validateFeature("fail:", "");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -70,8 +62,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void badClass3() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("fail:", "org.apache.wookie.beans.Name");
+		FeatureLoader.validateFeature("fail:", "org.apache.wookie.beans.Name");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -79,8 +70,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void badName() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("FAIL", "org.apache.wookie.feature.conformance.Test");
+		FeatureLoader.validateFeature("FAIL", "org.apache.wookie.feature.conformance.Test");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -88,8 +78,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void badName2() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("", "org.apache.wookie.feature.conformance.Test");
+		FeatureLoader.validateFeature("", "org.apache.wookie.feature.conformance.Test");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -97,8 +86,7 @@ public class FeatureLoaderTest {
 	
 	@Test(expected=Exception.class)
 	public void mismatch() throws Exception{
-		@SuppressWarnings("unused")
-		ServerFeature sf = FeatureLoader.createFeature("fail:", "org.apache.wookie.feature.conformance.Test");
+		FeatureLoader.validateFeature("fail:", "org.apache.wookie.feature.conformance.Test");
         // Uh-oh! No exception was thrown so we 
         // better make this test fail!
         fail("should've thrown an exception!");
@@ -107,9 +95,7 @@ public class FeatureLoaderTest {
 	@Test
 	public void valid(){
 		try {
-			ServerFeature sf = FeatureLoader.createFeature("feature:a9bb79c1", "org.apache.wookie.feature.conformance.Test");
-			assertEquals(sf.getFeatureName(), "feature:a9bb79c1");
-			assertEquals(sf.getClassName(), "org.apache.wookie.feature.conformance.Test");
+			FeatureLoader.validateFeature("feature:a9bb79c1", "org.apache.wookie.feature.conformance.Test");
 		} catch (Exception e) {
 			fail("Couldn't create valid feature");
 		}

Modified: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/OpenSocialUtilsTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/OpenSocialUtilsTest.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/OpenSocialUtilsTest.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/OpenSocialUtilsTest.java Wed Jun 16 14:16:36 2010
@@ -17,48 +17,49 @@ package org.apache.wookie.tests;
 import static org.junit.Assert.*;
 
 import org.apache.wookie.Messages;
-import org.apache.wookie.beans.Widget;
-import org.apache.wookie.beans.WidgetInstance;
+import org.apache.wookie.beans.IStartFile;
+import org.apache.wookie.beans.IWidget;
+import org.apache.wookie.beans.IWidgetInstance;
+import org.apache.wookie.beans.jpa.impl.StartFileImpl;
+import org.apache.wookie.beans.jpa.impl.WidgetImpl;
+import org.apache.wookie.beans.jpa.impl.WidgetInstanceImpl;
 import org.apache.wookie.util.opensocial.OpenSocialUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class OpenSocialUtilsTest{
 	
-	private static WidgetInstance INSTANCE;
-	private static WidgetInstance INSTANCE_NO_WIDGET;
-	private static WidgetInstance INSTANCE_NO_IDKEY;
-	private static WidgetInstance INSTANCE_NO_USER_ID;
+	private static IWidgetInstance INSTANCE;
+	private static IWidgetInstance INSTANCE_NO_WIDGET;
+	private static IWidgetInstance INSTANCE_NO_IDKEY;
+	private static IWidgetInstance INSTANCE_NO_USER_ID;
 	private static Messages BUNDLE;
 	
 	@BeforeClass 
 	public static void setUp(){
-		Widget widget = new Widget();
-		//widget.setUrl("http://getwookie.org/test/index.html"); FIXME
+		IWidget widget = new WidgetImpl();
 		widget.setGuid("http://getwookie.org/test");
-		widget.setId(1);
+		IStartFile startFile = new StartFileImpl();
+        startFile.setUrl("http://getwookie.org/test/index.html");
+        startFile.setLang("en");
+		widget.getStartFiles().add(startFile);
 		
-		INSTANCE = new WidgetInstance();
+		INSTANCE = new WidgetInstanceImpl();
 		INSTANCE.setWidget(widget);
-		INSTANCE.setId(1);
 		INSTANCE.setIdKey("xhKEoiff/4ltxSuuBmPjjxBx5hw.eq.");
 		INSTANCE.setUserId("scott");
 
-		INSTANCE_NO_WIDGET = new WidgetInstance();
-		INSTANCE_NO_WIDGET.setId(1);
+		INSTANCE_NO_WIDGET = new WidgetInstanceImpl();
 		INSTANCE_NO_WIDGET.setIdKey("xhKEoiff/4ltxSuuBmPjjxBx5hw.eq.");
 		INSTANCE_NO_WIDGET.setUserId("scott");
 		
-		INSTANCE_NO_IDKEY = new WidgetInstance();
+		INSTANCE_NO_IDKEY = new WidgetInstanceImpl();
 		INSTANCE_NO_IDKEY.setWidget(widget);
-		INSTANCE_NO_IDKEY.setId(1);
 		INSTANCE_NO_IDKEY.setUserId("scott");
 		
-		INSTANCE_NO_USER_ID = new WidgetInstance();
-		INSTANCE_NO_USER_ID.setWidget(widget);
-		INSTANCE_NO_USER_ID.setId(1);
+		INSTANCE_NO_USER_ID = new WidgetInstanceImpl();
+        INSTANCE_NO_USER_ID.setWidget(widget);
 		INSTANCE_NO_USER_ID.setIdKey("xhKEoiff/4ltxSuuBmPjjxBx5hw.eq.");
-		
 	}
 
 	@Test

Added: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/AbstractPersistenceTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/AbstractPersistenceTest.java?rev=955236&view=auto
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/AbstractPersistenceTest.java (added)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/AbstractPersistenceTest.java Wed Jun 16 14:16:36 2010
@@ -0,0 +1,340 @@
+/*
+ *  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.tests.beans;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.naming.Context;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+import org.apache.wookie.beans.IAccessRequest;
+import org.apache.wookie.beans.IApiKey;
+import org.apache.wookie.beans.IParticipant;
+import org.apache.wookie.beans.IPost;
+import org.apache.wookie.beans.IPreference;
+import org.apache.wookie.beans.IServerFeature;
+import org.apache.wookie.beans.IWidget;
+import org.apache.wookie.beans.IWidgetDefault;
+import org.apache.wookie.beans.IWidgetInstance;
+import org.apache.wookie.beans.IWidgetService;
+import org.apache.wookie.beans.util.IPersistenceManager;
+import org.apache.wookie.beans.util.PersistenceManagerFactory;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * AbstractPersistenceTest - persistence implementation tests.
+ * 
+ * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
+ * @version $Id$
+ */
+public abstract class AbstractPersistenceTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(AbstractPersistenceTest.class);
+    
+    protected boolean configured = false;
+
+    /**
+     * Execute generic persistence test.
+     * 
+     * @throws Exception
+     */
+    @Test
+    public void testPersistence() throws Exception
+    {
+        if (!configured)
+        {
+            logger.warn("Test not configured, skipping");
+            return;
+        }
+        logger.info("Run test");
+        
+        // allocate and begin persistence manager transaction
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+        persistenceManager.begin();
+
+        // test generic findAll methods
+        IWidget [] allWidgets = persistenceManager.findAll(IWidget.class);
+        assertNotNull(allWidgets);
+        assertEquals(1, allWidgets.length);
+        IPost [] allPosts = persistenceManager.findAll(IPost.class);
+        assertNotNull(allPosts);
+        assertEquals(0, allPosts.length);
+        IWidgetDefault [] allWidgetDefaults = persistenceManager.findAll(IWidgetDefault.class);
+        assertNotNull(allWidgetDefaults);
+        assertEquals(1, allWidgetDefaults.length);
+        IWidgetService [] widgetServices = persistenceManager.findAll(IWidgetService.class);
+        assertNotNull(widgetServices);
+        assertEquals(5, widgetServices.length);
+
+        // test generic findById methods
+        Object widgetId = allWidgets[0].getId();
+        IWidget widgetById = persistenceManager.findById(IWidget.class, widgetId);
+        assertNotNull(widgetById);
+        assertEquals(allWidgets[0], widgetById);
+        Object widgetDefaultId = allWidgetDefaults[0].getId();
+        IWidgetDefault widgetDefaultById = persistenceManager.findById(IWidgetDefault.class, widgetDefaultId);
+        assertNotNull(widgetDefaultById);
+        assertEquals(allWidgetDefaults[0], widgetDefaultById);
+
+        // test generic findByValue methods
+        String widgetGuid = allWidgets[0].getGuid();
+        IWidget [] widgetsByValue = persistenceManager.findByValue(IWidget.class, "guid", widgetGuid);
+        assertNotNull(widgetsByValue);
+        assertEquals(1, widgetsByValue.length);
+        assertEquals(allWidgets[0], widgetsByValue[0]);
+        IPost [] postsByValue = persistenceManager.findByValue(IPost.class, "userId", "xxx");
+        assertNotNull(postsByValue);
+        assertEquals(0, postsByValue.length);
+        IWidgetDefault [] widgetDefaultsByValue = persistenceManager.findByValue(IWidgetDefault.class, "widget", widgetById);
+        assertNotNull(widgetDefaultsByValue);
+        assertEquals(1, widgetDefaultsByValue.length);
+        assertEquals(allWidgetDefaults[0], widgetDefaultsByValue[0]);
+        
+        // test generic findByValues methods
+        Map<String,Object> values = new HashMap<String,Object>();
+        values.put("height", allWidgets[0].getHeight());
+        values.put("width", allWidgets[0].getWidth());
+        values.put("widgetAuthor", allWidgets[0].getWidgetAuthor());
+        IWidget [] widgetsByValues = persistenceManager.findByValues(IWidget.class, values);
+        assertNotNull(widgetsByValues);
+        assertEquals(1, widgetsByValues.length);
+        assertEquals(allWidgets[0], widgetsByValues[0]);
+        
+        // test custom widget query methods
+        IWidget widgetByGuid = persistenceManager.findWidgetByGuid(widgetGuid);
+        assertNotNull(widgetByGuid);
+        assertEquals(allWidgets[0], widgetByGuid);
+        String widgetContext = allWidgetDefaults[0].getWidgetContext();
+        IWidget widgetDefaultByType = persistenceManager.findWidgetDefaultByType(widgetContext);
+        assertNotNull(widgetDefaultByType);
+        assertEquals(allWidgets[0], widgetDefaultByType);
+        IWidget [] widgetsByType = persistenceManager.findWidgetsByType(widgetContext);
+        assertNotNull(widgetsByType);
+        assertEquals(1, widgetsByType.length);
+        assertEquals(allWidgets[0], widgetsByType[0]);
+        
+        // rollback and close persistence manager transaction
+        persistenceManager.rollback();
+        PersistenceManagerFactory.closePersistenceManager();
+        
+        // allocate and begin persistence manager transaction
+        persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+        persistenceManager.begin();
+
+        // create widget instance
+        IApiKey [] apiKeys = persistenceManager.findAll(IApiKey.class);
+        String apiKey = apiKeys[0].getValue();
+        IWidget [] widgets = persistenceManager.findAll(IWidget.class);
+        IWidget widget = widgets[0];        
+        widgetGuid = widget.getGuid();
+        IWidgetInstance widgetInstance = persistenceManager.findWidgetInstanceByGuid(apiKey, "test", "test-shared-data-key", widgetGuid);
+        assertNull(widgetInstance);
+        widgetInstance = persistenceManager.newInstance(IWidgetInstance.class);
+        widgetInstance.setApiKey(apiKey);
+        widgetInstance.setWidget(widget);
+        widgetInstance.setIdKey("test");
+        widgetInstance.setLang("en");
+        widgetInstance.setNonce("nonce-test");
+        widgetInstance.setOpensocialToken("");
+        widgetInstance.setSharedDataKey("test-shared-data-key");
+        widgetInstance.setShown(true);
+        widgetInstance.setUserId("test");
+        IPreference widgetInstancePreference = persistenceManager.newInstance(IPreference.class);
+        widgetInstancePreference.setDkey("sharedDataKey");
+        widgetInstancePreference.setDvalue("test-shared-data-key");
+        widgetInstancePreference.setReadOnly(true);
+        widgetInstance.getPreferences().add(widgetInstancePreference);
+        persistenceManager.save(widgetInstance);
+
+        // create participant
+        IParticipant participant = persistenceManager.newInstance(IParticipant.class);
+        participant.setWidget(widget);
+        participant.setSharedDataKey("test-shared-data-key");
+        participant.setParticipantId("test");
+        participant.setParticipantDisplayName("");
+        participant.setParticipantThumbnailUrl("");
+        persistenceManager.save(participant);
+
+        // create post hierarchy
+        IPost post2 = persistenceManager.newInstance(IPost.class);
+        post2.setContent("post-2-content");
+        post2.setTitle("post-2-title");
+        post2.setSharedDataKey("test-shared-data-key");
+        post2.setPublishDate(new Date());
+        post2.setUserId("test");
+        persistenceManager.save(post2);
+        IPost post1 = persistenceManager.newInstance(IPost.class);
+        post1.setContent("post-1-content");
+        post1.setTitle("post-1-title");
+        post1.setSharedDataKey("test-shared-data-key");
+        post1.setPublishDate(new Date());
+        post1.setUserId("test");
+        post1.getPosts().add(post2);
+        persistenceManager.save(post1);
+        IPost post0 = persistenceManager.newInstance(IPost.class);
+        post0.setContent("post-0-content");
+        post0.setTitle("post-0-title");
+        post0.setSharedDataKey("test-shared-data-key");
+        post0.setPublishDate(new Date());
+        post0.setUserId("test");
+        post0.getPosts().add(post1);
+        persistenceManager.save(post0);
+
+        // create server feature
+        IServerFeature serverFeature = persistenceManager.newInstance(IServerFeature.class);
+        serverFeature.setFeatureName("test-feature-name");
+        serverFeature.setClassName("test.feature.class.name");
+        persistenceManager.save(serverFeature);
+
+        // create access request
+        IAccessRequest accessRequest = persistenceManager.newInstance(IAccessRequest.class);
+        accessRequest.setOrigin("localhost");
+        accessRequest.setSubdomains(false);
+        accessRequest.setGranted(true);
+        accessRequest.setWidget(widget);
+        persistenceManager.save(accessRequest);
+
+        // commit and close persistence manager transaction
+        persistenceManager.commit();
+        PersistenceManagerFactory.closePersistenceManager();
+
+        // allocate and begin persistence manager transaction
+        persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+        persistenceManager.begin();
+        
+        // test custom widget instance query methods
+        apiKeys = persistenceManager.findAll(IApiKey.class);
+        apiKey = apiKeys[0].getValue();
+        widgets = persistenceManager.findAll(IWidget.class);
+        widget = widgets[0];
+        String serviceContext = widget.getWidgetTypes().iterator().next().getWidgetContext();
+        IWidgetInstance widgetInstance0 = persistenceManager.findWidgetInstance(apiKey, "test", "test-shared-data-key", serviceContext);
+        assertNotNull(widgetInstance0);
+        widgetGuid = widget.getGuid();
+        IWidgetInstance widgetInstance1 = persistenceManager.findWidgetInstanceByGuid(apiKey, "test", "test-shared-data-key", widgetGuid);
+        assertNotNull(widgetInstance1);
+        assertEquals(widgetInstance0, widgetInstance1);
+        IWidgetInstance widgetInstance2 = persistenceManager.findWidgetInstanceByIdKey("test");
+        assertNotNull(widgetInstance2);
+        assertEquals(widgetInstance0, widgetInstance2);
+        
+        // test custom participant query methods
+        IParticipant [] participants = persistenceManager.findParticipants(widgetInstance0);
+        assertNotNull(participants);
+        assertEquals(1, participants.length);
+        participant = persistenceManager.findParticipantViewer(widgetInstance0);
+        assertNotNull(participant);
+        assertEquals(participants[0], participant);
+        
+        // test custom server feature query methods
+        String [] serverFeatureNames = persistenceManager.findServerFeatureNames();
+        assertNotNull(serverFeatureNames);
+        assertEquals(1, serverFeatureNames.length);
+        String serverFeatureName = serverFeatureNames[0];
+        serverFeature = persistenceManager.findServerFeatureByName(serverFeatureName);
+        assertNotNull(serverFeature);
+        assertEquals("test-feature-name", serverFeature.getFeatureName());
+        
+        // find generic objects
+        IPost [] posts = persistenceManager.findByValue(IPost.class, "title", "post-0-title");
+        assertNotNull(posts);
+        assertEquals(1, posts.length);
+        IAccessRequest [] accessRequests = persistenceManager.findAll(IAccessRequest.class);
+        assertNotNull(accessRequests);
+        assertEquals(1, accessRequests.length);
+        
+        // delete test objects
+        persistenceManager.delete(widgetInstance0);
+        persistenceManager.delete(participant);
+        persistenceManager.delete(serverFeature);
+        persistenceManager.delete(posts);
+        persistenceManager.delete(accessRequests);
+        
+        // commit and close persistence manager transaction
+        persistenceManager.commit();
+        PersistenceManagerFactory.closePersistenceManager();
+
+        // allocate and begin persistence manager transaction
+        persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+        persistenceManager.begin();
+        
+        // verify test deletes
+        IWidgetInstance [] widgetInstances = persistenceManager.findAll(IWidgetInstance.class);
+        assertNotNull(widgetInstances);
+        assertEquals(0, widgetInstances.length);
+        participants = persistenceManager.findAll(IParticipant.class);
+        assertNotNull(participants);
+        assertEquals(0, participants.length);
+        IServerFeature [] serverFeatures = persistenceManager.findAll(IServerFeature.class);
+        assertNotNull(serverFeatures);
+        assertEquals(0, serverFeatures.length);
+        posts = persistenceManager.findAll(IPost.class);
+        assertNotNull(posts);
+        assertEquals(0, posts.length);
+        
+        // rollback and close persistence manager transaction
+        persistenceManager.rollback();
+        PersistenceManagerFactory.closePersistenceManager();
+
+        logger.info("Test run");
+    }
+    
+    /**
+     * Get configuration system property.
+     * 
+     * @param name property name
+     * @param defaultValue default property value
+     * @return property value
+     */
+    protected static String getSystemProperty(String name, String defaultValue)
+    {
+        String value = System.getProperty(name);
+        return (((value != null) && (value.length() > 0) && !value.startsWith("$")) ? value : defaultValue);
+    }
+
+    /**
+     * Lookup or create naming context.
+     * 
+     * @param parent parent context
+     * @param name context name
+     * @return context
+     */
+    protected static Context lookupOrCreateNamingContext(Context parent, String name) throws NamingException
+    {
+        Context context = null;
+        try
+        {
+            context = (Context)parent.lookup(name);
+        }
+        catch (NameNotFoundException nnfe)
+        {
+        }
+        if (context == null)
+        {
+            context =  parent.createSubcontext(name);
+        }
+        return context;
+    }
+}

Added: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JCRPersistenceTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JCRPersistenceTest.java?rev=955236&view=auto
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JCRPersistenceTest.java (added)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JCRPersistenceTest.java Wed Jun 16 14:16:36 2010
@@ -0,0 +1,129 @@
+/*
+ *  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.tests.beans;
+
+import java.io.File;
+
+import javax.jcr.Repository;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.jackrabbit.core.TransientRepository;
+import org.apache.wookie.beans.jcr.JCRPersistenceManager;
+import org.apache.wookie.beans.util.PersistenceManagerFactory;
+
+import org.junit.After;
+import org.junit.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * JCRPersistenceTest - JCR persistence implementation tests.
+ * 
+ * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
+ * @version $Id$
+ */
+public class JCRPersistenceTest extends AbstractPersistenceTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(JPAPersistenceTest.class);
+    
+    public static final String REPOSITORY_USER_PROPERTY_NAME = "wookie.test.repository.user";
+    public static final String REPOSITORY_PASSWORD_PROPERTY_NAME = "wookie.test.repository.password";
+    public static final String REPOSITORY_DIRECTORY_PROPERTY_NAME = "wookie.test.repository.dir";
+    public static final String REPOSITORY_ROOT_PATH_PROPERTY_NAME = "wookie.test.repository.rootpath";
+    public static final String REPOSITORY_WORKSPACE_PROPERTY_NAME = "wookie.test.repository.workspace";
+    
+    private String repositoryDir;
+    private String repositoryUser;
+    private String repositoryPassword;
+    private String repositoryRootPath;
+    private String repositoryWorkspace;
+    private Context rootContext;
+    
+    /**
+     * Set up JCR persistence runtime test environment.
+     * 
+     * @throws Exception
+     */
+    @Before
+    public void setUpPerTest() throws Exception
+    {
+        logger.info("JCR set up test");
+
+        // load repository configuration from environment
+        String testRepositoryDir = System.getProperty("user.dir")+"/build/test-repository";
+        repositoryDir = getSystemProperty(REPOSITORY_DIRECTORY_PROPERTY_NAME, testRepositoryDir);
+        repositoryUser = getSystemProperty(REPOSITORY_USER_PROPERTY_NAME, "java");
+        repositoryPassword = getSystemProperty(REPOSITORY_PASSWORD_PROPERTY_NAME, "java");
+        repositoryRootPath = getSystemProperty(REPOSITORY_ROOT_PATH_PROPERTY_NAME, "/wookie");
+        repositoryWorkspace = getSystemProperty(REPOSITORY_WORKSPACE_PROPERTY_NAME, "default");
+        
+        // construct JCR remote client repository instance
+        File repositoryDirFile = new File(repositoryDir);
+        if (!repositoryDirFile.exists())
+        {
+            repositoryDirFile.mkdirs();
+        }
+        String derbyLog = repositoryDir+File.separator+"derby.log";
+        System.setProperty("derby.stream.error.file", derbyLog);
+        String repositoryConfig = repositoryDir+File.separator+"repository.xml";
+        Repository repository = new TransientRepository(repositoryConfig, repositoryDir);
+        
+        // create JNDI context
+        rootContext = new InitialContext();
+        Context namingContext = lookupOrCreateNamingContext(rootContext, "java:comp");
+        namingContext = lookupOrCreateNamingContext(namingContext, "env");
+        lookupOrCreateNamingContext(namingContext, "jcr");
+        
+        // bind datasource to JNDI context
+        rootContext.rebind(JCRPersistenceManager.WIDGET_REPOSITORY_JNDI_REPOSITORY_FULL_NAME, repository);
+
+        // initialize persistence manager factory and persistence manager;
+        // truncate and initialize persistent store
+        Configuration configuration = new PropertiesConfiguration();
+        configuration.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_CLASS_NAME_PROPERTY_NAME, JCRPersistenceManager.class.getName());
+        configuration.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_INITIALIZE_STORE_PROPERTY_NAME, "true");
+        configuration.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_USER_PROPERTY_NAME, repositoryUser);
+        configuration.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_PASSWORD_PROPERTY_NAME, repositoryPassword);
+        configuration.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_ROOT_PATH_PROPERTY_NAME, repositoryRootPath);
+        configuration.setProperty(JCRPersistenceManager.PERSISTENCE_MANAGER_WORKSPACE_PROPERTY_NAME, repositoryWorkspace);
+        PersistenceManagerFactory.initialize(configuration);
+
+        logger.info("JCR test set up");
+        configured = true;
+    }
+
+    /**
+     * Tear down JCR persistence runtime test environment.
+     * 
+     * @throws Exception
+     */
+    @After
+    public void tearDownPerTest() throws Exception
+    {
+        configured = false;
+        logger.info("JCR tear down test");
+
+        // terminate persistence manager factory
+        PersistenceManagerFactory.terminate();
+
+        // unbind repository from JNDI context
+        rootContext.unbind(JCRPersistenceManager.WIDGET_REPOSITORY_JNDI_REPOSITORY_FULL_NAME);
+        
+        logger.info("JCR test torn down");
+    }
+}

Added: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JPAPersistenceTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JPAPersistenceTest.java?rev=955236&view=auto
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JPAPersistenceTest.java (added)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/beans/JPAPersistenceTest.java Wed Jun 16 14:16:36 2010
@@ -0,0 +1,166 @@
+/*
+ *  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.tests.beans;
+
+import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.dbcp.ConnectionFactory;
+import org.apache.commons.dbcp.DriverManagerConnectionFactory;
+import org.apache.commons.dbcp.PoolableConnectionFactory;
+import org.apache.commons.dbcp.PoolingDataSource;
+import org.apache.commons.pool.ObjectPool;
+import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.wookie.beans.jpa.JPAPersistenceManager;
+import org.apache.wookie.beans.util.PersistenceManagerFactory;
+
+import org.junit.After;
+import org.junit.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * JPAPersistenceTest - JPA persistence implementation tests.
+ * 
+ * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
+ * @version $Id$
+ */
+public class JPAPersistenceTest extends AbstractPersistenceTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(JPAPersistenceTest.class);
+    
+    public static final String DB_USER_PROPERTY_NAME = "wookie.test.db.user";
+    public static final String DB_PASSWORD_PROPERTY_NAME = "wookie.test.db.password";
+    public static final String DB_DRIVER_CLASS_PROPERTY_NAME = "wookie.test.db.driver";
+    public static final String DB_URI_PROPERTY_NAME = "wookie.test.db.uri";
+    public static final String DB_TYPE_PROPERTY_NAME = "wookie.test.db.type";
+    
+    private String dbUser;
+    private String dbPassword;
+    private String dbDriver;
+    private String dbUri;
+    private String dbType;
+    private ObjectPool connectionPool;
+    private Context rootContext;
+    
+    /**
+     * Set up JPA persistence runtime test environment.
+     * 
+     * @throws Exception
+     */
+    @Before
+    public void setUpPerTest() throws Exception
+    {
+        logger.info("JPA set up test");
+
+        // load database configuration from environment
+        String testDatabaseDir = (System.getProperty("user.dir")+"/build/test-database").replace(File.separatorChar, '/');
+        dbUser = getSystemProperty(DB_USER_PROPERTY_NAME, "java");
+        dbPassword = getSystemProperty(DB_PASSWORD_PROPERTY_NAME, "java");
+        dbDriver = getSystemProperty(DB_DRIVER_CLASS_PROPERTY_NAME, "org.apache.derby.jdbc.EmbeddedDriver");
+        dbUri = getSystemProperty(DB_URI_PROPERTY_NAME, "jdbc:derby:"+testDatabaseDir+"/widgetdb;create=true");
+        dbType = getSystemProperty(DB_TYPE_PROPERTY_NAME, "derby");
+        
+        // load driver
+        Class.forName(dbDriver);
+        
+        // test connection
+        Connection conn = DriverManager.getConnection(dbUri, dbUser, dbPassword);
+        conn.close();
+        
+        // construct pooling datasource
+        connectionPool = new GenericObjectPool(null, 0, GenericObjectPool.WHEN_EXHAUSTED_GROW, 0, 5);
+        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(dbUri, dbUser, dbPassword);
+        new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);
+        DataSource dataSource = new PoolingDataSource(connectionPool);            
+        
+        // create JNDI context
+        rootContext = new InitialContext();
+        Context namingContext = lookupOrCreateNamingContext(rootContext, "java:comp");
+        namingContext = lookupOrCreateNamingContext(namingContext, "env");
+        lookupOrCreateNamingContext(namingContext, "jdbc");
+        
+        // bind datasource to JNDI context
+        rootContext.rebind(JPAPersistenceManager.WIDGET_DATABASE_JNDI_DATASOURCE_FULL_NAME, dataSource);
+
+        // initialize persistence manager factory and persistence manager;
+        // truncate and initialize persistent store
+        Configuration configuration = new PropertiesConfiguration();
+        configuration.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_CLASS_NAME_PROPERTY_NAME, JPAPersistenceManager.class.getName());
+        configuration.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_INITIALIZE_STORE_PROPERTY_NAME, "true");
+        configuration.setProperty(JPAPersistenceManager.PERSISTENCE_MANAGER_CACHE_SIZE_PROPERTY_NAME, "1000");
+        configuration.setProperty(JPAPersistenceManager.PERSISTENCE_MANAGER_DB_TYPE_PROPERTY_NAME, dbType);
+        PersistenceManagerFactory.initialize(configuration);
+
+        logger.info("JPA test set up");
+        configured = true;
+    }
+
+    /**
+     * Tear down JPA persistence runtime test environment.
+     * 
+     * @throws Exception
+     */
+    @After
+    public void tearDownPerTest() throws Exception
+    {
+        configured = false;
+        logger.info("JPA tear down test");
+
+        // terminate persistence manager factory
+        PersistenceManagerFactory.terminate();
+
+        // unbind datasource from JNDI context
+        rootContext.unbind(JPAPersistenceManager.WIDGET_DATABASE_JNDI_DATASOURCE_FULL_NAME);
+        
+        // shutdown datasource pool
+        connectionPool.close();
+        
+        // special shutdown handling for derby
+        if (dbDriver.equals("org.apache.derby.jdbc.EmbeddedDriver") && dbUri.startsWith("jdbc:derby:") && dbType.equals("derby"))
+        {
+            // derby shutdown connection
+            String shutdownDBUri = dbUri;
+            int parametersIndex = shutdownDBUri.indexOf(";");
+            if (parametersIndex != -1)
+            {
+                shutdownDBUri = shutdownDBUri.substring(0, parametersIndex);
+            }
+            shutdownDBUri += ";shutdown=true";
+            try
+            {
+                DriverManager.getConnection(shutdownDBUri, dbUser, dbPassword);
+                throw new SQLException("Derby database not shutdown");
+            }
+            catch (SQLException sqle)
+            {
+                if (!sqle.getSQLState().equals("08006") && !sqle.getSQLState().equals("XJ015"))
+                {
+                    throw sqle;
+                }
+            }
+        }
+
+        logger.info("JPA test torn down");
+    }
+}

Modified: incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/integration/GadgetUtilsTest.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/integration/GadgetUtilsTest.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/integration/GadgetUtilsTest.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src-tests/org/apache/wookie/tests/integration/GadgetUtilsTest.java Wed Jun 16 14:16:36 2010
@@ -16,7 +16,7 @@ package org.apache.wookie.tests.integrat
 
 import static org.junit.Assert.*;
 
-import org.apache.wookie.beans.Widget;
+import org.apache.wookie.beans.IWidget;
 import org.apache.wookie.tests.helpers.MockHttpServletRequest;
 import org.apache.wookie.util.gadgets.GadgetUtils;
 import org.apache.wookie.w3c.W3CWidget;
@@ -197,7 +197,7 @@ public class GadgetUtilsTest {
 	@Test
 	public void getWidgetWithValidMetadata() {
 		@SuppressWarnings("unused")
-		Widget widget = null;
+		IWidget widget = null;
 		try {
 			assertNotNull(GadgetUtils.getWidget(TEST_METADATA_VALID, SHINDIG));
 		} catch (Exception e) {
@@ -218,7 +218,7 @@ public class GadgetUtilsTest {
 	@Test
 	public void getWidgetWithMetadataNoResults() {
 		@SuppressWarnings("unused")
-		Widget widget = null;
+		IWidget widget = null;
 		try {
 			assertNull(GadgetUtils.getWidget(TEST_METADATA_NO_GADGETS, SHINDIG));
 		} catch (Exception e) {

Added: incubator/wookie/branches/pluggablepersistence/src/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src/META-INF/persistence.xml?rev=955236&view=auto
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src/META-INF/persistence.xml (added)
+++ incubator/wookie/branches/pluggablepersistence/src/META-INF/persistence.xml Wed Jun 16 14:16:36 2010
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
+
+    <persistence-unit name="wookie" transaction-type="RESOURCE_LOCAL">
+
+        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
+
+        <non-jta-data-source>java:comp/env/jdbc/widgetdb</non-jta-data-source>
+
+        <class>org.apache.wookie.beans.jpa.impl.AccessRequestImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.ApiKeyImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.DescriptionImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.FeatureImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.LicenseImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.LocalizedBeanImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.NameImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.ParamImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.ParticipantImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.PostImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.PreferenceDefaultImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.PreferenceImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.ServerFeatureImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.SharedDataImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.StartFileImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.TokenImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WhitelistImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WidgetDefaultImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WidgetIconImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WidgetImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WidgetInstanceImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WidgetServiceImpl</class>
+        <class>org.apache.wookie.beans.jpa.impl.WidgetTypeImpl</class>
+
+        <exclude-unlisted-classes>true</exclude-unlisted-classes>
+
+    </persistence-unit>
+
+</persistence>

Modified: incubator/wookie/branches/pluggablepersistence/src/log4j.properties
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src/log4j.properties?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src/log4j.properties (original)
+++ incubator/wookie/branches/pluggablepersistence/src/log4j.properties Wed Jun 16 14:16:36 2010
@@ -10,21 +10,11 @@ log4j.appender.widgety.Target=System.out
 log4j.appender.widgety.layout=org.apache.log4j.PatternLayout
 log4j.appender.widgety.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
 
-
-### direct messages to file hibernate.log ###
-#log4j.appender.file=org.apache.log4j.FileAppender
-#log4j.appender.file.File=hibernate.log
-#log4j.appender.file.layout=org.apache.log4j.PatternLayout
-#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
 ### set log levels - for more verbose logging change 'info' to 'debug' ###
 
 #log4j.rootLogger=DEBUG, INFO, warn, stdout
 log4j.rootLogger=warn, stdout
 
-log4j.logger.org.hibernate=warn
-#log4j.logger.org.hibernate=debug
-
 ### log level for the this project - change this to "info" to kill the debug messages
 log4j.logger.org.apache.wookie=info, widgety
 log4j.logger.org.directwebremoting.impl.DefaultCreatorManager=info, widgety
@@ -32,32 +22,3 @@ log4j.logger.org.directwebremoting.impl.
 
 log4j.category.org.directwebremoting=warn
 log4j.additivity.org.directwebremoting=false
-
-### log HQL query parser activity
-#log4j.logger.org.hibernate.hql.ast.AST=debug
-
-### log just the SQL
-#log4j.logger.org.hibernate.SQL=debug
-
-### log JDBC bind parameters ###
-#log4j.logger.org.hibernate.type=info
-#log4j.logger.org.hibernate.type=debug
-
-### log schema export/update ###
-l#og4j.logger.org.hibernate.tool.hbm2ddl=debug
-
-### log HQL parse trees
-#log4j.logger.org.hibernate.hql=debug
-
-### log cache activity ###
-#log4j.logger.org.hibernate.cache=debug
-
-### log transaction activity
-#log4j.logger.org.hibernate.transaction=debug
-
-### log JDBC resource acquisition
-#log4j.logger.org.hibernate.jdbc=debug
-
-### enable the following line if you want to track down connection ###
-### leakages when using DriverManagerConnectionProvider ###
-#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

Modified: incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetAdminServlet.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetAdminServlet.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetAdminServlet.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetAdminServlet.java Wed Jun 16 14:16:36 2010
@@ -28,12 +28,13 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.log4j.Logger;
-import org.apache.wookie.beans.ApiKey;
-import org.apache.wookie.beans.ServerFeature;
-import org.apache.wookie.beans.Whitelist;
-import org.apache.wookie.beans.Widget;
-import org.apache.wookie.beans.WidgetDefault;
-import org.apache.wookie.beans.WidgetService;
+import org.apache.wookie.beans.IApiKey;
+import org.apache.wookie.beans.IWhitelist;
+import org.apache.wookie.beans.IWidget;
+import org.apache.wookie.beans.IWidgetDefault;
+import org.apache.wookie.beans.IWidgetService;
+import org.apache.wookie.beans.util.IPersistenceManager;
+import org.apache.wookie.beans.util.PersistenceManagerFactory;
 import org.apache.wookie.controller.WidgetServicesController;
 import org.apache.wookie.exceptions.InvalidParametersException;
 import org.apache.wookie.exceptions.ResourceDuplicationException;
@@ -127,9 +128,10 @@ public class WidgetAdminServlet extends 
 	private void addWhiteListEntry(HttpSession session, HttpServletRequest request) {
 		Messages localizedMessages = LocaleHandler.localizeMessages(request);
 		String uri = request.getParameter("newuri"); //$NON-NLS-1$
-		Whitelist list = new Whitelist();
+		IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		IWhitelist list = persistenceManager.newInstance(IWhitelist.class);
 		list.setfUrl(uri);
-		if(list.save()){
+		if(persistenceManager.save(list)){
 			session.setAttribute("message_value", localizedMessages.getString("WidgetAdminServlet.2")); //$NON-NLS-1$ //$NON-NLS-2$ 
 		}
 		else{
@@ -315,11 +317,12 @@ public class WidgetAdminServlet extends 
 	private void listOperation(HttpSession session, boolean getDefaults){
 		retrieveWidgets(session);	
 		if(getDefaults){
-			Hashtable<String, Integer> defaultHash = new Hashtable<String, Integer>();
-			WidgetDefault[] wds = WidgetDefault.findAll();
+			Hashtable<String, Object> defaultHash = new Hashtable<String, Object>();
+	        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+			IWidgetDefault[] wds = persistenceManager.findAll(IWidgetDefault.class);
 			if (wds != null){
-				for(WidgetDefault defaultWidget : wds){
-					defaultHash.put(defaultWidget.getWidgetContext(), defaultWidget.getWidgetId());				
+				for(IWidgetDefault defaultWidget : wds){
+					defaultHash.put(defaultWidget.getWidgetContext(), defaultWidget.getWidget().getId());				
 				}	
 			}
 			session.setAttribute("widget_defaults", defaultHash); //$NON-NLS-1$
@@ -327,7 +330,8 @@ public class WidgetAdminServlet extends 
 	}
 
 	private void listWhiteListOperation(HttpSession session) {
-		session.setAttribute("whitelist", Whitelist.findAll()); //$NON-NLS-1$
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		session.setAttribute("whitelist", persistenceManager.findAll(IWhitelist.class)); //$NON-NLS-1$
 	}  	
 
 	private void removeServiceOperation(HttpSession session, HttpServletRequest request) {
@@ -347,7 +351,7 @@ public class WidgetAdminServlet extends 
 		Messages localizedMessages = LocaleHandler.localizeMessages(request);
 		String widgetId = request.getParameter("widgetId"); //$NON-NLS-1$
 		String widgetType = request.getParameter("widgetType");	 //$NON-NLS-1$
-		if(manager.removeSingleWidgetType(Integer.parseInt(widgetId), widgetType)){
+		if(manager.removeSingleWidgetType(widgetId, widgetType)){
 			session.setAttribute("message_value", localizedMessages.getString("WidgetAdminServlet.8")); 				 //$NON-NLS-1$ //$NON-NLS-2$ 
 		}
 		else{
@@ -359,8 +363,9 @@ public class WidgetAdminServlet extends 
 	private void removeWhiteListEntry(HttpSession session, HttpServletRequest request) {
 		Messages localizedMessages = LocaleHandler.localizeMessages(request);
 		String entryId = request.getParameter("entryId"); //$NON-NLS-1$
-		Whitelist entry = Whitelist.findById(Integer.valueOf(entryId));
-		if(entry.delete()){
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		IWhitelist entry = persistenceManager.findById(IWhitelist.class, entryId);
+		if(persistenceManager.delete(entry)){
 			session.setAttribute("message_value", localizedMessages.getString("WidgetAdminServlet.10")); 				 //$NON-NLS-1$ //$NON-NLS-2$ 
 		}
 		else{
@@ -372,9 +377,10 @@ public class WidgetAdminServlet extends 
 		final String WIDGETFOLDER = request.getSession().getServletContext().getRealPath(properties.getString("widget.widgetfolder"));//$NON-NLS-1$
 		Messages localizedMessages = LocaleHandler.localizeMessages(request);
 		String widgetId = request.getParameter("widgetId"); //$NON-NLS-1$
-		Widget widget = Widget.findById(Integer.parseInt(widgetId));
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		IWidget widget = persistenceManager.findById(IWidget.class, widgetId);
 		String guid = widget.getGuid();
-		if(WidgetFactory.destroy(Integer.parseInt(widgetId))){
+		if(WidgetFactory.destroy(widgetId)){
 			if(WidgetFileUtils.removeWidgetResources(WIDGETFOLDER, guid)){			
 				session.setAttribute("message_value", localizedMessages.getString("WidgetAdminServlet.12"));			 //$NON-NLS-1$ //$NON-NLS-2$ 
 			}
@@ -388,11 +394,13 @@ public class WidgetAdminServlet extends 
 	}		
 
 	private void retrieveServices(HttpSession session){						
-		session.setAttribute("services", WidgetService.findAll());						 //$NON-NLS-1$
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		session.setAttribute("services", persistenceManager.findAll(IWidgetService.class));						 //$NON-NLS-1$
 	}
 
 	private void retrieveWidgets(HttpSession session){
-		session.setAttribute("widgets", Widget.findAll()); //$NON-NLS-1$
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		session.setAttribute("widgets", persistenceManager.findAll(IWidget.class)); //$NON-NLS-1$
 	}
 
 
@@ -408,7 +416,7 @@ public class WidgetAdminServlet extends 
 	private void setDefaultWidgetOperation(HttpSession session, HttpServletRequest request, IWidgetAdminManager manager){
 		String widgetId = request.getParameter("widgetId"); //$NON-NLS-1$
 		String widgetType = request.getParameter("widgetType");		 //$NON-NLS-1$
-		manager.setDefaultWidget(Integer.parseInt(widgetId), widgetType);
+		manager.setDefaultWidget(widgetId, widgetType);
 		listOperation(session, true);
 	}
 
@@ -420,7 +428,7 @@ public class WidgetAdminServlet extends 
 		if(maximize!=null){
 			canMax = Boolean.valueOf(maximize);
 		}
-		int dbKey = Integer.parseInt(request.getParameter("dbkey")); //$NON-NLS-1$
+		String dbKey = request.getParameter("dbkey"); //$NON-NLS-1$
 		String[] widgetTypes = request.getParameterValues("widgetTypes"); //$NON-NLS-1$
 		manager.setWidgetTypesForWidget(dbKey, widgetTypes, canMax);
 		session.setAttribute("message_value", localizedMessages.getString("WidgetAdminServlet.15")); 		 //$NON-NLS-1$ //$NON-NLS-2$ 
@@ -430,7 +438,8 @@ public class WidgetAdminServlet extends 
 		Messages localizedMessages = LocaleHandler.localizeMessages(request);
 		try {
 			W3CWidget widgetModel = GadgetUtils.createWidget(request);
-			if(!Widget.exists(widgetModel.getIdentifier())){
+	        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+			if(persistenceManager.findWidgetByGuid(widgetModel.getIdentifier()) == null){
 				WidgetFactory.addNewWidget(widgetModel);
 				session.setAttribute("message_value", widgetModel.getLocalName("en")+": "+localizedMessages.getString("WidgetAdminServlet.16")); //$NON-NLS-1$ //$NON-NLS-2$
 			} else {
@@ -443,7 +452,8 @@ public class WidgetAdminServlet extends 
 	}
 
 	private void listAPIKeysOperation(HttpSession session, HttpServletRequest request){
-		session.setAttribute("keys", ApiKey.findAll());
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		session.setAttribute("keys", persistenceManager.findAll(IApiKey.class));
 	}
 
 	private void revokeAPIKeyOperation(HttpSession session, HttpServletRequest request){
@@ -474,18 +484,19 @@ public class WidgetAdminServlet extends 
 
 		try {	
 			if(zipFile.exists()){
+                IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
 				final String[] locales = properties.getStringArray("widget.locales");
 				W3CWidgetFactory fac = new W3CWidgetFactory();
 				fac.setLocales(locales);
 				fac.setLocalPath(session.getServletContext().getContextPath()+properties.getString("widget.widgetfolder"));
 				fac.setOutputDirectory(WIDGETFOLDER);
-				fac.setFeatures(ServerFeature.getFeatureNames());
+				fac.setFeatures(persistenceManager.findServerFeatureNames());
 				fac.setStartPageProcessor(new StartPageProcessor());
 				W3CWidget widgetModel = fac.parse(zipFile);
-				if(!Widget.exists(widgetModel.getIdentifier())){	
+	            if(persistenceManager.findWidgetByGuid(widgetModel.getIdentifier()) == null){
 					// ADD
-					Widget widget = WidgetFactory.addNewWidget(widgetModel);
-					int dbkey = widget.getId();
+					IWidget widget = WidgetFactory.addNewWidget(widgetModel);
+					Object dbkey = widget.getId();
 					// widget added
 					session.setAttribute("message_value", "'"+ widgetModel.getLocalName("en") +"' - " + localizedMessages.getString("WidgetAdminServlet.19")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 					retrieveServices(session);

Modified: incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetWebMenuServlet.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetWebMenuServlet.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetWebMenuServlet.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/WidgetWebMenuServlet.java Wed Jun 16 14:16:36 2010
@@ -27,8 +27,10 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.log4j.Logger;
-import org.apache.wookie.beans.Widget;
-import org.apache.wookie.beans.WidgetInstance;
+import org.apache.wookie.beans.IWidget;
+import org.apache.wookie.beans.IWidgetInstance;
+import org.apache.wookie.beans.util.IPersistenceManager;
+import org.apache.wookie.beans.util.PersistenceManagerFactory;
 import org.apache.wookie.connector.framework.AbstractWookieConnectorService;
 import org.apache.wookie.connector.framework.WookieConnectorException;
 import org.apache.wookie.connector.framework.WookieConnectorService;
@@ -106,7 +108,8 @@ public class WidgetWebMenuServlet extend
 				case DEMO_WIDGET:{
           String idKey = request.getParameter("idkey");
           try {
-            String guid = WidgetInstance.findByIdKey(idKey).getWidget().getGuid();
+            IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+            String guid = persistenceManager.findWidgetInstanceByIdKey(idKey).getWidget().getGuid();
             AbstractWookieConnectorService conn = getConnectorService(request);
             conn.setCurrentUser("testuser");
             org.apache.wookie.connector.framework.WidgetInstance instanceOne = conn.getOrCreateInstance(guid);
@@ -177,7 +180,8 @@ public class WidgetWebMenuServlet extend
 	}
 
 	private void instantiateOperation(HttpSession session, IWidgetAdminManager manager){
-		Widget[] widgets = Widget.findAll();
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+		IWidget[] widgets = persistenceManager.findAll(IWidget.class);
 		session.setAttribute("widgets", widgets); //$NON-NLS-1$
 	}
 	/**
@@ -191,16 +195,18 @@ public class WidgetWebMenuServlet extend
 	 * @param manager
 	 */
 	private void listOperation(HttpServletRequest request, HttpSession session, IWidgetAdminManager manager){
-		Hashtable<String, Widget> widgetsHash = new Hashtable<String, Widget>();
+		Hashtable<String, IWidget> widgetsHash = new Hashtable<String, IWidget>();
 
-		for(Widget widget:Widget.findAll()){
+        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
+        IWidget[] widgets = persistenceManager.findAll(IWidget.class);
+		for(IWidget widget : widgets){
 			
 			// Create an instance of the widget so that we can display it as the demo widget
 			// An instance of a widget refers to a widget that has data stored on
 			// to it and is going to be deployed on different platforms. In this 
 			// case its windows.  
 			
-			WidgetInstance instance = null;
+			IWidgetInstance instance = null;
 			String apiKey = "TEST"; //$NON-NLS-1$
 			String userId = "testuser"; //$NON-NLS-1$
 			String sharedDataKey = "myshareddata"; //$NON-NLS-1$

Modified: incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/IWidgetAPI.java
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/IWidgetAPI.java?rev=955236&r1=955235&r2=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/IWidgetAPI.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/IWidgetAPI.java Wed Jun 16 14:16:36 2010
@@ -17,7 +17,7 @@ package org.apache.wookie.ajaxmodel;
 import java.util.Map;
 import java.util.List;
 
-import org.apache.wookie.beans.Preference;
+import org.apache.wookie.beans.IPreference;
 
 
 /**
@@ -73,7 +73,7 @@ public interface IWidgetAPI {	
 	 * @param id_key
 	 * @return
 	 */
-	public List<Preference> preferences(String id_key);
+	public List<IPreference> preferences(String id_key);
 	
 	/**
 	 * Returns the widget metadata

Copied: incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/impl/PreferenceDelegate.java (from r955218, incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/beans/Preference.java)
URL: http://svn.apache.org/viewvc/incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/impl/PreferenceDelegate.java?p2=incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/impl/PreferenceDelegate.java&p1=incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/beans/Preference.java&r1=955218&r2=955236&rev=955236&view=diff
==============================================================================
--- incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/beans/Preference.java (original)
+++ incubator/wookie/branches/pluggablepersistence/src/org/apache/wookie/ajaxmodel/impl/PreferenceDelegate.java Wed Jun 16 14:16:36 2010
@@ -1,3 +1,5 @@
+package org.apache.wookie.ajaxmodel.impl;
+
 /*
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -11,92 +13,44 @@
  *  See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.wookie.beans;
-
-import java.util.HashMap;
-import java.util.Map;
+import org.apache.wookie.beans.IPreference;
 
 /**
- * A preference entity
- * @author Paul Sharples
- * @version $Id: Preference.java,v 1.3 2009-09-14 21:15:07 scottwilson Exp $
- *
+ * Delegate for Preference implementations; this is used for DWR marshalling
  */
-public class Preference extends AbstractKeyBean<Preference> {
-
-	private static final long serialVersionUID = 1L;
-
-	public Preference() {
-	}
-
-	private WidgetInstance widgetInstance;
-	private String dkey;
-	private String dvalue;
-	private boolean readOnly;
-
-	public WidgetInstance getWidgetInstance() {
-		return widgetInstance;
+public class PreferenceDelegate implements IPreference {
+	
+	private IPreference pref;
+	
+	public PreferenceDelegate(){
 	}
-
-	public void setWidgetInstance(WidgetInstance widgetInstance) {
-		this.widgetInstance = widgetInstance;
+	
+	public PreferenceDelegate(IPreference pref){
+		this.pref = pref;
 	}
 
 	public String getDkey() {
-		return dkey;
+		return pref.getDkey();
 	}
 
-	public void setDkey(String dkey) {
-		this.dkey = dkey;
+	public String getDvalue() {
+		return pref.getDvalue();
 	}
-	
-	public void setReadOnly(boolean value){
-		this.readOnly = value;
+
+	public boolean isReadOnly() {
+		return pref.isReadOnly();
 	}
 
-	public String getDvalue() {
-		return dvalue;
+	public void setDkey(String dkey) {
+		pref.setDkey(dkey);
 	}
 
 	public void setDvalue(String dvalue) {
-		this.dvalue = dvalue;
-	}
-	
-	public boolean getReadOnly(){
-		return this.readOnly;
-	}
-	
-	/// Active record methods
-	public static Preference findById(Object id){
-		return (Preference) findById(Preference.class, id);
-	}
-	
-	public static Preference[] findByValue(String key, Object value) {
-		return (Preference[]) findByValue(Preference.class, key, value);
+		pref.setDvalue(dvalue);
 	}
 
-	@SuppressWarnings("unchecked")
-	public static Preference[] findByValues(Map map) {
-		return (Preference[]) findByValues(Preference.class, map);
-	}
-	
-	public static Preference[] findAll(){
-		return (Preference[]) findAll(Preference.class);
-	}
-	
-	// Special queries
-	public static Preference findPreferenceForInstance(WidgetInstance instance, String key){
-		Map<String, Object> map = new HashMap<String,Object>();
-		map.put("widgetInstance", instance);
-		map.put("dkey", key);
-		Preference[] preferences = findByValues(map);
-		if (preferences == null||preferences.length != 1) return null;
-		return preferences[0];
-	}
-	
-	public static Preference[] findPreferencesForInstance(WidgetInstance instance){
-		return Preference.findByValue("widgetInstance", instance);	
+	public void setReadOnly(boolean readOnly) {
+		pref.setReadOnly(readOnly);
 	}
 
-}
\ No newline at end of file
+}