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 no...@apache.org on 2010/01/04 10:54:57 UTC
svn commit: r895586 - in
/james/server/sandbox/active/pure_spring_deployment: ./
core-api/src/main/java/org/apache/james/api/kernel/
core-api/src/test/java/org/apache/james/api/kernel/mock/
spring-deployment/lib/phoenix-runtime/ spring-deployment/src/m...
Author: norman
Date: Mon Jan 4 09:54:57 2010
New Revision: 895586
URL: http://svn.apache.org/viewvc?rev=895586&view=rev
Log:
* Add migrate notes
* Add abstract LoaderService to share some more code
* Remove old dependencies wich are not needed anymore
* Fix log4j.properties
* "Fix" paths in james-config.xml
* Add name for imapserver.protocolfactoryhandler to act as Poster
* Register shutdown hook
Added:
james/server/sandbox/active/pure_spring_deployment/MIGRATE.txt
james/server/sandbox/active/pure_spring_deployment/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java
Removed:
james/server/sandbox/active/pure_spring_deployment/spring-deployment/lib/phoenix-runtime/
Modified:
james/server/sandbox/active/pure_spring_deployment/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java
james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/james-config.xml
james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/log4j.properties
james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/spring-beans.xml
james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/Main.java
james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/JSR250LoaderService.java
Added: james/server/sandbox/active/pure_spring_deployment/MIGRATE.txt
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/MIGRATE.txt?rev=895586&view=auto
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/MIGRATE.txt (added)
+++ james/server/sandbox/active/pure_spring_deployment/MIGRATE.txt Mon Jan 4 09:54:57 2010
@@ -0,0 +1,21 @@
+# Needed steps to migrate from phoenix based deployment to the new spring one
+
+1. Copy your old config.xml file to conf/james-config.xml
+
+ % cp /path/to/james-old/apps/james/SAR-INF/config.xml /path/to/james/conf/config.xml
+
+
+2. Copy over your old data from /path/to/james-old/apps/james/var/ to /path/to/james/var .
+
+ % cp -r /path/to/james-old/apps/james/var/* /path/to/james/var/
+
+
+3. Adjust paths in james-config.xml. Replace ../apps/james/var/* with ../var/*
+
+
+4. If you made any adjustments in the assembly.xml you need todo the same adjustment in the spring-beans.xml file.
+ For more details how the spring beans get configured please see the spring documentation
+
+
+5. If you made any adjustments in the enviroment.xml for logging you need to configure the same in log4j.properties.
+ For more details how log4j.properties are configured please see the log4j documentation.
\ No newline at end of file
Added: james/server/sandbox/active/pure_spring_deployment/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java?rev=895586&view=auto
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java (added)
+++ james/server/sandbox/active/pure_spring_deployment/core-api/src/main/java/org/apache/james/api/kernel/AbstractJSR250LoaderService.java Mon Jan 4 09:54:57 2010
@@ -0,0 +1,127 @@
+/****************************************************************
+ * 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.api.kernel;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.james.lifecycle.Configurable;
+import org.apache.james.lifecycle.LogEnabled;
+
+/**
+ * Abstract base class which implements a JSR250 based LoaderService
+ *
+ *
+ */
+public abstract class AbstractJSR250LoaderService implements LoaderService{
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.api.kernel.LoaderService#injectDependencies(java.lang.Object)
+ */
+ public void injectDependencies(Object obj) {
+ try {
+ injectResources(obj);
+ postConstruct(obj);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException("Unable to handle dependency injection of object " + obj, e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException("Unable to handle dependency injection of object " + obj, e);
+ }
+ }
+
+
+ private void postConstruct(Object resource) throws IllegalAccessException,
+ InvocationTargetException {
+ Method[] methods = resource.getClass().getMethods();
+ for (Method method : methods) {
+ PostConstruct postConstructAnnotation = method
+ .getAnnotation(PostConstruct.class);
+ if (postConstructAnnotation != null) {
+ Object[] args = {};
+ method.invoke(resource, args);
+
+ }
+ }
+ }
+
+ private void injectResources(Object resource) {
+ final Method[] methods = resource.getClass().getMethods();
+ for (Method method : methods) {
+ final Resource resourceAnnotation = method.getAnnotation(Resource.class);
+ if (resourceAnnotation != null) {
+ final String name = resourceAnnotation.name();
+ if (name == null) {
+ throw new UnsupportedOperationException("Resource annotation without name specified is not supported by this implementation");
+ } else {
+ // Name indicates a service
+ final Object service = getObjectForName(name);
+
+ if (service == null) {
+ throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource name " + name + ", because no mapping was found");
+ } else {
+ try {
+ Object[] args = {service};
+ method.invoke(resource, args);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e);
+ } catch (IllegalArgumentException e) {
+ throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.api.kernel.LoaderService#injectDependenciesWithLifecycle(java.lang.Object, org.apache.commons.logging.Log, org.apache.commons.configuration.HierarchicalConfiguration)
+ */
+ public void injectDependenciesWithLifecycle(Object obj, Log logger,
+ HierarchicalConfiguration config) {
+ if (obj instanceof LogEnabled) {
+ ((LogEnabled) obj).setLog(logger);
+ }
+ if (obj instanceof Configurable) {
+ try {
+ ((Configurable) obj).configure(config);
+ } catch (ConfigurationException ex) {
+ throw new RuntimeException("Unable to configure object " + obj, ex);
+ }
+ }
+ injectDependencies(obj);
+ }
+
+ /**
+ * Return the Object which should be injected for given name
+ *
+ * @param name
+ * @return object
+ */
+ protected abstract Object getObjectForName(String name);
+}
Modified: james/server/sandbox/active/pure_spring_deployment/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java?rev=895586&r1=895585&r2=895586&view=diff
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java (original)
+++ james/server/sandbox/active/pure_spring_deployment/core-api/src/test/java/org/apache/james/api/kernel/mock/FakeLoader.java Mon Jan 4 09:54:57 2010
@@ -19,23 +19,13 @@
package org.apache.james.api.kernel.mock;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-
import org.apache.avalon.framework.service.ServiceException;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.commons.logging.Log;
-import org.apache.james.api.kernel.LoaderService;
-import org.apache.james.lifecycle.Configurable;
-import org.apache.james.lifecycle.LogEnabled;
+import org.apache.james.api.kernel.AbstractJSR250LoaderService;
-public class FakeLoader implements LoaderService, org.apache.avalon.framework.service.ServiceManager{
+public class FakeLoader extends AbstractJSR250LoaderService implements org.apache.avalon.framework.service.ServiceManager{
private final Map<String, Object> servicesByName;
private final Map<String, String> mappings = new HashMap<String, String>();
@@ -71,7 +61,7 @@
mappings.put("nntp-repository", "org.apache.james.nntpserver.repository.NNTPRepository");
}
-
+
public Object get(String name) {
Object service = servicesByName.get(mapName(name));
@@ -85,45 +75,29 @@
}
return newName;
}
- private void injectResources(Object resource) {
- final Method[] methods = resource.getClass().getMethods();
- for (Method method : methods) {
- final Resource resourceAnnotation = method.getAnnotation(Resource.class);
- if (resourceAnnotation != null) {
- final String name = resourceAnnotation.name();
- if (name == null) {
- // Unsupported
- } else {
- // Name indicates a service
- final Object service = get(name);
-
- if (service == null) {
- } else {
- try {
- Object[] args = {service};
- method.invoke(resource, args);
- } catch (IllegalAccessException e) {
- throw new RuntimeException("Injection failed", e);
- } catch (IllegalArgumentException e) {
- throw new RuntimeException("Injection failed", e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException("Injection failed", e);
- }
- }
- }
- }
- }
- }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String)
+ */
public boolean hasService(String name) {
return servicesByName.containsKey(name);
}
+ /*
+ * (non-Javadoc)
+ * @see org.apache.avalon.framework.service.ServiceManager#lookup(java.lang.String)
+ */
public Object lookup(String name) throws ServiceException {
return servicesByName.get(name);
}
+ /*
+ * (non-Javadoc)
+ * @see org.apache.avalon.framework.service.ServiceManager#release(java.lang.Object)
+ */
public void release(Object service) {
}
@@ -132,43 +106,8 @@
}
- public void injectDependencies(Object obj) {
- injectResources(obj);
- try {
- postConstruct(obj);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
-
- public void injectDependenciesWithLifecycle(Object obj, Log logger,
- HierarchicalConfiguration config) {
- if (obj instanceof LogEnabled) {
- ((LogEnabled)obj).setLog(logger);
- }
- if (obj instanceof Configurable) {
- try {
- ((Configurable) obj).configure(config);
- } catch (ConfigurationException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
- injectDependencies(obj);
- }
-
- private void postConstruct(Object resource) throws IllegalAccessException,
- InvocationTargetException {
- Method[] methods = resource.getClass().getMethods();
- for (Method method : methods) {
- PostConstruct postConstructAnnotation = method
- .getAnnotation(PostConstruct.class);
- if (postConstructAnnotation != null) {
- Object[] args = {};
- method.invoke(resource, args);
-
- }
- }
+ @Override
+ protected Object getObjectForName(String name) {
+ return get(name);
}
}
Modified: james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/james-config.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/james-config.xml?rev=895586&r1=895585&r2=895586&view=diff
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/james-config.xml (original)
+++ james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/james-config.xml Mon Jan 4 09:54:57 2010
@@ -1140,7 +1140,7 @@
value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property
name="torque.dsfactory.mailboxmanager.connection.url"
- value="jdbc:derby:../apps/james/var/mailboxmanager-derbydb;create=true"/>
+ value="jdbc:derby:../var/mailboxmanager-derbydb;create=true"/>
<property
name="torque.dsfactory.mailboxmanager.connection.user"
value="app"/>
@@ -1499,7 +1499,7 @@
<!-- -->
<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
<driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
- <dburl>jdbc:derby:../apps/james/var/derbydb;create=true</dburl>
+ <dburl>jdbc:derby:../var/derbydb;create=true</dburl>
<user></user>
<password></password>
<poolPreparedStatements>true</poolPreparedStatements>
Modified: james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/log4j.properties
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/log4j.properties?rev=895586&r1=895585&r2=895586&view=diff
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/log4j.properties (original)
+++ james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/log4j.properties Mon Jan 4 09:54:57 2010
@@ -91,7 +91,7 @@
log4j.appender.NNTP-REPOSITORY.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n
log4j.appender.MAILSTORE=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.MAILSTORE=../log/mailstore.log
+log4j.appender.MAILSTORE.File=../log/mailstore.log
log4j.appender.MAILSTORE.DatePattern='.'yyyy-MM-dd
log4j.appender.MAILSTORE.layout=org.apache.log4j.PatternLayout
log4j.appender.MAILSTORE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n
Modified: james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/spring-beans.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/spring-beans.xml?rev=895586&r1=895585&r2=895586&view=diff
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/spring-beans.xml (original)
+++ james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/config/james/spring-beans.xml Mon Jan 4 09:54:57 2010
@@ -302,7 +302,7 @@
-->
<!-- IMAP server Beans -->
- <bean id="imapserver.protocolhandlerfactory"
+ <bean id="imapserver.protocolhandlerfactory" name="org.apache.jsieve.mailet.Poster"
class="org.apache.james.imapserver.ImapServerProtocolHandlerFactory" />
<bean id="imapserver.protocolserver" class="org.apache.james.socket.AvalonProtocolServer">
Modified: james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/Main.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/Main.java?rev=895586&r1=895585&r2=895586&view=diff
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/Main.java (original)
+++ james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/Main.java Mon Jan 4 09:54:57 2010
@@ -18,19 +18,16 @@
****************************************************************/
package org.apache.james.container.spring;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Bootstraps James using a Spring container
*/
public class Main {
- public static void main(String[] args) {
- //JamesApplicationContext.newJamesApplicationContext();
-
- ApplicationContext context = new JamesServerApplicationContext(
+ public static void main(String[] args) {
+ JamesServerApplicationContext context = new JamesServerApplicationContext(
new String[] {"spring-beans.xml"});
+ context.registerShutdownHook();
}
Modified: james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/JSR250LoaderService.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/JSR250LoaderService.java?rev=895586&r1=895585&r2=895586&view=diff
==============================================================================
--- james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/JSR250LoaderService.java (original)
+++ james/server/sandbox/active/pure_spring_deployment/spring-deployment/src/main/java/org/apache/james/container/spring/lifecycle/JSR250LoaderService.java Mon Jan 4 09:54:57 2010
@@ -18,18 +18,10 @@
****************************************************************/
package org.apache.james.container.spring.lifecycle;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-
-import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.logging.Log;
+import org.apache.james.api.kernel.AbstractJSR250LoaderService;
import org.apache.james.api.kernel.LoaderService;
-import org.apache.james.lifecycle.Configurable;
-import org.apache.james.lifecycle.LogEnabled;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@@ -45,66 +37,14 @@
@SuppressWarnings("serial")
public class JSR250LoaderService extends CommonAnnotationBeanPostProcessor implements LoaderService, ApplicationContextAware {
- private ConfigurableApplicationContext applicationContext;
-
+ private SpringJSR250LoaderService loader;
+
/*
* (non-Javadoc)
* @see org.apache.james.api.kernel.LoaderService#injectDependencies(java.lang.Object)
*/
public void injectDependencies(Object obj) {
- try {
- injectResources(obj);
- postConstruct(obj);
- } catch (IllegalAccessException e) {
- throw new RuntimeException("Unable to handle dependency injection of object " + obj, e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException("Unable to handle dependency injection of object " + obj, e);
- }
- }
-
-
- private void postConstruct(Object resource) throws IllegalAccessException,
- InvocationTargetException {
- Method[] methods = resource.getClass().getMethods();
- for (Method method : methods) {
- PostConstruct postConstructAnnotation = method
- .getAnnotation(PostConstruct.class);
- if (postConstructAnnotation != null) {
- Object[] args = {};
- method.invoke(resource, args);
-
- }
- }
- }
-
- private void injectResources(Object resource) {
- final Method[] methods = resource.getClass().getMethods();
- for (Method method : methods) {
- final Resource resourceAnnotation = method.getAnnotation(Resource.class);
- if (resourceAnnotation != null) {
- final String name = resourceAnnotation.name();
- if (name == null) {
- // Unsupported
- } else {
- // Name indicates a service
- final Object service = applicationContext.getBean(name);
-
- if (service == null) {
- } else {
- try {
- Object[] args = {service};
- method.invoke(resource, args);
- } catch (IllegalAccessException e) {
- throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e);
- } catch (IllegalArgumentException e) {
- throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e);
- }
- }
- }
- }
- }
+ loader.injectDependencies(obj);
}
/*
@@ -113,20 +53,28 @@
*/
public void injectDependenciesWithLifecycle(Object obj, Log logger,
HierarchicalConfiguration config) {
- if (obj instanceof LogEnabled) {
- ((LogEnabled) obj).setLog(logger);
- }
- if (obj instanceof Configurable) {
- try {
- ((Configurable) obj).configure(config);
- } catch (ConfigurationException ex) {
- throw new RuntimeException("Unable to configure object " + obj, ex);
- }
- }
- injectDependencies(obj);
+ loader.injectDependenciesWithLifecycle(obj, logger, config);
}
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
+ */
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- this.applicationContext = (ConfigurableApplicationContext) applicationContext;
+ loader = new SpringJSR250LoaderService(applicationContext);
+ }
+
+ private final class SpringJSR250LoaderService extends AbstractJSR250LoaderService {
+
+ private ApplicationContext context;
+
+ public SpringJSR250LoaderService(ApplicationContext context) {
+ this.context = context;
+ }
+ @Override
+ protected Object getObjectForName(String name) {
+ return context.getBean(name);
+ }
+
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org