001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.mail;
018:
019: import java.util.HashMap;
020: import java.util.Map;
021:
022: import org.apache.avalon.framework.context.Contextualizable;
023: import org.apache.avalon.framework.logger.AbstractLogEnabled;
024: import org.apache.cocoon.mail.command.AbstractMailCommand;
025:
026: /**
027: * Build an AbstractMailCommand from MailContext.
028: * <p>
029: * As a user requests a command, the command is mapped to an MailCommand instance.
030: * The registration of MailCommand, and the resolution of a command string to
031: * a command instance are the tasks of this class.
032: * </p>
033: *
034: * @author Bernhard Huber
035: * @since 28 December 2002
036: * @version $Id: MailCommandBuilder.java 468424 2006-10-27 15:44:53Z vgritsenko $
037: */
038: public class MailCommandBuilder extends AbstractLogEnabled {
039:
040: // global factory settings
041: private Map cmdMap;
042:
043: /**
044: * Constructor for the MailCommandBuilder object
045: */
046: public MailCommandBuilder() {
047: configure();
048: }
049:
050: /**
051: * Build a mail command.
052: *
053: * @param mailContext Description of the Parameter
054: * @return Description of the Return Value
055: */
056: public AbstractMailCommand buildAbstractMailCommand(
057: MailContext mailContext) {
058: AbstractMailCommand ama = null;
059:
060: try {
061: // request parameter say "what"
062: String cmd = mailContext.getParameter("cmd");
063: if (cmd == null) {
064: cmd = (String) mailContext
065: .get(MailContext.MAIL_CURRENT_WORKING_COMMAND_ENTRY);
066: }
067: Class clazz = getClassForCommand(cmd);
068: if (clazz != null) {
069: ama = (AbstractMailCommand) clazz.newInstance();
070: // enable logging of the mail command
071: ama.enableLogging(getLogger());
072: // contextualize the mail command
073: if (ama instanceof Contextualizable) {
074: ((Contextualizable) ama).contextualize(mailContext);
075: }
076: return ama;
077: } else {
078: getLogger().error(
079: "Cmd " + String.valueOf(cmd) + " is invalid");
080: }
081: } catch (Exception e) {
082: String message = "Cannto build AbstractMailCommand";
083: getLogger().error(message, e);
084: }
085: return ama;
086: }
087:
088: /**
089: * Get Class for a command
090: *
091: * @param cmd the command
092: * @return Class associated with cmd, or null iff cmd is not mapped to any class
093: */
094: protected Class getClassForCommand(String cmd) {
095: return (Class) cmdMap.get(cmd);
096: }
097:
098: /**
099: * Test if command is mapped to a Command class
100: *
101: * @param cmd the command
102: * @return true iff command is mapped to a Class, otherwise return false
103: */
104: public boolean isCommandMapped(String cmd) {
105: return cmdMap.containsKey(cmd);
106: }
107:
108: /**
109: * Configure the cmd to mail command class mapping.
110: *
111: * <p>New commands are registered here. A command name is associated with
112: * each command class.</p>
113: */
114: public void configure() {
115: cmdMap = new HashMap();
116: cmdMap.put("cat-folder",
117: MailCommandManager.MailFolderCatCommand.class);
118: cmdMap.put("refresh-folder",
119: MailCommandManager.MailRefreshFolderCommand.class);
120: cmdMap.put("list-folder",
121: MailCommandManager.MailListFolderCommand.class);
122: cmdMap.put("list-folder-messages",
123: MailCommandManager.MailListMessagesCommand.class);
124: cmdMap.put("search-folder-messages",
125: MailCommandManager.MailSearchMessagesCommand.class);
126: cmdMap.put("cat-message-by-uid",
127: MailCommandManager.MailCatMessageByUIDCommand.class);
128: cmdMap.put("cat-message-by-id",
129: MailCommandManager.MailCatMessageByIdCommand.class);
130: cmdMap
131: .put(
132: "cat-attachment-of-message-by-id",
133: MailCommandManager.MailCatAttachmentMessageByIdCommand.class);
134: }
135:
136: }
|