/**
* Copyright 2005-2010 hdiv.org
*
* 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 org.hdiv.logger;
import java.util.Iterator;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UISelectBoolean;
import javax.faces.component.html.HtmlInputSecret;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlInputTextarea;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hdiv.logs.Logger;
import org.hdiv.util.HDIVErrorCodes;
import org.hdiv.util.UtilsJsf;
/**
* Class for logging messages found in the components that show any
* data modification by the user.
*
*
* @author Gotzon Illarramendi
*
*/
public class LogMessages {
private static Log log = LogFactory.getLog(LogMessages.class);
/**
* HDIV logger
*/
private Logger logger;
/**
* Initilization method
*
* @param logger
* active logger
*/
public void init(Logger logger) {
this.logger = logger;
}
/**
* Searches for validation messages created by the framework itself that
* show value modification by the user and creates logs for them.
*
* @param facesContext
* request context
*/
public void manageMessages(FacesContext facesContext) {
Iterator clientIterator = facesContext.getClientIdsWithMessages();
while (clientIterator.hasNext()) {
String clientId = (String) clientIterator.next();
HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
String requestValue = request.getParameter(clientId);
// Remove row identifiers from clientId
String clientIdWithoutRowId = UtilsJsf.removeRowId(clientId);
UIComponent clientComponent = facesContext.getViewRoot().findComponent(clientIdWithoutRowId);
Iterator clientMessages = facesContext.getMessages(clientId);
manageClientMessages(requestValue, facesContext, clientComponent, clientMessages);
}
}
/**
* Creates a log for the corresponding component
*
* @param requestValue
* real value
* @param facesContext
* request context
* @param clientComponent
* component that has been modified
* @param clientMessages
* messages created by the framework
*/
private void manageClientMessages(String requestValue, FacesContext facesContext, UIComponent clientComponent,
Iterator clientMessages) {
// If it is editable data, that is: HtmlInputText, HtmlInputTextarea
// or HtmlInputSecret
if (clientComponent instanceof UIInput) {
boolean isTextEditable = (clientComponent instanceof HtmlInputText)
|| (clientComponent instanceof HtmlInputTextarea) || (clientComponent instanceof HtmlInputSecret);
boolean isUISelectBoolean = clientComponent instanceof UISelectBoolean;
// If it is UISelectOne or UISelectMany:
if ((!isTextEditable) && (!isUISelectBoolean)) {
// Check all messages from component
while (clientMessages.hasNext()) {
FacesMessage message = (FacesMessage) clientMessages.next();
if (log.isDebugEnabled()) {
log.debug("Message detail:" + message.getDetail());
}
String value = null;
if (clientComponent instanceof UIInput) {
value = requestValue;
}
this.logger.log(HDIVErrorCodes.PARAMETER_VALUE_INCORRECT, LoggerUtil.getTarget(facesContext),
clientComponent.getClientId(facesContext), value);
}
}
}
}
}