/*
* Copyright 2004 original author or authors.
*
* 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 org.extremecomponents.util;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Jeff Johnston
*/
public final class ExtremeUtils {
private static Log logger = LogFactory.getLog(ExtremeUtils.class);
private ExtremeUtils() {
}
/**
* Convert camelCase text to a readable word. example: camelCaseToWord -->
* Camel Case To Word
*/
public static String camelCaseToWord(String camelCaseText) {
if (StringUtils.isEmpty(camelCaseText)) {
return camelCaseText;
}
if (camelCaseText.equals(camelCaseText.toUpperCase())) {
return camelCaseText;
}
char[] ch = camelCaseText.toCharArray();
String first = "" + ch[0];
String build = first.toUpperCase();
for (int i = 1; i < ch.length; i++) {
String test = "" + ch[i];
if (test.equals(test.toUpperCase())) {
build += " ";
}
build += test;
}
return build;
}
public static String formatDate(String parse, String format, Object value) {
return formatDate(parse, format, value, Locale.getDefault());
}
public static String formatDate(String parse, String format, Object value, Locale locale) {
if (value == null) {
return null;
}
if (StringUtils.isBlank(format)) {
String valueAsString = value.toString();
logger.error("The format was not defined for date [" + valueAsString + "].");
return valueAsString;
}
Date date = null;
if (value instanceof Date) {
date = (Date) value;
} else {
String valueAsString = value.toString();
if (StringUtils.isBlank(valueAsString)) {
return valueAsString;
}
if (StringUtils.isBlank(parse)) {
logger.error("The parse was not defined for date String [" + valueAsString + "].");
return valueAsString;
}
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(parse, locale);
date = simpleDateFormat.parse(valueAsString);
} catch (Exception e) {
logger.error("The parse was incorrectly defined for date String [" + valueAsString + "].");
return valueAsString;
}
}
return DateFormatUtils.format(date, format, locale);
}
public static String formatNumber(String format, Object value) {
return formatNumber(format, value, Locale.getDefault());
}
public static String formatNumber(String format, Object value, Locale locale) {
String result = null;
if (value == null) {
return result;
}
if (StringUtils.isBlank(format)) {
logger.error("The format was not defined for number [" + value.toString() + "].");
return value.toString();
}
NumberFormat nf = NumberFormat.getNumberInstance(locale);
DecimalFormat df = (DecimalFormat) nf;
df.applyLocalizedPattern(format);
return df.format(Double.parseDouble(value.toString()));
}
/**
* Get the bean out of the proper scope.
*/
public static Object retrieveFromScope(PageContext pageContext, String name) {
return retrieveFromScope(pageContext, name, null);
}
/**
* Get the bean out of the proper scope.
*/
public static Object retrieveFromScope(PageContext pageContext, String name, String scope) {
if (StringUtils.isBlank(scope)) {
return pageContext.findAttribute(name);
}
int scopeType = PageContext.REQUEST_SCOPE;
if (scope.equalsIgnoreCase("page")) {
scopeType = PageContext.PAGE_SCOPE;
} else if (scope.equalsIgnoreCase("application")) {
scopeType = PageContext.APPLICATION_SCOPE;
} else if (scope.equalsIgnoreCase("session")) {
scopeType = PageContext.SESSION_SCOPE;
}
return pageContext.getAttribute(name, scopeType);
}
public static int sessionSize(HttpSession session) {
int total = 0;
try {
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
Enumeration enumeration = session.getAttributeNames();
while (enumeration.hasMoreElements()) {
String name = (String) enumeration.nextElement();
Object obj = session.getAttribute(name);
oos.writeObject(obj);
int size = baos.size();
total += size;
logger.debug("The session name: " + name + " and the size is: " + size);
}
logger.debug("Total session size is: " + total);
} catch (Exception e) {
logger.error("Could not get the session size - " + ExceptionUtils.formatStackTrace(e));
}
return total;
}
/**
* Get a list of bean or map property names
*/
public static List beanProperties(Object bean) throws Exception {
List properties = new ArrayList();
if (bean instanceof Map) {
properties.addAll(((Map) bean).keySet());
} else {
properties.addAll(BeanUtils.describe(bean).keySet());
}
return properties;
}
/**
* Check to see if it is safe to grab the property from the bean via
* reflection.
*
* PropertyUtils.isReadable() Will throw a runtime IllegalArgumentException
* if bean or property is null. This is a problem when trying to reflect
* further down into an object.
*/
public static boolean isBeanPropertyReadable(Object bean, String property) {
if (bean instanceof Map) {
return ((Map) bean).containsKey(property);
}
boolean isReadable;
try {
isReadable = PropertyUtils.isReadable(bean, property);
} catch (IllegalArgumentException e) {
if (logger.isDebugEnabled()) {
logger.debug("Could not find the property [" + property + "]. Either the bean or property is null");
}
isReadable = false;
}
return isReadable;
}
/**
* Go through the request parameters and figure out which checkboxes are
* selected.
*
* @param startsWithValue
* A way to identify all the checkboxes. For example ckbox_.
*/
public static List checkboxesSelected(HttpServletRequest request, String startsWithValue) {
List results = new ArrayList();
Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = (String) parameterNames.nextElement();
if (parameterName.startsWith(startsWithValue)) {
results.add(StringUtils.substringAfter(parameterName, startsWithValue));
}
}
return results;
}
/**
* Take a map of parameter key/value pairs and create
* a URI query string out of it.
*/
public static String getQueryString(Map parameterMap) {
StringBuffer results = new StringBuffer();
Iterator iterator = parameterMap.keySet().iterator();
for (Iterator iter = iterator; iter.hasNext();) {
String key = (String) iter.next();
String value[] = (String[]) parameterMap.get(key);
if (results.length() == 0) {
results.append("?");
} else {
results.append("&");
}
results.append(key + "=");
if (value != null && value.length > 0) {
results.append(value[0]);
}
}
return results.toString();
}
}