/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.reports; import com.eas.script.Scripts; import com.eas.util.IdGenerator; import java.lang.reflect.Array; import java.util.Date; import java.util.List; import java.util.Map; import jdk.nashorn.api.scripting.JSObject; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.DynaClass; /** * * @author Andrew */ public class JSDynaBean implements DynaBean { private final String REPORT_DYNA_CLASS_PREFIX = "PlatypusReportClass_"; private final JSObject delegate; private JSDynaClass dynaClass; private final int timezoneOffset; public JSDynaBean(JSObject aDelegate, int aTimezoneOffset) { super(); delegate = aDelegate; timezoneOffset = aTimezoneOffset; } @Override public boolean contains(String aName, String aKey) { Object value = delegate.getMember(aName); if (value == null) { throw new NullPointerException("No mapped value for '" + aName + "(" + aKey + ")'"); } else if (value instanceof JSObject) { if (!((JSObject) value).isFunction()) { return ((JSObject) value).hasMember(aKey); } else { return false; } } else if (value instanceof Map) { return ((Map) value).containsKey(aKey); } else { throw new IllegalArgumentException("Non-mapped property for '" + aName + "(" + aKey + ")'"); } } @Override public Object get(String aName) { return wrap(delegate.getMember(aName), timezoneOffset); } @Override public Object get(String aName, int aIndex) { Object value = delegate.getMember(aName); if (value == null) { throw new NullPointerException("No indexed value for '" + aName + "[" + aIndex + "]'"); } else if (value instanceof JSObject) { return wrap(((JSObject) value).getSlot(aIndex), timezoneOffset); } else if (value.getClass().isArray()) { return wrap(Array.get(value, aIndex), timezoneOffset); } else if (value instanceof List) { return wrap(((List) value).get(aIndex), timezoneOffset); } else { throw new IllegalArgumentException("Non-indexed property for '" + aName + "[" + aIndex + "]'"); } } @Override public Object get(String aName, String aKey) { Object value = delegate.getMember(aName); if (value == null) { throw new NullPointerException("No mapped value for '" + aName + "(" + aKey + ")'"); } else if (value instanceof JSObject) { return wrap(((JSObject) value).getMember(aKey), timezoneOffset); } else if (value instanceof Map) { return wrap(((Map) value).get(aKey), timezoneOffset); } else { throw new IllegalArgumentException("Non-mapped property for '" + aName + "(" + aKey + ")'"); } } public static Object wrap(Object aValue, int aTimezoneOffset) { aValue = Scripts.getSpace().toJava(aValue); if (aValue instanceof Date) { return convertDateToExcelDate((Date)aValue, aTimezoneOffset); } else if (aValue instanceof Number || aValue instanceof Boolean || aValue instanceof CharSequence || aValue == null) { return aValue; } else if (aValue instanceof JSObject) { JSObject jsValue = (JSObject) aValue; if (jsValue.isArray() || Scripts.getSpace().isArrayDeep(jsValue)) { return new JSDynaList(jsValue, aTimezoneOffset); } else if (!jsValue.isFunction()) { return new JSDynaBean(jsValue, aTimezoneOffset); } else { return null; } } else { return aValue; } } public static double convertDateToExcelDate(Date aValue, int aTimezoneOffset) { return ((double)(aValue.getTime() - aTimezoneOffset * 60 * 1000) / 86400000) + 25569; } @Override public DynaClass getDynaClass() { if (dynaClass == null) { dynaClass = new JSDynaClass(delegate, REPORT_DYNA_CLASS_PREFIX + IdGenerator.genStringId()); } return dynaClass; } @Override public void remove(String string, String string1) { throw new UnsupportedOperationException("Not supported in JSDynaBean."); } @Override public void set(String string, Object o) { throw new UnsupportedOperationException("Not supported in JSDynaBean."); } @Override public void set(String string, int i, Object o) { throw new UnsupportedOperationException("Not supported in JSDynaBean."); } @Override public void set(String string, String string1, Object o) { throw new UnsupportedOperationException("Not supported in JSDynaBean."); } }