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
015package org.apache.tapestry.portlet;
016
017import javax.portlet.PortletRequest;
018
019import org.apache.hivemind.impl.BaseLocatable;
020import org.apache.hivemind.util.Defense;
021import org.apache.hivemind.util.ToStringBuilder;
022
023/**
024 * Contribution used for resolving requests to named pages.
025 * 
026 * @author Howard M. Lewis Ship
027 * @since 4.0
028 */
029public class PageResolverContribution extends BaseLocatable implements Comparable
030{
031    private String _portletMode;
032
033    private String _windowState;
034
035    private String _mimeType;
036
037    private String _pageName;
038
039    public void setMimeType(String mimeType)
040    {
041        _mimeType = mimeType;
042    }
043
044    public void setPageName(String pageName)
045    {
046        _pageName = pageName;
047    }
048
049    public String getPageName()
050    {
051        return _pageName;
052    }
053
054    public void setPortletMode(String portletMode)
055    {
056        _portletMode = portletMode;
057    }
058
059    public void setWindowState(String windowState)
060    {
061        _windowState = windowState;
062    }
063
064    int sortScore()
065    {
066        int result = 0;
067
068        if (_mimeType != null)
069            result += 4;
070
071        if (_portletMode != null)
072            result += 2;
073
074        if (_windowState != null)
075            result += 1;
076
077        return result;
078    }
079
080    public String toString()
081    {
082        ToStringBuilder builder = new ToStringBuilder(this);
083
084        builder.append("mimeType", _mimeType);
085        builder.append("portletMode", _portletMode);
086        builder.append("windowState", _windowState);
087        builder.append("pageName", _pageName);
088
089        return builder.toString();
090    }
091
092    public int compareTo(Object o)
093    {
094        int thisScore = sortScore();
095        int otherScore = ((PageResolverContribution) o).sortScore();
096
097        // End result: sorted descending by specificity
098
099        return otherScore - thisScore;
100    }
101
102    public boolean match(PortletRequest request)
103    {
104        Defense.notNull(request, "request");
105
106        if (_mimeType != null && !_mimeType.equals(request.getResponseContentType()))
107            return false;
108
109        if (_portletMode != null && !_portletMode.equals(request.getPortletMode().toString()))
110            return false;
111
112        if (_windowState != null && !_windowState.equals(request.getWindowState().toString()))
113            return false;
114
115        return true;
116    }
117}