package org.araqne.logdb.query.expr;
import java.util.List;
import org.araqne.api.InetAddresses;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.Row;
public class ToIp extends FunctionExpression {
private Expression valueExpr;
public ToIp(QueryContext ctx, List<Expression> exprs) {
super("ip", exprs, 1);
this.valueExpr = exprs.get(0);
}
@Override
public Object eval(Row map) {
Object v = valueExpr.eval(map);
if (v == null)
return null;
String s = null;
if (v instanceof Integer) {
long ip = (Integer) v & 0xFFFFFFFFL;
s = convert(ip);
} else if (v instanceof Long) {
s = convert((Long) v);
} else {
s = v.toString();
}
if (s.isEmpty())
return null;
try {
return InetAddresses.forString(s);
} catch (IllegalArgumentException e) {
return null;
}
}
public static String convert(long ip) {
StringBuilder result = new StringBuilder(20);
for (int count = 24; count >= 0; count -= 8) {
long part = (ip >> count) & 0xff;
result.append(part);
if (count != 0)
result.append(".");
}
return result.toString();
}
}