Commits

Anonymous committed 4f23f31

Re-organized the poms a bit, added a parent pom. Got cached and memory tests working.

git-svn-id: http://svn.opensymphony.com/svn/propertyset/branches/maven_build@244bf3cbcdd-1c1a-0410-9a68-d6f521e3fa7b

Comments (0)

Files changed (30)

 		<groupId>com.opensymphony.propertyset</groupId>
 		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset</groupId>
 	<artifactId>api</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> API</name>
+	<name>PropertySet API</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>opensymphony</groupId>
 			<artifactId>oscore</artifactId>
 			<version>2.2.4</version>
 		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.1</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-logging</groupId>
+			<artifactId>commons-logging</artifactId>
+			<version>1.1.1</version>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>1.2.13</version>
+			<scope>runtime</scope>
+		</dependency>
 	</dependencies>
 
 </project>

api/src/main/java/com/opensymphony/module/propertyset/config/PropertySetConfig.java

  */
 package com.opensymphony.module.propertyset.config;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.w3c.dom.*;
 
 import org.xml.sax.SAXException;
 public class PropertySetConfig {
     //~ Static fields/initializers /////////////////////////////////////////////
 
+    private static final Log logger = LogFactory.getLog(PropertySetConfig.class);
     private static PropertySetConfig config;
     private static final Object lock = new Object();
     private static final String[] CONFIG_LOCATIONS = new String[] {
      * @throws IllegalArgumentException     If none of the config files could be found.
      */
     private InputStream load() throws IllegalArgumentException {
+        if (logger.isDebugEnabled()) {
+            logger.debug("Loading configuration from specified locations...");
+        }
         InputStream is = null;
 
         for (int i = 0; i < CONFIG_LOCATIONS.length; i++) {
             String location = CONFIG_LOCATIONS[i];
+            if (logger.isDebugEnabled()) {
+                logger.debug("Attempting to load configuration from '" + location + "'");
+            }
 
             try {
                 URL resource = getResource(location, this.getClass());
                     return is;
                 }
             } catch (Exception e) {
-                //do nothing.
+                if (logger.isDebugEnabled()) {
+                    logger.error("Failed to load configuration from location '" + location + "'", e);
+                }
             }
         }
 
         if (is == null) {
-            String exceptionMessage = "Could not load propertyset config using '" + CONFIG_LOCATIONS + "'.  Please check your classpath.";
+            String exceptionMessage = "Could not load PropertySet configuration from the specified locations: '" + StringUtils.join(CONFIG_LOCATIONS, ',') + "'.  Please verify that the configuration file is in your classpath.";
             throw new IllegalArgumentException(exceptionMessage);
         }
 

api/src/test/java/com/opensymphony/module/propertyset/AbstractPropertySetTest.java

+/*
+ * Copyright (c) 2002-2003 by OpenSymphony
+ * All rights reserved.
+ */
+package com.opensymphony.module.propertyset;
+
+import com.opensymphony.util.XMLUtils;
+
+import junit.framework.TestCase;
+
+import org.w3c.dom.Document;
+
+import java.text.DateFormat;
+
+import java.util.Date;
+import java.util.Properties;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+
+/**
+ * User: bbulger
+ * Date: May 22, 2004
+ */
+public abstract class AbstractPropertySetTest extends TestCase {
+    //~ Instance fields ////////////////////////////////////////////////////////
+
+    protected PropertySet ps;
+    protected final String TEXT_VALUE = "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890";
+
+    //~ Methods ////////////////////////////////////////////////////////////////
+
+    public void testAbstractPropertySetTypeMethods() {
+        if (ps instanceof AbstractPropertySet) {
+            assertEquals("boolean", ((AbstractPropertySet) ps).type(PropertySet.BOOLEAN));
+            assertEquals("data", ((AbstractPropertySet) ps).type(PropertySet.DATA));
+            assertEquals("date", ((AbstractPropertySet) ps).type(PropertySet.DATE));
+            assertEquals("double", ((AbstractPropertySet) ps).type(PropertySet.DOUBLE));
+            assertEquals("int", ((AbstractPropertySet) ps).type(PropertySet.INT));
+            assertEquals("long", ((AbstractPropertySet) ps).type(PropertySet.LONG));
+            assertEquals("object", ((AbstractPropertySet) ps).type(PropertySet.OBJECT));
+            assertEquals("properties", ((AbstractPropertySet) ps).type(PropertySet.PROPERTIES));
+            assertEquals("string", ((AbstractPropertySet) ps).type(PropertySet.STRING));
+            assertEquals("text", ((AbstractPropertySet) ps).type(PropertySet.TEXT));
+            assertEquals("xml", ((AbstractPropertySet) ps).type(PropertySet.XML));
+            assertEquals(null, ((AbstractPropertySet) ps).type(-1));
+
+            assertEquals(PropertySet.BOOLEAN, ((AbstractPropertySet) ps).type("boolean"));
+            assertEquals(PropertySet.DATA, ((AbstractPropertySet) ps).type("data"));
+            assertEquals(PropertySet.DATE, ((AbstractPropertySet) ps).type("date"));
+            assertEquals(PropertySet.DOUBLE, ((AbstractPropertySet) ps).type("double"));
+            assertEquals(PropertySet.INT, ((AbstractPropertySet) ps).type("int"));
+            assertEquals(PropertySet.LONG, ((AbstractPropertySet) ps).type("long"));
+            assertEquals(PropertySet.OBJECT, ((AbstractPropertySet) ps).type("object"));
+            assertEquals(PropertySet.PROPERTIES, ((AbstractPropertySet) ps).type("properties"));
+            assertEquals(PropertySet.STRING, ((AbstractPropertySet) ps).type("string"));
+            assertEquals(PropertySet.TEXT, ((AbstractPropertySet) ps).type("text"));
+            assertEquals(PropertySet.XML, ((AbstractPropertySet) ps).type("xml"));
+            assertEquals(0, ((AbstractPropertySet) ps).type("unknown"));
+            assertEquals(0, ((AbstractPropertySet) ps).type(null));
+        }
+    }
+
+    public void testExistsOnPropertyInPropertySet() {
+        ps.setString("test1", "value1");
+        assertTrue(ps.exists("test1"));
+    }
+
+    public void testExistsOnPropertyNotInPropertySet() {
+        assertFalse(ps.exists("test425"));
+    }
+
+    public void testGetKeys() {
+        ps.setString("test1", "value1");
+        ps.setString("test2", "value2");
+        ps.setString("test3", "value3");
+        assertEquals(3, ps.getKeys().size());
+    }
+
+    public void testGetKeysOfType() {
+        if (ps.supportsTypes()) {
+            ps.setString("test1", "value1");
+            ps.setString("test2", "value2");
+            ps.setInt("testInt", 14);
+            assertEquals(2, ps.getKeys(PropertySet.STRING).size());
+            assertEquals(1, ps.getKeys(PropertySet.INT).size());
+        }
+    }
+
+    public void testGetKeysWithPrefix() {
+        ps.setString("test1", "value1");
+        ps.setString("test2", "value2");
+        ps.setString("username", "user1");
+        assertEquals(2, ps.getKeys("test").size());
+        assertEquals(1, ps.getKeys("user").size());
+    }
+
+    public void testGetKeysWithPrefixOfType() {
+        if (ps.supportsTypes()) {
+            ps.setString("test1", "value1");
+            ps.setString("test2", "value2");
+            ps.setString("username", "user1");
+            ps.setInt("testInt", 32);
+            ps.setInt("usernum", 18);
+            assertEquals(2, ps.getKeys("test", PropertySet.STRING).size());
+            assertEquals(1, ps.getKeys("user", PropertySet.STRING).size());
+            assertEquals(1, ps.getKeys("test", PropertySet.INT).size());
+            assertEquals(1, ps.getKeys("user", PropertySet.INT).size());
+        }
+    }
+
+    public void testGetStringNotInPropertySet() {
+        assertNull(ps.getString("test555"));
+    }
+
+    public void testGetTypeForBoolean() {
+        if (ps.supportsType(PropertySet.BOOLEAN)) {
+            ps.setBoolean("testBoolean", true);
+            assertEquals(PropertySet.BOOLEAN, ps.getType("testBoolean"));
+        }
+    }
+
+    public void testGetTypeForData() {
+        if (ps.supportsType(PropertySet.DATA)) {
+            ps.setData("testData", "value2".getBytes());
+            assertEquals(PropertySet.DATA, ps.getType("testData"));
+        }
+    }
+
+    public void testGetTypeForDate() {
+        if (ps.supportsType(PropertySet.DATE)) {
+            ps.setDate("testDate", new Date());
+            assertEquals(PropertySet.DATE, ps.getType("testDate"));
+        }
+    }
+
+    public void testGetTypeForDouble() {
+        if (ps.supportsType(PropertySet.DOUBLE)) {
+            ps.setDouble("testDouble", 10.456D);
+            assertEquals(PropertySet.DOUBLE, ps.getType("testDouble"));
+        }
+    }
+
+    public void testGetTypeForInt() {
+        if (ps.supportsType(PropertySet.INT)) {
+            ps.setInt("testInt", 7);
+            assertEquals(PropertySet.INT, ps.getType("testInt"));
+        }
+    }
+
+    public void testGetTypeForLong() {
+        if (ps.supportsType(PropertySet.LONG)) {
+            ps.setLong("testLong", 7L);
+            assertEquals(PropertySet.LONG, ps.getType("testLong"));
+        }
+    }
+
+    public void testGetTypeForObject() {
+        if (ps.supportsType(PropertySet.OBJECT)) {
+            ps.setObject("testObject", new StringBuffer());
+            assertEquals(PropertySet.OBJECT, ps.getType("testObject"));
+        }
+    }
+
+    public void testGetTypeForProperties() {
+        if (ps.supportsType(PropertySet.PROPERTIES)) {
+            ps.setProperties("testProperties", new Properties());
+            assertEquals(PropertySet.PROPERTIES, ps.getType("testProperties"));
+        }
+    }
+
+    public void testGetTypeForString() {
+        if (ps.supportsType(PropertySet.STRING)) {
+            ps.setString("testString", "value7");
+            assertEquals(PropertySet.STRING, ps.getType("testString"));
+        }
+    }
+
+    public void testGetTypeForText() {
+        if (ps.supportsType(PropertySet.TEXT)) {
+            ps.setText("testText", TEXT_VALUE);
+            assertEquals(PropertySet.TEXT, ps.getType("testText"));
+        }
+    }
+
+    public void testGetTypeForXml() throws ParserConfigurationException {
+        if (ps.supportsType(PropertySet.XML)) {
+            Document doc = XMLUtils.newDocument();
+            doc.appendChild(doc.createElement("root"));
+            ps.setXML("testXml", doc);
+            assertEquals(doc.getFirstChild().getNodeName(), ps.getXML("testXml").getFirstChild().getNodeName());
+        }
+    }
+
+    public void testRemoveAllKeys() {
+        ps.setString("test1", "value1");
+        assertEquals(1, ps.getKeys().size());
+
+        try {
+            ps.remove();
+            assertEquals(0, ps.getKeys().size());
+        } catch (PropertyException e) {
+            // this is ok too for read only PropertySets
+        }
+    }
+
+    public void testRemoveSingleKey() {
+        ps.setString("test1", "value1");
+        assertEquals(1, ps.getKeys().size());
+
+        try {
+            ps.remove("test1");
+            assertEquals(0, ps.getKeys().size());
+        } catch (PropertyException e) {
+            // this is ok too for read only PropertySets
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForBoolean() {
+        if (ps.supportsType(PropertySet.BOOLEAN)) {
+            ps.setAsActualType("testBoolean", new Boolean(true));
+            assertEquals(new Boolean(true), ps.getAsActualType("testBoolean"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForData() {
+        if (ps.supportsType(PropertySet.DATA)) {
+            ps.setAsActualType("testData", "value1".getBytes());
+            assertEquals(new String("value1".getBytes()), new String((byte[]) ps.getAsActualType("testData")));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForDate() {
+        if (ps.supportsType(PropertySet.DATE)) {
+            DateFormat df = DateFormat.getInstance();
+            Date now = new Date();
+            ps.setAsActualType("testDate", now);
+            assertEquals(df.format(now), df.format(ps.getAsActualType("testDate")));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForDouble() {
+        if (ps.supportsType(PropertySet.DOUBLE)) {
+            ps.setAsActualType("testDouble", new Double(10.234));
+            assertEquals(new Double(10.234), (Double) ps.getAsActualType("testDouble"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForInt() {
+        if (ps.supportsType(PropertySet.INT)) {
+            ps.setAsActualType("testInt", new Integer(7));
+            assertEquals(new Integer(7), ps.getAsActualType("testInt"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForLong() {
+        if (ps.supportsType(PropertySet.LONG)) {
+            ps.setAsActualType("testLong", new Long(70000));
+            assertEquals(new Long(70000), ps.getAsActualType("testLong"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForObject() {
+        if (ps.supportsType(PropertySet.OBJECT)) {
+            TestObject testObject = new TestObject(2);
+            ps.setAsActualType("testObject", testObject);
+            assertEquals(testObject, (TestObject) ps.getAsActualType("testObject"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForProperties() {
+        if (ps.supportsType(PropertySet.PROPERTIES)) {
+            Properties props = new Properties();
+            props.setProperty("prop1", "value1");
+            ps.setAsActualType("testProperties", props);
+            assertEquals(props, ps.getAsActualType("testProperties"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForString() {
+        if (ps.supportsType(PropertySet.STRING)) {
+            ps.setAsActualType("testString", "value1");
+            assertEquals("value1", ps.getAsActualType("testString"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForText() {
+        if (ps.supportsType(PropertySet.TEXT)) {
+            ps.setAsActualType("testText", TEXT_VALUE);
+            assertEquals(TEXT_VALUE, ps.getAsActualType("testText"));
+        }
+    }
+
+    public void testSetAsActualTypeGetAsActualTypeForXml() throws ParserConfigurationException {
+        if (ps.supportsType(PropertySet.XML)) {
+            Document doc = XMLUtils.newDocument();
+            doc.appendChild(doc.createElement("root"));
+            ps.setAsActualType("testXml", doc);
+            assertEquals(doc.getFirstChild().getNodeName(), ps.getXML("testXml").getFirstChild().getNodeName());
+        }
+    }
+
+    public void testSetBooleanGetBoolean() {
+        if (ps.supportsType(PropertySet.BOOLEAN)) {
+            ps.setBoolean("testBoolean", true);
+            assertTrue(ps.getBoolean("testBoolean"));
+            ps.setBoolean("testBoolean", false);
+            assertFalse(ps.getBoolean("testBoolean"));
+        }
+    }
+
+    public void testSetDataGetData() {
+        if (ps.supportsType(PropertySet.DATA)) {
+            ps.setData("testData", "value1".getBytes());
+            assertEquals(new String("value1".getBytes()), new String(ps.getData("testData")));
+            ps.setData("testData", "value2".getBytes());
+            assertEquals(new String("value2".getBytes()), new String(ps.getData("testData")));
+        }
+    }
+
+    public void testSetDateGetDate() {
+        if (ps.supportsType(PropertySet.DATE)) {
+            DateFormat df = DateFormat.getInstance();
+            Date now = new Date();
+            ps.setDate("testDate", now);
+            assertEquals(df.format(now), df.format(ps.getDate("testDate")));
+            ps.setDate("testDate", new Date());
+            assertEquals(df.format(now), df.format(ps.getDate("testDate")));
+        }
+    }
+
+    public void testSetDoubleGetDouble() {
+        if (ps.supportsType(PropertySet.DOUBLE)) {
+            ps.setDouble("testDouble", 1D);
+            assertEquals(1D, ps.getDouble("testDouble"), 0);
+            ps.setDouble("testDouble", 100000D);
+            assertEquals(100000D, ps.getDouble("testDouble"), 0);
+        }
+    }
+
+    public void testSetIntGetInt() {
+        if (ps.supportsType(PropertySet.INT)) {
+            ps.setInt("testInt", 7);
+            assertEquals(7, ps.getInt("testInt"));
+            ps.setInt("testInt", 11);
+            assertEquals(11, ps.getInt("testInt"));
+        }
+    }
+
+    public void testSetLongGetLong() {
+        if (ps.supportsType(PropertySet.LONG)) {
+            ps.setLong("testLong", 1L);
+            assertEquals(1L, ps.getLong("testLong"));
+            ps.setLong("testLong", 100000);
+            assertEquals(100000, ps.getLong("testLong"));
+        }
+    }
+
+    public void testSetObjectGetObject() {
+        if (ps.supportsType(PropertySet.OBJECT)) {
+            TestObject testObject = new TestObject(1);
+            ps.setObject("testObject", testObject);
+            assertEquals(testObject, ps.getObject("testObject"));
+        }
+    }
+
+    public void testSetPropertiesGetProperties() {
+        if (ps.supportsType(PropertySet.PROPERTIES)) {
+            Properties props = new Properties();
+            props.setProperty("prop1", "propValue1");
+            ps.setProperties("testProperties", props);
+            assertEquals(props, ps.getProperties("testProperties"));
+            props.setProperty("prop2", "propValue2");
+            ps.setProperties("testProperties", props);
+            assertEquals(props, ps.getProperties("testProperties"));
+        }
+    }
+
+    public void testSetStringGetStringLengthGreaterThan255() {
+        try {
+            ps.setString("testString", TEXT_VALUE);
+            fail("Should not be able to setString() with a String longer than 255 chars.");
+        } catch (IllegalPropertyException e) {
+            // expected
+        }
+    }
+
+    public void testSetStringGetStringLengthLessThan255() {
+        ps.setString("testString", "value1");
+        assertTrue("value1".equals(ps.getString("testString")));
+        ps.setString("testString", "value2");
+        assertTrue("value2".equals(ps.getString("testString")));
+    }
+
+    public void testSetTextGetText() {
+        if (ps.supportsType(PropertySet.TEXT)) {
+            ps.setText("testText", TEXT_VALUE);
+            assertEquals(TEXT_VALUE, ps.getText("testText"));
+            ps.setText("testText", TEXT_VALUE + "A");
+            assertEquals(TEXT_VALUE + "A", ps.getText("testText"));
+        }
+    }
+
+    public void testSetXmlGetXml() throws ParserConfigurationException {
+        if (ps.supportsType(PropertySet.XML)) {
+            Document doc = XMLUtils.newDocument();
+            doc.appendChild(doc.createElement("root"));
+            ps.setXML("testXml", doc);
+            assertEquals(doc.getFirstChild().getNodeName(), ps.getXML("testXml").getFirstChild().getNodeName());
+        }
+    }
+}

api/src/test/java/com/opensymphony/module/propertyset/TestObject.java

+/*
+ * Copyright (c) 2002-2003 by OpenSymphony
+ * All rights reserved.
+ */
+package com.opensymphony.module.propertyset;
+
+import java.io.Serializable;
+
+
+/**
+ * User: bbulger
+ * Date: May 22, 2004
+ */
+public class TestObject implements Serializable {
+    //~ Static fields/initializers /////////////////////////////////////////////
+
+    private static final long serialVersionUID = 261939103282846342L;
+
+    //~ Instance fields ////////////////////////////////////////////////////////
+
+    private long id;
+
+    //~ Constructors ///////////////////////////////////////////////////////////
+
+    public TestObject(long id) {
+        this.id = id;
+    }
+
+    //~ Methods ////////////////////////////////////////////////////////////////
+
+    public long getId() {
+        return id;
+    }
+
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj == null) {
+            return false;
+        }
+
+        if (this.getClass() != obj.getClass()) {
+            return false;
+        }
+
+        TestObject testObject = (TestObject) obj;
+
+        return id == testObject.getId();
+    }
+
+    public int hashCode() {
+        return (int) (id ^ id >>> 32);
+    }
+}

api/src/test/resources/clover.license

+Product: Clover
+License: Open Source License, 0.x, 1.x
+Issued: Sun Jan 12 2003 16:49:06 CST
+Expiry: Never
+Key: 95021d1a8d297dc7c24a4d55b
+Name: Patrick Lightbody
+Org: OpenSymphony
+Certificate: AAAB02+Ow8B7/zEbxOMqqKwwrdpP+a1COmJGHco7sCNLjHkHnajPF+dQW
+Ct12PMy0uml0s9xuus5wKngJ9OFk5PFeh01dzQF66bhXH1bvegLfvja3Kle6BYtDv4LZgE
+gk3E0aJN4IbgTn+TgUckSevXDR4KzK77NWJfrVzkxV3/JepMgS+gaUIj0h0mnUXI0d9L3d
++Ly/oD4fPPUcM+l7THY/MeGoGxPE34jA+emuAgEC6n8WXzjy9zHEesXaA+2NGYLPMcCL3W
+EOyD9KZPr6k/XEjTzhk+N4BCr2lOgsk4meUx51XqzPkL/ZyOP4owbvVonAQ/L+GDj6aPFk
+WDo0jWpoOc30+HRw+FjC20je0yIpPcSA06h/l9485Kz11TtFSESojB/CyCOKDNpjHd57C2
+D4o9H1xtn89RVjso3ssxJg69Fa2VRYslQsDlN4ydagKqGVbpdNwA4jK0ms7LhkZsgrJdlm
+8btO9j7w8W7Nz88dy0G5/TuCARCra5efv7fg4we6A8/UqAheBU70gw4cow7Ivct1urqTd9
+XM+nAT5mtPq/WUp3rQjR+VmOMGbA/WOM7B+/ohkWsRiEBK83ocO3vs8nIKajzWsul/SDe+
+8/K8n4dJXdGLSygwlLtZhtmxDYQhP+14HrB1hsru9usIilX2v1DGzap25mlAHZxwhxFXPd
+OlbPJEIfwJ+MBSJ4uw9ef3Pt8wtIulNrAraTniIYyShlOc/vgrMuGmZTAObtza2oJAaztu
+87hSZYD0A5Al0hC7kOliEBe871Gl590e9tiSFiNokQ=
+License Agreement: CLOVER VERSION 1 (ONE) SOFTWARE LICENSE AGREEMENT
+
+1. Licenses and Software
+
+Cortex eBusiness Pty Ltd, an Australian Proprietary Limited Company
+("CENQUA") hereby grants to the purchaser (the "LICENSEE") a limited,
+revocable, worldwide, non-exclusive, non-transferable,
+non-sublicensable license to use the Clover version 1 (one) software
+(the "Software"), including any minor upgrades thereof during the Term
+(hereinafter defined) up to, but not including the next major version
+of the Software. The licensee shall not, or knowingly allow others to,
+reverse engineer, decompile, disassemble, modify, adapt, create
+derivative works from or otherwise attempt to derive source code from
+the Software provided. And, in accordance with the terms and
+conditions of this Software License Agreement (the "Agreement"), the
+Software shall be used solely by the licensed users in accordance with
+the following edition specific conditions:
+
+a) Server Edition
+
+A Server Edition license entitles the Licensee to execute one instance
+of Clover Server Edition on one (1) machine for the purposes of
+instrumenting source code and generating reports. There are no
+limitations on the use of the instrumented source code or generated
+reports produced by Server Edition.
+
+b) Workstation Edition
+
+A Workstation Edition license entitles the licensee to use Clover
+Workstation Edition on one (1) machine by one (1) individual end
+user. Workstation Edition does not permit the generation of reports
+for distribution.
+
+c) Team Edition
+
+A Team Edition license entitles the licensee to use Clover Team
+edition on any number of machines solely by the licensed number of
+users. Reports generated by Clover Team Edition are strictly for use
+only by the licensed number of individual end users.
+
+2. License Fee
+
+In exchange for the License(s), the Licensee shall pay to Cenqua a
+one-time, up front, non-refundable license fee. At the sole discretion
+of Cenqua this fee will be waived for non-commercial
+projects. Notwithstanding the Licensee's payment of the License Fee,
+Cenqua reserves the right to terminate the License if Cenqua discovers
+that the Licensee and/or the Licensee's use of the Software is in
+breach of this Agreement.
+
+3. Proprietary Rights
+
+Cenqua will retain all right, title and interest in and to the
+Software, all copies thereof, and Cenqua website(s), software, and
+other intellectual property, including, but not limited to, ownership
+of all copyrights, look and feel, trademark rights, design rights,
+trade secret rights and any and all other intellectual property and
+other proprietary rights therein. The Licensee will not directly or
+indirectly obtain or attempt to obtain at any time, any right, title
+or interest by registration or otherwise in or to the trademarks,
+service marks, copyrights, trade names, symbols, logos or designations
+or other intellectual property rights owned or used by Cenqua. All
+technical manuals or other information provided by Cenqua to the
+Licensee shall be the sole property of Cenqua.
+
+4. Term and Termination
+
+Subject to the other provisions hereof, this Agreement shall commence
+upon the Licensee's opting into this Agreement and continue until the
+Licensee discontinues use of the Software or the Agreement terminates
+automatically upon the Licensee's breach of any term or condition of
+this Agreement (the "Term"). Upon any such termination, the Licensee
+will delete the Software immediately.
+
+5. Copying & Transfer
+
+The Licensee may copy the Software for back-up purposes only. The
+Licensee may not assign or otherwise transfer the Software to any
+third party.
+
+6. Specific Disclaimer of Warranty and Limitation of Liability
+
+THE SOFTWARE IS PROVIDED WITHOUT WARRANTY OF ANY KIND. CENQUA
+DISCLAIMS ALL WARRANTIES, EXPRESSED OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE. CENQUA WILL NOT BE LIABLE FOR ANY DAMAGES
+ASSOCIATED WITH THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ORDINARY,
+INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING
+BUT NOT LIMITED TO DAMAGES RELATING TO LOST DATA OR LOST PROFITS, EVEN
+IF CENQUA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. Warranties and Representations
+
+Licensee Indemnification. CENQUA agrees to indemnify, defend and hold
+the Licensee harmless from and against any and all liabilities, 
+damages, losses, claims, costs, and expenses (including reasonable 
+legal fees) arising out of or resulting from the Software or the use 
+thereof infringing upon, misappropriating or violating any patents, 
+copyrights, trademarks, or trade secret rights or other proprietary 
+rights of persons, firms or entities who are not parties to this 
+Agreement.
+
+CENQUA Indemnification. The Licensee warrants and represents that the 
+Licensee's actions with regard to the Software will be in compliance 
+with all applicable  laws; and the Licensee agrees to indemnify, 
+defend, and hold CENQUA harmless  from and against any and all 
+liabilities, damages, losses, claims, costs,  and expenses (including 
+reasonable legal fees) arising out of or resulting  from the 
+Licensee's failure to observe the use restrictions set forth herein.
+
+8. Publicity
+
+The Licensee grants permission for CENQUA to use Licensee's name 
+solely in customer lists. CENQUA shall not, without prior consent in 
+writing, use the Licensee's name, or that of its affiliates, in any 
+form with the specific  exception of customer lists. CENQUA agrees to 
+remove Licensee's name from  any and all materials within 7 days if 
+notified by the Licensee in writing.
+
+9. Governing Law
+
+This Agreement shall be governed by the laws of New South Wales, 
+Australia.
+
+10. Independent Contractors
+
+The parties are independent contractors with respect to each  other, 
+and nothing in this Agreement shall be construed as creating an 
+employer-employee  relationship, a partnership, agency relationship or 
+a joint venture between  the parties.
+
+11. Assignment
+
+This Agreement is not assignable or transferable by the Licensee. 
+CENQUA  in its sole discretion may transfer a license to a third party 
+at the written  request of the Licensee.
+
+12. Entire Agreement
+
+This Agreement constitutes the entire agreement between the parties 
+concerning  the Licensee's use of the Software. This Agreement 
+supersedes any prior verbal understanding between the parties and any 
+Licensee purchase order or other  ordering document, regardless of 
+whether such document is received by CENQUA  before or after execution 
+of this Agreement. This Agreement may be amended  only in writing by 
+CENQUA.

api/src/test/resources/log4j.properties

+# Set log4j to verbose state
+log4j.debug=true
+
+# Set root logger to DEBUG and add an appender called PROPERTYSET_CONSOLE
+log4j.rootLogger=DEBUG, ROOT_FILE, PROPERTYSET_CONSOLE
+
+# Set application logger to DEBUG and add an appender called PROPERTYSET_FILE
+log4j.logger.com.opensymphony.module.propertyset=DEBUG, PROPERTYSET_FILE
+
+# PROPERTYSET_CONSOLE is set to be a console appender
+log4j.appender.PROPERTYSET_CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.PROPERTYSET_CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.PROPERTYSET_CONSOLE.layout.ConversionPattern=<%d{ISO8601}> <%p> <%C{1}> <%m>%n
+
+# PROPERTYSET_FILE is set to be a file appender
+log4j.appender.PROPERTYSET_FILE=org.apache.log4j.FileAppender
+log4j.appender.PROPERTYSET_FILE.file=${user.home}/.propertyset/logs/propertyset.log
+log4j.appender.PROPERTYSET_FILE.layout=org.apache.log4j.PatternLayout
+log4j.appender.PROPERTYSET_FILE.layout.ConversionPattern=<%d{ISO8601}> <%p> <%C{1}> <%m>%n
+
+# ROOT_FILE is set to be a file appender
+log4j.appender.ROOT_FILE=org.apache.log4j.FileAppender
+log4j.appender.ROOT_FILE.file=${user.home}/.propertyset/logs/propertyset-root.log
+log4j.appender.ROOT_FILE.layout=org.apache.log4j.PatternLayout
+log4j.appender.ROOT_FILE.layout.ConversionPattern=<%d{ISO8601}> <%p> <%C{1}> <%m>%n
 		<groupId>com.opensymphony.propertyset</groupId>
 		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset</groupId>
 	<artifactId>core</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Core</name>
+	<name>PropertySet Core</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
+			<groupId>com.opensymphony.propertyset</groupId>
+			<artifactId>api</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+			<classifier>tests</classifier>
 		</dependency>
 	</dependencies>
 

core/src/main/resources/META-INF/propertyset-default.xml

+<propertysets>
+    <!-- Core implementations of PropertySet interface -->
+    <propertyset name="aggregate" class="com.opensymphony.module.propertyset.aggregate.AggregatePropertySet"/>
+    <propertyset name="cached" class="com.opensymphony.module.propertyset.cached.CachingPropertySet"/>
+    <propertyset name="properties" class="com.opensymphony.module.propertyset.file.PropertiesFilePropertySet"/>
+    <propertyset name="javabeans" class="com.opensymphony.module.propertyset.javabeans.BeanIntrospectorPropertySet"/>
+    <propertyset name="map" class="com.opensymphony.module.propertyset.map.MapPropertySet"/>
+    <propertyset name="memory" class="com.opensymphony.module.propertyset.memory.MemoryPropertySet"/>
+    <propertyset name="serializable" class="com.opensymphony.module.propertyset.memory.SerializablePropertySet"/>
+    <propertyset name="xml" class="com.opensymphony.module.propertyset.xml.XMLPropertySet"/>
+
+    <!-- Additional implementations of PropertySet interface not necessarily used together --> 
+    <propertyset name="ejb" class="com.opensymphony.module.propertyset.ejb.EJBPropertySet"/>
+    <propertyset name="ejb3" class="com.opensymphony.module.propertyset.ejb3.EJBPropertySetImpl"/>
+    <propertyset name="hibernate" class="com.opensymphony.module.propertyset.hibernate.HibernatePropertySet"/>
+    <propertyset name="jdbc" class="com.opensymphony.module.propertyset.database.JDBCPropertySet">
+        <arg name="datasource" value="jdbc/DefaultDS"/>
+        <arg name="table.name" value="OS_PROPERTYENTRY"/>
+        <arg name="col.globalKey" value="GLOBAL_KEY"/>
+        <arg name="col.itemKey" value="ITEM_KEY"/>
+        <arg name="col.itemType" value="ITEM_TYPE"/>
+        <arg name="col.string" value="STRING_VALUE"/>
+        <arg name="col.date" value="DATE_VALUE"/>
+        <arg name="col.data" value="DATA_VALUE"/>
+        <arg name="col.float" value="FLOAT_VALUE"/>
+        <arg name="col.number" value="NUMBER_VALUE"/>
+    </propertyset>
+    <propertyset name="ofbiz" class="com.opensymphony.module.propertyset.ofbiz.OFBizPropertySet"/>
+    <propertyset name="ojb" class="com.opensymphony.module.propertyset.ojb.OJBPropertySet"/>
+</propertysets>

core/src/test/java/com/opensymphony/module/propertyset/cached/CachingPropertySetTest.java

+/*
+ * Copyright (c) 2002-2003 by OpenSymphony
+ * All rights reserved.
+ */
+package com.opensymphony.module.propertyset.cached;
+
+import com.opensymphony.module.propertyset.PropertySet;
+import com.opensymphony.module.propertyset.memory.MemoryPropertySet;
+import com.opensymphony.module.propertyset.memory.SerializablePropertySetTest;
+
+import java.util.HashMap;
+
+
+/**
+ * User: bbulger
+ * Date: May 24, 2004
+ */
+public class CachingPropertySetTest extends SerializablePropertySetTest {
+    //~ Methods ////////////////////////////////////////////////////////////////
+
+    protected void setUp() throws Exception {
+        PropertySet memoryPropertySet = new MemoryPropertySet();
+        memoryPropertySet.init(null, null);
+
+        HashMap args = new HashMap();
+        args.put("PropertySet", memoryPropertySet);
+        ps = new CachingPropertySet();
+        ps.init(new HashMap(), args);
+    }
+}

core/src/test/java/com/opensymphony/module/propertyset/memory/MemoryPropertySetTest.java

+/*
+ * Copyright (c) 2002-2003 by OpenSymphony
+ * All rights reserved.
+ */
+package com.opensymphony.module.propertyset.memory;
+
+import com.opensymphony.module.propertyset.AbstractPropertySetTest;
+
+
+/**
+ * User: bbulger
+ * Date: May 22, 2004
+ */
+public class MemoryPropertySetTest extends AbstractPropertySetTest {
+    //~ Methods ////////////////////////////////////////////////////////////////
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        ps = new MemoryPropertySet();
+        ps.init(null, null);
+    }
+}

core/src/test/java/com/opensymphony/module/propertyset/memory/SerializablePropertySetTest.java

+/*
+ * Copyright (c) 2002-2003 by OpenSymphony
+ * All rights reserved.
+ */
+package com.opensymphony.module.propertyset.memory;
+
+import com.opensymphony.module.propertyset.AbstractPropertySetTest;
+
+
+/**
+ * User: bbulger
+ * Date: May 22, 2004
+ */
+public class SerializablePropertySetTest extends AbstractPropertySetTest {
+    //~ Methods ////////////////////////////////////////////////////////////////
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        ps = new SerializablePropertySet();
+        ps.init(null, null);
+    }
+}

core/src/test/resources/propertyset-default.xml

+<propertysets>
+    <propertyset name="aggregate" class="com.opensymphony.module.propertyset.aggregate.AggregatePropertySet"/>
+    <propertyset name="cached" class="com.opensymphony.module.propertyset.cached.CachingPropertySet"/>
+    <propertyset name="jdbc" class="com.opensymphony.module.propertyset.database.JDBCPropertySet">
+        <arg name="datasource" value="jdbc/DefaultDS"/>
+        <arg name="table.name" value="OS_PROPERTYENTRY"/>
+        <arg name="col.globalKey" value="GLOBAL_KEY"/>
+        <arg name="col.itemKey" value="ITEM_KEY"/>
+        <arg name="col.itemType" value="ITEM_TYPE"/>
+        <arg name="col.string" value="STRING_VALUE"/>
+        <arg name="col.date" value="DATE_VALUE"/>
+        <arg name="col.data" value="DATA_VALUE"/>
+        <arg name="col.float" value="FLOAT_VALUE"/>
+        <arg name="col.number" value="NUMBER_VALUE"/>
+    </propertyset>
+    <propertyset name="ejb" class="com.opensymphony.module.propertyset.ejb.EJBPropertySet"/>
+    <propertyset name="ejb3" class="com.opensymphony.module.propertyset.ejb3.EJBPropertySetImpl"/>
+    <propertyset name="javabeans" class="com.opensymphony.module.propertyset.javabeans.BeanIntrospectorPropertySet"/>
+    <propertyset name="map" class="com.opensymphony.module.propertyset.map.MapPropertySet"/>
+    <propertyset name="memory" class="com.opensymphony.module.propertyset.memory.MemoryPropertySet"/>
+    <propertyset name="properties" class="com.opensymphony.module.propertyset.file.PropertiesFilePropertySet" />
+    <propertyset name="serializable" class="com.opensymphony.module.propertyset.memory.SerializablePropertySet"/>
+    <propertyset name="ofbiz" class="com.opensymphony.module.propertyset.ofbiz.OFBizPropertySet"/>
+    <propertyset name="hibernate" class="com.opensymphony.module.propertyset.hibernate.HibernatePropertySet" />
+  <propertyset name="ojb" class="com.opensymphony.module.propertyset.ojb.OJBPropertySet"/>
+  <propertyset name="xml" class="com.opensymphony.module.propertyset.xml.XMLPropertySet"/>
+</propertysets>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.opensymphony.propertyset</groupId>
+	<artifactId>parent</artifactId>
+	<version>1.5.0-SNAPSHOT</version>
+	<packaging>pom</packaging>
+
+	<name>PropertySet Parent</name>
+	<description>
+		PropertySet is a persistence-agnostic module that can be used to fulfill storage requirements in applications
+		that can change constantly. An example of this might be a "User Preferences" storage device. It may be
+		impossible to know what the user can store at any given time in your application's lifecycle, so employing a
+		PropertySet can help. Backed by XML, EJB, Ofbiz, JDBC, Castor JDO, or any other persistence mechanism, you can
+		provide a complete typed key-value pair implementation.
+	</description>
+	<url>http://www.opensymphony.com/propertyset</url>
+	<inceptionYear>2000</inceptionYear>
+	<organization>
+		<name>OpenSymphony</name>
+		<url>http://www.opensymphony.com</url>
+	</organization>
+	<licenses>
+		<license>
+			<name>OpenSymphony Software License, Version 1.1</name>
+			<url>http://www/opensymphony.com/propertyset/license.action</url>
+		</license>
+	</licenses>
+
+	<developers>
+		<developer>
+			<name>Hani Suileman</name>
+			<email>fate@formicary.com</email>
+			<roles>
+				<role>Project Leader</role>
+			</roles>
+		</developer>
+		<developer>
+			<name>Patrick Lightbody</name>
+			<email>plightbo@gmail.com</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+		</developer>
+		<developer>
+			<id>skanjo</id>
+			<name>Samer Kanjo</name>
+			<email>samer@teamkanjo.com</email>
+			<timezone>-6</timezone>
+			<roles>
+				<role>Developer</role>
+			</roles>
+		</developer>
+	</developers>
+
+	<issueManagement>
+		<system>JIRA</system>
+		<url>http://jira.opensymphony.com</url>
+	</issueManagement>
+	<scm>
+		<connection>http://svn.opensymphony.com/svn/propertyset/trunk</connection>
+		<developerConnection>https://svn.opensymphony.com/svn/propertyset/trunk</developerConnection>
+		<url>http://svn.opensymphony.com/fisheye/browse/propertyset</url>
+	</scm>
+	<ciManagement>
+		<system>Bamboo</system>
+		<url>http://bamboo.opensymphony.com</url>
+	</ciManagement>
+
+	<prerequisites>
+		<maven>2.0.9</maven>
+	</prerequisites>
+
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-assembly-plugin</artifactId>
+					<version>2.2-beta-5</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-clean-plugin</artifactId>
+					<version>2.4</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<version>2.1</version>
+					<configuration>
+						<source>${jdk.version}</source>
+						<target>${jdk.version}</target>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-dependency-plugin</artifactId>
+					<version>2.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-deploy-plugin</artifactId>
+					<version>2.5</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-install-plugin</artifactId>
+					<version>2.3</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-jar-plugin</artifactId>
+					<version>2.3</version>
+					<configuration>
+						<archive>
+							<manifest>
+								<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+							</manifest>
+							<manifestEntries>
+								<url>${pom.url}</url>
+							</manifestEntries>
+						</archive>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<version>2.6.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-release-plugin</artifactId>
+					<version>2.0</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-resources-plugin</artifactId>
+					<version>2.4.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-site-plugin</artifactId>
+					<version>2.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-source-plugin</artifactId>
+					<version>2.1.1</version>
+					<executions>
+						<execution>
+							<id>attach-sources</id>
+							<goals>
+								<goal>jar</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-plugin</artifactId>
+					<version>2.5</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-war-plugin</artifactId>
+					<version>2.1-beta-1</version>
+					<configuration>
+						<archive>
+							<manifest>
+								<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+							</manifest>
+							<manifestEntries>
+								<url>${pom.url}</url>
+							</manifestEntries>
+						</archive>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-help-plugin</artifactId>
+					<version>2.1</version>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<!--
+			<plugin>
+			<groupId>com.atlassian.maven.plugins</groupId>
+			<artifactId>maven-clover2-plugin</artifactId>
+			<configuration>
+			<licenseLocation>${basedir}/src/test/clover/clover.license</licenseLocation>
+			</configuration>
+			<executions>
+			<execution>
+			<configuration>
+			<targetPercentage>50%</targetPercentage>
+			</configuration>
+			<phase>verify</phase>
+			<goals>
+			<goal>instrument</goal>
+			<goal>check</goal>
+			</goals>
+			</execution>
+			</executions>
+			</plugin>
+			-->
+		</plugins>
+	</build>
+
+	<repositories>
+		<repository>
+			<id>maven-repository.dev.java.net</id>
+			<name>Java.net Maven 1 Repository</name>
+			<url>http://download.java.net/maven/1/</url>
+			<layout>legacy</layout>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+		</repository>
+		<repository>
+			<id>maven2-repository.dev.java.net</id>
+			<name>Java.net Maven 2 Repository</name>
+			<layout>default</layout>
+			<url>http://download.java.net/maven/2/</url>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+		</repository>
+	</repositories>
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>clover</groupId>
+			<artifactId>clover</artifactId>
+			<version>1.3.9</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<properties>
+		<jdk.version>1.3</jdk.version>
+	</properties>
+
+</project>
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
 	<modelVersion>4.0.0</modelVersion>
+	
 	<groupId>com.opensymphony.propertyset</groupId>
-	<artifactId>parent</artifactId>
-	<version>1.5.0-SNAPSHOT</version>
+	<artifactId>builder</artifactId>
+	<version>1-SNAPSHOT</version>
 	<packaging>pom</packaging>
 
-	<name>PropertySet</name>
+	<name>PropertySet Builder</name>
 	<description>
-		PropertySet is a persistence-agnostic module that can be used to fulfill storage requirements in applications 
-		that can change constantly. An example of this might be a "User Preferences" storage device. It may be 
-		impossible to know what the user can store at any given time in your application's lifecycle, so employing a 
-		PropertySet can help. Backed by XML, EJB, Ofbiz, JDBC, Castor JDO, or any other persistence mechanism, you can 
+		PropertySet is a persistence-agnostic module that can be used to fulfill storage requirements in applications
+		that can change constantly. An example of this might be a "User Preferences" storage device. It may be
+		impossible to know what the user can store at any given time in your application's lifecycle, so employing a
+		PropertySet can help. Backed by XML, EJB, Ofbiz, JDBC, Castor JDO, or any other persistence mechanism, you can
 		provide a complete typed key-value pair implementation.
 	</description>
-	<inceptionYear>2000</inceptionYear>
 	<url>http://www.opensymphony.com/propertyset</url>
-
-	<modules>
-		<module>api</module>
-		<module>test</module>
-		<module>core</module>
-        <module>providers</module>
-    </modules>
-
-	<prerequisites>
-		<maven>2.0.9</maven>
-	</prerequisites>
-
-	<properties>
-	</properties>
-
-	<repositories>
-		<repository>
-			<id>maven-repository.dev.java.net</id>
-			<name>Java.net Maven 1 Repository</name>
-			<url>http://download.java.net/maven/1/</url>
-			<layout>legacy</layout>
-			<snapshots>
-				<enabled>false</enabled>
-			</snapshots>
-		</repository>
-		<repository>
-			<id>maven2-repository.dev.java.net</id>
-			<name>Java.net Maven 2 Repository</name>
-			<layout>default</layout>
-			<url>http://download.java.net/maven/2/</url>
-			<snapshots>
-				<enabled>false</enabled>
-			</snapshots>
-		</repository>
-	</repositories>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.3</source>
-					<target>1.3</target>
-				</configuration>
-			</plugin>
-			<!--
-			<plugin>
-				<groupId>com.atlassian.maven.plugins</groupId>
-				<artifactId>maven-clover2-plugin</artifactId>
-				<configuration>
-					<licenseLocation>${basedir}/src/test/clover/clover.license</licenseLocation>
-				</configuration>
-				<executions>
-					<execution>
-						<configuration>
-							<targetPercentage>50%</targetPercentage>
-						</configuration>
-						<phase>verify</phase>
-						<goals>
-							<goal>instrument</goal>
-							<goal>check</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-			-->
-		</plugins>
-	</build>
-
+	<inceptionYear>2000</inceptionYear>
 	<organization>
 		<name>OpenSymphony</name>
 		<url>http://www.opensymphony.com</url>
 	</organization>
-
-	<developers>
-		<developer>
-			<id>skanjo</id>
-			<name>Samer Kanjo</name>
-			<email>samer@teamkanjo.com</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>-6</timezone>
-		</developer>
-	</developers>
-
+	<licenses>
+			<license>
+				<name>OpenSymphony Software License, Version 1.1</name>
+				<url>http://www/opensymphony.com/propertyset/license.action</url>
+			</license>
+	</licenses>
+	
+	<modules>
+		<module>api</module>
+		<module>core</module>
+		<module>parent</module>
+		<module>providers</module>
+	</modules>
+	
 </project>

providers/ejb2/pom.xml

 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
-	    <artifactId>parent</artifactId>
+		<groupId>com.opensymphony.propertyset</groupId>
+		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>ejb2</artifactId>
 	<packaging>ejb</packaging>
 
-	<name>PropertySet -> Providers -> EJB 2</name>
+	<name>PropertySet Providers EJB 2</name>
 	<description></description>
 
-	<dependencies>
-		<dependency>
-			<groupId>com.opensymphony.propertyset</groupId>
-			<artifactId>api</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
-			<groupId>javax.ejb</groupId>
-			<artifactId>ejb</artifactId>
-			<version>2.0</version>
-			<scope>provided</scope>
-		</dependency>
-	</dependencies>
-
 	<build>
 		<plugins>
 			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+			<plugin>
 				<groupId>org.codehaus.mojo</groupId>
 				<artifactId>xdoclet-maven-plugin</artifactId>
 				<executions>
 			</plugin>
 		</plugins>
 	</build>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.opensymphony.propertyset</groupId>
+			<artifactId>api</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.ejb</groupId>
+			<artifactId>ejb</artifactId>
+			<version>2.0</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+
 </project>

providers/ejb3/pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0"
-xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
 	<modelVersion>4.0.0</modelVersion>
-	
+
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
+		<groupId>com.opensymphony.propertyset</groupId>
 		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>ejb3</artifactId>
 	<packaging>ejb</packaging>
-	
-	<name>PropertySet -> Providers -> EJB 3</name>
+
+	<name>PropertySet Providers EJB 3</name>
 	<description></description>
-	
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-ejb-plugin</artifactId>
+				<configuration>
+					<ejbVersion>3.0</ejbVersion>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
 			<groupId>javax.ejb</groupId>
 			<artifactId>ejb-api</artifactId>
 			<version>3.0</version>
 			<groupId>org.hibernate</groupId>
 			<artifactId>hibernate-annotations</artifactId>
 			<version>3.3.1.GA</version>
+			<scope>provided</scope>
 		</dependency>
 	</dependencies>
-	
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.5</source>
-					<target>1.5</target>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-ejb-plugin</artifactId>
-				<configuration>
-					<ejbVersion>3.0</ejbVersion>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-	
+
+	<properties>
+		<jdk.version>1.5</jdk.version>
+	</properties>
+
 </project>

providers/hibernate2/pom.xml

 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
-	    <artifactId>parent</artifactId>
+		<groupId>com.opensymphony.propertyset</groupId>
+		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>hibernate2</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Providers -> Hibernate 2</name>
+	<name>PropertySet Providers Hibernate 2</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
 			<groupId>hibernate</groupId>
 			<artifactId>hibernate</artifactId>
 			<version>2.1.8</version>

providers/hibernate3/pom.xml

 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
-	    <artifactId>parent</artifactId>
+		<groupId>com.opensymphony.propertyset</groupId>
+		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>hibernate3</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Providers -> Hibernate 3</name>
+	<name>PropertySet Providers Hibernate 3</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
 			<groupId>org.hibernate</groupId>
 			<artifactId>hibernate-core</artifactId>
 			<version>3.3.2.GA</version>
+			<scope>provided</scope>
 		</dependency>
 	</dependencies>
 

providers/jdbc/pom.xml

 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
-	    <artifactId>parent</artifactId>
+		<groupId>com.opensymphony.propertyset</groupId>
+		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>jdbc</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Providers -> JDBC</name>
+	<name>PropertySet Providers JDBC</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<artifactId>api</artifactId>
 			<version>${project.version}</version>
 		</dependency>
-		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
 	</dependencies>
 
 </project>

providers/ofbiz2/pom.xml

 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
-	    <artifactId>parent</artifactId>
+		<groupId>com.opensymphony.propertyset</groupId>
+		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>ofbiz2</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Providers -> OFBiz 2</name>
+	<name>PropertySet Providers OFBiz 2</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
 			<groupId>org.ofbiz.ofbcore</groupId>
 			<artifactId>ofbcore-share</artifactId>
 			<version>2.1.1</version>
 			<artifactId>ofbcore-entity</artifactId>
 			<version>2.1.1</version>
 		</dependency>
-</dependencies>
+	</dependencies>
 
 
 </project>

providers/ojb/pom.xml

 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
-		<groupId>com.opensymphony.propertyset.providers</groupId>
-	    <artifactId>parent</artifactId>
+		<groupId>com.opensymphony.propertyset</groupId>
+		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
 	<artifactId>ojb</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Providers -> OJB</name>
+	<name>PropertySet Providers OJB</name>
 	<description></description>
 
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>com.opensymphony.propertyset</groupId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-			<version>2.1</version>
-		</dependency>
-		<dependency>
 			<groupId>ojb</groupId>
 			<artifactId>db-ojb</artifactId>
 			<version>1.0.4</version>

providers/pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-    <modelVersion>4.0.0</modelVersion>
+	<modelVersion>4.0.0</modelVersion>
 
-    <parent>
-		<groupId>com.opensymphony.propertyset</groupId>
-		<artifactId>parent</artifactId>
-        <version>1.5.0-SNAPSHOT</version>
-    </parent>
 	<groupId>com.opensymphony.propertyset.providers</groupId>
-    <artifactId>parent</artifactId>
+	<artifactId>builder</artifactId>
+	<version>1-SNAPSHOT</version>
 	<packaging>pom</packaging>
 
-	<name>PropertySet -> Providers</name>
-	<description></description>
+	<name>PropertySet Providers Builder</name>
+	<description>
+		PropertySet is a persistence-agnostic module that can be used to fulfill storage requirements in applications
+		that can change constantly. An example of this might be a "User Preferences" storage device. It may be
+		impossible to know what the user can store at any given time in your application's lifecycle, so employing a
+		PropertySet can help. Backed by XML, EJB, Ofbiz, JDBC, Castor JDO, or any other persistence mechanism, you can
+		provide a complete typed key-value pair implementation.
+	</description>
+	<url>http://www.opensymphony.com/propertyset</url>
+	<inceptionYear>2000</inceptionYear>
+	<organization>
+		<name>OpenSymphony</name>
+		<url>http://www.opensymphony.com</url>
+	</organization>
+	<licenses>
+			<license>
+				<name>OpenSymphony Software License, Version 1.1</name>
+				<url>http://www/opensymphony.com/propertyset/license.action</url>
+			</license>
+	</licenses>
 
 	<modules>
 		<module>ejb2</module>
 		<module>jdbc</module>
 		<module>ofbiz2</module>
 		<module>ojb</module>
-    </modules>
+<!--
+-->
+	</modules>
 
-</project>
+</project>

src/test/com/opensymphony/module/propertyset/cached/CachingPropertySetTest.java

-/*
- * Copyright (c) 2002-2003 by OpenSymphony
- * All rights reserved.
- */
-package com.opensymphony.module.propertyset.cached;
-
-import com.opensymphony.module.propertyset.PropertySet;
-import com.opensymphony.module.propertyset.memory.MemoryPropertySet;
-import com.opensymphony.module.propertyset.memory.SerializablePropertySetTest;
-
-import java.util.HashMap;
-
-
-/**
- * User: bbulger
- * Date: May 24, 2004
- */
-public class CachingPropertySetTest extends SerializablePropertySetTest {
-    //~ Methods ////////////////////////////////////////////////////////////////
-
-    protected void setUp() throws Exception {
-        PropertySet memoryPropertySet = new MemoryPropertySet();
-        memoryPropertySet.init(null, null);
-
-        HashMap args = new HashMap();
-        args.put("PropertySet", memoryPropertySet);
-        ps = new CachingPropertySet();
-        ps.init(new HashMap(), args);
-    }
-}

src/test/com/opensymphony/module/propertyset/memory/MemoryPropertySetTest.java

-/*
- * Copyright (c) 2002-2003 by OpenSymphony
- * All rights reserved.
- */
-package com.opensymphony.module.propertyset.memory;
-
-import com.opensymphony.module.propertyset.AbstractPropertySetTest;
-
-
-/**
- * User: bbulger
- * Date: May 22, 2004
- */
-public class MemoryPropertySetTest extends AbstractPropertySetTest {
-    //~ Methods ////////////////////////////////////////////////////////////////
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        ps = new MemoryPropertySet();
-        ps.init(null, null);
-    }
-}

src/test/com/opensymphony/module/propertyset/memory/SerializablePropertySetTest.java

-/*
- * Copyright (c) 2002-2003 by OpenSymphony
- * All rights reserved.
- */
-package com.opensymphony.module.propertyset.memory;
-
-import com.opensymphony.module.propertyset.AbstractPropertySetTest;
-
-
-/**
- * User: bbulger
- * Date: May 22, 2004
- */
-public class SerializablePropertySetTest extends AbstractPropertySetTest {
-    //~ Methods ////////////////////////////////////////////////////////////////
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        ps = new SerializablePropertySet();
-        ps.init(null, null);
-    }
-}
 		<groupId>com.opensymphony.propertyset</groupId>
 		<artifactId>parent</artifactId>
 		<version>1.5.0-SNAPSHOT</version>
+		<relativePath>../parent/pom.xml</relativePath>
 	</parent>
 	<groupId>com.opensymphony.propertyset</groupId>
 	<artifactId>test</artifactId>
 	<packaging>jar</packaging>
 
-	<name>PropertySet -> Test</name>
+	<name>PropertySet Test</name>
 	<description></description>
 
 	<dependencies>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 			<version>3.8.1</version>
 		</dependency>
+		<dependency>
+			<groupId>clover</groupId>
+			<artifactId>clover</artifactId>
+			<version>1.3.9</version>
+		</dependency>
 	</dependencies>
 
 </project>

test/src/main/java/com/opensymphony/module/propertyset/AbstractPropertySetTest.java

-/*
- * Copyright (c) 2002-2003 by OpenSymphony
- * All rights reserved.
- */
-package com.opensymphony.module.propertyset;
-