View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  package org.apache.struts.apps.mailreader.actions;
    18
    19  import org.apache.commons.beanutils.PropertyUtils;
    20  import org.apache.struts.action.ActionForm;
    21  import org.apache.struts.action.ActionForward;
    22  import org.apache.struts.action.ActionMapping;
    23  import org.apache.struts.apps.mailreader.Constants;
    24  import org.apache.struts.apps.mailreader.dao.Subscription;
    25  import org.apache.struts.apps.mailreader.dao.User;
    26
    27  import javax.servlet.ServletException;
    28  import javax.servlet.http.HttpServletRequest;
    29  import javax.servlet.http.HttpServletResponse;
    30  import javax.servlet.http.HttpSession;
    31  import java.lang.reflect.InvocationTargetException;
    32
    33  /**
    34   * <p>
    35   * Provide an Edit method for retrieving an existing subscription,
    36   * and a Save method for updating or inserting a subscription.
    37   * </p>
    38   */
    39  public final class SubscriptionAction extends BaseAction {
    40
    41      // --- Public Constants --
    42
    43      /**
    44       * <p>
    45       * Name of autoConnect field ["autoConnect"].
    46       * </p>
    47       */
    48      public final static String AUTO_CONNECT = "autoConnect";
    49
    50      /**
    51       * <p>
    52       * Name of host field ["host"].
    53       * </p>
    54       */
    55      public final static String HOST = "host";
    56
    57      /**
    58       * <p>
    59       * Name of type field ["type"].
    60       * </p>
    61       */
    62      public final static String TYPE = "type";
    63
    64      // ---- Private Methods ----
    65
    66      final String LOG_SUBSCRIPTION_POPULATE = "SubscriptionForm.populate";
    67
    68      /**
    69       * <p>
    70       * Obtain subscription matching host for the given User,
    71       * or return null if not found.
    72       * </p>
    73       *
    74       * @param user Our User object
    75       * @param host The name of the mail server host
    76       * @return The matching Subscription or null
    77       */
    78      private Subscription doFindSubscription(User user, String host) {
    79
    80          Subscription subscription;
    81
    82          try {
    83              subscription = user.findSubscription(host);
    84          }
    85          catch (NullPointerException e) {
    86              subscription = null;
    87          }
    88
    89          if ((subscription == null) && (log.isTraceEnabled())) {
    90              log.trace(
    91                      " No subscription for user "
    92                              + user.getUsername()
    93                              + " and host "
    94                              + host);
    95          }
    96
    97          return subscription;
    98      }
    99
    100     /**
    101      * <p>
    102      * Helper method to populate the Subscription object from the input form.
    103      * </p>
    104      *
    105      * @param subscription User object to populate
    106      * @param form         Form with incoming values
    107      * @throws ServletException On any error
    108      */
    109     private void doPopulate(Subscription subscription, ActionForm form)
    110             throws ServletException {
    111
    112         if (log.isTraceEnabled()) {
    113             log.trace(Constants.LOG_POPULATE_SUBSCRIPTION + subscription);
    114         }
    115
    116         try {
    117             PropertyUtils.copyProperties(subscription, form);
    118         } catch (InvocationTargetException e) {
    119             Throwable t = e.getTargetException();
    120             if (t == null) {
    121                 t = e;
    122             }
    123             log.error(LOG_SUBSCRIPTION_POPULATE, t);
    124             throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t);
    125         } catch (Throwable t) {
    126             log.error(LOG_SUBSCRIPTION_POPULATE, t);
    127             throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t);
    128         }
    129     }
    130
    131     /**
    132      * <p>
    133      * Helper method to populate the input form from the Subscription object.
    134      * </p>
    135      *
    136      * @param subscription User object to populate
    137      * @param form         Form with incoming values
    138      * @throws ServletException On any error
    139      */
    140     private void doPopulate(ActionForm form, Subscription subscription)
    141             throws ServletException {
    142
    143         final String title = Constants.EDIT;
    144
    145         if (log.isTraceEnabled()) {
    146             log.trace(Constants.LOG_POPULATE_FORM + subscription.getHost());
    147         }
    148
    149         try {
    150             PropertyUtils.copyProperties(form, subscription);
    151             doSet(form, TASK, title);
    152         } catch (InvocationTargetException e) {
    153             Throwable t = e.getTargetException();
    154             if (t == null) {
    155                 t = e;
    156             }
    157             log.error(LOG_SUBSCRIPTION_POPULATE, t);
    158             throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t);
    159         } catch (Throwable t) {
    160             log.error(LOG_SUBSCRIPTION_POPULATE, t);
    161             throw new ServletException(LOG_SUBSCRIPTION_POPULATE, t);
    162         }
    163     }
    164
    165     /**
    166      * <p>
    167      * Remove the given subscription for this user.
    168      * </p>
    169      *
    170      * @param mapping      Our ActionMapping
    171      * @param session      Our HttpSession
    172      * @param user         Our User
    173      * @param subscription Subscription to delete
    174      * @return "Success" if delete is nominal, "Logon" if attributes are
    175      *         missing
    176      * @throws ServletException if updates fails
    177      */
    178     private ActionForward doRemoveSubscription(
    179             ActionMapping mapping,
    180             HttpSession session,
    181             User user,
    182             Subscription subscription)
    183             throws ServletException {
    184
    185         final String method = Constants.DELETE;
    186         doLogProcess(mapping, method);
    187
    188         if (log.isTraceEnabled()) {
    189             log.trace(
    190                     " Deleting subscription to mail server '"
    191                             + subscription.getHost()
    192                             + "' for user '"
    193                             + user.getUsername()
    194                             + "'");
    195         }
    196
    197         boolean missingAttributes = ((user == null) || (subscription == null));
    198         if (missingAttributes) {
    199             return doFindLogon(mapping);
    200         }
    201
    202         user.removeSubscription(subscription);
    203         session.removeAttribute(Constants.SUBSCRIPTION_KEY);
    204         doSaveUser(user);
    205
    206         return doFindSuccess(mapping);
    207     }
    208
    209     // ----- Public Methods ----
    210
    211     /**
    212      * <p>
    213      * Prepare for a Delete operation by populating the form
    214      * and seting the action to Delete.
    215      * </p>
    216      *
    217      * @param mapping  Our ActionMapping
    218      * @param form     Our ActionForm
    219      * @param request  Our HttpServletRequest
    220      * @param response Our HttpServletResponse
    221      * @return The "Success" result for this mapping
    222      * @throws Exception on any error
    223      */
    224     public ActionForward Delete(
    225             ActionMapping mapping,
    226             ActionForm form,
    227             HttpServletRequest request,
    228             HttpServletResponse response)
    229             throws Exception {
    230
    231         final String method = Constants.DELETE;
    232         doLogProcess(mapping, method);
    233
    234         ActionForward result = Edit(mapping, form, request, response);
    235
    236         doSet(form, TASK, method);
    237         return result;
    238     }
    239
    240     /**
    241      * <p>
    242      * Retrieve the Subscription object to edit
    243      * or null if the Subscription does not exist.
    244      * </p><p>
    245      * The Subscription object is bound to the User,
    246      * and so if the User is not logged in,
    247      * control is forwarded to the Logon result.
    248      * </p>
    249      *
    250      * @param mapping  Our ActionMapping
    251      * @param form     Our ActionForm
    252      * @param request  Our HttpServletRequest
    253      * @param response Our HttpServletResponse
    254      * @return The "Success" result for this mapping
    255      * @throws Exception on any error
    256      */
    257     public ActionForward Edit(
    258             ActionMapping mapping,
    259             ActionForm form,
    260             HttpServletRequest request,
    261             HttpServletResponse response)
    262             throws Exception {
    263
    264         final String method = Constants.EDIT;
    265         doLogProcess(mapping, method);
    266
    267         HttpSession session = request.getSession();
    268         User user = doGetUser(session);
    269         if (user == null) {
    270             return doFindLogon(mapping);
    271         }
    272
    273         // Retrieve the subscription, if there is one
    274         Subscription subscription;
    275         String host = doGet(form, HOST);
    276         boolean updating = (host != null);
    277         if (updating) {
    278             subscription = doFindSubscription(user, host);
    279             if (subscription == null) {
    280                 return doFindFailure(mapping);
    281             }
    282             session.setAttribute(Constants.SUBSCRIPTION_KEY, subscription);
    283             doPopulate(form, subscription);
    284             doSet(form, TASK, method);
    285         }
    286
    287         return doFindSuccess(mapping);
    288     }
    289
    290     /**
    291      * <p>
    292      * Insert or update a Subscription object to the persistent store.
    293      * </p>
    294      *
    295      * @param mapping  Our ActionMapping
    296      * @param form     Our ActionForm
    297      * @param request  Our HttpServletRequest
    298      * @param response Our HttpServletResponse
    299      * @return The "Success" result for this mapping
    300      * @throws Exception on any error
    301      */
    302     public ActionForward Save(
    303             ActionMapping mapping,
    304             ActionForm form,
    305             HttpServletRequest request,
    306             HttpServletResponse response)
    307             throws Exception {
    308
    309         final String method = Constants.SAVE;
    310         doLogProcess(mapping, method);
    311
    312         User user = doGetUser(request);
    313         if (user == null) {
    314             return doFindLogon(mapping);
    315         }
    316
    317         HttpSession session = request.getSession();
    318         if (isCancelled(request)) {
    319             doCancel(session, method, Constants.SUBSCRIPTION_KEY);
    320             return doFindSuccess(mapping);
    321         }
    322
    323         String action = doGet(form, TASK);
    324         Subscription subscription = doGetSubscription(request);
    325         boolean isDelete = action.equals(Constants.DELETE);
    326         if (isDelete) {
    327             return doRemoveSubscription(mapping, session, user, subscription);
    328         }
    329
    330         if (subscription == null) {
    331             subscription = user.createSubscription(doGet(form, HOST));
    332             session.setAttribute(Constants.SUBSCRIPTION_KEY, subscription);
    333         }
    334
    335         doPopulate(subscription, form);
    336         doSaveUser(user);
    337         session.removeAttribute(Constants.SUBSCRIPTION_KEY);
    338
    339         return doFindSuccess(mapping);
    340     }
    341
    342 }