    001// Copyright 2007, 2008, 2012 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.tapestry5.internal.renderers;
    016
    017import org.apache.tapestry5.MarkupWriter;
    018import org.apache.tapestry5.commons.util.CollectionFactory;
    019import org.apache.tapestry5.http.TapestryHttpSymbolConstants;
    020import org.apache.tapestry5.http.services.Context;
    021import org.apache.tapestry5.http.services.Request;
    022import org.apache.tapestry5.ioc.annotations.Primary;
    023import org.apache.tapestry5.ioc.annotations.Symbol;
    024import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    025import org.apache.tapestry5.services.ObjectRenderer;
    026
    027import java.util.List;
    028
    029public class RequestRenderer implements ObjectRenderer<Request>
    030{
    031    private final Context context;
    032
    033    private final String contextPath;
    034
    035    private final ObjectRenderer masterObjectRenderer;
    036
    037    public RequestRenderer(@Primary ObjectRenderer masterObjectRenderer, Context context, @Symbol(TapestryHttpSymbolConstants.CONTEXT_PATH) String contextPath)
    038    {
    039        this.masterObjectRenderer = masterObjectRenderer;
    040        this.context = context;
    041        this.contextPath = contextPath;
    042    }
    043
    044    public void render(Request request, MarkupWriter writer)
    045    {
    046        coreProperties(request, writer);
    047        parameters(request, writer);
    048        headers(request, writer);
    049        attributes(request, writer);
    050        context(writer);
    051    }
    052
    053    private void coreProperties(Request request, MarkupWriter writer)
    054    {
    055        writer.element("dl", "class", "dl-horizontal");
    056
    057        dt(writer, "Context Path");
    058
    059        writer.element("dd");
    060
    061        if (contextPath.equals(""))
    062        {
    063            writer.element("em");
    064            writer.write("none (deployed as root)");
    065            writer.end();
    066        } else
    067        {
    068            writer.write(contextPath);
    069        }
    070
    071        writer.end(); // dd
    072
    073        dt(writer, "Path", request.getPath());
    074
    075        dt(writer, "Locale", request.getLocale().toString());
    076
    077        dt(writer, "Server Name", request.getServerName());
    078
    079
    080        List<String> flags = CollectionFactory.newList();
    081        if (request.isSecure())
    082        {
    083            flags.add("secure");
    084        }
    085
    086        if (request.isXHR())
    087        {
    088            flags.add("XHR");
    089        }
    090
    091        if (request.isRequestedSessionIdValid())
    092        {
    093            flags.add("requested session id valid");
    094        }
    095
    096        if (request.isSessionInvalidated())
    097        {
    098            flags.add("session invalidated");
    099        }
    100
    101        if (!flags.isEmpty())
    102        {
    103            dt(writer, "Flags", InternalUtils.join(flags));
    104        }
    105
    106        dt(writer, "Ports (local/server)",
    107                String.format("%d / %d", request.getLocalPort(), request.getServerPort()));
    108
    109        dt(writer, "Method", request.getMethod());
    110
    111        writer.end();
    112    }
    113
    114    private void context(MarkupWriter writer)
    115    {
    116        List<String> attributeNames = context.getAttributeNames();
    117
    118        if (attributeNames.isEmpty()) return;
    119
    120        section(writer, "Context Attributes");
    121
    122        writer.element("dl");
    123
    124        for (String name : attributeNames)
    125        {
    126            dt(writer, name);
    127
    128            writer.element("dd");
    129
    130            masterObjectRenderer.render(context.getAttribute(name), writer);
    131
    132            writer.end(); // dd
    133        }
    134
    135        writer.end(); // dl
    136    }
    137
    138    private void parameters(Request request, MarkupWriter writer)
    139    {
    140        List<String> parameterNames = request.getParameterNames();
    141
    142        if (parameterNames.isEmpty())
    143            return;
    144
    145        section(writer, "Query Parameters");
    146
    147        writer.element("dl");
    148
    149        for (String name : parameterNames)
    150        {
    151            String[] values = request.getParameters(name);
    152
    153            dt(writer, name);
    154
    155            writer.element("dd");
    156
    157            if (values.length > 1)
    158            {
    159                writer.element("ul");
    160
    161                for (String value : values)
    162                {
    163                    writer.element("li");
    164                    writer.write(value);
    165                    writer.end();
    166                }
    167
    168                writer.end(); // ul
    169            } else
    170            {
    171                writer.write(values[0]);
    172            }
    173
    174            writer.end(); // dd
    175        }
    176
    177        writer.end(); // dl
    178    }
    179
    180    private void dt(MarkupWriter writer, String name, String value)
    181    {
    182        if (value != null)
    183        {
    184            dt(writer, name);
    185            dd(writer, value);
    186        }
    187    }
    188
    189    private void dt(MarkupWriter writer, String name)
    190    {
    191        writer.element("dt");
    192        writer.write(name);
    193        writer.end();
    194    }
    195
    196    private void dd(MarkupWriter writer, String name)
    197    {
    198        writer.element("dd");
    199        writer.write(name);
    200        writer.end();
    201    }
    202
    203    private void section(MarkupWriter writer, String name)
    204    {
    205        writer.element("h3");
    206        writer.write(name);
    207        writer.end();
    208    }
    209
    210    private void headers(Request request, MarkupWriter writer)
    211    {
    212        section(writer, "Headers");
    213
    214        writer.element("dl", "class", "dl-horizontal");
    215
    216        for (String name : request.getHeaderNames())
    217        {
    218            dt(writer, name, request.getHeader(name));
    219        }
    220
    221        writer.end(); // dl
    222
    223    }
    224
    225    private void attributes(Request request, MarkupWriter writer)
    226    {
    227        List<String> attributeNames = request.getAttributeNames();
    228
    229        if (attributeNames.isEmpty())
    230        {
    231            return;
    232        }
    233
    234        section(writer, "Attributes");
    235
    236        writer.element("dl");
    237
    238        for (String name : attributeNames)
    239        {
    240            dt(writer, name, String.valueOf(request.getAttribute(name)));
    241        }
    242
    243        writer.end(); // dl
    244    }
    245
    246}