/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.citrus.webx.handler.component;
import static com.alibaba.citrus.util.CollectionUtil.*;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.citrus.util.internal.webpagelite.PageComponent;
import com.alibaba.citrus.util.internal.webpagelite.PageComponentRegistry;
import com.alibaba.citrus.webx.handler.RequestHandlerContext;
import com.alibaba.citrus.webx.handler.support.AbstractVisitor;
public class RequestComponent extends PageComponent {
private final KeyValuesComponent keyValuesComponent;
public RequestComponent(PageComponentRegistry registry, String componentPath, KeyValuesComponent keyValuesComponent) {
super(registry, componentPath);
this.keyValuesComponent = keyValuesComponent;
}
public void visitTemplate(RequestHandlerContext context) {
getTemplate().accept(new RequestVisitor(context));
}
@SuppressWarnings("unused")
private class RequestVisitor extends AbstractVisitor {
private final HttpServletRequest request;
private final ServletContext servletContext;
public RequestVisitor(RequestHandlerContext context) {
super(context, RequestComponent.this);
this.request = context.getRequest();
this.servletContext = context.getServletContext();
}
public void visitBasicInfo() {
Map<String, Object> keyValues = createLinkedHashMap();
keyValues.put("Method", request.getMethod());
keyValues.put("Protocol", request.getProtocol());
keyValues.put("Request URL", request.getRequestURL().toString());
keyValues.put("Query String", request.getQueryString());
keyValues.put("Scheme", request.getScheme());
keyValues.put("Server Name", request.getServerName());
keyValues.put("Server Port", String.valueOf(request.getServerPort()));
keyValues.put("Context Path", request.getContextPath());
keyValues.put("Servlet Path", request.getServletPath());
keyValues.put("Path Info", request.getPathInfo());
keyValues.put("Path Translated", request.getPathTranslated());
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitConnectionInfo() {
Map<String, Object> keyValues = createLinkedHashMap();
keyValues.put("Local Name", request.getLocalName());
keyValues.put("Local Address", request.getLocalAddr());
keyValues.put("Local Port", String.valueOf(request.getLocalPort()));
keyValues.put("Remote Host", request.getRemoteHost());
keyValues.put("Remote Address", request.getRemoteAddr());
keyValues.put("Remote Port", String.valueOf(request.getRemotePort()));
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitAuthInfo() {
Map<String, Object> keyValues = createLinkedHashMap();
keyValues.put("Remote User", request.getRemoteUser());
keyValues.put("Auth Type", request.getAuthType());
keyValues.put("User Principal", String.valueOf(request.getUserPrincipal()));
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitMisc() {
Map<String, Object> keyValues = createLinkedHashMap();
keyValues.put("Character Encoding", request.getCharacterEncoding());
keyValues.put("Content Length", String.valueOf(request.getContentLength()));
keyValues.put("Content Type", request.getContentType());
keyValues.put("Preferred Locale", String.valueOf(request.getLocale()));
keyValues.put("Supported Locales", enumToList(request.getLocales()));
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitParameters() {
Map<String, Object> keyValues = createTreeMap();
for (String name : enumToList(request.getParameterNames())) {
keyValues.put(name, createArrayList(request.getParameterValues(name)));
}
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitHeaders() {
Map<String, Object> keyValues = createTreeMap();
for (String name : enumToList(request.getHeaderNames())) {
keyValues.put(name, enumToList(request.getHeaders(name)));
}
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitCookies() {
Map<String, Object> keyValues = createTreeMap();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
keyValues.put(cookie.getName(), cookie.getValue());
}
}
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitAttributes() {
Map<String, Object> keyValues = createTreeMap();
for (String name : enumToList(request.getAttributeNames())) {
keyValues.put(name, request.getAttribute(name));
}
keyValuesComponent.visitTemplate(context, keyValues);
}
public void visitContextAttributes() {
Map<String, Object> keyValues = createTreeMap();
for (String name : enumToList(servletContext.getAttributeNames())) {
keyValues.put(name, String.valueOf(servletContext.getAttribute(name)));
}
keyValuesComponent.visitTemplate(context, keyValues);
}
private List<String> enumToList(Enumeration<?> i) {
List<String> list = createArrayList();
if (i != null) {
while (i.hasMoreElements()) {
list.add(String.valueOf(i.nextElement()));
}
}
return list;
}
}
}