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.commons.chain.web.servlet; 018 019 020 import javax.servlet.http.HttpServletRequest; 021 import org.apache.commons.chain.Catalog; 022 import org.apache.commons.chain.Context; 023 import org.apache.commons.chain.Command; 024 import org.apache.commons.chain.generic.LookupCommand; 025 026 027 /** 028 * <p>{@link Command} that uses the "servlet path" component of the request URI 029 * to select a {@link Command} from the appropriate {@link Catalog}, and 030 * execute it. To use this command, you would typically map an instance 031 * of {@link ChainProcessor} to an extension pattern like "*.execute" and 032 * then arrange that this is the default command to be executed. In such 033 * an environment, a request for a context relative URI of "/foo.execute" 034 * would cause the "/foo.execute" command to be loaded and executed.</p> 035 * 036 * @author Craig R. McClanahan 037 */ 038 039 public class ServletPathMapper extends LookupCommand implements Command { 040 041 042 // ------------------------------------------------------ Instance Variables 043 044 045 private String catalogKey = ChainProcessor.CATALOG_DEFAULT; 046 047 048 // -------------------------------------------------------------- Properties 049 050 051 /** 052 * <p>Return the context key under which our {@link Catalog} has been 053 * stored.</p> 054 * 055 * @return The context key for the Catalog. 056 * 057 * @deprecated Use catalogName to specify the name of the catalog in the 058 * catalog factory 059 */ 060 public String getCatalogKey() { 061 062 return (this.catalogKey); 063 064 } 065 066 067 /** 068 * <p>Set the context key under which our {@link Catalog} has been 069 * stored.</p> 070 * 071 * @param catalogKey The new catalog key 072 * 073 * @deprecated Use catalogName to specify the name of the catalog in the 074 * catalog factory 075 */ 076 public void setCatalogKey(String catalogKey) { 077 078 this.catalogKey = catalogKey; 079 080 } 081 082 083 // --------------------------------------------------------- Command Methods 084 085 086 /** 087 * <p>Look up the servlet path information for this request, and use it to 088 * select an appropriate {@link Command} to be executed. 089 * 090 * @param context Context for the current request 091 * @return The name of the {@link Command} instance 092 * 093 * @since Chain 1.2 094 */ 095 protected String getCommandName(Context context) { 096 097 // Look up the servlet path for this request 098 ServletWebContext swcontext = (ServletWebContext) context; 099 HttpServletRequest request = swcontext.getRequest(); 100 String servletPath = (String) 101 request.getAttribute("javax.servlet.include.servlet_path"); 102 if (servletPath == null) { 103 servletPath = request.getServletPath(); 104 } 105 106 return servletPath; 107 108 } 109 110 /** 111 * <p>Return the {@link Catalog} to look up the {@link Command} in.</p> 112 * 113 * @param context {@link Context} for this request 114 * @return The catalog. 115 * @exception IllegalArgumentException if no {@link Catalog} 116 * can be found 117 * 118 * @since Chain 1.2 119 */ 120 protected Catalog getCatalog(Context context) { 121 Catalog catalog = (Catalog) context.get(getCatalogKey()); 122 if (catalog == null) { 123 catalog = super.getCatalog(context); 124 } 125 return catalog; 126 } 127 128 }