1 /* 2 * $Id: ExecuteCommand.java 471754 2006-11-06 14:55:09Z husted $ 3 * 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 package org.apache.struts.chain.commands; 22 23 import org.apache.commons.chain.Catalog; 24 import org.apache.commons.chain.CatalogFactory; 25 import org.apache.commons.chain.Command; 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 import org.apache.struts.chain.contexts.ActionContext; 29 import org.apache.struts.config.ActionConfig; 30 31 /** 32 * <p>Invoke the appropriate <code>Command</code> for this request. If the 33 * context's <code>ActionConfig</code> has no <code>command</code> property 34 * defined, no action will be taken. If the specified command cannot be 35 * found, a warning will be logged, but processing will continue. Depending 36 * on how the chain is configured, this can be used in place of an 37 * <code>Action</code> or as a method of performing pre-processing. </p> 38 * 39 * <p>If used instead of an action, the command which is looked up should put 40 * an ActionForward into the context, unless it has already dealt with the 41 * response.</p> 42 * 43 * @version $Id: ExecuteCommand.java 471754 2006-11-06 14:55:09Z husted $ 44 */ 45 public class ExecuteCommand extends ActionCommandBase { 46 // ------------------------------------------------------ Instance Variables 47 48 /** 49 * Provide Commons Logging instance for this class. 50 */ 51 private static final Log LOG = LogFactory.getLog(ExecuteCommand.class); 52 53 // ---------------------------------------------------------- Public Methods 54 55 /** 56 * <p>If the <code>context</code> is "valid", lookup a command and execute 57 * it.</p> 58 * 59 * @param actionCtx The <code>Context</code> for the current request 60 * @return the result of the lookup command's <code>execute</code> method, 61 * if executed, or <code>false</code> if it was not executed. 62 * @throws Exception on any error 63 */ 64 public boolean execute(ActionContext actionCtx) 65 throws Exception { 66 if (shouldProcess(actionCtx)) { 67 Command command = getCommand(actionCtx); 68 69 if (command != null) { 70 return (command.execute(actionCtx)); 71 } 72 } 73 74 return (false); 75 } 76 77 /** 78 * <p>Evaluate the current context to see if a command should even be 79 * executed.</p> 80 * 81 * @param context A valid ActionContext 82 * @return TRUE if the pending Command should be executed 83 */ 84 protected boolean shouldProcess(ActionContext context) { 85 // Skip processing if the current request is not valid 86 Boolean valid = context.getFormValid(); 87 88 return ((valid != null) && valid.booleanValue()); 89 } 90 91 /** 92 * <p>Find the <code>ActionConfig</code> in the current context and, if it 93 * is properly configured, lookup the appropriate <code>commons-chain</code> 94 * command.</p> 95 * 96 * @param context A valid ActionContext 97 * @return a <code>Command</code> to execute, or null if none is specified 98 * or if the specified command cannot be found. 99 */ 100 protected Command getCommand(ActionContext context) { 101 ActionConfig actionConfig = context.getActionConfig(); 102 103 String commandName = actionConfig.getCommand(); 104 105 if (commandName == null) { 106 return null; 107 } 108 109 String catalogName = actionConfig.getCatalog(); 110 111 return getCommand(commandName, catalogName); 112 } 113 114 /** 115 * <p> Retrieve the specified Command from the specified Catalog. </p> 116 * 117 * @param commandName The Command to retrieve. 118 * @param catalogName The Catalog to search. 119 * @return Instantiated Command, or null 120 */ 121 protected Command getCommand(String commandName, String catalogName) { 122 if (commandName == null) { 123 return null; 124 } 125 126 Catalog catalog; 127 128 if (catalogName != null) { 129 catalog = CatalogFactory.getInstance().getCatalog(catalogName); 130 131 if (catalog == null) { 132 LOG.warn("When looking up " + commandName + "," 133 + " no catalog found under " + catalogName); 134 135 return null; 136 } 137 } else { 138 catalogName = "the default catalog"; 139 catalog = CatalogFactory.getInstance().getCatalog(); 140 141 if (catalog == null) { 142 LOG.warn("When looking up " + commandName + "," 143 + " no default catalog found."); 144 145 return null; 146 } 147 } 148 149 if (LOG.isDebugEnabled()) { 150 LOG.debug("looking up command " + commandName + " in " 151 + catalogName); 152 } 153 154 return catalog.getCommand(commandName); 155 } 156 }