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}