/* ===========================================================
* TradeManager : a application to trade strategies for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Project Info: org.trade
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Oracle, Inc.
* in the United States and other countries.]
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Original Author: Simon Allen;
* Contributor(s): -;
*
* Changes
* -------
*
*/
package org.trade.core.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import org.trade.core.dao.Aspect;
import org.trade.core.properties.CollectionUtilities;
import org.trade.core.valuetype.Decode;
/**
*/
public class CoreUtils {
/**
* Replace substrings of a string.
*
* @param replaceIn
* String
* @param toReplace
* String
* @param replaceWith
* String
* @return String
*/
public static final String replace(String replaceIn, String toReplace, String replaceWith) {
StringBuffer buf = new StringBuffer(replaceIn);
int replaceLength = toReplace.length();
int replaceWithLength = replaceWith.length();
int netLength = replaceWithLength - replaceLength;
int index = -1;
int count = 0;
while ((index = replaceIn.indexOf(toReplace, index + 1)) != -1) {
int bufIndex = index + (count * netLength);
buf.replace(bufIndex, bufIndex + replaceLength, replaceWith);
count++;
}
return buf.toString();
}
/**
* Convert a string into a Java string representation. This just changes \
* to \\ and " to \".
*
* @param unescaped
* String
* @return String
*/
public static final String escapeJava(String unescaped) {
String escaped = replace(unescaped, "\\", "\\\\");
escaped = replace(escaped, "\"", "\\\"");
return escaped;
}
/**
* Returns a Hashtable of the attribute anems and vales in alpha order
* Returns a <code>Hashtable</code>
*
*
* @since ICAP Version Exchange
* @param aspect
* Aspect
* @param decodeConvertion
* boolean
* @return Hashtable. * @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static Hashtable<String, Object> getAllAttribueValues(Aspect aspect, boolean decodeConvertion)
throws InvocationTargetException, IllegalAccessException {
final Hashtable<String, Object> attributeList = new Hashtable<String, Object>();
final Method method[] = aspect.getClass().getDeclaredMethods();
if (method.length > 0) {
for (final Method element : method) {
final String methodName = element.getName();
if ("GET".equals(methodName.substring(0, 3).toUpperCase())) {
element.getReturnType();
final Class<?> parms[] = element.getParameterTypes();
final Object[] o = new Object[parms.length];
for (int j = 0; j < parms.length; j++) {
final Object obj = parms[j];
o[j] = obj;
}
Object returnValue = element.invoke(aspect, o);
if (null == returnValue) {
returnValue = "null";
}
if (decodeConvertion
&& returnValue.getClass().getSuperclass().getName().equals(Decode.class.getName())) {
returnValue = ((Decode) returnValue).getCode();
}
attributeList.put(methodName.substring(3, methodName.length()), returnValue);
}
}
}
return attributeList;
}
/**
* Format the return values from the getters as a string Returns a
* <code>String</code>
*
*
* @since ICAP Version Exchange
* @param aspect
* Aspect
* @return String. * @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static String toFormattedXMLString(Aspect aspect) throws InvocationTargetException, IllegalAccessException {
Hashtable<String, Object> attributeList = null;
StringBuffer returnStringBuf = null;
String returnString = null;
String attributeName = null;
if (null != (attributeList = getAllAttribueValues(aspect, true))) {
returnStringBuf = new StringBuffer();
String className = aspect.getClass().getName();
final StringTokenizer spaceTokens = new StringTokenizer(className, ".");
while (spaceTokens.hasMoreTokens()) {
className = spaceTokens.nextToken();
}
returnStringBuf.append("<" + className + "> \n");
final String index[] = new String[attributeList.size()];
final Enumeration<String> enumAttr = attributeList.keys();
int i = 0;
while (enumAttr.hasMoreElements()) {
index[i++] = enumAttr.nextElement();
}
CollectionUtilities.n2sort(index, true);
for (final String element : index) {
attributeName = element;
// if we get a list do toXMLString on it
if (attributeList.get(attributeName) instanceof ArrayList) {
@SuppressWarnings("unchecked")
final List<Aspect> list = (List<Aspect>) attributeList.get(attributeName);
for (Aspect aspect1 : list) {
returnStringBuf.append(toFormattedXMLString(aspect1));
}
} else if (attributeList.get(attributeName).getClass().getSuperclass().getName()
.equals(Aspect.class.getName())) {
final Aspect aspect1 = (Aspect) attributeList.get(attributeName);
returnStringBuf.append(toFormattedXMLString(aspect1));
} else {
returnStringBuf.append(" <" + attributeName + ">" + attributeList.get(attributeName) + "</"
+ attributeName + "> \n");
}
}
returnStringBuf.append("</" + className + "> \n");
returnString = returnStringBuf.toString();
}
return returnString;
}
/**
* Format the return values from the getters as a string Returns a
* <code>String</code>
*
*
* @since ICAP Version Exchange
* @param aspect
* Aspect
* @return String. * @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static String toFormattedString(Aspect aspect) throws InvocationTargetException, IllegalAccessException {
Hashtable<String, Object> attributeList = null;
StringBuffer returnStringBuf = null;
String returnString = null;
String attributeName = null;
if (null != (attributeList = getAllAttribueValues(aspect, true))) {
returnStringBuf = new StringBuffer();
final String index[] = new String[attributeList.size()];
final Enumeration<String> enumAttr = attributeList.keys();
int i = 0;
while (enumAttr.hasMoreElements()) {
index[i++] = enumAttr.nextElement();
}
CollectionUtilities.n2sort(index, true);
for (final String element : index) {
attributeName = element;
// if we get a list do toString on it
if (attributeList.get(attributeName) instanceof ArrayList) {
@SuppressWarnings("unchecked")
final List<Aspect> list = (List<Aspect>) attributeList.get(attributeName);
for (Aspect aspect1 : list) {
returnStringBuf.append(toFormattedXMLString(aspect1));
}
} else if (attributeList.get(attributeName).getClass().getSuperclass().getName()
.equals(Aspect.class.getName())) {
final Aspect aspect1 = (Aspect) attributeList.get(attributeName);
returnStringBuf.append(toFormattedXMLString(aspect1));
} else {
returnStringBuf.append(attributeName + "=\'" + attributeList.get(attributeName) + "\'\n");
}
}
returnString = returnStringBuf.toString();
}
return returnString;
}
/**
* append to the input StringBuffer the string to format an SQL load line..
*
* @param strBuf
* a <code>StringBuffer</code> that has the toAppend a
* <code>Object</code> or attributeName a <code>String</code>
* appended
*
* @since ICAP Version Exchange
* @param attributeName
* String
* @param toAppend
* Object
* @param columnNamesOnly
* boolean
* @see com.inpurchase.icap.aspect.Aspect
*/
public static void appendSQLString(StringBuffer strBuf, String attributeName, Object toAppend,
boolean columnNamesOnly) {
if (toAppend instanceof String) {
if ("null".equals(toAppend)) {
toAppend = null;
} else {
toAppend = ((String) toAppend).trim();
}
}
if (toAppend instanceof Date) {
final SimpleDateFormat newDateFormat = new SimpleDateFormat("dd-MMM-yy HH:mm:ss");
toAppend = newDateFormat.format((Date) toAppend);
}
if (columnNamesOnly) {
if (0 == strBuf.length()) {
strBuf.append(attributeName);
} else {
strBuf.append("," + attributeName);
}
} else {
if (null == toAppend) {
if (0 != strBuf.length()) {
strBuf.append("||");
}
} else {
if (0 == strBuf.length()) {
strBuf.append("\"" + toAppend + "\"");
} else {
strBuf.append("||" + "\"" + toAppend + "\"");
}
}
}
}
/**
* Method setDocumentText.
*
* @param content
* String
* @param append
* boolean
* @param newLine
* boolean
* @param attrSet
* SimpleAttributeSet
* @throws BadLocationException
*/
public static void setDocumentText(Document doc, String content, boolean newLine, SimpleAttributeSet attrSet)
throws BadLocationException {
if (null != content) {
doc.insertString(doc.getLength(), content, attrSet);
if (newLine)
doc.insertString(doc.getLength(), "\n", null);
}
}
/**
* Method padRight.
*
* @param text
* String
* @param size
* int
* @return String
*/
public static String padRight(String text, int size) {
return String.format("%1$-" + size + "s", text);
}
/**
* Method padLeft.
*
* @param text
* String
* @param size
* int
* @return String
*/
public static String padLeft(String text, int size) {
return String.format("%1$" + size + "s", text);
}
/**
* Method nullSafeObjectComparator.
*
* @param one
* T
* @param two
* T
* @return int
*/
public static <T extends Comparable<T>> int nullSafeComparator(T one, T two) {
if (one == null ^ two == null) {
return (one == null) ? -1 : 1;
}
if (one == null && two == null) {
return 0;
}
return one.compareTo(two);
}
/**
* Method isBetween. Is c between a and b
*
* @param a
* <T extends Number>
* @param b
* <T extends Number>
* @param c
* <T extends Number>
* @return boolean
*/
public static <T extends Number> boolean isBetween(T a, T b, T c) {
return b.doubleValue() > a.doubleValue()
? c.doubleValue() >= a.doubleValue() && c.doubleValue() <= b.doubleValue()
: c.doubleValue() >= b.doubleValue() && c.doubleValue() <= a.doubleValue();
}
/**
* Method isNumeric.
*
* @param str
* String to check
* @return boolean
*/
public static boolean isNumeric(String number) {
if (null != number)
return number.matches("-?\\d+(\\.\\d+)?");
return false;
}
}