blob: a97185c7cefd460fd075dbd4a5aece3690b3f7ac [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.cocoon.mail;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.mail.Folder;
import javax.mail.MessagingException;
import javax.mail.Store;
//import javax.mail.Session;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.DefaultContext;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.cocoon.environment.Request;
/**
* Encapsulation of context info of this webmail application
*
* @author Bernhard Huber
* @since 29 December 2002
* @version $Id$
*/
public class MailContext extends DefaultContext implements LogEnabled {
/**
* attribute name of MailContext object in an application session, eg http-session
*/
public final static String SESSION_MAIL_CONTEXT = "mail-context";
/**
* Description of the Field
*/
public final static String MAIL_SESSION_ENTRY = "mail-session";
/**
* Description of the Field
*/
public final static String MAIL_STORE_ENTRY = "mail-store";
/**
* Description of the Field
*/
public final static String MAIL_CURRENT_WORKING_FOLDER_ENTRY = "mail-current-working-folder";
/**
* Description of the Field
*/
public final static String MAIL_CURRENT_WORKING_COMMAND_ENTRY = "mail-current-working-command";
private Request request;
private Logger logger;
/**
*Constructor for the MailContext object
*
* @param parent Description of the Parameter
*/
MailContext(Context parent) {
super(parent);
}
/**
* Sets the request attribute of the MailContext object
*
* @param request The new request value
*/
public void setRequest(Request request) {
this.request = request;
}
/**
* A specialization of the plain Context get method.
* <p>
* Implementing special key prefixes
* </p>
* <ul>
* <li>"param:key" get key from request parameters
* </li>
* <li>"param-integer:key" get key from request parameters, casting to Integer
* </li>
* <li>"param-folder:key" get key from request parameters, ie foldername, lookup
* foldername using key "folder:foldername"
* </li>
* <li>key get key via plain context get method
* </li>
* </ul>
*
* @param key Description of the Parameter
* @return Description of the Return Value
* @exception ContextException Description of the Exception
*/
public Object get(Object key) throws ContextException {
String keyString = (String) key;
final String PARAM_PREFIX_ENTRY = "param:";
final String PARAM_INTEGER_PREFIX_ENTRY = "param-integer:";
final String PARAM_FOLDER_PREFIX_ENTRY = "param-folder:";
if (keyString.startsWith(PARAM_PREFIX_ENTRY)) {
String paramName = keyString.substring(PARAM_PREFIX_ENTRY.length());
String paramValue = getParameter(paramName);
if (paramValue == null) {
String message = "No parameter " + String.valueOf(keyString) + " available.";
throw new ContextException(message);
}
return paramValue;
} else if (keyString.startsWith(PARAM_INTEGER_PREFIX_ENTRY)) {
String paramName = keyString.substring(PARAM_INTEGER_PREFIX_ENTRY.length());
try {
return getParameterAsInteger(paramName);
} catch (NumberFormatException nfe) {
String message = "Cannot create Integer for parameter " + String.valueOf(keyString);
throw new ContextException(message, nfe);
}
} else if (keyString.startsWith(PARAM_FOLDER_PREFIX_ENTRY)) {
String paramName = keyString.substring(PARAM_FOLDER_PREFIX_ENTRY.length());
String folderName = getParameter(paramName);
if (folderName == null) {
// no folderName is available in the parameters bag
// try to get the current working folder
try {
folderName = (String) super.get(MAIL_CURRENT_WORKING_FOLDER_ENTRY);
} catch (ContextException ce) {
// no current working folder entry available
String message = "No " + MAIL_CURRENT_WORKING_FOLDER_ENTRY + " entry available ";
getLogger().error(message);
throw new ContextException(message, ce);
}
}
// get folder object, folderName is okay
Folder folder;
try {
folder = (Folder) getFolder(folderName);
} catch (ContextException ce) {
// folder is not stored yet
Store store = (Store) get(MAIL_STORE_ENTRY);
// get folder, eventually connect the store
try {
if (!store.isConnected()) {
store.connect();
}
final String DEFAULT_FOLDER_NAME = "~";
// empty folder name is specified by empty string, or "~"
if (folderName.equals(DEFAULT_FOLDER_NAME) || folderName.length() == 0) {
folder = store.getDefaultFolder();
} else {
folder = store.getFolder(folderName);
}
// save the Folder, for later access
putFolder(folder);
} catch (MessagingException me) {
String message = "Cannot get folder " + String.valueOf(folderName);
throw new ContextException(message, ce);
}
}
return folder;
} else {
return super.get(key);
}
}
/**
* Gets the theFolder attribute of the MailContext object
*
* @param entry Description of the Parameter
* @return The theFolder value
* @exception ContextException Description of the Exception
*/
public Folder getTheFolder(String entry) throws ContextException {
Folder f;
try {
f = (Folder) get("param-folder:" + entry);
} catch (Exception e) {
String message = "Cannot get Folder object for " + String.valueOf(entry);
throw new ContextException(message, e);
}
return f;
}
/**
* Gets the folder attribute of the MailContext object
*
* @param folderName Description of the Parameter
* @return The folder value
* @exception ContextException Description of the Exception
*/
public Object getFolder(String folderName) throws ContextException {
// canonicalize folder name
folderName = canoncializeFoldername(folderName);
final String key = "folder:" + folderName;
getLogger().debug("Getting folder " + String.valueOf(key));
Object o = super.get(key);
getLogger().debug("Successfully getting folder " + String.valueOf(key) + ": " + String.valueOf(o));
return o;
}
/**
* Remove and close Store of this MailContext, implicitly remove all folders, too.
*/
public void removeStore() {
try {
getLogger().info("Remove store " + String.valueOf(this));
removeAllFolders();
Map map = getContextData();
Store store = (Store) map.remove(MAIL_STORE_ENTRY);
if (store != null) {
MailCommandManager.closeStore(store);
}
} catch (Exception e) {
String message = "Cannot remove store";
getLogger().error(message, e);
}
}
/**
* remove all folders in this MailContext object
*/
public void removeAllFolders() {
try {
getLogger().info("Remove folders " + String.valueOf(this));
Map map = getContextData();
Set entrySet = map.entrySet();
Iterator i = entrySet.iterator();
while (i.hasNext()) {
Map.Entry me = (Map.Entry) i.next();
String key = (String) me.getKey();
if (key.startsWith("folder:")) {
Folder f = (Folder) me.getValue();
MailCommandManager.closeFolder(f);
i.remove();
}
}
} catch (Exception e) {
String message = "Cannot remove all folders";
getLogger().error(message, e);
}
}
/**
* put a folder in this MailContext object map
*
* @param folder Description of the Parameter
* @exception ContextException Description of the Exception
*/
public void putFolder(Folder folder) throws ContextException {
String folderName = folder.getFullName();
// canonicalize folder name
folderName = canoncializeFoldername(folderName);
final String key = "folder:" + folderName;
getLogger().debug("Putting folder key: " + String.valueOf(key) +
" folder " + String.valueOf(folder));
// close folder if folder is overwritten
try {
Object objRef = super.get(key);
if (objRef != null) {
// close this folder as it is goint to get overwritten
try {
Folder f = (Folder) objRef;
MailCommandManager.closeFolder(f);
} catch (MessagingException me) {
String message = "Cannot close folder";
getLogger().warn(message, me);
}
}
} catch (ContextException e) {
// ignore as we set it
}
// Shall we garbage collect folders?
super.put(key, folder);
}
/**
* Description of the Method
*
* @param folders Description of the Parameter
* @exception ContextException Description of the Exception
*/
public void putFolder(Folder[] folders) throws ContextException {
for (int i = 0; i < folders.length; i++) {
putFolder(folders[i]);
}
}
/**
* Description of the Method
*
* @param logger Description of the Parameter
*/
public void enableLogging(Logger logger) {
this.logger = logger;
}
/**
* Gets the parameter attribute of the MailContext object
*
* @param key Description of the Parameter
* @return The parameter value
*/
protected String getParameter(String key) {
return request.getParameter(key);
}
/**
* Gets the parameterAsInteger attribute of the MailContext object
*
* @param key Description of the Parameter
* @return The parameterAsInteger value
*/
protected Integer getParameterAsInteger(String key) {
String value = request.getParameter(key);
return new Integer(value);
}
/**
* Gets the logger attribute of the MailContext object
*
* @return The logger value
*/
protected Logger getLogger() {
return this.logger;
}
/**
* Description of the Method
*
* @param fn Description of the Parameter
* @return Description of the Return Value
*/
protected String canoncializeFoldername(String fn) {
//
return fn;
}
}