blob: fed4bb4922b16f70621ed4ac38addcd04a6a77b4 [file] [log] [blame]
/****************************************************************
* 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.jsieve.mailet;
import org.apache.jsieve.mail.*;
import org.apache.jsieve.mail.optional.ActionVacation;
import org.apache.mailet.Mail;
import javax.mail.MessagingException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Dynamically dispatches an Action depending on the type of Action received at runtime.
* <h4>Thread Safety</h4>
* <p>An instance maybe safe accessed concurrently by multiple threads.</p>
*/
public class ActionDispatcher {
/**
* A Map keyed by the type of Action. The values are the methods to invoke to
* handle the Action.
* <Action, MailAction>
*/
private ConcurrentMap<Class, MailAction> fieldMailActionMap;
/**
* Constructor for ActionDispatcher.
*
* @throws NoSuchMethodException
*/
public ActionDispatcher() {
super();
setMethodMap(defaultMethodMap());
}
/**
* Method execute executes the passed Action by invoking the method mapped by the
* receiver with a parameter of the EXACT type of Action.
*
* @param anAction not null
* @param aMail not null
* @param context not null
* @throws MessagingException
*/
public void execute(final Action anAction, final Mail aMail, final ActionContext context) throws MessagingException {
final MailAction mailAction = getMethodMap().get(anAction.getClass());
mailAction.execute(anAction, aMail, context);
}
/**
* Returns the methodMap.
*
* @return Map
*/
public ConcurrentMap<Class, MailAction> getMethodMap() {
return fieldMailActionMap;
}
/**
* Returns a new methodMap.
*
* @return Map
*/
private ConcurrentMap<Class, MailAction> defaultMethodMap() {
final ConcurrentMap<Class, MailAction> actionMap = new ConcurrentHashMap<Class, MailAction>(4);
actionMap.put(ActionFileInto.class, new FileIntoAction());
actionMap.put(ActionKeep.class, new KeepAction());
actionMap.put(ActionRedirect.class, new RedirectAction());
actionMap.put(ActionReject.class, new RejectAction());
actionMap.put(ActionVacation.class, new VacationAction());
return actionMap;
}
/**
* Sets the mail action mail.
*
* @param mailActionMap <Action, MailAction> not null
*/
protected void setMethodMap(ConcurrentMap<Class, MailAction> mailActionMap) {
fieldMailActionMap = mailActionMap;
}
}