1 33 34 package com.icesoft.faces.component.style; 35 36 import com.icesoft.faces.context.DOMContext; 37 import com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer; 38 import com.icesoft.faces.renderkit.dom_html_basic.HTML; 39 import com.icesoft.faces.util.CoreUtils; 40 41 import org.apache.commons.logging.Log; 42 import org.apache.commons.logging.LogFactory; 43 import org.w3c.dom.Element ; 44 45 import javax.faces.component.UIComponent; 46 import javax.faces.context.FacesContext; 47 import javax.servlet.http.HttpServletRequest ; 48 import java.beans.Beans ; 49 import java.io.IOException ; 50 51 55 public class OutputStyleRenderer extends DomBasicRenderer { 56 57 private static Log log = LogFactory.getLog(OutputStyleRenderer.class); 58 private static final String IE_EXTENTION = "_ie"; 59 private static final String IE_7_EXTENTION = "_ie7"; 60 private static final String SAFARI_EXTENTION = "_safari"; 61 private static final String CSS_EXTENTION = ".css"; 62 private static final String DT_EXTENTION = "_dt"; 63 64 private static final int DEFAULT_TYPE = 0; 65 private static final int IE = 1; 66 private static final int SAFARI = 2; 67 private static final int DT = 3; 68 private static final int IE_7 = 4; 69 70 public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) 71 throws IOException { 72 validateParameters(facesContext, uiComponent, OutputStyle.class); 73 try { 74 DOMContext domContext = 75 DOMContext.attachDOMContext(facesContext, uiComponent); 76 if (!domContext.isInitialized()) { 77 OutputStyle outputStyle = (OutputStyle) uiComponent; 78 Element styleEle = buildCssElement(domContext); 79 String href = outputStyle.getHref(); 80 styleEle.setAttribute(HTML.HREF_ATTR, getResourceURL(facesContext,href)); 81 domContext.setRootNode(styleEle); 82 int browserType = browserType(facesContext, uiComponent); 83 if (browserType != DEFAULT_TYPE) { 84 if (href.endsWith(CSS_EXTENTION)) { 85 int i = href.indexOf(CSS_EXTENTION); 86 if (i > 0) { 87 String start = href.substring(0, i); 88 Element ieStyleEle = buildCssElement(domContext); 89 String extention = IE_EXTENTION; 90 if (browserType == SAFARI) { 91 extention = SAFARI_EXTENTION; 92 } 93 if (browserType == DT) { 94 extention = DT_EXTENTION; 95 } 96 if(browserType == IE_7){ 97 extention = IE_7_EXTENTION; 98 } 99 String hrefURL = CoreUtils.resolveResourceURL(facesContext, start + extention + CSS_EXTENTION); 100 ieStyleEle.setAttribute(HTML.HREF_ATTR, hrefURL); 101 styleEle.getParentNode().appendChild(ieStyleEle); 102 } else { 103 throw new RuntimeException ( 104 "OutputStyle file attribute is too short. " + 105 "Needs at least one character before .css. Current Value is [" + 106 href + "]"); 107 } 108 } else { 109 throw new RuntimeException ( 110 "OutputStyle file attribute must end in .css. " + 111 "Current Value is [" + href + "]"); 112 } 113 } 114 115 } 116 domContext.stepOver(); 117 domContext.streamWrite(facesContext, uiComponent); 118 } catch (Exception e) { 119 log.error("Error in OutputStyleRenderer", e); 120 } 121 } 122 123 private Element buildCssElement(DOMContext domContext) { 124 Element styleEle = domContext.createElement("link"); 125 styleEle.setAttribute(HTML.REL_ATTR, "stylesheet"); 126 styleEle.setAttribute(HTML.TYPE_ATTR, "text/css"); 127 return styleEle; 128 } 129 130 private int browserType(FacesContext facesContext, UIComponent uiComponent) { 131 int result = DEFAULT_TYPE; 132 String useragent = ((OutputStyle)uiComponent).getUserAgent(); 133 if(useragent != null){ 134 return _browserType(useragent); 135 } 136 137 Object o = facesContext.getExternalContext().getRequest(); 138 if (o != null) { 139 if (o instanceof HttpServletRequest ) { 140 HttpServletRequest request = (HttpServletRequest ) o; 141 useragent = request.getHeader("user-agent"); 142 if(useragent == null){ 143 useragent = ((OutputStyle)uiComponent).getUserAgent(); 144 } 145 if(useragent == null){ 146 log.warn("Not able to find user agent. Returning default"); 147 return DEFAULT_TYPE; 148 } 149 if(((OutputStyle)uiComponent).getUserAgent() == null){ 150 ((OutputStyle)uiComponent).setUserAgent(useragent.toLowerCase()); 151 } 152 String user = useragent.toLowerCase(); 153 result = _browserType( user); 154 155 } else { 156 log.error( 157 "OutputStyleRenderer: Request is not HttpServletRequest. Its [" + 158 o.getClass().getName() + "]"); 159 } 160 } else { 161 log.error( 162 "IceStyleReader: facesContext.getExternalContext().getRequest() is null"); 163 } 164 return result; 165 } 166 167 private int _browserType(String user) { 168 int result = DEFAULT_TYPE; 169 if (Beans.isDesignTime()) { 170 result = DT; 171 } else { 172 if (user.indexOf("msie") != -1) { 173 result = IE; 174 if(user.indexOf("msie 7") != -1){ 175 result = IE_7; 176 } 177 } else if (user.indexOf("safari") != -1) { 178 result = SAFARI; 179 } 180 } 181 return result; 182 } 183 } 184 | Popular Tags |