/* * 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.struts.apps.mailreader.actions; import org.apache.commons.beanutils.PropertyUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.apps.mailreader.Constants; import org.apache.struts.apps.mailreader.dao.Subscription; import org.apache.struts.apps.mailreader.dao.User; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.lang.reflect.InvocationTargetException; /** * <p> * Provide an Edit method for retrieving an existing subscription, * and a Save method for updating or inserting a subscription. * </p> */ public final class SubscriptionAction extends BaseAction { // --- Public Constants -- /** * <p> * Name of autoConnect field ["autoConnect"]. * </p> */ public final static String AUTO_CONNECT = "autoConnect"; /** * <p> * Name of host field ["host"]. * </p> */ public final static String HOST = "host"; /** * <p> * Name of type field ["type"]. * </p> */ public final static String TYPE = "type"; // ---- Private Methods ---- final String LOG_SUBSCRIPTION_POPULATE = "SubscriptionForm.populate"; /** * <p> * Obtain subscription matching host for the given User, * or return null if not found. * </p> * * @param user Our User object * @param host The name of the mail server host * @return The matching Subscription or null */ private Subscription doFindSubscription(User user, String host) { Subscription subscription; try { subscription = user.findSubscription(host); } catch (NullPointerException e) { subscription = null; } if ((subscription == null) && (log.isTraceEnabled())) { log.trace( " No subscription for user " + user.getUsername() + " and host " + host); } return subscription; } /** * <p> * Helper method to populate the Subscription object from the input form. * </p> * * @param subscription User object to populate * @param form Form with incoming values * @throws ServletException On any error */ private void doPopulate(Subscription subscription, ActionForm form) throws ServletException { if (log.isTraceEnabled()) { log.trace(Constants.LOG_POPULATE_SUBSCRIPTION + subscription); } try { PropertyUtils.copyProperties(subscription, form); } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); if (t == null) { t = e; } log.error(LOG_SUBSCRIPTION_POPULATE, t); throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t); } catch (Throwable t) { log.error(LOG_SUBSCRIPTION_POPULATE, t); throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t); } } /** * <p> * Helper method to populate the input form from the Subscription object. * </p> * * @param subscription User object to populate * @param form Form with incoming values * @throws ServletException On any error */ private void doPopulate(ActionForm form, Subscription subscription) throws ServletException { final String title = Constants.EDIT; if (log.isTraceEnabled()) { log.trace(Constants.LOG_POPULATE_FORM + subscription.getHost()); } try { PropertyUtils.copyProperties(form, subscription); doSet(form, TASK, title); } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); if (t == null) { t = e; } log.error(LOG_SUBSCRIPTION_POPULATE, t); throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t); } catch (Throwable t) { log.error(LOG_SUBSCRIPTION_POPULATE, t); throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t); } } /** * <p> * Remove the given subscription for this user. * </p> * * @param mapping Our ActionMapping * @param session Our HttpSession * @param user Our User * @param subscription Subscription to delete * @return "Success" if delete is nominal, "Logon" if attributes are * missing * @throws ServletException if updates fails */ private ActionForward doRemoveSubscription( ActionMapping mapping, HttpSession session, User user, Subscription subscription) throws ServletException { final String method = Constants.DELETE; doLogProcess(mapping, method); if (log.isTraceEnabled()) { log.trace( " Deleting subscription to mail server '" + subscription.getHost() + "' for user '" + user.getUsername() + "'"); } boolean missingAttributes = ((user == null) || (subscription == null)); if (missingAttributes) { return doFindLogon(mapping); } user.removeSubscription(subscription); session.removeAttribute(Constants.SUBSCRIPTION_KEY); doSaveUser(user); return doFindSuccess(mapping); } // ----- Public Methods ---- /** * <p> * Prepare for a Delete operation by populating the form * and seting the action to Delete. * </p> * * @param mapping Our ActionMapping * @param form Our ActionForm * @param request Our HttpServletRequest * @param response Our HttpServletResponse * @return The "Success" result for this mapping * @throws Exception on any error */ public ActionForward Delete( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { final String method = Constants.DELETE; doLogProcess(mapping, method); ActionForward result = Edit(mapping, form, request, response); doSet(form, TASK, method); return result; } /** * <p> * Retrieve the Subscription object to edit * or null if the Subscription does not exist. * </p><p> * The Subscription object is bound to the User, * and so if the User is not logged in, * control is forwarded to the Logon result. * </p> * * @param mapping Our ActionMapping * @param form Our ActionForm * @param request Our HttpServletRequest * @param response Our HttpServletResponse * @return The "Success" result for this mapping * @throws Exception on any error */ public ActionForward Edit( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { final String method = Constants.EDIT; doLogProcess(mapping, method); HttpSession session = request.getSession(); User user = doGetUser(session); if (user == null) { return doFindLogon(mapping); } // Retrieve the subscription, if there is one Subscription subscription; String host = doGet(form, HOST); boolean updating = (host != null); if (updating) { subscription = doFindSubscription(user, host); if (subscription == null) { return doFindFailure(mapping); } session.setAttribute(Constants.SUBSCRIPTION_KEY, subscription); doPopulate(form, subscription); doSet(form, TASK, method); } return doFindSuccess(mapping); } /** * <p> * Insert or update a Subscription object to the persistent store. * </p> * * @param mapping Our ActionMapping * @param form Our ActionForm * @param request Our HttpServletRequest * @param response Our HttpServletResponse * @return The "Success" result for this mapping * @throws Exception on any error */ public ActionForward Save( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { final String method = Constants.SAVE; doLogProcess(mapping, method); User user = doGetUser(request); if (user == null) { return doFindLogon(mapping); } HttpSession session = request.getSession(); if (isCancelled(request)) { doCancel(session, method, Constants.SUBSCRIPTION_KEY); return doFindSuccess(mapping); } String action = doGet(form, TASK); Subscription subscription = doGetSubscription(request); boolean isDelete = action.equals(Constants.DELETE); if (isDelete) { return doRemoveSubscription(mapping, session, user, subscription); } if (subscription == null) { subscription = user.createSubscription(doGet(form, HOST)); session.setAttribute(Constants.SUBSCRIPTION_KEY, subscription); } doPopulate(subscription, form); doSaveUser(user); session.removeAttribute(Constants.SUBSCRIPTION_KEY); return doFindSuccess(mapping); } }