Last active
December 22, 2015 14:48
-
-
Save idefixcert/6487756 to your computer and use it in GitHub Desktop.
Bootstrap Message Renderer for JSF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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("×"); | |
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"); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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