001// Copyright 2007, 2008 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.internal.InternalConstants;
019import org.apache.tapestry5.ioc.annotations.Primary;
020import org.apache.tapestry5.services.Context;
021import org.apache.tapestry5.services.ObjectRenderer;
022import org.apache.tapestry5.services.Request;
023
024import java.util.List;
025
026public class RequestRenderer implements ObjectRenderer<Request>
027{
028    private final Context context;
029
030    private final ObjectRenderer masterObjectRenderer;
031
032    public RequestRenderer(@Primary ObjectRenderer masterObjectRenderer, Context context)
033    {
034        this.masterObjectRenderer = masterObjectRenderer;
035        this.context = context;
036    }
037
038    public void render(Request request, MarkupWriter writer)
039    {
040        writer.element("dl");
041
042        dt(writer, "Context Path");
043
044        writer.element("dd");
045
046        String contextPath = request.getContextPath();
047
048        if (contextPath.equals(""))
049        {
050            writer.element("em");
051            writer.write("none (deployed as root)");
052            writer.end();
053        }
054        else
055        {
056            writer.write(contextPath);
057        }
058        writer.end(); // dd
059
060        dt(writer, "Request Path");
061        dd(writer, request.getPath());
062
063        dt(writer, "Locale");
064        dd(writer, request.getLocale().toString());
065
066        dt(writer, "Secure");
067        dd(writer, Boolean.toString(request.isSecure()));
068
069        dt(writer, "Server Name");
070        dd(writer, request.getServerName());
071
072        writer.end();
073
074        parameters(request, writer);
075        headers(request, writer);
076        context(writer);
077    }
078
079    private void context(MarkupWriter writer)
080    {
081        List<String> attributeNames = context.getAttributeNames();
082
083        if (attributeNames.isEmpty()) return;
084
085        section(writer, "Context Attributes");
086
087        writer.element("dl");
088
089        for (String name : attributeNames)
090        {
091            dt(writer, name);
092
093            writer.element("dd");
094
095            masterObjectRenderer.render(context.getAttribute(name), writer);
096
097            writer.end(); // dd
098        }
099
100        writer.end(); // dl
101    }
102
103    private void parameters(Request request, MarkupWriter writer)
104    {
105        List<String> parameterNames = request.getParameterNames();
106
107        if (parameterNames.isEmpty())
108            return;
109
110        section(writer, "Query Parameters");
111
112        writer.element("dl");
113
114        for (String name : parameterNames)
115        {
116            String[] values = request.getParameters(name);
117
118            dt(writer, name);
119
120            writer.element("dd");
121
122            if (values.length > 1)
123            {
124                writer.element("ul");
125
126                for (String value : values)
127                {
128                    writer.element("li");
129                    writer.write(value);
130                    writer.end();
131                }
132
133                writer.end(); // ul
134            }
135            else
136            {
137                writer.write(values[0]);
138            }
139
140            writer.end(); // dd
141        }
142
143        writer.end(); // dl
144    }
145
146    private void dt(MarkupWriter writer, String name)
147    {
148        writer.element("dt");
149        writer.write(name);
150        writer.end();
151    }
152
153    private void dd(MarkupWriter writer, String name)
154    {
155        writer.element("dd");
156        writer.write(name);
157        writer.end();
158    }
159
160    private void section(MarkupWriter writer, String name)
161    {
162        writer.element("div", "class", InternalConstants.OBJECT_RENDER_DIV_SECTION);
163        writer.write(name);
164        writer.end();
165    }
166
167    private void headers(Request request, MarkupWriter writer)
168    {
169        section(writer, "Headers");
170
171        writer.element("dl");
172
173        for (String name : request.getHeaderNames())
174        {
175            dt(writer, name);
176            dd(writer, request.getHeader(name));
177        }
178
179        writer.end(); // dl
180
181    }
182
183}