org.apache.jsieve.mailet.ActionDispatcher Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of apache-jsieve-mailet Show documentation
Show all versions of apache-jsieve-mailet Show documentation
Apache jSieve is a server side mail filtering system
implementing RFC3028. Apache jSieve is developed by the
James project.
The newest version!
/****************************************************************
* 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 java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.mail.MessagingException;
import org.apache.jsieve.mail.Action;
import org.apache.jsieve.mail.ActionFileInto;
import org.apache.jsieve.mail.ActionKeep;
import org.apache.jsieve.mail.ActionRedirect;
import org.apache.jsieve.mail.ActionReject;
import org.apache.mailet.Mail;
/**
* Dynamically dispatches an Action depending on the type of Action received at runtime.
* Thread Safety
* An instance maybe safe accessed concurrently by multiple threads.
*/
public class ActionDispatcher
{
/**
* A Map keyed by the type of Action. The values are the methods to invoke to
* handle the Action.
*
*/
private ConcurrentMap fieldMailActionMap;
/**
* Constructor for ActionDispatcher.
* @throws NoSuchMethodException
*/
public ActionDispatcher() throws MessagingException
{
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 getMethodMap()
{
return fieldMailActionMap;
}
/**
* Returns a new methodMap.
* @return Map
*/
private ConcurrentMap defaultMethodMap()
{
final ConcurrentMap actionMap = new ConcurrentHashMap(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());
return actionMap;
}
/**
* Sets the mail action mail.
* @param mailActionMap not null
*/
protected void setMethodMap(ConcurrentMap mailActionMap)
{
fieldMailActionMap = mailActionMap;
}
}