001    // Copyright 2005 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.tapestry.portlet;
016    
017    import java.util.ArrayList;
018    import java.util.Collections;
019    import java.util.Iterator;
020    import java.util.List;
021    
022    import javax.portlet.PortletRequest;
023    
024    import org.apache.tapestry.IRequestCycle;
025    import org.apache.tapestry.PageNotFoundException;
026    
027    /**
028     * Uses the tapestry.portlet.resolver.PageResolverRules configuration point to find a match.
029     * 
030     * @author Howard M. Lewis Ship
031     * @since 4.0
032     */
033    public class MatchingPortletPageResolver implements PortletPageResolver
034    {
035        private List _contributions;
036    
037        private List _sortedContributions;
038    
039        private PortletRequest _request;
040    
041        public void initializeService()
042        {
043            _sortedContributions = new ArrayList(_contributions);
044            Collections.sort(_sortedContributions);
045        }
046    
047        public String getPageNameForRequest(IRequestCycle cycle)
048        {
049            Iterator i = _sortedContributions.iterator();
050            while (i.hasNext())
051            {
052                PageResolverContribution c = (PageResolverContribution) i.next();
053    
054                if (c.match(_request))
055                {
056                    String pageName = c.getPageName();
057    
058                    try
059                    {
060                        cycle.getPage(pageName);
061    
062                        return pageName;
063                    }
064                    catch (PageNotFoundException ex)
065                    {
066                        // Ignore.
067                    }
068                }
069            }
070    
071            // No match, or no matches where the page actually exists.
072    
073            return null;
074        }
075    
076        public void setContributions(List contributions)
077        {
078            _contributions = contributions;
079        }
080    
081        public void setRequest(PortletRequest request)
082        {
083            _request = request;
084        }
085    
086    }