blob: c63894f7bb124aabde30b78dd40fe97273b048ea [file]
package com.googlecode.aviator.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Map;
import java.util.Properties;
import com.googlecode.aviator.runtime.RuntimeUtils;
import com.googlecode.aviator.runtime.type.AviatorBigInt;
import com.googlecode.aviator.runtime.type.AviatorDecimal;
import com.googlecode.aviator.runtime.type.AviatorDouble;
import com.googlecode.aviator.runtime.type.AviatorLong;
import com.googlecode.aviator.runtime.type.AviatorNumber;
/**
* Some helper methods.
*
* @author dennis(killme2008@gmail.com)
*
*/
public class Utils {
private static final String CURRENT_VERSION = "5.0.0";
private Utils() {
}
private static final ThreadLocal<MessageDigest> MESSAGE_DIGEST_LOCAL =
new ThreadLocal<MessageDigest>() {
@Override
protected MessageDigest initialValue() {
try {
return MessageDigest.getInstance("md5");
} catch (Exception e) {
throw Reflector.sneakyThrow(e);
}
}
};
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(final byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
public static String md5sum(final String s) {
MessageDigest md = MESSAGE_DIGEST_LOCAL.get();
md.reset();
byte[] messageDigest = md.digest(s.getBytes());
return bytesToHex(messageDigest);
}
public static String readFully(final Reader reader) throws IOException {
final char[] arr = new char[16 * 1024];
final StringBuilder buf = new StringBuilder();
int numChars;
while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
buf.append(arr, 0, numChars);
}
return buf.toString();
}
public static AviatorNumber exponent(final Number base, final Number exp,
final Map<String, Object> env) {
final int expInt = exp.intValue();
if (base instanceof BigInteger) {
return new AviatorBigInt(((BigInteger) base).pow(expInt));
} else if (base instanceof BigDecimal) {
return new AviatorDecimal(((BigDecimal) base).pow(expInt, RuntimeUtils.getMathContext(env)));
} else {
final double ret = Math.pow(base.doubleValue(), exp.doubleValue());
if (TypeUtils.isDouble(base) || TypeUtils.isDouble(exp) || exp.doubleValue() < 0) {
return new AviatorDouble(ret);
} else {
return AviatorLong.valueOf((long) ret);
}
}
}
public static String getAviatorScriptVersion() {
Properties prop = new Properties();
InputStream in = null;
try {
in = Utils.class
.getResourceAsStream("/META-INF/maven/com.googlecode.aviator/aviator/pom.properties");
prop.load(in);
return prop.getProperty("version", CURRENT_VERSION);
} catch (Throwable e) {
// ignore
} finally {
try {
in.close();
} catch (Exception ex) {
}
}
return CURRENT_VERSION;
}
}