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        public void addFunction(String prefix, String localName, Method function)
017        {
018            FunctionMappingEntry entry = new FunctionMappingEntry(prefix, localName);
019            functions.put(entry, function);
020        }
021        
022        public void clearFunctions()
023        {
024            functions.clear();
025        }
026        
027        public Method resolveFunction(String prefix, String localName)
028        {
029            FunctionMappingEntry entry = new FunctionMappingEntry(prefix, localName);
030            return (Method)functions.get(entry);
031        }
032    
033        private class FunctionMappingEntry
034        {
035            private String prefix;
036            private String localName;
037            
038            public FunctionMappingEntry(String prefix, String localName)
039            {
040                this.prefix = prefix;
041                this.localName = localName;
042            }
043            
044            public String getLocalName()
045            {
046                return localName;
047            }
048    
049            public String getPrefix()
050            {
051                return prefix;
052            }
053            
054            public boolean equals(Object obj)
055            {
056                if(!(obj instanceof FunctionMappingEntry)) return false;
057                if(obj == this) return true;
058                FunctionMappingEntry otherEntry = (FunctionMappingEntry)obj;
059                boolean prefixOk = false;
060                boolean nameOk = false;
061                if(null == prefix)
062                {
063                    prefixOk = (otherEntry.getPrefix() == null);
064                }
065                else
066                {
067                    prefixOk = prefix.equals(otherEntry.getPrefix());
068                }
069                if(null == localName)
070                {
071                    nameOk = (otherEntry.getLocalName() == null);
072                }
073                else
074                {
075                    nameOk = localName.equals(otherEntry.getLocalName());
076                }
077                return (prefixOk && nameOk);
078            }
079    
080            public int hashCode()
081            {
082                int prefixHash = 0;
083                if(null != prefix)
084                {
085                    prefixHash = prefix.hashCode();
086                }
087                int localHash = 0;
088                if(null != localName)
089                {
090                    localHash = localName.hashCode();
091                }
092                return (prefixHash + localHash);
093            }
094        }
095    }