/**
* Copyright (c) 2014, the Railo Company Ltd.
* Copyright (c) 2015, Lucee Assosication Switzerland
*
* 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, see <http://www.gnu.org/licenses/>.
*
*/
package lucee.runtime.op;
import java.awt.Color;
import java.io.File;
import java.io.Serializable;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import lucee.commons.color.ColorCaster;
import lucee.commons.io.CharsetUtil;
import lucee.commons.io.res.Resource;
import lucee.commons.io.res.util.ResourceUtil;
import lucee.commons.lang.ExceptionUtil;
import lucee.commons.security.Credentials;
import lucee.commons.security.CredentialsImpl;
import lucee.runtime.Component;
import lucee.runtime.PageContext;
import lucee.runtime.dump.DumpData;
import lucee.runtime.dump.DumpProperties;
import lucee.runtime.engine.ThreadLocalPageContext;
import lucee.runtime.exp.CasterException;
import lucee.runtime.exp.PageException;
import lucee.runtime.exp.PageRuntimeException;
import lucee.runtime.op.date.DateCaster;
import lucee.runtime.security.CredentialImpl;
import lucee.runtime.type.Array;
import lucee.runtime.type.Collection;
import lucee.runtime.type.KeyImpl;
import lucee.runtime.type.Query;
import lucee.runtime.type.Struct;
import lucee.runtime.type.dt.DateTime;
import lucee.runtime.type.dt.TimeSpan;
import lucee.runtime.type.dt.TimeSpanImpl;
import lucee.runtime.type.util.StructUtil;
import lucee.runtime.util.Cast;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Implementation of the cast interface
*/
public final class CastImpl implements Cast {
private static CastImpl singelton;
@Override
public Object castTo(PageContext pc, short type, Object o) throws PageException {
return Caster.castTo(pc,type,o);
}
@Override
public Object castTo(PageContext pc, short type, String strType, Object o) throws PageException {
return Caster.castTo(pc,type,strType,o);
}
@Override
public Object castTo(PageContext pc, Class trgClass, Object obj) throws PageException {
return Caster.castTo(pc, trgClass, obj);
}
@Override
public Object castTo(PageContext pc, String type, Object o) throws PageException {
return Caster.castTo(pc,type,o,false);
}
@Override
public Object castTo(PageContext pc, String type, Object o, boolean alsoPattern) throws PageException {
return Caster.castTo(pc,type,o,alsoPattern);
}
@Override
public Array toArray(Object obj, Array defaultValue) {
return Caster.toArray(obj,defaultValue);
}
@Override
public Array toArray(Object obj) throws PageException {
return Caster.toArray(obj);
}
@Override
public Object[] toNativeArray(Object obj) throws PageException {
return Caster.toNativeArray(obj);
}
@Override
public Object[] toNativeArray(Object obj, Object[] defaultValue) {
return Caster.toNativeArray(obj,defaultValue);
}
@Override
public String toBase64(Object o, String defaultValue) {
return Caster.toBase64(o,null,defaultValue);
}
@Override
public String toBase64(Object o) throws PageException {
return Caster.toBase64(o,null);
}
@Override
public byte[] toBinary(Object obj, byte[] defaultValue) {
return Caster.toBinary(obj,defaultValue);
}
@Override
public byte[] toBinary(Object obj) throws PageException {
return Caster.toBinary(obj);
}
@Override
public Boolean toBoolean(boolean b) {
return Caster.toBoolean(b);
}
@Override
public Boolean toBoolean(char c) {
return Caster.toBoolean(c);
}
@Override
public Boolean toBoolean(double d) {
return Caster.toBoolean(d);
}
@Override
public Boolean toBoolean(Object o, Boolean defaultValue) {
return Caster.toBoolean(o,defaultValue);
}
@Override
public Boolean toBoolean(Object o) throws PageException {
return Caster.toBoolean(o);
}
@Override
public Boolean toBoolean(String str, Boolean defaultValue) {
return Caster.toBoolean(str,defaultValue);
}
@Override
public Boolean toBoolean(String str) throws PageException {
return Caster.toBoolean(str);
}
@Override
public boolean toBooleanValue(boolean b) {
return Caster.toBooleanValue(b);
}
@Override
public boolean toBooleanValue(char c) {
return Caster.toBooleanValue(c);
}
@Override
public boolean toBooleanValue(double d) {
return Caster.toBooleanValue(d);
}
@Override
public boolean toBooleanValue(Object o, boolean defaultValue) {
return Caster.toBooleanValue(o,defaultValue);
}
@Override
public boolean toBooleanValue(Object o) throws PageException {
return Caster.toBooleanValue(o);
}
@Override
public boolean toBooleanValue(String str, boolean defaultValue) {
return Caster.toBooleanValue(str,defaultValue);
}
@Override
public boolean toBooleanValue(String str) throws PageException {
return Caster.toBooleanValue(str);
}
@Override
public Byte toByte(boolean b) {
return Caster.toByte(b);
}
@Override
public Byte toByte(char c) {
return Caster.toByte(c);
}
@Override
public Byte toByte(double d) {
return Caster.toByte(d);
}
@Override
public Byte toByte(Object o, Byte defaultValue) {
return Caster.toByte(o,defaultValue);
}
@Override
public Byte toByte(Object o) throws PageException {
return Caster.toByte(o);
}
@Override
public byte toByteValue(boolean b) {
return Caster.toByteValue(b);
}
@Override
public byte toByteValue(char c) {
return Caster.toByteValue(c);
}
@Override
public byte toByteValue(double d) {
return Caster.toByteValue(d);
}
@Override
public byte toByteValue(Object o, byte defaultValue) {
return Caster.toByteValue(o,defaultValue);
}
@Override
public byte toByteValue(Object o) throws PageException {
return Caster.toByteValue(o);
}
@Override
public Character toCharacter(boolean b) {
return Caster.toCharacter(b);
}
@Override
public Character toCharacter(char c) {
return Caster.toCharacter(c);
}
@Override
public Character toCharacter(double d) {
return Caster.toCharacter(d);
}
@Override
public Character toCharacter(Object o, Character defaultValue) {
return Caster.toCharacter(o,defaultValue);
}
@Override
public Character toCharacter(Object o) throws PageException {
return Caster.toCharacter(o);
}
@Override
public char toCharValue(boolean b) {
return Caster.toCharValue(b);
}
@Override
public char toCharValue(char c) {
return Caster.toCharValue(c);
}
@Override
public char toCharValue(double d) {
return Caster.toCharValue(d);
}
@Override
public char toCharValue(Object o, char defaultValue) {
return Caster.toCharValue(o,defaultValue);
}
@Override
public char toCharValue(Object o) throws PageException {
return Caster.toCharValue(o);
}
@Override
public Collection toCollection(Object o, Collection defaultValue) {
return Caster.toCollection(o,defaultValue);
}
@Override
public Collection toCollection(Object o) throws PageException {
return Caster.toCollection(o);
}
@Override
public Color toColor(Object o) throws PageException {
if(o instanceof Color) return (Color) o;
else if (o instanceof CharSequence)return ColorCaster.toColor(o.toString());
else if (o instanceof Number)return ColorCaster.toColor(Integer.toHexString(((Number)o).intValue()));
throw new CasterException(o,Color.class);
}
@Override
public DateTime toDate(boolean b, TimeZone tz) {
return Caster.toDate(b,tz);
}
@Override
public DateTime toDate(char c, TimeZone tz) {
return Caster.toDate(c,tz);
}
@Override
public DateTime toDate(double d, TimeZone tz) {
return Caster.toDate(d,tz);
}
@Override
public DateTime toDate(Locale locale, String str, TimeZone tz, DateTime defaultValue) {
return DateCaster.toDateTime(locale,str,tz,defaultValue,true);
}
@Override
public DateTime toDate(Locale locale, String str, TimeZone tz) throws PageException {
return DateCaster.toDateTime(locale,str,tz,true);
}
@Override
public DateTime toDate(Object o, boolean alsoNumbers, TimeZone tz, DateTime defaultValue) {
return Caster.toDate(o,alsoNumbers,tz,defaultValue);
}
@Override
public DateTime toDate(Object o, TimeZone tz) throws PageException {
return Caster.toDate(o,tz);
}
@Override
public DateTime toDate(String str, boolean alsoNumbers, TimeZone tz, DateTime defaultValue) {
return Caster.toDate(str,alsoNumbers,tz,defaultValue);
}
@Override
public DateTime toDate(String str, TimeZone tz) throws PageException {
return Caster.toDate(str,tz);
}
@Override
public DateTime toDatetime(Object o, TimeZone tz) throws PageException {
return DateCaster.toDateAdvanced(o,tz);
}
@Override
public DateTime toDateTime(Object o, TimeZone tz) throws PageException {
return DateCaster.toDateAdvanced(o,tz);
}
@Override
public DateTime toDateTime(Object o, TimeZone tz, DateTime defaultValue) {
return DateCaster.toDateAdvanced(o,tz,defaultValue);
}
@Override
public String toDecimal(boolean b) {
return Caster.toDecimal(b);
}
@Override
public String toDecimal(char c) {
return Caster.toDecimal(c);
}
@Override
public String toDecimal(double d) {
return Caster.toDecimal(d);
}
@Override
public String toDecimal(Object value, String defaultValue) {
return Caster.toDecimal(value,defaultValue);
}
@Override
public String toDecimal(Object value) throws PageException {
return Caster.toDecimal(value);
}
@Override
public Double toDouble(boolean b) {
return Caster.toDouble(b);
}
@Override
public Double toDouble(char c) {
return Caster.toDouble(c);
}
@Override
public Double toDouble(double d) {
return Caster.toDouble(d);
}
@Override
public Double toDouble(Object o, Double defaultValue) {
return Caster.toDouble(o,defaultValue);
}
@Override
public Double toDouble(Object o) throws PageException {
return Caster.toDouble(o);
}
@Override
public Double toDouble(String str, Double defaultValue) {
return Caster.toDouble(str,defaultValue);
}
@Override
public Double toDouble(String str) throws PageException {
return Caster.toDouble(str);
}
@Override
public double toDoubleValue(boolean b) {
return Caster.toDoubleValue(b);
}
@Override
public double toDoubleValue(char c) {
return Caster.toDoubleValue(c);
}
@Override
public double toDoubleValue(double d) {
return Caster.toDoubleValue(d);
}
@Override
public double toDoubleValue(Object o, double defaultValue) {
return Caster.toDoubleValue(o,true,defaultValue);
}
@Override
public double toDoubleValue(Object o) throws PageException {
return Caster.toDoubleValue(o);
}
@Override
public double toDoubleValue(String str, double defaultValue) {
return Caster.toDoubleValue(str,true,defaultValue);
}
@Override
public double toDoubleValue(String str) throws PageException {
return Caster.toDoubleValue(str);
}
@Override
public File toFile(Object obj, File defaultValue) {
return Caster.toFile(obj,defaultValue);
}
@Override
public File toFile(Object obj) throws PageException {
return Caster.toFile(obj);
}
@Override
public Integer toInteger(boolean b) {
return Caster.toInteger(b);
}
@Override
public Integer toInteger(char c) {
return Caster.toInteger(c);
}
@Override
public Integer toInteger(double d) {
return Caster.toInteger(d);
}
@Override
public Integer toInteger(Object o, Integer defaultValue) {
return Caster.toInteger(o,defaultValue);
}
@Override
public Integer toInteger(Object o) throws PageException {
return Caster.toInteger(o);
}
@Override
public int toIntValue(boolean b) {
return Caster.toIntValue(b);
}
@Override
public int toIntValue(char c) {
return Caster.toIntValue(c);
}
@Override
public int toIntValue(double d) {
return Caster.toIntValue(d);
}
@Override
public int toIntValue(Object o, int defaultValue) {
return Caster.toIntValue(o,defaultValue);
}
@Override
public int toIntValue(Object o) throws PageException {
return Caster.toIntValue(o);
}
@Override
public int toIntValue(String str, int defaultValue) {
return Caster.toIntValue(str,defaultValue);
}
@Override
public int toIntValue(String str) throws PageException {
return Caster.toIntValue(str);
}
@Override
public Iterator toIterator(Object o) throws PageException {
return Caster.toIterator(o);
}
@Override
public List toList(Object o, boolean duplicate, List defaultValue) {
return Caster.toList(o,duplicate,defaultValue);
}
@Override
public List toList(Object o, boolean duplicate) throws PageException {
return Caster.toList(o,duplicate);
}
@Override
public List toList(Object o, List defaultValue) {
return Caster.toList(o,defaultValue);
}
@Override
public List toList(Object o) throws PageException {
return Caster.toList(o);
}
@Override
public Locale toLocale(String strLocale, Locale defaultValue) {
return Caster.toLocale(strLocale,defaultValue);
}
@Override
public Locale toLocale(String strLocale) throws PageException {
return Caster.toLocale(strLocale);
}
@Override
public Long toLong(boolean b) {
return Caster.toLong(b);
}
@Override
public Long toLong(char c) {
return Caster.toLong(c);
}
@Override
public Long toLong(double d) {
return Caster.toLong(d);
}
@Override
public Long toLong(Object o, Long defaultValue) {
return Caster.toLong(o,defaultValue);
}
@Override
public Long toLong(Object o) throws PageException {
return Caster.toLong(o);
}
@Override
public long toLongValue(boolean b) {
return Caster.toLongValue(b);
}
@Override
public long toLongValue(char c) {
return Caster.toLongValue(c);
}
@Override
public long toLongValue(double d) {
return Caster.toLongValue(d);
}
@Override
public long toLongValue(Object o, long defaultValue) {
return Caster.toLongValue(o,defaultValue);
}
@Override
public long toLongValue(Object o) throws PageException {
return Caster.toLongValue(o);
}
@Override
public Map toMap(Object o, boolean duplicate, Map defaultValue) {
return Caster.toMap(o,duplicate,defaultValue);
}
@Override
public Map toMap(Object o, boolean duplicate) throws PageException {
return Caster.toMap(o,duplicate);
}
@Override
public Map toMap(Object o, Map defaultValue) {
return Caster.toMap(o,defaultValue);
}
@Override
public Map toMap(Object o) throws PageException {
return Caster.toMap(o);
}
//@Override
public Node toNode(Object o, Node defaultValue) {
return Caster.toNode(o,defaultValue);
}
//@Override
public Node toNode(Object o) throws PageException {
return Caster.toNode(o);
}
//@Override
public NodeList toNodeList(Object o, NodeList defaultValue) {
return Caster.toNodeList(o,defaultValue);
}
//@Override
public NodeList toNodeList(Object o) throws PageException {
return Caster.toNodeList(o);
}
@Override
public Object toNull(Object value, Object defaultValue) {
return Caster.toNull(value,defaultValue);
}
@Override
public Object toNull(Object value) throws PageException {
return Caster.toNull(value);
}
@Override
public Collection.Key toKey(Object o) throws PageException{
return Caster.toKey(o);
}
@Override
public Collection.Key toKey(String str) {
return KeyImpl.init(str);
}
@Override
public Collection.Key toKey(Object o, Collection.Key defaultValue){
return Caster.toKey(o,defaultValue);
}
@Override
public PageException toPageException(Throwable t) {
return Caster.toPageException(t);
}
@Override
public Query toQuery(Object o, boolean duplicate, Query defaultValue) {
return Caster.toQuery(o,duplicate,defaultValue);
}
@Override
public Query toQuery(Object o, boolean duplicate) throws PageException {
return Caster.toQuery(o,duplicate);
}
@Override
public Query toQuery(Object o, Query defaultValue) {
return Caster.toQuery(o,defaultValue);
}
@Override
public Query toQuery(Object o) throws PageException {
return Caster.toQuery(o);
}
@Override
public Boolean toRef(boolean b) {
return Caster.toRef(b);
}
@Override
public Byte toRef(byte b) {
return Caster.toRef(b);
}
@Override
public String toRef(char c) {
return Caster.toRef(c);
}
@Override
public Collection toRef(Collection o) {
return Caster.toRef(o);
}
@Override
public Double toRef(double d) {
return Caster.toRef(d);
}
@Override
public Float toRef(float f) {
return Caster.toRef(f);
}
@Override
public Integer toRef(int i) {
return Caster.toRef(i);
}
@Override
public Long toRef(long l) {
return Caster.toRef(l);
}
@Override
public Object toRef(Object o) {
return Caster.toRef(o);
}
@Override
public Short toRef(short s) {
return Caster.toRef(s);
}
@Override
public String toRef(String str) {
return Caster.toRef(str);
}
@Override
public Short toShort(boolean b) {
return Caster.toShort(b);
}
@Override
public Short toShort(char c) {
return Caster.toShort(c);
}
@Override
public Short toShort(double d) {
return Caster.toShort(d);
}
@Override
public Short toShort(Object o, Short defaultValue) {
return Caster.toShort(o,defaultValue);
}
@Override
public Short toShort(Object o) throws PageException {
return Caster.toShort(o);
}
@Override
public short toShortValue(boolean b) {
return Caster.toShortValue(b);
}
@Override
public short toShortValue(char c) {
return Caster.toShortValue(c);
}
@Override
public short toShortValue(double d) {
return Caster.toShortValue(d);
}
@Override
public short toShortValue(Object o, short defaultValue) {
return Caster.toShortValue(o,defaultValue);
}
@Override
public short toShortValue(Object o) throws PageException {
return Caster.toShortValue(o);
}
@Override
public String toString(boolean b) {
return Caster.toString(b);
}
@Override
public String toString(double d) {
return Caster.toString(d);
}
@Override
public String toString(int i) {
return Caster.toString(i);
}
@Override
public String toString(long l) {
return Caster.toString(l);
}
@Override
public String toString(Object o, String defaultValue) {
return Caster.toString(o,defaultValue);
}
@Override
public String toString(Object o) throws PageException {
return Caster.toString(o);
}
@Override
public Struct toStruct(Object o, Struct defaultValue,boolean caseSensitive) {
return Caster.toStruct(o,defaultValue,caseSensitive);
}
@Override
public Struct toStruct(Object o, Struct defaultValue) {
return Caster.toStruct(o,defaultValue,true);
}
@Override
public Struct toStruct(Object o) throws PageException {
return Caster.toStruct(o);
}
@Override
public TimeSpan toTimespan(Object o, TimeSpan defaultValue) {
return Caster.toTimespan(o,defaultValue);
}
@Override
public TimeSpan toTimespan(Object o) throws PageException {
return Caster.toTimespan(o);
}
@Override
public TimeSpan toTimespan(long millis) {
return TimeSpanImpl.fromMillis(millis);
}
@Override
public String toTypeName(Object o) {
return Caster.toTypeName(o);
}
@Override
public Object toUUId(Object o, Object defaultValue) {
return Caster.toUUId(o,defaultValue);
}
@Override
public Object toUUId(Object o) throws PageException {
return Caster.toUUId(o);
}
@Override
public Object toVariableName(Object obj, Object defaultValue) {
String res = Caster.toVariableName(obj,null);
if(res==null) return defaultValue;
return res;
}
@Override
public String toVariableName(Object obj, String defaultValue) {
return Caster.toVariableName(obj,defaultValue);
}
@Override
public String toVariableName(Object o) throws PageException {
return Caster.toVariableName(o);
}
@Override
public Object toVoid(Object o, Object defaultValue) {
return Caster.toVoid(o,defaultValue);
}
@Override
public Object toVoid(Object o) throws PageException {
return Caster.toVoid(o);
}
//@Override
public Node toXML(Object value, Node defaultValue) {
return Caster.toXML(value,defaultValue);
}
//@Override
public Node toXML(Object value) throws PageException {
return Caster.toXML(value);
}
public static Cast getInstance() {
if(singelton==null)singelton=new CastImpl();
return singelton;
}
@Override
public Resource toResource(Object obj) throws PageException {
if(obj instanceof Resource) return (Resource) obj;
if(obj instanceof File) return ResourceUtil.toResource((File) obj);
return ResourceUtil.toResourceNotExisting(ThreadLocalPageContext.get(), toString(obj));
}
@Override
public Resource toResource(Object obj, Resource defaultValue) {
if(obj instanceof Resource) return (Resource) obj;
String path=toString(obj,null);
if(path==null)return defaultValue;
return ResourceUtil.toResourceNotExisting(ThreadLocalPageContext.get(), path);
}
@Override
public Object to(String type, Object o,boolean alsoPattern) throws PageException {
return Caster.castTo(ThreadLocalPageContext.get(), type, o,alsoPattern);
}
@Override
public Serializable toSerializable(Object obj) throws PageException {
return Caster.toSerializable(obj);
}
@Override
public Serializable toSerializable(Object object, Serializable defaultValue) {
return Caster.toSerializable(object, defaultValue);
}
@Override
public Charset toCharset(String strCharset) {
return CharsetUtil.toCharset(strCharset);
}
@Override
public Charset toCharset(String strCharset, Charset defaultValue) {
return CharsetUtil.toCharset(strCharset,defaultValue);
}
@Override
public RuntimeException toPageRuntimeException(Throwable t) {
return new PageRuntimeException(toPageException(t));
}
@Override
public Float toFloat(Object o) throws PageException {
return Caster.toFloat(o);
}
@Override
public Float toFloat(Object o, Float defaultValue) {
return Caster.toFloat(o,defaultValue);
}
@Override
public float toFloatValue(Object o) throws PageException {
return Caster.toFloatValue(o);
}
@Override
public float toFloatValue(Object o, float defaultValue) {
return Caster.toFloatValue(o,defaultValue);
}
@Override
public BigDecimal toBigDecimal(Object obj) throws PageException {
return Caster.toBigDecimal(obj);
}
@Override
public BigDecimal toBigDecimal(Object obj, BigDecimal defaultValue) {
try {
return Caster.toBigDecimal(obj);
} catch(Throwable t) {
ExceptionUtil.rethrowIfNecessary(t);
return defaultValue;
}
}
@Override
public Component toComponent(Object obj) throws PageException {
return Caster.toComponent(obj);
}
@Override
public Component toComponent(Object obj, Component defaultValue) {
return Caster.toComponent(obj, defaultValue);
}
@Override
public TimeZone toTimeZone(Object obj) throws PageException {
return Caster.toTimeZone(obj);
}
@Override
public TimeZone toTimeZone(Object obj, TimeZone defaultValue) {
return Caster.toTimeZone(obj, defaultValue);
}
@Override
public Calendar toCalendar(long time, TimeZone tz, Locale l) {
return Caster.toCalendar(time, tz, l);
}
@Override
public DumpData toDumpTable(Struct sct,String title,PageContext pageContext, int maxlevel, DumpProperties dp) {
return StructUtil.toDumpTable(sct, title, pageContext, maxlevel, dp);
}
// FUTURE add to interface
public Credentials toCredentials(String username, String password) {
return CredentialsImpl.toCredentials(username, password);
}
}