You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by er...@apache.org on 2010/09/03 09:44:00 UTC
svn commit: r992226 - in /james/server/trunk: core-function/
core-function/src/main/java/org/apache/james/domain/
core-function/src/test/java/org/apache/james/domain/
spring-deployment/src/main/config/james/
spring-deployment/src/main/config/james/META...
Author: eric
Date: Fri Sep 3 07:44:00 2010
New Revision: 992226
URL: http://svn.apache.org/viewvc?rev=992226&view=rev
Log:
DomainList is now also JPA (JAMES-1037)
Added:
james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomain.java
james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomainList.java
james/server/trunk/core-function/src/test/java/org/apache/james/domain/JPADomainListTest.java
Modified:
james/server/trunk/core-function/pom.xml
james/server/trunk/core-function/src/main/java/org/apache/james/domain/JDBCDomainList.java
james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml
james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml
Modified: james/server/trunk/core-function/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/core-function/pom.xml?rev=992226&r1=992225&r2=992226&view=diff
==============================================================================
--- james/server/trunk/core-function/pom.xml (original)
+++ james/server/trunk/core-function/pom.xml Fri Sep 3 07:44:00 2010
@@ -112,6 +112,14 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.apache.openjpa</groupId>
+ <artifactId>openjpa</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ </dependency>
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
@@ -123,4 +131,39 @@
<type>test-jar</type>
</dependency>
</dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>openjpa-maven-plugin</artifactId>
+ <version>1.0</version>
+ <configuration>
+ <includes>org/apache/james/domain/JPADomain.class</includes>
+ <addDefaultConstructor>true</addDefaultConstructor>
+ <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+ <toolProperties>
+ <property>
+ <name>log</name>
+ <value>TOOL=TRACE</value>
+ </property>
+ <property>
+ <name>metaDataFactory</name>
+ <value>jpa(Types=org.apache.james.domain.JPADomain)</value>
+ </property>
+ </toolProperties>
+ </configuration>
+ <executions>
+ <execution>
+ <id>enhancer</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>enhance</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
</project>
Modified: james/server/trunk/core-function/src/main/java/org/apache/james/domain/JDBCDomainList.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-function/src/main/java/org/apache/james/domain/JDBCDomainList.java?rev=992226&r1=992225&r2=992226&view=diff
==============================================================================
--- james/server/trunk/core-function/src/main/java/org/apache/james/domain/JDBCDomainList.java (original)
+++ james/server/trunk/core-function/src/main/java/org/apache/james/domain/JDBCDomainList.java Fri Sep 3 07:44:00 2010
@@ -45,7 +45,9 @@ import org.apache.james.util.sql.JDBCUti
import org.apache.james.util.sql.SqlResources;
/**
- * Allow to query a costum table for domains
+ * Allow to query a custom table for domains
+ *
+ * @deprecated use the JPA
*/
public class JDBCDomainList extends AbstractDomainList implements Configurable{
Added: james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomain.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomain.java?rev=992226&view=auto
==============================================================================
--- james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomain.java (added)
+++ james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomain.java Fri Sep 3 07:44:00 2010
@@ -0,0 +1,58 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.james.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+/**
+ * Domain class for the James Domain to be used for JPA persistence.
+ *
+ */
+@Entity(name = "JamesDomain")
+@Table(name = "DOMAIN")
+@NamedQueries( {
+ @NamedQuery(name = "findDomainByName", query = "SELECT domain FROM JamesDomain domain WHERE domain.name=:name"),
+ @NamedQuery(name = "containsDomain", query = "SELECT COUNT(domain) FROM JamesDomain domain WHERE domain.name=:name") ,
+ @NamedQuery(name = "listDomainNames", query = "SELECT domain.name FROM JamesDomain domain"),
+ @NamedQuery(name = "deleteDomainByName", query = "DELETE FROM JamesDomain domain WHERE domain.name=:name")
+})
+public class JPADomain {
+
+ /**
+ * The name of the domain. column name is chosen to be compatible with the JDBCDomainList.
+ */
+ @Id
+ @Column(name = "DOMAIN", nullable = false, length = 100)
+ private String name;
+
+ /**
+ * Use this simple constructor to create a new Domain.
+ *
+ * @param name the name of the Domain
+ */
+ public JPADomain (String name) {
+ this.name = name;
+ }
+
+}
Added: james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomainList.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomainList.java?rev=992226&view=auto
==============================================================================
--- james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomainList.java (added)
+++ james/server/trunk/core-function/src/main/java/org/apache/james/domain/JPADomainList.java Fri Sep 3 07:44:00 2010
@@ -0,0 +1,146 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.james.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.lifecycle.Configurable;
+
+/**
+ * JPA implementation of the DomainList.
+ * This implementation is compatible with the JDBCDomainList, meaning same database schema can be reused.
+ *
+ */
+public class JPADomainList extends AbstractDomainList implements Configurable {
+
+ /**
+ * The entity manager to access the database.
+ */
+ private EntityManagerFactory entityManagerFactory;
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.lifecycle.Configurable#configure(org.apache.commons.configuration.HierarchicalConfiguration)
+ */
+ @SuppressWarnings("unchecked")
+ public void configure(HierarchicalConfiguration config) throws ConfigurationException {
+ // TODO The common configuration could be migrated to AbstractDomainList (should it implement Configurable?)
+ setAutoDetect(config.getBoolean("autodetect", true));
+ setAutoDetectIP(config.getBoolean("autodetectIP", true));
+ }
+
+ /**
+ * @see org.apache.james.domain.AbstractDomainList#getDomainListInternal()
+ */
+ protected List<String> getDomainListInternal() {
+ List<String> domains = new ArrayList<String>();
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ try {
+ domains = entityManager.createNamedQuery("listDomainNames").getResultList();
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to list domains", e);
+ } finally {
+ entityManager.close();
+ }
+ if (domains.size() == 0) {
+ return null;
+ } else {
+ return new ArrayList<String>(domains);
+ }
+ }
+
+ /**
+ * @see org.apache.james.api.domainlist.DomainList#containsDomain(java.lang.String)
+ */
+ public boolean containsDomain(String domain) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ try {
+ JPADomain jpaDomain = (JPADomain) entityManager.createNamedQuery("findDomainByName").setParameter("name", domain).getSingleResult();
+ return (jpaDomain != null) ? true : false;
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to find domain", e);
+ } finally {
+ entityManager.close();
+ }
+ return false;
+ }
+
+ /**
+ * @see org.apache.james.domain.AbstractDomainList#addDomainInternal(java.lang.String)
+ */
+ protected boolean addDomainInternal(String domain) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ JPADomain jpaDomain = new JPADomain(domain);
+ entityManager.persist(jpaDomain);
+ transaction.commit();
+ return true;
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to save domain", e);
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } finally {
+ entityManager.close();
+ }
+ return false;
+ }
+
+ /**
+ * @see org.apache.james.domain.AbstractDomainList#removeDomainInternal(java.lang.String)
+ */
+ protected boolean removeDomainInternal(String domain) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ final EntityTransaction transaction = entityManager.getTransaction();
+ try {
+ transaction.begin();
+ entityManager.createNamedQuery("deleteDomainByName").setParameter("name", domain).executeUpdate();
+ transaction.commit();
+ return true;
+ } catch (PersistenceException e) {
+ getLogger().debug("Failed to remove domain", e);
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } finally {
+ entityManager.close();
+ }
+ return false;
+ }
+
+ /**
+ * Set the entity manager to use.
+ *
+ * @param entityManagerFactory
+ */
+ public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+}
Added: james/server/trunk/core-function/src/test/java/org/apache/james/domain/JPADomainListTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-function/src/test/java/org/apache/james/domain/JPADomainListTest.java?rev=992226&view=auto
==============================================================================
--- james/server/trunk/core-function/src/test/java/org/apache/james/domain/JPADomainListTest.java (added)
+++ james/server/trunk/core-function/src/test/java/org/apache/james/domain/JPADomainListTest.java Fri Sep 3 07:44:00 2010
@@ -0,0 +1,162 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.james.domain;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.james.api.dnsservice.AbstractDNSServer;
+import org.apache.james.api.dnsservice.DNSService;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+
+/**
+ * Test the JPA implementation of the DomainList.
+ */
+public class JPADomainListTest extends TestCase {
+
+ // Domains we will play with.
+ private final String DOMAIN_1 = "domain1.tld";
+ private final String DOMAIN_2 = "domain2.tld";
+ private final String DOMAIN_3 = "domain3.tld";
+ private final String DOMAIN_4 = "domain4.tld";
+ private final String DOMAIN_5 = "domain5.tld";
+
+ /**
+ * The OpenJPA Entity Manager used for the tests.
+ */
+ private OpenJPAEntityManagerFactory factory;
+
+ /**
+ * The properties for the OpenJPA Entity Manager.
+ */
+ private HashMap<String, String> properties;
+
+ /**
+ * The JPA DomainList service.
+ */
+ private JPADomainList jpaDomainList;
+
+ @Override
+ protected void setUp() throws Exception {
+
+ super.setUp();
+
+ // Use a memory database.
+ properties = new HashMap<String, String>();
+ properties.put("openjpa.ConnectionDriverName", org.apache.derby.jdbc.EmbeddedDriver.class.getName());
+ properties.put("openjpa.ConnectionURL", "jdbc:derby:memory:JPADomainListTestDB;create=true");
+ properties.put("openjpa.Log", "JDBC=WARN, SQL=TRACE, Runtime=WARN");
+ properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72");
+ properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
+ properties.put("openjpa.MetaDataFactory", "jpa(Types=" + JPADomain.class.getName() +")");
+ factory = OpenJPAPersistence.getEntityManagerFactory(properties);
+
+ // Initialize the JPADomainList (no autodetect,...).
+ jpaDomainList = new JPADomainList();
+ jpaDomainList.setLog(new SimpleLog("JPADomainListMockLog"));
+ jpaDomainList.setDNSService(setUpDNSServer("localhost"));
+ jpaDomainList.setAutoDetect(false);
+ jpaDomainList.setAutoDetectIP(false);
+ jpaDomainList.setEntityManagerFactory(factory);
+
+ // Always delete everything before running any tests.
+ deleteAll();
+
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /**
+ * Add 3 domains and list them.
+ */
+ public void createListDomains() {
+ assertEquals(true, jpaDomainList.addDomain(DOMAIN_3));
+ assertEquals(true, jpaDomainList.addDomain(DOMAIN_4));
+ assertEquals(true, jpaDomainList.addDomain(DOMAIN_5));
+ assertEquals(3, jpaDomainList.getDomains().size());
+ }
+
+ /**
+ * Add a domain and check it is present.
+ */
+ public void testAddContainsDomain() {
+ assertEquals(true, jpaDomainList.addDomain(DOMAIN_2));
+ assertEquals(true, jpaDomainList.containsDomain(DOMAIN_2));
+ }
+
+ /**
+ * Add and remove a domain, and check database is empty.
+ */
+ public void testAddRemoveContainsSameDomain() {
+ assertEquals(true, jpaDomainList.addDomain(DOMAIN_1));
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_1));
+ assertEquals(null, jpaDomainList.getDomains());
+ }
+
+ /**
+ * Add a domain and remove another domain, and check first domain is still present.
+ */
+ public void testAddRemoveContainsDifferentDomain() {
+ assertEquals(true, jpaDomainList.addDomain(DOMAIN_1));
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_2));
+ assertEquals(1, jpaDomainList.getDomains().size());
+ assertEquals(true, jpaDomainList.containsDomain(DOMAIN_1));
+ }
+
+ /**
+ * Delete all possible domains from database.
+ */
+ private void deleteAll() {
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_1));
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_2));
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_3));
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_4));
+ assertEquals(true, jpaDomainList.removeDomain(DOMAIN_5));
+ }
+
+ /**
+ * Return a fake DNSServer.
+ *
+ * @param hostName
+ * @return
+ */
+ private DNSService setUpDNSServer(final String hostName) {
+ DNSService dns = new AbstractDNSServer() {
+ public String getHostName(InetAddress inet) {
+ return hostName;
+ }
+ public InetAddress[] getAllByName(String name) throws UnknownHostException {
+ return new InetAddress[] { InetAddress.getByName("127.0.0.1")};
+ }
+ public InetAddress getLocalHost() throws UnknownHostException {
+ return InetAddress.getLocalHost();
+ }
+ };
+ return dns;
+ }
+
+}
Modified: james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml?rev=992226&r1=992225&r2=992226&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml (original)
+++ james/server/trunk/spring-deployment/src/main/config/james/META-INF/persistence.xml Fri Sep 3 07:44:00 2010
@@ -30,6 +30,10 @@
<!-- UsersRepository -->
<class>org.apache.james.userrepository.JPAUser</class>
+
+ <!-- DomainList -->
+ <class>org.apache.james.domain.JPADomain</class>
+
<properties>
<!-- Create tables on startup -->
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
Modified: james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml?rev=992226&r1=992225&r2=992226&view=diff
==============================================================================
--- james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml (original)
+++ james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml Fri Sep 3 07:44:00 2010
@@ -267,7 +267,14 @@
<!-- The context domainlist implementation -->
<bean id="domainlist" class="org.apache.james.domain.XMLDomainList" />
- <!-- JDBC implementation of the domainlist service-->
+ <!-- JPA implementation of the domainlist service -->
+ <!--
+ <bean id="domainlist" class="org.apache.james.domain.JPADomainList">
+ <property name="entityManagerFactory" ref="entityManagerFactory" />
+ </bean>
+ -->
+
+ <!-- JDBC implementation of the domainlist service - deprecated, use the JPADomainList -->
<!--
<bean id="domainlist" class="org.apache.james.domain.JDBCDomainList"/>
-->
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org