001 package com.mockrunner.mock.web; 002 003 import java.lang.reflect.Method; 004 import java.util.HashMap; 005 import java.util.Map; 006 007 import javax.servlet.jsp.el.FunctionMapper; 008 009 /** 010 * Mock implementation of <code>FunctionMapper</code>. 011 */ 012 public class MockFunctionMapper implements FunctionMapper 013 { 014 private Map functions = new HashMap(); 015 016 /** 017 * Adds a function for the specified prefix and name. 018 * @param prefix the prefix of the function 019 * @param localName the name of the function 020 * @param function the function as <code>Method</code> 021 */ 022 public void addFunction(String prefix, String localName, Method function) 023 { 024 FunctionMappingEntry entry = new FunctionMappingEntry(prefix, localName); 025 functions.put(entry, function); 026 } 027 028 /** 029 * Clears all functions. 030 */ 031 public void clearFunctions() 032 { 033 functions.clear(); 034 } 035 036 public Method resolveFunction(String prefix, String localName) 037 { 038 FunctionMappingEntry entry = new FunctionMappingEntry(prefix, localName); 039 return (Method)functions.get(entry); 040 } 041 042 private class FunctionMappingEntry 043 { 044 private String prefix; 045 private String localName; 046 047 public FunctionMappingEntry(String prefix, String localName) 048 { 049 this.prefix = prefix; 050 this.localName = localName; 051 } 052 053 public String getLocalName() 054 { 055 return localName; 056 } 057 058 public String getPrefix() 059 { 060 return prefix; 061 } 062 063 public boolean equals(Object obj) 064 { 065 if(!(obj instanceof FunctionMappingEntry)) return false; 066 if(obj == this) return true; 067 FunctionMappingEntry otherEntry = (FunctionMappingEntry)obj; 068 boolean prefixOk = false; 069 boolean nameOk = false; 070 if(null == prefix) 071 { 072 prefixOk = (otherEntry.getPrefix() == null); 073 } 074 else 075 { 076 prefixOk = prefix.equals(otherEntry.getPrefix()); 077 } 078 if(null == localName) 079 { 080 nameOk = (otherEntry.getLocalName() == null); 081 } 082 else 083 { 084 nameOk = localName.equals(otherEntry.getLocalName()); 085 } 086 return (prefixOk && nameOk); 087 } 088 089 public int hashCode() 090 { 091 int hashCode = 17; 092 if(null != prefix) hashCode = (31 * hashCode) + prefix.hashCode(); 093 if(null != localName) hashCode = (31 * hashCode) + localName.hashCode(); 094 return hashCode; 095 } 096 } 097 }