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 Norman Maurer <nm...@byteaction.de> on 2006/06/27 07:57:00 UTC

Re: svn commit: r417204 - in /james/server/trunk/src: conf/ java/org/apache/james/management/ java/org/apache/james/remotemanager/ java/org/apache/james/services/ test/org/apache/james/remotemanager/

Feel free to also refactor my new code for jmx which is attached here: 
http://issues.apache.org/jira/browse/JAMES-530

IF you do so plz assign it to you.

bye
Norman

Am Montag, den 26.06.2006, 15:00 +0000 schrieb berndf@apache.org:
> Author: berndf
> Date: Mon Jun 26 08:00:32 2006
> New Revision: 417204
> 
> URL: http://svn.apache.org/viewvc?rev=417204&view=rev
> Log:
> - make spool commands from RemoteManager available in JMX
> - common logic centralized in SpoolManagement
> 
> Added:
>     james/server/trunk/src/java/org/apache/james/management/ManagementException.java
>     james/server/trunk/src/java/org/apache/james/management/SpoolManagement.java
>     james/server/trunk/src/java/org/apache/james/management/SpoolManagement.xinfo
>     james/server/trunk/src/java/org/apache/james/management/SpoolManagementException.java
>     james/server/trunk/src/java/org/apache/james/management/SpoolManagementMBean.java
>     james/server/trunk/src/java/org/apache/james/services/SpoolManagementService.java
> Modified:
>     james/server/trunk/src/conf/james-assembly.xml
>     james/server/trunk/src/java/org/apache/james/management/UserManagementException.java
>     james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java
>     james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.java
>     james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo
>     james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java
>     james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandlerConfigurationData.java
>     james/server/trunk/src/test/org/apache/james/remotemanager/RemoteManagerTest.java
> 
> Modified: james/server/trunk/src/conf/james-assembly.xml
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-assembly.xml?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/conf/james-assembly.xml (original)
> +++ james/server/trunk/src/conf/james-assembly.xml Mon Jun 26 08:00:32 2006
> @@ -54,6 +54,11 @@
>  
>    <block name="dnsserver" class="org.apache.james.dnsserver.DNSServer" />
>  
> +  <!-- The Spool Management block  -->
> +  <block name="spoolmanagement" class="org.apache.james.management.SpoolManagement" >
> +      <provide name="mailstore" role="org.apache.avalon.cornerstone.services.store.Store"/>
> +  </block>
> +
>    <block name="remotemanager" class="org.apache.james.remotemanager.RemoteManager" >
>      <provide name="mailstore" role="org.apache.avalon.cornerstone.services.store.Store"/>
>      <provide name="users-store" role="org.apache.james.services.UsersStore"/>
> @@ -65,9 +70,10 @@
>      <provide name="James" role="org.apache.james.services.MailServer"/>
>      <provide name="thread-manager"
>               role="org.apache.avalon.cornerstone.services.threads.ThreadManager" />
> +    <provide name="spoolmanagement" role="org.apache.james.services.SpoolManagementService"/>
>    </block>
>  
> -    <!-- The User Management block  -->
> +  <!-- The User Management block  -->
>    <block name="usermanagement" class="org.apache.james.management.UserManagement" >
>      <provide name="localusersrepository" role="org.apache.james.services.UsersRepository"/>
>      <provide name="users-store" role="org.apache.james.services.UsersStore"/>
> 
> Added: james/server/trunk/src/java/org/apache/james/management/ManagementException.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/ManagementException.java?rev=417204&view=auto
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/ManagementException.java (added)
> +++ james/server/trunk/src/java/org/apache/james/management/ManagementException.java Mon Jun 26 08:00:32 2006
> @@ -0,0 +1,39 @@
> +/***********************************************************************
> + * Copyright (c) 2006 The Apache Software Foundation.             *
> + * All rights reserved.                                                *
> + * ------------------------------------------------------------------- *
> + * Licensed under the Apache License, Version 2.0 (the "License"); you *
> + * may not use this file except in compliance with the License. You    *
> + * may obtain a copy of the License at:                                *
> + *                                                                     *
> + *     http://www.apache.org/licenses/LICENSE-2.0                      *
> + *                                                                     *
> + * Unless required by applicable law or agreed to in writing, software *
> + * distributed under the License is distributed on an "AS IS" BASIS,   *
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
> + * implied.  See the License for the specific language governing       *
> + * permissions and limitations under the License.                      *
> + ***********************************************************************/
> +
> +
> +package org.apache.james.management;
> +
> +public class ManagementException extends Exception {
> +
> +    public ManagementException() {
> +        super();
> +    }
> +
> +    public ManagementException(String message) {
> +        super(message);
> +    }
> +
> +    public ManagementException(Exception e) {
> +        super(e);
> +    }
> +
> +    public ManagementException(String message, Exception e) {
> +        super(message, e);
> +    }
> +
> +}
> 
> Added: james/server/trunk/src/java/org/apache/james/management/SpoolManagement.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/SpoolManagement.java?rev=417204&view=auto
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/SpoolManagement.java (added)
> +++ james/server/trunk/src/java/org/apache/james/management/SpoolManagement.java Mon Jun 26 08:00:32 2006
> @@ -0,0 +1,221 @@
> +/***********************************************************************
> + * Copyright (c) 2006 The Apache Software Foundation.             *
> + * All rights reserved.                                                *
> + * ------------------------------------------------------------------- *
> + * Licensed under the Apache License, Version 2.0 (the "License"); you *
> + * may not use this file except in compliance with the License. You    *
> + * may obtain a copy of the License at:                                *
> + *                                                                     *
> + *     http://www.apache.org/licenses/LICENSE-2.0                      *
> + *                                                                     *
> + * Unless required by applicable law or agreed to in writing, software *
> + * distributed under the License is distributed on an "AS IS" BASIS,   *
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
> + * implied.  See the License for the specific language governing       *
> + * permissions and limitations under the License.                      *
> + ***********************************************************************/
> +
> +
> +package org.apache.james.management;
> +
> +import org.apache.avalon.cornerstone.services.store.Store;
> +import org.apache.avalon.framework.configuration.DefaultConfiguration;
> +import org.apache.avalon.framework.service.ServiceException;
> +import org.apache.avalon.framework.service.ServiceManager;
> +import org.apache.avalon.framework.service.Serviceable;
> +import org.apache.james.services.SpoolManagementService;
> +import org.apache.james.services.SpoolRepository;
> +import org.apache.mailet.Mail;
> +
> +import javax.mail.MessagingException;
> +import java.util.Date;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.ArrayList;
> +
> +public class SpoolManagement implements Serviceable, SpoolManagementService, SpoolManagementMBean {
> +
> +    private Store mailStore;
> +
> +    public void service(ServiceManager serviceManager) throws ServiceException {
> +        mailStore = (Store)serviceManager.lookup("org.apache.avalon.cornerstone.services.store.Store" );
> +    }
> +
> +    public String[] listSpoolItems(String spoolRepositoryURL) throws SpoolManagementException {
> +        List spoolItems;
> +        try {
> +            spoolItems = getSpoolItems(spoolRepositoryURL);
> +        } catch (Exception e) {
> +             throw new SpoolManagementException(e);
> +        }
> +        return (String[]) spoolItems.toArray(new String[]{});
> +    }
> +
> +    public List getSpoolItems(String spoolRepositoryURL) throws ServiceException, MessagingException {
> +        SpoolRepository spoolRepository = getSpoolRepository(spoolRepositoryURL);
> +
> +        List items = new ArrayList();
> +
> +        // get an iterator of all keys
> +        Iterator spoolR = spoolRepository.list();
> +        while (spoolR.hasNext()) {
> +            String key = spoolR.next().toString();
> +            Mail m = spoolRepository.retrieve(key);
> +
> +            // Only show email if its in error state.
> +            if (m.getState().equals(Mail.ERROR)) {
> +                StringBuffer itemInfo = new StringBuffer();
> +                itemInfo.append("key: ").append(key).append(" sender: ").append(m.getSender()).append(" recipient:");
> +                for (int i = 0; i < m.getRecipients().size(); i++) {
> +                    itemInfo.append(" ").append(m.getRecipients());
> +                }
> +                items.add(itemInfo.toString());
> +            }
> +        }
> +
> +        return items;
> +    }
> +
> +    public int removeSpoolItems(String spoolRepositoryURL, String key) throws SpoolManagementException {
> +        try {
> +            return removeSpoolItems(spoolRepositoryURL, key, null);
> +        } catch (Exception e) {
> +            throw new SpoolManagementException(e);
> +        }
> +    }
> +
> +    public int removeSpoolItems(String spoolRepositoryURL, String key, List lockingFailures) throws ServiceException, MessagingException {
> +        int count = 0;
> +        SpoolRepository spoolRepository = getSpoolRepository(spoolRepositoryURL);
> +
> +        if (key != null) {
> +            count = removeMail(spoolRepository, key, count, lockingFailures);
> +        } else {
> +            Iterator spoolR = spoolRepository.list();
> +
> +            while (spoolR.hasNext()) {
> +                key = spoolR.next().toString();
> +                count = removeMail(spoolRepository, key, count, lockingFailures);
> +            }
> +        }
> +        return count;
> +    }
> +
> +    private int removeMail(SpoolRepository spoolRepository, String key, int count, List lockingFailures) throws MessagingException {
> +        try {
> +            if (removeMail(spoolRepository, key)) count++;
> +        } catch (IllegalStateException e) {
> +            lockingFailures.add(key);
> +        } catch (SpoolManagementException e) {
> +            return count; 
> +        }
> +        return count;
> +    }
> +
> +    public int resendSpoolItems(String spoolRepositoryURL, String key) throws SpoolManagementException {
> +        try {
> +            return resendSpoolItems(spoolRepositoryURL, key, null);
> +        } catch (Exception e) {
> +            throw new SpoolManagementException(e);
> +        }
> +    }
> +
> +    public int resendSpoolItems(String spoolRepositoryURL, String key, List lockingFailures) throws ServiceException, MessagingException {
> +        int count = 0;
> +        SpoolRepository spoolRepository = getSpoolRepository(spoolRepositoryURL);
> +
> +        // check if an key was given as argument
> +        if (key != null) {
> +            try {
> +                if (resendErrorMail(spoolRepository, key)) count++;
> +            } catch (IllegalStateException e) {
> +                if (lockingFailures != null) lockingFailures.add(key);
> +            }
> +        } else {
> +            // get an iterator of all keys
> +            Iterator spoolR = spoolRepository.list();
> +
> +            while (spoolR.hasNext()) {
> +                key = spoolR.next().toString();
> +                try {
> +                    if (resendErrorMail(spoolRepository, key)) count++;
> +                } catch (IllegalStateException e) {
> +                    if (lockingFailures != null) lockingFailures.add(key);
> +                }
> +            }
> +        }
> +        return count;
> +    }
> +
> +    /**
> +     * Resent the mail that belongs to the given key and spoolRepository 
> +     * 
> +     * @param spoolRepository The spoolRepository
> +     * @param key The message key
> +     * @return true orf false
> +     * @throws MessagingException Get thrown if there happen an error on modify the mail
> +     */
> +    private boolean resendErrorMail(SpoolRepository spoolRepository, String key)
> +            throws MessagingException, IllegalStateException {
> +        if (!spoolRepository.lock(key)) throw new IllegalStateException("locking failure");
> +
> +        // get the mail and set the error_message to "0" that will force the spoolmanager to try to deliver it now!
> +        Mail m = spoolRepository.retrieve(key);
> +
> +        if (m.getState().equals(Mail.ERROR)) {
> +
> +            // this will force Remotedelivery to try deliver the mail now!
> +            m.setLastUpdated(new Date(0));
> +
> +            // store changes
> +            spoolRepository.store(m);
> +            spoolRepository.unlock(key);
> +
> +            synchronized (spoolRepository) {
> +                spoolRepository.notify();
> +            }
> +            return true;
> +        } else {
> +            spoolRepository.unlock(key);
> +            return false;
> +        }
> +    }
> +
> +    /**
> +     * Remove the mail that belongs to the given key and spoolRepository 
> +     * @param spoolRepository The spoolRepository
> +     * @param key The message key
> +     * @return true or false
> +     * @throws MessagingException Get thrown if there happen an error on modify the mail
> +     */
> +    private boolean removeMail(SpoolRepository spoolRepository, String key) throws MessagingException, SpoolManagementException {
> +        if (!spoolRepository.lock(key)) throw new IllegalStateException("locking failure");
> +
> +        Mail m = spoolRepository.retrieve(key);
> +        if (m == null) throw new SpoolManagementException("mail not available having key " + key);
> +        if (!m.getState().equals(Mail.ERROR)) return false;
> +
> +        spoolRepository.remove(key);
> +        return true;
> +    }
> +
> +    /**
> +     * Retrieve a spoolRepository by the given url
> +     * 
> +     * @param url The spoolRepository url
> +     * @return The spoolRepository
> +     * @throws ServiceException Get thrown if the spoolRepository can not retrieved
> +     */
> +    private SpoolRepository getSpoolRepository(String url)
> +            throws ServiceException {
> +        // Setup all needed data
> +        DefaultConfiguration spoolConf = new DefaultConfiguration("spool",
> +                "generated:RemoteManager.java");
> +        spoolConf.setAttribute("destinationURL", url);
> +        spoolConf.setAttribute("type", "SPOOL");
> +
> +        return (SpoolRepository) mailStore.select(spoolConf);
> +    }
> +
> +
> +}
> 
> Added: james/server/trunk/src/java/org/apache/james/management/SpoolManagement.xinfo
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/SpoolManagement.xinfo?rev=417204&view=auto
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/SpoolManagement.xinfo (added)
> +++ james/server/trunk/src/java/org/apache/james/management/SpoolManagement.xinfo Mon Jun 26 08:00:32 2006
> @@ -0,0 +1,24 @@
> +<?xml version="1.0"?>
> +
> +<blockinfo>
> +
> +  <!-- section to describe block -->
> +  <block>
> +    <version>1.0</version>
> +  </block>
> +
> +  <services>
> +    <service name="org.apache.james.services.SpoolManagementService" version="1.0" />
> +  </services>
> +    
> +  <!-- interfaces that may be exported to manange this block -->
> +  <management-access-points>
> +    <service name="org.apache.james.management.SpoolManagementMBean"/>
> +  </management-access-points>
> +
> +  <dependencies>
> +    <dependency>
> +      <service name="org.apache.avalon.cornerstone.services.store.Store" version="1.0"/>
> +    </dependency>
> +  </dependencies>
> +</blockinfo>
> 
> Added: james/server/trunk/src/java/org/apache/james/management/SpoolManagementException.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/SpoolManagementException.java?rev=417204&view=auto
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/SpoolManagementException.java (added)
> +++ james/server/trunk/src/java/org/apache/james/management/SpoolManagementException.java Mon Jun 26 08:00:32 2006
> @@ -0,0 +1,39 @@
> +/***********************************************************************
> + * Copyright (c) 2006 The Apache Software Foundation.             *
> + * All rights reserved.                                                *
> + * ------------------------------------------------------------------- *
> + * Licensed under the Apache License, Version 2.0 (the "License"); you *
> + * may not use this file except in compliance with the License. You    *
> + * may obtain a copy of the License at:                                *
> + *                                                                     *
> + *     http://www.apache.org/licenses/LICENSE-2.0                      *
> + *                                                                     *
> + * Unless required by applicable law or agreed to in writing, software *
> + * distributed under the License is distributed on an "AS IS" BASIS,   *
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
> + * implied.  See the License for the specific language governing       *
> + * permissions and limitations under the License.                      *
> + ***********************************************************************/
> +
> +
> +package org.apache.james.management;
> +
> +public class SpoolManagementException extends ManagementException {
> +
> +    public SpoolManagementException() {
> +        super();
> +    }
> +
> +    public SpoolManagementException(String message) {
> +        super(message);
> +    }
> +
> +    public SpoolManagementException(Exception e) {
> +        super(e);
> +    }
> +
> +    public SpoolManagementException(String message, Exception e) {
> +        super(message, e);
> +    }
> +
> +}
> 
> Added: james/server/trunk/src/java/org/apache/james/management/SpoolManagementMBean.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/SpoolManagementMBean.java?rev=417204&view=auto
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/SpoolManagementMBean.java (added)
> +++ james/server/trunk/src/java/org/apache/james/management/SpoolManagementMBean.java Mon Jun 26 08:00:32 2006
> @@ -0,0 +1,63 @@
> +/***********************************************************************
> + * Copyright (c) 2006 The Apache Software Foundation.             *
> + * All rights reserved.                                                *
> + * ------------------------------------------------------------------- *
> + * Licensed under the Apache License, Version 2.0 (the "License"); you *
> + * may not use this file except in compliance with the License. You    *
> + * may obtain a copy of the License at:                                *
> + *                                                                     *
> + *     http://www.apache.org/licenses/LICENSE-2.0                      *
> + *                                                                     *
> + * Unless required by applicable law or agreed to in writing, software *
> + * distributed under the License is distributed on an "AS IS" BASIS,   *
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
> + * implied.  See the License for the specific language governing       *
> + * permissions and limitations under the License.                      *
> + ***********************************************************************/
> +
> +
> +package org.apache.james.management;
> +
> +/**
> + * Expose spool management functionality through JMX.
> + * 
> + * @phoenix:mx-topic name="SpoolAdministration"
> + */
> +public interface SpoolManagementMBean {
> +
> +    /**
> +     * List mails on the spool whose state is ERROR
> +     *
> +     * @phoenix:mx-operation
> +     * @phoenix:mx-description List mails on the spool whose state is ERROR
> +     *
> +     * @param spoolRepositoryURL specifies the spool
> +     * @return number of removed items
> +     */
> +    String[] listSpoolItems(String spoolRepositoryURL) throws SpoolManagementException;
> +    
> +    /**
> +     * Removes one specific or all mails from the given spool repository
> +     *
> +     * @phoenix:mx-operation
> +     * @phoenix:mx-description Removes one specific or all mails from the given spool repository
> +     *
> +     * @param spoolRepositoryURL specifies the spool
> +     * @param key identifies the item to be removed. if NULL, all items are removed
> +     * @return number of removed items
> +     */
> +    int removeSpoolItems(String spoolRepositoryURL, String key) throws SpoolManagementException;
> +
> +    /**
> +     * (Re-)tries to send one specific or all mails with status ERROR in the given spool repository
> +     *
> +     * @phoenix:mx-operation
> +     * @phoenix:mx-description (Re-)tries to send one specific or all mails with status ERROR in the given spool repository
> +     *
> +     * @param spoolRepositoryURL specifies the spool
> +     * @param key identifies the item to be sent. if NULL, all items with status ERROR are sent
> +     * @return number of processed items
> +     */
> +    int resendSpoolItems(String spoolRepositoryURL, String key) throws SpoolManagementException;
> +
> +}
> 
> Modified: james/server/trunk/src/java/org/apache/james/management/UserManagementException.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/UserManagementException.java?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/UserManagementException.java (original)
> +++ james/server/trunk/src/java/org/apache/james/management/UserManagementException.java Mon Jun 26 08:00:32 2006
> @@ -18,7 +18,7 @@
>  
>  package org.apache.james.management;
>  
> -public class UserManagementException extends Exception {
> +public class UserManagementException extends ManagementException {
>  
>      public UserManagementException() {
>          super();
> 
> Modified: james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java (original)
> +++ james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java Mon Jun 26 08:00:32 2006
> @@ -191,5 +191,5 @@
>       *
>       * @return List<String> of repository names
>       */
> -    public List getUserRepositoryNames();
> +    List getUserRepositoryNames();
>  }
> 
> Modified: james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.java?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.java (original)
> +++ james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.java Mon Jun 26 08:00:32 2006
> @@ -25,6 +25,7 @@
>  import org.apache.avalon.framework.service.ServiceManager;
>  import org.apache.james.core.AbstractJamesService;
>  import org.apache.james.services.MailServer;
> +import org.apache.james.services.SpoolManagementService;
>  import org.apache.james.services.UsersRepository;
>  import org.apache.james.services.UsersStore;
>  
> @@ -57,15 +58,20 @@
>      private UsersRepository users;
>  
>      /**
> +     * The reference to the spool management service
> +     */
> +    private SpoolManagementService spoolManagement;
> +
> +    /**
>       * The service prompt to be displayed when waiting for input.
>       */
>      private String prompt = "";
> -    
> +
>      /**
>       * The reference to the internal MailServer service
>       */
>      private MailServer mailServer;
> -    
> +
>      /**
>       * There reference to the Store
>       */
> @@ -93,6 +99,7 @@
>          if (users == null) {
>              throw new ServiceException("","The user repository could not be found.");
>          }
> +        spoolManagement = (SpoolManagementService) componentManager.lookup(SpoolManagementService.ROLE);
>      }
>  
>      /**
> @@ -153,7 +160,7 @@
>          }
>  
>          /**
> -         * @see org.apache.avalon.excalibur.pool.ObjectFactory#decommision(Object)
> +         * @see org.apache.avalon.excalibur.pool.ObjectFactory#decommission(Object) 
>           */
>          public void decommission( Object object ) throws Exception {
>              return;
> @@ -197,10 +204,14 @@
>          }
>  
>          /**
> -         * @see org.apache.james.remotemanager.RemoteManagerHandlerConfigurationData#getUsersStore()
> +         * @see org.apache.james.remotemanager.RemoteManagerHandlerConfigurationData#getUserStore() 
>           */
>          public UsersStore getUserStore() {
>              return RemoteManager.this.usersStore;
> +        }
> +
> +        public SpoolManagementService getSpoolManagement() {
> +            return RemoteManager.this.spoolManagement;
>          }
>  
>          /**
> 
> Modified: james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo (original)
> +++ james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManager.xinfo Mon Jun 26 08:00:32 2006
> @@ -34,5 +34,8 @@
>      <dependency>
>        <service name="org.apache.avalon.cornerstone.services.threads.ThreadManager" version="1.0"/>
>      </dependency>
> +    <dependency>
> +      <service name="org.apache.james.services.SpoolManagementService" version="1.0"/>
> +    </dependency>
>    </dependencies>
>  </blockinfo>
> 
> Modified: james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java (original)
> +++ james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java Mon Jun 26 08:00:32 2006
> @@ -22,21 +22,15 @@
>  import org.apache.james.services.JamesUser;
>  import org.apache.james.services.User;
>  import org.apache.james.services.UsersRepository;
> -import org.apache.james.services.SpoolRepository;
> -
>  import org.apache.mailet.MailAddress;
> -import org.apache.mailet.Mail;
> -import org.apache.avalon.framework.configuration.DefaultConfiguration;
> -import org.apache.avalon.framework.service.ServiceException;
>  
>  import javax.mail.internet.ParseException;
> -import javax.mail.MessagingException;
> -
>  import java.io.IOException;
>  import java.net.Socket;
> +import java.util.ArrayList;
>  import java.util.Iterator;
>  import java.util.Locale;
> -import java.util.Date;
> +import java.util.List;
>  
> 
>  /**
> @@ -125,17 +119,17 @@
>       * The text string for the LISTSPOOL command
>       */
>      private static final String COMMAND_LISTSPOOL = "LISTSPOOL";
> - 
> +
>      /**
>       * The text string for the FLUSHSPOOL command
>       */
>      private static final String COMMAND_FLUSHSPOOL = "FLUSHSPOOL";
> - 
> +
>      /**
>       * The text string for the DELETESPOOL command
>       */
>      private static final String COMMAND_DELETESPOOL = "DELETESPOOL";
> -    
> +
>      /**
>       * The text string for the QUIT command
>       */
> @@ -164,7 +158,7 @@
>      public void setConfigurationData(Object theData) {
>          if (theData instanceof RemoteManagerHandlerConfigurationData) {
>              theConfigData = (RemoteManagerHandlerConfigurationData) theData;
> -    
> +
>              // Reset the users repository to the default.
>              users = theConfigData.getUsersRepository();
>          } else {
> @@ -231,7 +225,7 @@
>          getLogger().info(infoBuffer.toString());
>  
>      }
> -    
> +
>      /**
>       * @see org.apache.james.core.AbstractJamesHandler#errorHandler(java.lang.RuntimeException)
>       */
> @@ -267,7 +261,7 @@
>       * wire in handleConnection.  It returns true if expecting additional
>       * commands, false otherwise.</p>
>       *
> -     * @param command the raw command string passed in over the socket
> +     * @param rawCommand the raw command string passed in over the socket
>       *
>       * @return whether additional commands are expected.
>       */
> @@ -558,7 +552,7 @@
>          out.println("quit                                           close connection");
>          out.flush();
>          return true;
> -        
> +
>      }
>  
>      /**
> @@ -581,7 +575,7 @@
>              writeLoggedFlushedResponse("Usage: setalias [username] [alias]");
>              return true;
>          }
> -        
> +
>          User baseuser = users.getUserByName(username);
>          if (baseuser == null) {
>              writeLoggedFlushedResponse("No such user " + username);
> @@ -591,7 +585,7 @@
>              writeLoggedFlushedResponse("Can't set alias for this user type.");
>              return true;
>          }
> -        
> +
>          JamesUser user = (JamesUser) baseuser;
>          JamesUser aliasUser = (JamesUser) users.getUserByName(alias);
>          if (aliasUser == null) {
> @@ -685,7 +679,7 @@
>       * Handler method called upon receipt of an SHOWALIAS command.
>       * Returns whether further commands should be read off the wire.
>       *
> -     * @param argument the user name
> +     * @param username the user name
>       */
>      private boolean doSHOWALIAS(String username) {
>          if ( username == null || username.equals("") ) {
> @@ -731,7 +725,7 @@
>       * Handler method called upon receipt of an SHOWFORWARDING command.
>       * Returns whether further commands should be read off the wire.
>       *
> -     * @param argument the user name
> +     * @param username the user name
>       */
>      private boolean doSHOWFORWARDING(String username) {
>          if ( username == null || username.equals("") ) {
> @@ -864,7 +858,7 @@
>          }
>          return true;
>      }
> -    
> +
>      /**
>       * Handler method called upon receipt of a LISTSPOOL command. Returns
>       * whether further commands should be read off the wire.
> @@ -883,30 +877,14 @@
>  
>          String url = argument;
>  
> -        SpoolRepository spoolRepository;
>          try {
> -            spoolRepository = getSpoolRepository(url);
> -
> -            // get an iterator of all keys
> -            Iterator spoolR = spoolRepository.list();
> -
> -            while (spoolR.hasNext()) {
> -                String key = spoolR.next().toString();
> -
> -                out.println("Messages in spool:");
> -                Mail m = spoolRepository.retrieve(key);
> -
> -                // Only show email if its in error state.
> -                if (m.getState().equals(Mail.ERROR)) {
> -                    out.print("key: " + key + " sender: " + m.getSender()
> -                            + " recipient:");
> -                    for (int i = 0; i < m.getRecipients().size(); i++) {
> -                        out.print(" " + m.getRecipients());
> -                    }
> -                    out.println();
> -
> -                    count++;
> -                }
> +            List spoolItems = theConfigData.getSpoolManagement().getSpoolItems(url);
> +            count = spoolItems.size();
> +            if (count > 0) out.println("Messages in spool:");
> +            for (Iterator iterator = spoolItems.iterator(); iterator.hasNext();) {
> +                String item = (String) iterator.next();
> +                out.println(item);
> +                out.flush();
>              }
>              out.println("Number of spooled mails: " + count);
>              out.flush();
> @@ -939,28 +917,10 @@
>              return true;
>          }
>  
> -        SpoolRepository spoolRepository;
>          String url = args[0];
> +        String key = args.length == 2 ? args[1] : null;
>          try {
> -
> -            spoolRepository = getSpoolRepository(url);
> -
> -            // check if an key was given as argument
> -            if (args.length == 2) {
> -                String key = args[1];
> -                if (resendErrorMail(spoolRepository, key))
> -                    count++;
> -
> -            } else {
> -                // get an iterator of all keys
> -                Iterator spoolR = spoolRepository.list();
> -
> -                while (spoolR.hasNext()) {
> -                    String key = spoolR.next().toString();
> -                    if (resendErrorMail(spoolRepository, key))
> -                        count++;
> -                }
> -            }
> +            count = theConfigData.getSpoolManagement().resendSpoolItems(url, key, null);
>              out.println("Number of flushed mails: " + count);
>              out.flush();
>  
> @@ -976,49 +936,6 @@
>      }
>  
>      /**
> -     * Resent the mail that belongs to the given key and spoolRepository 
> -     * 
> -     * @param spoolRepository The spoolRepository
> -     * @param key The message key
> -     * @return true orf false
> -     * @throws MessagingException Get thrown if there happen an error on modify the mail
> -     */
> -    private boolean resendErrorMail(SpoolRepository spoolRepository, String key)
> -            throws MessagingException {
> -        if (spoolRepository.lock(key)) {
> -
> -            // get the mail and set the error_message to "0" that will force the spoolmanager to try to deliver it now!
> -            Mail m = spoolRepository.retrieve(key);
> -
> -            if (m.getState().equals(Mail.ERROR)) {
> -               
> -                // this will force Remotedelivery to try deliver the mail now!
> -                m.setLastUpdated(new Date(0));
> -
> -                // store changes
> -                spoolRepository.store(m);
> -                spoolRepository.unlock(key);
> -
> -                synchronized (spoolRepository) {
> -                    spoolRepository.notify();
> -                }
> -                return true;
> -            } else {
> -
> -                spoolRepository.unlock(key);
> -
> -                out.println("The mail with key " + key
> -                        + " is not in error state!");
> -                out.flush();
> -            }
> -        } else {
> -            out.println("Error locking the mail with key:  " + key);
> -            out.flush();
> -        }
> -        return false;
> -    }
> -
> -    /**
>       * Handler method called upon receipt of a DELETESPOOL command. Returns
>       * whether further commands should be read off the wire.
>       * 
> @@ -1026,7 +943,6 @@
>       *            the argument passed in with the command
>       */
>      private boolean doDELETESPOOL(String argument) {
> -        int count = 0;
>          String[] args = null;
>  
>          if (argument != null)
> @@ -1039,82 +955,29 @@
>              return true;
>          }
>  
> -        SpoolRepository spoolRepository;
>          String url = args[0];
> +        String key = args.length == 2 ? args[1] : null;
> +
>          try {
> -            spoolRepository = getSpoolRepository(url);
> +            ArrayList lockingFailures = new ArrayList();
> +            int count =  theConfigData.getSpoolManagement().removeSpoolItems(url, key, lockingFailures);
>  
> -            if (args.length == 2) {
> -                String key = args[1];
> -                if (removeMail(spoolRepository, key))
> -                    count++;
> -            } else {
> -                Iterator spoolR = spoolRepository.list();
> -
> -                while (spoolR.hasNext()) {
> -                    String key = spoolR.next().toString();
> -
> -                    if (removeMail(spoolRepository, key))
> -                        count++;
> -                }
> +            for (Iterator iterator = lockingFailures.iterator(); iterator.hasNext();) {
> +                String lockFailureKey = (String) iterator.next();
> +                out.println("Error locking the mail with key:  " + lockFailureKey);
>              }
> +            out.flush();
> +
>              out.println("Number of deleted mails: " + count);
>              out.flush();
>  
>          } catch (Exception e) {
>              out.println("Error opening the spoolrepository " + e.getMessage());
>              out.flush();
> -            getLogger().error(
> -                    "Error opeing the spoolrepository " + e.getMessage());
> +            getLogger().error("Error opeing the spoolrepository " + e.getMessage());
>          }
>          return true;
>      }
> -
> -    /**
> -     * Remove the mail that belongs to the given key and spoolRepository 
> -     * @param spoolRepository The spoolRepository
> -     * @param key The message key
> -     * @return true or false
> -     * @throws MessagingException Get thrown if there happen an error on modify the mail
> -     */
> -    private boolean removeMail(SpoolRepository spoolRepository, String key)
> -            throws MessagingException {
> -        if (spoolRepository.lock(key)) {
> -
> -            Mail m = spoolRepository.retrieve(key);
> -            if (m.getState().equals(Mail.ERROR)) {
> -
> -                spoolRepository.remove(key);
> -                return true;
> -            }
> -        } else {
> -            out.println("Error locking the mail with key:  " + key);
> -            out.flush();
> -        }
> -        return false;
> -    }
> -
> -    /**
> -     * Retrieve a spoolRepository by the given url
> -     * 
> -     * @param url The spoolRepository url
> -     * @return The spoolRepository
> -     * @throws ServiceException Get thrown if the spoolRepository can not retrieved
> -     */
> -    private SpoolRepository getSpoolRepository(String url)
> -            throws ServiceException {
> -        SpoolRepository spoolRepository;
> -        // Setup all needed data
> -        DefaultConfiguration spoolConf = new DefaultConfiguration("spool",
> -                "generated:RemoteManager.java");
> -        spoolConf.setAttribute("destinationURL", url);
> -        spoolConf.setAttribute("type", "SPOOL");
> -
> -        spoolRepository = (SpoolRepository) theConfigData.getStore().select(
> -                spoolConf);
> -        return spoolRepository;
> -    }
> -
>  
>      /**
>       * Handler method called upon receipt of a QUIT command. Returns whether
> 
> Modified: james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandlerConfigurationData.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandlerConfigurationData.java?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandlerConfigurationData.java (original)
> +++ james/server/trunk/src/java/org/apache/james/remotemanager/RemoteManagerHandlerConfigurationData.java Mon Jun 26 08:00:32 2006
> @@ -19,6 +19,7 @@
>  
>  import org.apache.avalon.cornerstone.services.store.Store;
>  import org.apache.james.services.MailServer;
> +import org.apache.james.services.SpoolManagementService;
>  import org.apache.james.services.UsersRepository;
>  import org.apache.james.services.UsersStore;
>  
> @@ -58,6 +59,13 @@
>       * @return the local users store
>       */
>      UsersStore getUserStore();
> +
> +    /**
> +     * Returns the SpoolManagement for this service.
> +     *
> +     * @return the spool manager
> +     */
> +    SpoolManagementService getSpoolManagement();
>  
>      /**
>       * Returns the Administrative Account Data
> 
> Added: james/server/trunk/src/java/org/apache/james/services/SpoolManagementService.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/services/SpoolManagementService.java?rev=417204&view=auto
> ==============================================================================
> --- james/server/trunk/src/java/org/apache/james/services/SpoolManagementService.java (added)
> +++ james/server/trunk/src/java/org/apache/james/services/SpoolManagementService.java Mon Jun 26 08:00:32 2006
> @@ -0,0 +1,34 @@
> +/***********************************************************************
> + * Copyright (c) 2006 The Apache Software Foundation.             *
> + * All rights reserved.                                                *
> + * ------------------------------------------------------------------- *
> + * Licensed under the Apache License, Version 2.0 (the "License"); you *
> + * may not use this file except in compliance with the License. You    *
> + * may obtain a copy of the License at:                                *
> + *                                                                     *
> + *     http://www.apache.org/licenses/LICENSE-2.0                      *
> + *                                                                     *
> + * Unless required by applicable law or agreed to in writing, software *
> + * distributed under the License is distributed on an "AS IS" BASIS,   *
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
> + * implied.  See the License for the specific language governing       *
> + * permissions and limitations under the License.                      *
> + ***********************************************************************/
> +
> +
> +package org.apache.james.services;
> +
> +import org.apache.avalon.framework.service.ServiceException;
> +
> +import javax.mail.MessagingException;
> +import java.util.List;
> +
> +public interface SpoolManagementService {
> +    String ROLE = "org.apache.james.services.SpoolManagementService";
> +
> +    public int removeSpoolItems(String spoolRepositoryURL, String key, List lockingFailures) throws ServiceException, MessagingException;
> +    
> +    public int resendSpoolItems(String spoolRepositoryURL, String key, List lockingFailures) throws ServiceException, MessagingException;
> +
> +    public List getSpoolItems(String spoolRepositoryURL) throws ServiceException, MessagingException;
> +}
> 
> Modified: james/server/trunk/src/test/org/apache/james/remotemanager/RemoteManagerTest.java
> URL: http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/remotemanager/RemoteManagerTest.java?rev=417204&r1=417203&r2=417204&view=diff
> ==============================================================================
> --- james/server/trunk/src/test/org/apache/james/remotemanager/RemoteManagerTest.java (original)
> +++ james/server/trunk/src/test/org/apache/james/remotemanager/RemoteManagerTest.java Mon Jun 26 08:00:32 2006
> @@ -266,27 +266,15 @@
>          login();
>  
>          sendCommand("help");
> -        try {
> -            Thread.sleep(100);
> -        } catch (InterruptedException e) {
> -            ; // ignore
> -        }
> +        delay();
>          assertTrue("command line is effective", readAnswer().size() > 0);
>  
>          sendCommand("quit");
> -        try {
> -            Thread.sleep(100);
> -        } catch (InterruptedException e) {
> -            ; // ignore
> -        }
> +        delay();
>          readAnswer(0);
>  
>          sendCommand("help");
> -        try {
> -            Thread.sleep(100);
> -        } catch (InterruptedException e) {
> -            ; // ignore
> -        }
> +        delay();
>          assertNull("connection is closed", m_reader.readLine());
>      }   
>  
> @@ -302,12 +290,8 @@
>              sendCommand("adduser " + user + " test");
>              readAnswer(1);
>          }
> -        
> -        try {
> -            Thread.sleep(100);
> -        } catch (InterruptedException e) {
> -            ; // ignore
> -        }
> +
> +        delay();
>  
>          sendCommand("listusers");
>          List list = readAnswer(5);
> @@ -325,6 +309,14 @@
>          for (int i = 0; i < users.length; i++) {
>              String user = users[i];
>              assertTrue("name found", readUserNames.contains(user));
> +        }
> +    }
> +
> +    private void delay() {
> +        try {
> +            Thread.sleep(100);
> +        } catch (InterruptedException e) {
> +            ; // ignore
>          }
>      }
>  
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
> For additional commands, e-mail: server-dev-help@james.apache.org
> 
> !EXCUBATOR:1,449ff6b448539715210382!

Re: svn commit: r417204 - in /james/server/trunk/src: conf/ java/org/apache/james/management/ java/org/apache/james/remotemanager/ java/org/apache/james/services/ test/org/apache/james/remotemanager/

Posted by Bernd Fondermann <bf...@brainlounge.de>.
Hi Norman,

OK. I won't get to it right now. Maybe you'd like me to prepare the 
SpoolManagement so you incorporate it into RemoteManager afterwards?

   Bernd

Norman Maurer wrote:
> Feel free to also refactor my new code for jmx which is attached here: 
> http://issues.apache.org/jira/browse/JAMES-530
> 
> IF you do so plz assign it to you.
> 
> bye
> Norman
> 
> Am Montag, den 26.06.2006, 15:00 +0000 schrieb berndf@apache.org:
> 
>>Author: berndf
>>Date: Mon Jun 26 08:00:32 2006
>>New Revision: 417204
>>
>>URL: http://svn.apache.org/viewvc?rev=417204&view=rev
>>Log:
>>- make spool commands from RemoteManager available in JMX
>>- common logic centralized in SpoolManagement
>>
>>Added:
>> 
<snip/>
>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
>>For additional commands, e-mail: server-dev-help@james.apache.org
>>
>>!EXCUBATOR:1,449ff6b448539715210382
> 
> !


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Re: svn commit: r417204 - in /james/server/trunk/src: conf/ java/org/apache/james/management/ java/org/apache/james/remotemanager/ java/org/apache/james/services/ test/org/apache/james/remotemanager/

Posted by Norman Maurer <nm...@byteaction.de>.
That sounds great :-) Plz do it ..

bye
Norman 

Am Donnerstag, den 29.06.2006, 09:41 +0200 schrieb Bernd Fondermann:
> Hi Norman,
> 
> OK. I won't get to it right now. Maybe you'd like me to prepare the 
> SpoolManagement so you incorporate it into RemoteManager afterwards?
> 
>    Bernd
> 
> Norman Maurer wrote:
> > Feel free to also refactor my new code for jmx which is attached here: 
> > http://issues.apache.org/jira/browse/JAMES-530
> > 
> > IF you do so plz assign it to you.
> > 
> > bye
> > Norman
> > 
> > Am Montag, den 26.06.2006, 15:00 +0000 schrieb berndf@apache.org:
> > 
> >>Author: berndf
> >>Date: Mon Jun 26 08:00:32 2006
> >>New Revision: 417204
> >>
> >>URL: http://svn.apache.org/viewvc?rev=417204&view=rev
> >>Log:
> >>- make spool commands from RemoteManager available in JMX
> >>- common logic centralized in SpoolManagement
> >>
> >>Added:
> >> 
> <snip/>
> >>
> >>
> >>
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
> >>For additional commands, e-mail: server-dev-help@james.apache.org
> >>
> >>!EXCUBATOR:1,449ff6b448539715210382
> > 
> > !
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
> For additional commands, e-mail: server-dev-help@james.apache.org
> 
> !EXCUBATOR:1,44a3842c48531428518920!