001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.myfaces.tobago.util; 021 022 import org.apache.commons.logging.Log; 023 import org.apache.commons.logging.LogFactory; 024 025 import javax.faces.context.FacesContext; 026 import javax.faces.context.ExternalContext; 027 import javax.faces.event.PhaseEvent; 028 import javax.faces.event.PhaseId; 029 import javax.faces.event.PhaseListener; 030 import javax.faces.application.FacesMessage; 031 import javax.servlet.http.HttpServletRequest; 032 import javax.servlet.http.HttpServletResponse; 033 import java.util.Date; 034 import java.util.Map; 035 import java.util.Iterator; 036 import java.text.MessageFormat; 037 038 /* 039 * Date: Dec 6, 2005 040 * Time: 7:50:25 PM 041 */ 042 public class DebugPhaseListener implements PhaseListener { 043 private static final Log LOG = LogFactory.getLog(DebugPhaseListener.class); 044 private static final String KEY = DebugPhaseListener.class.getName() + "_ID_"; 045 046 @SuppressWarnings("unchecked") 047 public void afterPhase(PhaseEvent phaseEvent) { 048 if (LOG.isInfoEnabled()) { 049 Date end = new Date(); 050 FacesContext facesContext = phaseEvent.getFacesContext(); 051 Map map = facesContext.getExternalContext().getRequestMap(); 052 map.put(KEY + phaseEvent.getPhaseId().getOrdinal() + "E", end); 053 054 if (LOG.isTraceEnabled()) { 055 LOG.trace("After Phase :" + phaseEvent.getPhaseId() 056 + " Time=" + end.getTime()); 057 } 058 059 if (LOG.isDebugEnabled()) { 060 Date start 061 = (Date) map.get(KEY + phaseEvent.getPhaseId().getOrdinal() + "S"); 062 LOG.debug("Phase " + phaseEvent.getPhaseId() + " needs " 063 + (end.getTime() - start.getTime() + " milliseconds")); 064 } 065 066 if (phaseEvent.getPhaseId().getOrdinal() == 6) { 067 if (LOG.isTraceEnabled()) { 068 HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); 069 LOG.trace(" response Locale = \"" + response.getLocale() + "\""); 070 LOG.trace(" response ContentType = \"" + response.getContentType() + "\""); 071 LOG.trace(" response CharacterEncoding = \"{" + response.getCharacterEncoding() + "}\""); 072 } 073 074 Date start = (Date) map.get(KEY + "1S"); 075 if (start != null) { 076 LOG.info("Total response time : " 077 + (end.getTime() - start.getTime() + " milliseconds")); 078 } 079 } 080 for (Iterator iter = facesContext.getClientIdsWithMessages(); iter.hasNext();) { 081 String clientId = (String) iter.next(); 082 083 for (Iterator msgIter = facesContext.getMessages(clientId); msgIter.hasNext();) { 084 FacesMessage msg = (FacesMessage) msgIter.next(); 085 LOG.info(MessageFormat.format("Faces message found." 086 + "\n Component: {0} \n Severity : {1}" 087 + "\n Summary : {2} \n Detail : {3}", 088 new Object[]{clientId, msg.getSeverity(), msg.getSummary(), msg.getDetail()})); 089 } 090 } 091 } 092 } 093 094 @SuppressWarnings("unchecked") 095 public void beforePhase(PhaseEvent phaseEvent) { 096 if (LOG.isInfoEnabled()) { 097 Date start = null; 098 Map map = null; 099 PhaseId phaseId = phaseEvent.getPhaseId(); 100 if (LOG.isDebugEnabled() || phaseId.getOrdinal() == 1) { 101 102 ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 103 104 if (LOG.isTraceEnabled() && PhaseId.RESTORE_VIEW == phaseId) { 105 // this is before restoreView 106 107 Object request = externalContext.getRequest(); 108 if (request instanceof HttpServletRequest) { 109 HttpServletRequest servletRequest = (HttpServletRequest) request; 110 LOG.trace("RequestURI = " + servletRequest.getRequestURI()); 111 } 112 Map headerMap = externalContext.getRequestHeaderMap(); 113 for (Object key : headerMap.keySet()) { 114 LOG.trace("Header : \"" + key + "\" = \"" + headerMap.get(key) + "\""); 115 } 116 Map parameterMap = externalContext.getRequestParameterMap(); 117 for (Object key : parameterMap.keySet()) { 118 LOG.trace("Param : \"" + key + "\" = \"" + parameterMap.get(key) + "\""); 119 } 120 } 121 122 start = new Date(); 123 map = externalContext.getRequestMap(); 124 map.put(KEY + phaseId.getOrdinal() + "S", start); 125 } 126 127 if (LOG.isDebugEnabled()) { 128 Date end = null; 129 int ordinal = phaseId.getOrdinal(); 130 while (end == null && ordinal > 0) { 131 end = (Date) map.get(KEY + --ordinal + "E"); 132 } 133 if (end != null) { 134 LOG.debug("Time between phases " + ordinal + " and " + phaseId.getOrdinal() + ": " 135 + (start.getTime() - end.getTime()) + " milliseconds"); 136 } 137 } 138 if (LOG.isTraceEnabled()) { 139 LOG.trace("Before Phase :" + phaseId 140 + " Time=" + start.getTime()); 141 } 142 } 143 } 144 145 public PhaseId getPhaseId() { 146 return PhaseId.ANY_PHASE; 147 } 148 }