package com.metaweb.gridlock.expr.functions; import java.lang.reflect.Array; import java.util.Properties; import com.metaweb.gridlock.expr.Function; public class Slice implements Function { @Override public Object call(Properties bindings, Object[] args) { if (args.length > 1 && args.length <= 3) { Object v = args[0]; Object from = args[1]; Object to = args.length == 3 ? args[2] : null; if (v != null && from != null && from instanceof Number && (to == null || to instanceof Number)) { if (v instanceof Array) { Object[] a = (Object[]) v; int start = ((Number) from).intValue(); int end = to != null && to instanceof Number ? ((Number) to).intValue() : a.length; if (start < 0) { start = a.length - start; } start = Math.min(a.length, Math.max(0, start)); if (end < 0) { end = a.length - end; } end = Math.min(a.length, Math.max(start, end)); Object[] a2 = new Object[end - start]; System.arraycopy(a, start, a2, 0, end - start); return a2; } else { String s = (v instanceof String ? (String) v : v.toString()); int start = ((Number) from).intValue(); if (start < 0) { start = s.length() - start; } start = Math.min(s.length(), Math.max(0, start)); if (to != null && to instanceof Number) { int end = ((Number) to).intValue(); if (end < 0) { end = s.length() - end; } end = Math.min(s.length(), Math.max(start, end)); return s.substring(start, end); } else { return s.substring(start); } } } } return null; } }