Skip to content

Instantly share code, notes, and snippets.

@idefixcert
Last active December 22, 2015 14:48
Show Gist options
  • Save idefixcert/6487756 to your computer and use it in GitHub Desktop.
Save idefixcert/6487756 to your computer and use it in GitHub Desktop.
Bootstrap Message Renderer for JSF
package at.freelenzer.jsftest.bootstrap;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.component.UIMessage;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;
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.MessageRenderer;
@FacesRenderer(componentFamily = "javax.faces.Message", rendererType = "javax.faces.Message")
public class BootstrapMessageRenderer extends MessageRenderer {
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);
UIMessage messages = (UIMessage) component;
ResponseWriter writer = context.getResponseWriter();
assert (writer != null);
String clientId = ((UIMessage) component).getFor();
@SuppressWarnings("unchecked")
Iterator<FacesMessage> 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, UIMessage 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);
for (FacesMessage msg : messages) {
String summary = msg.getSummary() != null ? msg.getSummary() : "";
String detail = msg.getDetail() != null ? msg.getDetail() : summary;
if (uiMessages.isShowSummary()) {
writer.startElement("strong", component);
writer.writeText(summary, component, null);
writer.endElement("strong");
}
if (uiMessages.isShowDetail()) {
writer.writeText(" " + detail, null);
}
msg.rendered();
}
writer.endElement("div");
}
}
package at.freelenzer.jsftest.bootstrap;
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;
@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 = "";
@SuppressWarnings("unchecked")
Iterator<FacesMessage> 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>at.freelenzer.jsftest.bootstrap.BootstrapMessagesRenderer</renderer-class>
</renderer>
<renderer>
<component-family>javax.faces.Message</component-family>
<renderer-type>javax.faces.Message</renderer-type>
<renderer-class>at.freelenzer.jsftest.bootstrap.BootstrapMessageRenderer</renderer-class>
</renderer>
</render-kit>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment