Last active
July 26, 2018 17:12
-
-
Save mychalvlcek/4151211 to your computer and use it in GitHub Desktop.
Component which overrides the default JSF Message renderer by Bootstrap alert design.
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
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> |
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 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("×"); | |
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>com.example.yourpackage.BootstrapMessagesRenderer</renderer-class> | |
</renderer> | |
</render-kit> |
great, thanks!
Nice! Thanks!
Works awesome! Thanks ^^
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks a lot!