View Javadoc

1   /****************************************************************
2    * Licensed to the Apache Software Foundation (ASF) under one   *
3    * or more contributor license agreements.  See the NOTICE file *
4    * distributed with this work for additional information        *
5    * regarding copyright ownership.  The ASF licenses this file   *
6    * to you under the Apache License, Version 2.0 (the            *
7    * "License"); you may not use this file except in compliance   *
8    * with the License.  You may obtain a copy of the License at   *
9    *                                                              *
10   *   http://www.apache.org/licenses/LICENSE-2.0                 *
11   *                                                              *
12   * Unless required by applicable law or agreed to in writing,   *
13   * software distributed under the License is distributed on an  *
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15   * KIND, either express or implied.  See the License for the    *
16   * specific language governing permissions and limitations      *
17   * under the License.                                           *
18   ****************************************************************/
19  
20  package org.apache.jsieve.mailet;
21  
22  import java.util.concurrent.ConcurrentHashMap;
23  import java.util.concurrent.ConcurrentMap;
24  
25  import javax.mail.MessagingException;
26  
27  import org.apache.jsieve.mail.Action;
28  import org.apache.jsieve.mail.ActionFileInto;
29  import org.apache.jsieve.mail.ActionKeep;
30  import org.apache.jsieve.mail.ActionRedirect;
31  import org.apache.jsieve.mail.ActionReject;
32  import org.apache.mailet.Mail;
33  
34  /**
35   * Dynamically dispatches an Action depending on the type of Action received at runtime. 
36   * <h4>Thread Safety</h4>
37   * <p>An instance maybe safe accessed concurrently by multiple threads.</p>
38   */
39  public class ActionDispatcher
40  {   
41      /**
42       * A Map keyed by the type of Action. The values are the methods to invoke to 
43       * handle the Action.
44       * <Action, MailAction>
45       */ 
46      private ConcurrentMap<Class, MailAction> fieldMailActionMap;
47  
48      /**
49       * Constructor for ActionDispatcher.
50       * @throws NoSuchMethodException 
51       */
52      public ActionDispatcher() throws MessagingException
53      {
54          super();
55          setMethodMap(defaultMethodMap());
56      }
57  
58      /**
59       * Method execute executes the passed Action by invoking the method mapped by the
60       * receiver with a parameter of the EXACT type of Action.
61       * @param anAction not null
62       * @param aMail not null
63       * @param context not null
64       * @throws MessagingException
65       */
66      public void execute(final Action anAction, final Mail aMail, final ActionContext context) throws MessagingException
67      {
68          final MailAction mailAction = getMethodMap().get(anAction.getClass());
69          mailAction.execute(anAction, aMail, context);
70      }
71  
72      /**
73       * Returns the methodMap.
74       * @return Map
75       */
76      public ConcurrentMap<Class, MailAction> getMethodMap()
77      {
78          return fieldMailActionMap;
79      }    
80  
81      /**
82       * Returns a new methodMap.
83       * @return Map
84       */
85      private ConcurrentMap<Class, MailAction> defaultMethodMap()
86      {
87          final ConcurrentMap<Class, MailAction> actionMap = new ConcurrentHashMap<Class, MailAction>(4);
88          actionMap.put(ActionFileInto.class, new FileIntoAction());
89          actionMap.put(ActionKeep.class, new KeepAction());
90          actionMap.put(ActionRedirect.class, new RedirectAction());
91          actionMap.put(ActionReject.class, new RejectAction());
92          return actionMap;
93      }    
94  
95      /**
96       * Sets the mail action mail.
97       * @param mailActionMap <Action, MailAction> not null
98       */
99      protected void setMethodMap(ConcurrentMap<Class, MailAction>  mailActionMap)
100     {
101         fieldMailActionMap = mailActionMap;
102     }
103 }