001    // Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.internal.services;
016    
017    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
018    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
019    import org.apache.tapestry5.ioc.util.Stack;
020    import org.apache.tapestry5.services.Context;
021    
022    import javax.servlet.ServletContext;
023    import java.io.File;
024    import java.net.MalformedURLException;
025    import java.net.URL;
026    import java.util.Collections;
027    import java.util.List;
028    import java.util.Set;
029    
030    public class ContextImpl implements Context
031    {
032        private final ServletContext servletContext;
033    
034        public ContextImpl(ServletContext servletContext)
035        {
036            this.servletContext = servletContext;
037        }
038    
039        public URL getResource(String path)
040        {
041            try
042            {
043                return servletContext.getResource(path);
044            }
045            catch (MalformedURLException ex)
046            {
047                throw new RuntimeException(ex);
048            }
049        }
050    
051        public File getRealFile(String path)
052        {
053            String realPath = servletContext.getRealPath(path);
054    
055            return realPath == null ? null : new File(realPath);
056        }
057    
058        public String getInitParameter(String name)
059        {
060            return servletContext.getInitParameter(name);
061        }
062    
063        @SuppressWarnings("unchecked")
064        public List<String> getResourcePaths(String path)
065        {
066            List<String> result = CollectionFactory.newList();
067            Stack<String> queue = CollectionFactory.newStack();
068    
069            queue.push(path);
070    
071            while (!queue.isEmpty())
072            {
073                String current = queue.pop();
074    
075                Set<String> matches = servletContext.getResourcePaths(current);
076    
077                // Tomcat 5.5.20 inside JBoss 4.0.2 has been observed to do this!
078                // Perhaps other servers do as well.
079    
080                if (matches == null) continue;
081    
082                for (String match : matches)
083                {
084                    // Folders are queued up for further expansion.
085    
086                    if (match.endsWith("/")) queue.push(match);
087                    else result.add(match);
088                }
089            }
090    
091            Collections.sort(result);
092    
093            return result;
094        }
095    
096        public Object getAttribute(String name)
097        {
098            return servletContext.getAttribute(name);
099        }
100    
101        public List<String> getAttributeNames()
102        {
103            return InternalUtils.toList(servletContext.getAttributeNames());
104        }
105    
106        public String getMimeType(String file)
107        {
108            return servletContext.getMimeType(file);
109        }
110    }