Skip to content

Instantly share code, notes, and snippets.

@mychalvlcek
Last active July 26, 2018 17:12
Show Gist options
  • Save mychalvlcek/4151211 to your computer and use it in GitHub Desktop.
Save mychalvlcek/4151211 to your computer and use it in GitHub Desktop.
Component which overrides the default JSF Message renderer by Bootstrap alert design.
Component which overrides the default JSF Message renderer by Bootstrap alert design.
faces-config.xml:
<render-kit>
<renderer>
<component-family>javax.faces.Messages</component-family>
<renderer-type>javax.faces.Messages</renderer-type>
<renderer-class>com.example.yourpackage.BootstrapMessagesRenderer</renderer-class>
</renderer>
</render-kit>
package com.example.yourpackage;
import java.io.IOException;
import java.util.Iterator;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIMessages;
import javax.faces.context.FacesContext;
import javax.faces.render.FacesRenderer;
import javax.faces.context.ResponseWriter;
import com.sun.faces.renderkit.Attribute;
import com.sun.faces.renderkit.AttributeManager;
import com.sun.faces.renderkit.RenderKitUtils;
import com.sun.faces.renderkit.html_basic.MessagesRenderer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage.Severity;
/**
* Component for twitter bootstrap alerts.
* Overrides default JSF Message renderer with Bootstrap alert design.
*
* @author vlcekmi3
*/
@FacesRenderer(componentFamily="javax.faces.Messages", rendererType="javax.faces.Messages")
public class BootstrapMessagesRenderer extends MessagesRenderer {
private static final Attribute[] ATTRIBUTES = AttributeManager.getAttributes(AttributeManager.Key.MESSAGESMESSAGES);
@Override
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
super.encodeBegin(context, component);
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
rendererParamsNotNull(context, component);
if (!shouldEncode(component)) return;
boolean mustRender = shouldWriteIdAttribute(component);
UIMessages messages = (UIMessages) component;
ResponseWriter writer = context.getResponseWriter();
assert(writer != null);
String clientId = ((UIMessages) component).getFor();
if (clientId == null)
if (messages.isGlobalOnly())
clientId = "";
Iterator messageIter = getMessageIter(context, clientId, component);
assert(messageIter != null);
if (!messageIter.hasNext()) {
if (mustRender) {
if ("javax_faces_developmentstage_messages".equals(component.getId())) {
return;
}
writer.startElement("div", component);
writeIdAttributeIfNecessary(context, writer, component);
writer.endElement("div");
}
return;
}
writeIdAttributeIfNecessary(context, writer, component);
// style is rendered as a passthru attribute
RenderKitUtils.renderPassThruAttributes(context, writer, component, ATTRIBUTES);
Map<Severity, List<FacesMessage>> msgs = new HashMap<Severity, List<FacesMessage>>();
msgs.put(FacesMessage.SEVERITY_INFO, new ArrayList<FacesMessage>()); // Bootstrap info
msgs.put(FacesMessage.SEVERITY_WARN, new ArrayList<FacesMessage>()); // Bootstrap warning
msgs.put(FacesMessage.SEVERITY_ERROR, new ArrayList<FacesMessage>()); // Bootstrap error
msgs.put(FacesMessage.SEVERITY_FATAL, new ArrayList<FacesMessage>()); // Bootstrap error
while (messageIter.hasNext()) {
FacesMessage curMessage = (FacesMessage) messageIter.next();
if (curMessage.isRendered() && !messages.isRedisplay()) {
continue;
}
msgs.get(curMessage.getSeverity()).add(curMessage);
}
List<FacesMessage> severityMessages = msgs.get(FacesMessage.SEVERITY_FATAL);
if (severityMessages.size() > 0){
encodeSeverityMessages(context, component, messages, FacesMessage.SEVERITY_FATAL, severityMessages);
}
severityMessages = msgs.get(FacesMessage.SEVERITY_ERROR);
if (severityMessages.size() > 0){
encodeSeverityMessages(context, component, messages, FacesMessage.SEVERITY_ERROR, severityMessages);
}
severityMessages = msgs.get(FacesMessage.SEVERITY_WARN);
if (severityMessages.size() > 0){
encodeSeverityMessages(context, component, messages, FacesMessage.SEVERITY_WARN, severityMessages);
}
severityMessages = msgs.get(FacesMessage.SEVERITY_INFO);
if (severityMessages.size() > 0){
encodeSeverityMessages(context, component, messages, FacesMessage.SEVERITY_INFO, severityMessages);
}
}
private void encodeSeverityMessages(FacesContext facesContext, UIComponent component, UIMessages uiMessages, Severity severity, List<FacesMessage> messages) throws IOException {
ResponseWriter writer = facesContext.getResponseWriter();
String alertSeverityClass = "";
if(FacesMessage.SEVERITY_INFO.equals(severity)) {
alertSeverityClass = "alert-info";
} else if(FacesMessage.SEVERITY_WARN.equals(severity)) {
alertSeverityClass = ""; // Default alert is a warning
} else if(FacesMessage.SEVERITY_ERROR.equals(severity)) {
alertSeverityClass = "alert-error";
} else if(FacesMessage.SEVERITY_FATAL.equals(severity)) {
alertSeverityClass = "alert-error";
}
writer.startElement("div", null);
writer.writeAttribute("class", "alert " + alertSeverityClass, "alert " + alertSeverityClass);
writer.startElement("a", component);
writer.writeAttribute("class", "close", "class");
writer.writeAttribute("data-dismiss", "alert", "data-dismiss");
writer.writeAttribute("href", "#", "href");
writer.write("&times;");
writer.endElement("a");
writer.startElement("ul", null);
for (FacesMessage msg : messages){
String summary = msg.getSummary() != null ? msg.getSummary() : "";
String detail = msg.getDetail() != null ? msg.getDetail() : summary;
writer.startElement("li", component);
if (uiMessages.isShowSummary()) {
writer.startElement("strong", component);
writer.writeText(summary, component, null);
writer.endElement("strong");
}
if (uiMessages.isShowDetail()) {
writer.writeText(" " + detail, null);
}
writer.endElement("li");
msg.rendered();
}
writer.endElement("ul");
writer.endElement("div");
}
}
<render-kit>
<renderer>
<component-family>javax.faces.Messages</component-family>
<renderer-type>javax.faces.Messages</renderer-type>
<renderer-class>com.example.yourpackage.BootstrapMessagesRenderer</renderer-class>
</renderer>
</render-kit>
@bvansomeren
Copy link

Thanks for this!

@omrsin
Copy link

omrsin commented Nov 30, 2014

Thanks a lot!

@Emiliano22
Copy link

great, thanks!

@brunocarneiro312
Copy link

Nice! Thanks!

@cleonilson
Copy link

Works awesome! Thanks ^^

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment