All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.bootsfaces.utils.BsfUtils Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
package net.bootsfaces.utils;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import net.bootsfaces.beans.ELTools;
import net.bootsfaces.expressions.ExpressionResolver;

public class BsfUtils {

	/**
	 * This is a trick method to provide navigation from an ajax request (credit by Ryan Lubke)
	 * In fact, you can map an action to an UICommand that calls this method and return null.
	 * Once the bean sends the redirect, the ajax client receives a message from the server telling the client to redirect to a new page.
	 *
	 *
	 * @param outcome
	 * @throws FacesException
	 */
	// Example:
	// 
	// 
	// 
	// 
	// 
	//
	// 
	// 
	// 
	//
	// @ManagedBean
	// @RequestScoped
	// public class ExampleBean {
	// public String goToNewPage() {
	// BsfUtils.navigateInAjax("/pages/newPage.xhtml"); return null; }
	// }

	public static String navigateInAjax(String outcome)
			throws FacesException {
		FacesContext ctx = FacesContext.getCurrentInstance();
		ExternalContext extContext = ctx.getExternalContext();

		String url = extContext.encodeActionURL(
				ctx.getApplication().getViewHandler().getActionURL(
						ctx, outcome));
		try {
			extContext.redirect(url);
		} catch (IOException ioe) {
			throw new FacesException(ioe);
		}
		return null;
	}

	/**
	 * Check if a generic object is valued
	 * @param obj
	 * @return
	 */
	public static boolean isValued(Object obj) {
		if (obj == null) return false;
		if (obj instanceof String) return isStringValued((String) obj);
		return true;
	}

	/**
	 * Check if a string is valued
	 * @param str
	 * @return
	 */
	public static boolean isStringValued(String str) {
		return str != null && !"".equals(str.trim());
	}

	/**
	 *  Get the string if is not null or empty,
	 *  otherwise return the default value
	 * @param str
	 * @param defaultValue
	 * @return
	 */
	public static String stringOrDefault(String str, String defaultValue) {
		if(isStringValued(str)) return str;
		return defaultValue;
	}

	/**
	 * Transform a snake-case string to a camel-case one.
	 * @param snakeCase
	 * @return
	 */
	public static String snakeCaseToCamelCase(String snakeCase) {
		if(snakeCase.contains("-")) {
			StringBuilder camelCaseStr = new StringBuilder(snakeCase.length());
			boolean toUpperCase = false;
			for (char c : snakeCase.toCharArray()) {
				if (c == '-')
					toUpperCase = true;
				else {
					if (toUpperCase) {
						toUpperCase = false;
						c = Character.toUpperCase(c);
					}
					camelCaseStr.append(c);
				}
			}
			snakeCase = camelCaseStr.toString();
		}
		return snakeCase;
	}

	/**
	 * Transform a snake-case string to a camelCase one.
	 * @param camelCase
	 * @return the original string if there is no camelCase character. Otherwise, a snake-case representation of the camelCase version.
	 */
	public static String camelCaseToSnakeCase(String camelCase) {
		if (null == camelCase || camelCase.length()==0)
			return camelCase;
		StringBuilder snakeCase = new StringBuilder(camelCase.length()+3);
		snakeCase.append(camelCase.charAt(0));
		boolean hasCamelCase=false;
		for (int i = 1; i < camelCase.length(); i++) {
			char c = camelCase.charAt(i);
			if (Character.isUpperCase(c)) {
				snakeCase.append("-");
				c = Character.toLowerCase(c);
				hasCamelCase=true;
			}
			snakeCase.append(c);
		}
		if (!hasCamelCase)
			return camelCase;

		return snakeCase.toString();
	}
	
	/**
	 * Returns JavaScript var name for provided client ID.
	 * @param clientId Client ID to convert to JavaScript var name.
	 * @return JavaScript var name.
	 */
	public static String javaScriptVarName(String clientId) {
		return snakeCaseToCamelCase(clientId.replace(":", "-"));
	}
	
	/**
	 * Returns widget var name for provided client ID.
	 * @param clientId Client ID to convert to widget var name.
	 * @return Widget var name.
	 */
	public static String widgetVarName(String clientId) {
		return javaScriptVarName(clientId) + "Widget";
	}
	
	/**
	 * Escape html special chars from string
	 * @param htmlString
	 * @return
	 */
	public static String escapeHtml(String htmlString) {
		StringBuffer sb = new StringBuffer(htmlString.length());
		// true if last char was blank
		boolean lastWasBlankChar = false;
		int len = htmlString.length();
		char c;

		for (int i = 0; i < len; i++)
		{
			c = htmlString.charAt(i);
			if (c == ' ') {
				// blank gets extra work,
				// this solves the problem you get if you replace all
				// blanks with  , if you do that you loss
				// word breaking
				if (lastWasBlankChar) {
					lastWasBlankChar = false;
					sb.append(" ");
				}
				else {
					lastWasBlankChar = true;
					sb.append(' ');
				}
			}
			else {
				lastWasBlankChar = false;
				//
				// HTML Special Chars
				if (c == '"')
					sb.append(""");
				else if (c == '&')
					sb.append("&");
				else if (c == '<')
					sb.append("<");
				else if (c == '>')
					sb.append(">");
				else if (c == '/')
					sb.append("-");
				else if (c == '\\')
					sb.append("-");
				else if (c == '\n')
					// Handle Newline
					sb.append("<br/>");
				else {
					int ci = 0xffff & c;
					if (ci < 160 )
						// nothing special only 7 Bit
						sb.append(c);
					else {
						// Not 7 Bit use the unicode system
						sb.append("&#");
						sb.append(String.valueOf(ci));
						sb.append(';');
					}
				}
			}
		}
		return sb.toString();
	}

	/**
	 * Escape special jQuery chars in selector query
	 * @param selector
	 * @return
	 */
	public static String escapeJQuerySpecialCharsInSelector(String selector) {
		String jQuerySpecialChars = "!\"#$%&'()*+,./:;<=>?@[]^`{|}~;";
		String[] jsc = jQuerySpecialChars.split("(?!^)");
		for(String c: jsc) {
			selector = selector.replace(c, "\\\\" + c);
		}
		return selector;
	}

	/**
	 * Check if a class is primitive, wrapper or String type.
	 * So, it returns true if is a basic java type class
	 * @param obj
	 * @return
	 */
	public static boolean isPrimitiveOrPrimitiveWrapperOrString(Object obj) {
		if(obj == null) return false;
		return isPrimitiveOrPrimitiveWrapperOrString(obj.getClass());
	}
	public static boolean isPrimitiveOrPrimitiveWrapperOrString(Class type) {
		return (type.isPrimitive() && type != void.class) ||
				type == Double.class || type == Float.class || type == Long.class ||
				type == Integer.class || type == Short.class || type == Character.class ||
				type == Byte.class || type == Boolean.class || type == String.class;
	}

	/**
	 * Get the related form
	 * @param component
	 * @return
	 */
	public static UIForm getClosestForm(UIComponent component) {
		while (component != null) {
			if (component instanceof UIForm) {
				return (UIForm) component;
			}
			component = component.getParent();
		}
		return null;
	}

	/**
	 * Returns the clientId for a component with id="foo".
	 * @return null if there's no such component.
	 */
	public static String getComponentClientId(final String componentId) {
		FacesContext context = FacesContext.getCurrentInstance();
		UIViewRoot root = context.getViewRoot();

		UIComponent c = findComponent(root, componentId);
		if (c==null) {
			return null;
		}
		return c.getClientId(context);
	}

	/**
	 * Finds component with the given id
	 */
	public static UIComponent findComponent(UIComponent c, String id) {
		if (id.equals(c.getId())) {
			return c;
		}
		Iterator kids = c.getFacetsAndChildren();
		while (kids.hasNext()) {
			UIComponent found = findComponent(kids.next(), id);
			if (found != null) {
				return found;
			}
		}
		return null;
	}

	/**
	 * Shortcut for getting context parameters.
	 * @param param context parameter name
	 * @return value of context parameter, may be null or empty
	 */
	public static String getInitParam(String param) {
		return getInitParam(param, FacesContext.getCurrentInstance());
	}

	/**
	 * Shortcut for getting context parameters using an already obtained FacesContext.
	 * @param param context parameter name
	 * @return value of context parameter, may be null or empty
	 */
	public static String getInitParam(String param, FacesContext context) {
		return context.getExternalContext().getInitParameter(param);
	}

	/**
	 * 

* Creates and returns a FacesMessage for the specified Locale. *

* Simplified and streamlined version of the implementation of Mojarra * 2.2.8-b02 (see MessageFactory). * * @param messageId * - the key of the message in the resource bundle * @param params * - substitution parameters * * @return a localized FacesMessage with the severity of * FacesMessage.SEVERITY_ERROR */ public static FacesMessage getMessage(String messageId, String... params) { String summary = null; String detail = null; ResourceBundle bundle; String bundleName; FacesContext context = FacesContext.getCurrentInstance(); Locale locale = context.getViewRoot().getLocale(); // see if we have a user-provided bundle Application app = (FacesContext.getCurrentInstance().getApplication()); if (null != (bundleName = app.getMessageBundle())) { if (null != (bundle = ResourceBundle.getBundle(bundleName, locale, Thread.currentThread().getContextClassLoader()))) { // see if we have a hit try { summary = bundle.getString(messageId); detail = bundle.getString(messageId + "_detail"); } catch (MissingResourceException e) { // ignore } } } // we couldn't find a summary in the user-provided bundle if (null == summary) { // see if we have a summary in the app provided bundle bundle = ResourceBundle.getBundle(FacesMessage.FACES_MESSAGES, locale, Thread.currentThread().getContextClassLoader()); if (null == bundle) { throw new NullPointerException(); } // see if we have a hit try { summary = bundle.getString(messageId); detail = bundle.getString(messageId + "_detail"); } catch (MissingResourceException e) { // ignore } } for (int i = 0; i < params.length; i++) { if (null != summary) { summary = summary.replace("{" + i + "}", params[i]); } if (null != detail) { detail = detail.replace("{" + i + "}", params[i]); } } // At this point, we have a summary and a bundle. FacesMessage ret = new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail); ret.setSeverity(FacesMessage.SEVERITY_ERROR); return ret; } /** * Implementation from Apache Commons Lang * * @param str * @return */ public static Locale toLocale(String str) { if (str == null) { return null; } int len = str.length(); if (len != 2 && len != 5 && len < 7) { throw new IllegalArgumentException("Invalid locale format: " + str); } char ch0 = str.charAt(0); char ch1 = str.charAt(1); if (ch0 < 'a' || ch0 > 'z' || ch1 < 'a' || ch1 > 'z') { throw new IllegalArgumentException("Invalid locale format: " + str); } if (len == 2) { return new Locale(str, ""); } else { if (str.charAt(2) != '_') { throw new IllegalArgumentException("Invalid locale format: " + str); } char ch3 = str.charAt(3); if (ch3 == '_') { return new Locale(str.substring(0, 2), "", str.substring(4)); } char ch4 = str.charAt(4); if (ch3 < 'A' || ch3 > 'Z' || ch4 < 'A' || ch4 > 'Z') { throw new IllegalArgumentException("Invalid locale format: " + str); } if (len == 5) { return new Locale(str.substring(0, 2), str.substring(3, 5)); } else { if (str.charAt(5) != '_') { throw new IllegalArgumentException("Invalid locale format: " + str); } return new Locale(str.substring(0, 2), str.substring(3, 5), str.substring(6)); } } } // Pass the attrs timezone value // Pass facesContext.getViewRoot().getLocale() and attrs locale value public static Locale selectLocale(Locale vrloc, Object loc, UIComponent comp) { java.util.Locale selLocale = vrloc; if (loc != null) { if (loc instanceof String) { selLocale = BsfUtils.toLocale((String) loc); } else if (loc instanceof java.util.Locale) { selLocale = (java.util.Locale) loc; } else { throw new IllegalArgumentException( "Type:" + loc.getClass() + " is not a valid locale type for " + comp.getFamily() + ":" + comp.getClientId()); } } return selLocale; } /** * Selects the Date Pattern to use based on the given Locale if the input * format is null * * @param locale * Locale (may be the result of a call to selectLocale) * @param format * Input format String * @return Date Pattern eg. dd/MM/yyyy */ public static String selectDateFormat(Locale locale, String format) { String selFormat; if (format == null) { selFormat = ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale)).toPattern(); // Since DateFormat.SHORT is silly, return a smart format if (selFormat.equals("M/d/yy")) { return "MM/dd/yyyy"; } if (selFormat.equals("d/M/yy")) { return "dd/MM/yyyy"; } } else { selFormat = format; } return selFormat; } /** * Selects the Date Pattern to use based on the given Locale if the input * format is null * * @param locale * Locale (may be the result of a call to selectLocale) * @param format * optional Input format String, given as Moment.js date format * @return Moment.js Date Pattern eg. DD/MM/YYYY */ public static String selectMomentJSDateFormat(Locale locale, String format) { String selFormat; if (format == null) { selFormat = ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale)).toPattern(); // Since DateFormat.SHORT is silly, return a smart format if (selFormat.equals("M/d/yy")) { return "MM/DD/YYYY"; } if (selFormat.equals("d/M/yy")) { return "DD/MM/YYYY"; } return LocaleUtils.javaToMomentFormat(selFormat); } else { selFormat = format; } return selFormat; } /** * Selects the Date Pattern to use based on the given Locale if the input * format is null * * @param locale * Locale (may be the result of a call to selectLocale) * @param momentJSFormat * Input format String * @return Date Pattern eg. dd/MM/yyyy */ public static String selectJavaDateTimeFormatFromMomentJSFormatOrDefault(Locale locale, String momentJSFormat, boolean withDate, boolean withTime) { if (momentJSFormat == null) { String dateFormat = ""; if (withDate) { dateFormat = ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale)).toPattern(); } String timeFormat = ""; if (withTime) { timeFormat = ((SimpleDateFormat)DateFormat.getTimeInstance(DateFormat.MEDIUM, locale)).toPattern(); } // Since DateFormat.SHORT is silly, return a smart format if (dateFormat.equals("M/d/yy")) { dateFormat = "MM/dd/yyyy"; } else if (dateFormat.equals("d/M/yy")) { dateFormat = "dd/MM/yyyy"; } return (dateFormat + " " + timeFormat).trim(); } else { return LocaleUtils.momentToJavaFormat(momentJSFormat); } } /** * Selects the Date Pattern to use based on the given Locale if the input * format is null * * @param locale * Locale (may be the result of a call to selectLocale) * @param momentJSFormat * Input format String * @return moment.js Date Pattern eg. DD/MM/YYYY */ public static String selectMomentJSDateTimeFormat(Locale locale, String momentJSFormat, boolean withDate, boolean withTime) { if (momentJSFormat == null) { String dateFormat = ""; if (withDate) { dateFormat = ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale)).toPattern(); } String timeFormat = ""; if (withTime) { timeFormat = ((SimpleDateFormat)DateFormat.getTimeInstance(DateFormat.MEDIUM, locale)).toPattern(); } // Since DateFormat.SHORT is silly, return a smart format if (dateFormat.equals("M/d/yy")) { dateFormat = "MM/dd/yyyy"; } else if (dateFormat.equals("d/M/yy")) { dateFormat = "dd/MM/yyyy"; } String result = LocaleUtils.javaToMomentFormat((dateFormat + " " + timeFormat).trim()); // System.out.println(result); return result; } else { return momentJSFormat; } } /** *

* Returns the label property from the specified component. *

* Simplified and adapted version of the implementation of Mojarra 2.2.8-b02 * (see MessageFactory). * * @param context * - the FacesContext for the current request * * @return the label, if any, of the component */ public static String getLabel(FacesContext context, UIComponent comp) { Object o = comp.getAttributes().get("label"); if (o == null || (o instanceof String && ((String) o).length() == 0)) { ValueExpression vex = comp.getValueExpression("label"); if (null != vex) return (String) vex.getValue(context.getELContext()); } if (o == null) { // Use the "clientId" if there was no label specified. o = comp.getClientId(context); } return (String) o; } /** * Read an object from a base64 string * @param s * @return * * @deprecated since potentially unsafe ( #880 ) * public static Object fromString(String s) { try { byte[] data = DatatypeConverter.parseBase64Binary(s); // byte [] data = Base64.getDecoder().decode( s ); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)); Object o = ois.readObject(); ois.close(); return o; } catch(Exception e) { e.printStackTrace(); return null; } } /** * Write an object to base64 string * @param o * @return * * @deprecated since potentially unsafe ( #880 ) * public static String toString(Serializable o) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(o); oos.close(); // return Base64.getEncoder().encodeToString(baos.toByteArray()); return DatatypeConverter.printBase64Binary(baos.toByteArray()); } catch (IOException e) { e.printStackTrace(); return ""; } } */ /** * Resolve the search expression * @param refItem * @return */ public static String resolveSearchExpressions(String refItem) { if (refItem != null) { if (refItem.contains("@") || refItem.contains("*")) { refItem = ExpressionResolver.getComponentIDs(FacesContext.getCurrentInstance(), FacesContext.getCurrentInstance().getViewRoot(), refItem); } } return refItem; } /** * Support method to convert String slider value to float values * @param value * @return */ public static Float[] getSliderValues(String value) { return getSliderValues(value, false); } public static Float[] getSliderValues(String value, boolean isArray) { List floatList = new ArrayList(); if(value != null) { // is an array if (value.trim().startsWith("[") || value.contains(",") || isArray) { if(value.trim().startsWith("[")) value = value.substring(1, value.length() -1); String[] values = value.split(","); for(int i = 0; i < values.length; i++) { try { if(BsfUtils.isStringValued(values[i])) floatList.add(Float.parseFloat(values[i])); } catch(NumberFormatException nfe) { nfe.printStackTrace(); } } // is a single value } else { try { floatList.add(Float.parseFloat(value)); } catch(NumberFormatException nfe) { nfe.printStackTrace(); } } } Float[] values = new Float[floatList.size()]; return floatList.toArray(values); } public static float getSliderValue(String value) { Float[] values = getSliderValues(value); if(values != null) return values[0]; return -1f; } public static int getIntSliderValue(String value) { return (int)getSliderValue(value); } /** * It checks where the framework should place BS feedback classes. * * @return */ public static boolean isLegacyFeedbackClassesEnabled() { String legacyErrorClasses = getInitParam("net.bootsfaces.legacy_error_classes"); legacyErrorClasses=evalELIfPossible(legacyErrorClasses); return legacyErrorClasses.equalsIgnoreCase("true") || legacyErrorClasses.equalsIgnoreCase("yes"); } private static String evalELIfPossible(String expression) { if (expression != null) { if (expression.contains("#")) { expression = ELTools.evalAsString(expression).trim(); } } else expression = ""; return expression; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy