Java tutorial
/* * Copyright 2004-2013 ICEsoft Technologies Canada Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package com.icesoft.faces.component.util; import com.icesoft.faces.renderkit.dom_html_basic.FormRenderer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.icefaces.util.EnvUtils; import javax.faces.FacesException; import javax.faces.component.EditableValueHolder; import javax.faces.component.UINamingContainer; import javax.faces.component.UIComponent; import javax.faces.component.UIForm; import javax.faces.component.UIViewRoot; import javax.faces.component.ValueHolder; import javax.faces.component.UIData; import javax.faces.component.html.HtmlInputText; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.el.PropertyNotFoundException; import java.io.IOException; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; public class CustomComponentUtils { private static final String HIDDEN_COMMAND_INPUTS_SET_ATTR = FormRenderer.class.getName() + ".HIDDEN_COMMAND_INPUTS_SET"; public static final String HIDDEN_COMMANDLINK_FIELD_NAME = "_link_hidden_"; public static final String FOOTER_CLASS_ATTR = "footerClass"; public static final String HEADER_CLASS_ATTR = "headerClass"; public static final String[] EMPTY_STRING_ARRAY = new String[0]; public static final String EMPTY_STRING = new String(); private static final String HIDDEN_TREE_NAV_FIELD_NAME = "_idtn"; private static final String HIDDEN_TREE_ACTION_FIELD_NAME = "_idta"; private static final Log log = LogFactory.getLog(CustomComponentUtils.class); public static void restoreAncestorState(UIComponent uiComponent) { uiComponent.setId(uiComponent.getId()); if ((uiComponent = uiComponent.getParent()) != null) { restoreAncestorState(uiComponent); } } public static void restoreDescendentState(UIComponent uiComponent) { uiComponent.setId(uiComponent.getId()); Iterator it = uiComponent.getFacetsAndChildren(); while (it.hasNext()) { UIComponent next = (UIComponent) it.next(); restoreDescendentState(next); } } public static String getStringValue(FacesContext facesContext, UIComponent component) { try { if (!(component instanceof ValueHolder)) { throw new IllegalArgumentException( "Component : " + getPathToComponent(component) + "is not a ValueHolder"); } if (component instanceof EditableValueHolder) { Object submittedValue = ((EditableValueHolder) component).getSubmittedValue(); if (submittedValue != null) { if (submittedValue instanceof String) { return (String) submittedValue; } else { throw new IllegalArgumentException( "Expected submitted value of type String for component : " + getPathToComponent(component)); } } } Object value = ((ValueHolder) component).getValue(); Converter converter = ((ValueHolder) component).getConverter(); if (converter == null && value != null) { if (value instanceof String) { return (String) value; } try { converter = facesContext.getApplication().createConverter(value.getClass()); } catch (FacesException e) { log.error("No converter for class " + value.getClass().getName() + " found (component id=" + component.getId() + ").", e); // converter stays null } } if (converter == null) { if (value == null) { return ""; } else { return value.toString(); } } else { return converter.getAsString(facesContext, component, value); } } catch (PropertyNotFoundException ex) { log.error("Property not found - called by component : " + getPathToComponent(component), ex); throw ex; } } public static String getPathToComponent(UIComponent component) { StringBuffer buf = new StringBuffer(); if (component == null) { buf.append("{Component-Path : "); buf.append("[null]}"); return buf.toString(); } getPathToComponent(component, buf); buf.insert(0, "{Component-Path : "); buf.append("}"); return buf.toString(); } private static void getPathToComponent(UIComponent component, StringBuffer buf) { if (component == null) { return; } StringBuffer intBuf = new StringBuffer(); intBuf.append("[Class: "); intBuf.append(component.getClass().getName()); if (component instanceof UIViewRoot) { intBuf.append(",ViewId: "); intBuf.append(((UIViewRoot) component).getViewId()); } else { intBuf.append(",Id: "); intBuf.append(component.getId()); } intBuf.append("]"); //intBuf.toString for non-1.4 JDK 1.5 compiler output buf.insert(0, intBuf.toString()); if (component != null) { getPathToComponent(component.getParent(), buf); } } public static void addHiddenCommandParameter(UIComponent form, String paramName) { Set set = (Set) form.getAttributes().get(HIDDEN_COMMAND_INPUTS_SET_ATTR); if (set == null) { set = new HashSet(); form.getAttributes().put(HIDDEN_COMMAND_INPUTS_SET_ATTR, set); } set.add(paramName); } public static String getHiddenCommandLinkFieldName(String formName) { return formName + UINamingContainer.getSeparatorChar(FacesContext.getCurrentInstance()) + HIDDEN_COMMANDLINK_FIELD_NAME; } public static String getHiddenTreeExpandFieldName(String componentId, String formName) { return formName + UINamingContainer.getSeparatorChar(FacesContext.getCurrentInstance()) + componentId + HIDDEN_TREE_NAV_FIELD_NAME; } public static String getHiddenTreeActionFieldName(String componentId, String formName) { return formName + UINamingContainer.getSeparatorChar(FacesContext.getCurrentInstance()) + componentId + HIDDEN_TREE_ACTION_FIELD_NAME; } public static String getFormName(UIComponent component, FacesContext context) { //Find form UIComponent parent = component.getParent(); while (parent != null && !(parent instanceof UIForm)) { parent = parent.getParent(); } if (parent != null) { //link is nested inside a form return ((UIForm) parent).getClientId(context); } return "this"; } /** * Split a string into an array of strings arround a character separator. * This function will be efficient for short strings, for longer strings, * another approach may be better * * @param str the string to be split * @param separator the separator character * @return array of string subparts */ public static String[] splitShortString(String str, char separator) { int len; if (str == null || (len = str.length()) == 0) { return EMPTY_STRING_ARRAY; } int lastTokenIndex = 0; // Step 1: how many substrings? // We exchange double scan time for less memory allocation for (int pos = str.indexOf(separator); pos >= 0; pos = str.indexOf(separator, pos + 1)) { lastTokenIndex++; } // Step 2: allocate exact size array String[] list = new String[lastTokenIndex + 1]; int oldPos = 0; // Step 3: retrieve substrings for (int pos = str.indexOf(separator), i = 0; pos >= 0; pos = str.indexOf(separator, (oldPos = (pos + 1)))) { list[i++] = substring(str, oldPos, pos); } list[lastTokenIndex] = substring(str, oldPos, len); return list; } public static String substring(String str, int begin, int end) { if (begin == end) { return ""; } return str.substring(begin, end); } public static String[] trim(String[] strings) { if (strings == null) { return null; } for (int i = 0, len = strings.length; i < len; i++) { strings[i] = strings[i].trim(); } return strings; } public static void renderChildren(FacesContext facesContext, UIComponent component) throws IOException { if (component.getChildCount() > 0) { for (Iterator it = component.getChildren().iterator(); it.hasNext();) { UIComponent child = (UIComponent) it.next(); renderChild(facesContext, child); } } } public static void renderChild(FacesContext facesContext, UIComponent child) throws IOException { if (!child.isRendered()) { return; } child.encodeBegin(facesContext); if (child.getRendersChildren()) { child.encodeChildren(facesContext); } else { renderChildren(facesContext, child); } child.encodeEnd(facesContext); } /** * Gets the comma separated list of visibility user roles from the given * component and checks if current user is in one of these roles. * * @param component a user role aware component * @return true if no user roles are defined for this component or user is * in one of these roles, false otherwise */ public static boolean isVisibleOnUserRole(UIComponent component) { String userRole; if (component instanceof UserRoleAware) { userRole = ((UserRoleAware) component).getVisibleOnUserRole(); } else { userRole = (String) component.getAttributes().get(UserRoleAware.VISIBLE_ON_USER_ROLE_ATTR); } if (userRole == null) { // no restriction return true; } FacesContext facesContext = FacesContext.getCurrentInstance(); StringTokenizer st = new StringTokenizer(userRole, ","); while (st.hasMoreTokens()) { if (facesContext.getExternalContext().isUserInRole(st.nextToken().trim())) { return true; } } return false; } /** * Gets the comma separated list of enabling user roles from the given * component and checks if current user is in one of these roles. * * @param component a user role aware component * @return true if no user roles are defined for this component or user is * in one of these roles, false otherwise */ public static boolean isEnabledOnUserRole(UIComponent component) { String userRole; if (component instanceof UserRoleAware) { userRole = ((UserRoleAware) component).getEnabledOnUserRole(); } else { userRole = (String) component.getAttributes().get(UserRoleAware.ENABLED_ON_USER_ROLE_ATTR); } if (userRole == null) { // no restriction return true; } FacesContext facesContext = FacesContext.getCurrentInstance(); StringTokenizer st = new StringTokenizer(userRole, ","); while (st.hasMoreTokens()) { if (facesContext.getExternalContext().isUserInRole(st.nextToken().trim())) { return true; } } return false; } public static Object newInstance(Class clazz) throws FacesException { try { return clazz.newInstance(); } catch (NoClassDefFoundError e) { throw new FacesException(e); } catch (InstantiationException e) { throw new FacesException(e); } catch (IllegalAccessException e) { throw new FacesException(e); } } /** * Same as {@link #classForName(String)}, but throws a RuntimeException * (FacesException) instead of a ClassNotFoundException. * * @return the corresponding Class * @throws NullPointerException if type is null * @throws FacesException if class not found */ public static Class simpleClassForName(String type) { try { return classForName(type); } catch (ClassNotFoundException e) { throw new FacesException(e); } } public static Object newInstance(String type) throws FacesException { if (type == null) { return null; } return newInstance(simpleClassForName(type)); } /** * Tries a Class.forName with the context class loader of the current thread * first and automatically falls back to the ClassUtils class loader (i.e. * the loader of the myfaces.jar lib) if necessary. * * @param type fully qualified name of a non-primitive non-array class * @return the corresponding Class * @throws NullPointerException if type is null * @throws ClassNotFoundException */ public static Class classForName(String type) throws ClassNotFoundException { if (type == null) { throw new NullPointerException("type"); } if (!EnvUtils.isValidJavaIdentifier(type)) { throw new ClassNotFoundException("not a valid identifier [" + type + "]"); } try { // Try WebApp ClassLoader first return Class.forName(type, false, // do not initialize for faster startup Thread.currentThread().getContextClassLoader()); } catch (ClassNotFoundException ignore) { // fallback: Try ClassLoader for ClassUtils (i.e. the myfaces.jar lib) return Class.forName(type, false, // do not initialize for faster startup CustomComponentUtils.class.getClassLoader()); } } public static boolean isDisabledOrReadOnly(UIComponent component) { return isTrue(component.getAttributes().get("disabled")) || isTrue(component.getAttributes().get("readOnly")); } private static boolean isTrue(Object obj) { if (!(obj instanceof Boolean)) { return false; } return ((Boolean) obj).booleanValue(); } public static void decodeUIInput(FacesContext facesContext, UIComponent component, String clientId) { if (!(component instanceof EditableValueHolder)) { throw new IllegalArgumentException( "Component " + component.getClientId(facesContext) + " is not an EditableValueHolder"); } Map paramMap = facesContext.getExternalContext().getRequestParameterMap(); if (paramMap.containsKey(clientId)) { //request parameter found, set submittedValue ((EditableValueHolder) component).setSubmittedValue(paramMap.get(clientId)); } else { //request parameter not found, nothing to decode - set submitted value to empty //if the component has not been disabled if (!isDisabledOrReadOnly(component)) { ((EditableValueHolder) component).setSubmittedValue(EMPTY_STRING); } } } public static void decodeUIInput(FacesContext facesContext, UIComponent component) { decodeUIInput(facesContext, component, component.getClientId(facesContext)); } public static Date getDateValue(UIComponent component) { if (!(component instanceof ValueHolder)) { throw new IllegalArgumentException( "Component : " + getPathToComponent(component) + "is not a ValueHolder"); } if (component instanceof EditableValueHolder) { Object submittedValue = ((EditableValueHolder) component).getSubmittedValue(); if (submittedValue != null) { if (submittedValue instanceof Date) { return (Date) submittedValue; } // Else, some text was typed into the inputText, which didn't // validate. So, we should fall through to still use value } } Object value = ((ValueHolder) component).getValue(); if (value == null || value instanceof Date) { return (Date) value; } else { throw new IllegalArgumentException( "Expected value of type Date for component : " + getPathToComponent(component)); } } public static void copyHtmlInputTextAttributes(HtmlInputText src, HtmlInputText dest) { dest.setId(src.getId()); dest.setImmediate(src.isImmediate()); dest.setTransient(src.isTransient()); dest.setAccesskey(src.getAccesskey()); dest.setAlt(src.getAlt()); dest.setConverter(src.getConverter()); dest.setDir(src.getDir()); dest.setDisabled(src.isDisabled()); dest.setLang(src.getLang()); dest.setLocalValueSet(src.isLocalValueSet()); dest.setMaxlength(src.getMaxlength()); dest.setOnblur(src.getOnblur()); dest.setOnchange(src.getOnchange()); dest.setOnclick(src.getOnclick()); dest.setOndblclick(src.getOndblclick()); dest.setOnfocus(src.getOnfocus()); dest.setOnkeydown(src.getOnkeydown()); dest.setOnkeypress(src.getOnkeypress()); dest.setOnkeyup(src.getOnkeyup()); dest.setOnmousedown(src.getOnmousedown()); dest.setOnmousemove(src.getOnmousemove()); dest.setOnmouseout(src.getOnmouseout()); dest.setOnmouseover(src.getOnmouseover()); dest.setOnmouseup(src.getOnmouseup()); dest.setOnselect(src.getOnselect()); dest.setReadonly(src.isReadonly()); dest.setRendered(src.isRendered()); dest.setRequired(src.isRequired()); dest.setSize(src.getSize()); dest.setStyle(src.getStyle()); dest.setStyleClass(src.getStyleClass()); dest.setTabindex(src.getTabindex()); dest.setTitle(src.getTitle()); dest.setValidator(src.getValidator()); } public static String setPropertyValue(String css, String propName, String value, boolean add) { String[] properties = css.split(";"); boolean found = false; StringBuffer newCss = new StringBuffer(); for (int i = 0; i < properties.length; i++) { String[] property = properties[i].split(":"); if (property.length == 2) { if (property[0].equalsIgnoreCase(propName)) { if (add) { found = true; newCss.append(propName + ":" + value + ";"); } } else { newCss.append(property[0] + ":" + property[1] + ";"); } } } if (add && !found) { newCss.append(propName + ":" + value + ";"); } return newCss.toString(); } public static String getCssPropertyValue(String css, String propName) { String[] properties = css.split(";"); for (int i = 0; i < properties.length; i++) { String[] property = properties[i].split(":"); if (property.length == 2) { if (property[0].equalsIgnoreCase(propName)) { return property[1]; } } } return null; } //ensures that Ancestor's rendered property is true public static boolean isAncestorRendered(UIComponent component) { if (component == null) return true; if (!component.isRendered()) return false; if (component instanceof UIViewRoot) return true; return isAncestorRendered(component.getParent()); } }