package railo.runtime.orm.hibernate;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.hibernate.JDBCException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
import railo.commons.lang.types.RefBoolean;
import railo.loader.engine.CFMLEngineFactory;
import railo.runtime.Component;
import railo.runtime.ComponentPro;
import railo.runtime.MappingImpl;
import railo.runtime.PageContext;
import railo.runtime.PageContextImpl;
import railo.runtime.component.Property;
import railo.runtime.component.PropertyImpl;
import railo.runtime.config.Config;
import railo.runtime.config.ConfigWebImpl;
import railo.runtime.db.DataSource;
import railo.runtime.db.DatasourceConnection;
import railo.runtime.db.SQL;
import railo.runtime.db.SQLItem;
import railo.runtime.db.SQLItemImpl;
import railo.runtime.engine.ThreadLocalPageContext;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
import railo.runtime.op.Operator;
import railo.runtime.text.xml.XMLUtil;
import railo.runtime.type.Array;
import railo.runtime.type.Collection;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.Query;
import railo.runtime.type.QueryImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.cfc.ComponentAccess;
import railo.runtime.type.dt.DateTime;
import railo.runtime.type.scope.Argument;
import railo.runtime.type.util.ListUtil;
import railo.runtime.util.Cast;
import railo.runtime.util.Creation;
import railo.runtime.util.Decision;
public class CommonUtil {
public static final Key ENTITY_NAME = CommonUtil.createKey("entityname");
public static final Key FIELDTYPE = CommonUtil.createKey("fieldtype");
public static final Key POST_INSERT=CommonUtil.createKey("postInsert");
public static final Key POST_UPDATE=CommonUtil.createKey("postUpdate");
public static final Key PRE_DELETE=CommonUtil.createKey("preDelete");
public static final Key POST_DELETE=CommonUtil.createKey("postDelete");
public static final Key PRE_LOAD=CommonUtil.createKey("preLoad");
public static final Key POST_LOAD=CommonUtil.createKey("postLoad");
public static final Key PRE_UPDATE=CommonUtil.createKey("preUpdate");
public static final Key PRE_INSERT=CommonUtil.createKey("preInsert");
public static final Key INIT=CommonUtil.createKey("init");
private static final short INSPECT_UNDEFINED = (short)4; /*ConfigImpl.INSPECT_UNDEFINED*/
public static final Charset UTF8;
static {
UTF8=Charset.forName("utf-8");
}
private static Cast caster;
private static Decision decision;
private static Creation creator;
public static Object castTo(PageContext pc, Class trgClass, Object obj) throws PageException {
return Caster.castTo(pc, trgClass, obj);
}
public static Array toArray(Object obj) throws PageException {
return caster().toArray(obj);
}
public static Array toArray(Object obj, Array defaultValue) {
return caster().toArray(obj,defaultValue);
}
public static Boolean toBoolean(String str) throws PageException {
return caster().toBoolean(str);
}
public static Boolean toBoolean(String str, Boolean defaultValue) {
return caster().toBoolean(str,defaultValue);
}
public static Boolean toBoolean(Object obj) throws PageException {
return caster().toBoolean(obj);
}
public static Boolean toBoolean(Object obj, Boolean defaultValue) {
return caster().toBoolean(obj,defaultValue);
}
public static Boolean toBooleanValue(String str) throws PageException {
return caster().toBooleanValue(str);
}
public static Boolean toBooleanValue(String str, Boolean defaultValue) {
return caster().toBooleanValue(str,defaultValue);
}
public static boolean toBooleanValue(Object obj) throws PageException {
return caster().toBooleanValue(obj);
}
public static boolean toBooleanValue(Object obj, boolean defaultValue) {
return caster().toBooleanValue(obj,defaultValue);
}
public static Component toComponent(Object obj) throws PageException {
return Caster.toComponent(obj);
}
public static Component toComponent(Object obj, Component defaultValue) {
return Caster.toComponent(obj,defaultValue);
}
public static Object toList(String[] arr, String delimiter) {
return ListUtil.arrayToList(arr, delimiter);
}
public static String toString(Object obj, String defaultValue) {
return caster().toString(obj,defaultValue);
}
public static String toString(Object obj) throws PageException {
return caster().toString(obj);
}
public static String toString(boolean b) {
return caster().toString(b);
}
public static String toString(double d) {
return caster().toString(d);
}
public static String toString(int i) {
return caster().toString(i);
}
public static String toString(long l) {
return caster().toString(l);
}
public static String toString(Resource file, Charset charset) throws IOException {
return IOUtil.toString(file, charset);
}
public static String[] toStringArray(String list, char delimiter) {
return ListUtil.listToStringArray(list, delimiter);
}
public static String[] toStringArray(String list, String delimiter) {
return ListUtil.toStringArray(ListUtil.listToArray(list,delimiter),""); //TODO better
}
public static Integer toInteger(Object obj) throws PageException {
return caster().toInteger(obj);
}
public static Integer toInteger(Object obj, Integer defaultValue) {
return caster().toInteger(obj, defaultValue);
}
public static int toIntValue(Object obj) throws PageException {
return caster().toIntValue(obj);
}
public static int toIntValue(Object obj, int defaultValue) {
return caster().toIntValue(obj,defaultValue);
}
public static Array toArray(Argument arg) {
Array trg=createArray();
int[] keys = arg.intKeys();
for(int i=0;i<keys.length;i++){
trg.setEL(keys[i],
arg.get(keys[i],null));
}
return trg;
}
public static PageException toPageException(Throwable t) {
if (!(t instanceof JDBCException))
return caster().toPageException(t);
JDBCException j = (JDBCException)t;
String message = j.getMessage();
Throwable cause = j.getCause();
if(cause != null) {
message += " [" + cause.getMessage() + "]";
}
return CFMLEngineFactory.getInstance().getExceptionUtil().createDatabaseException(message, new SQLImpl(j.getSQL()));
}
public static Serializable toSerializable(Object obj) throws PageException {
return caster().toSerializable(obj);
}
public static Serializable toSerializable(Object obj,Serializable defaultValue) {
return caster().toSerializable(obj,defaultValue);
}
public static Struct toStruct(Object obj) throws PageException {
return caster().toStruct(obj);
}
public static Struct toStruct(Object obj, Struct defaultValue) {
return caster().toStruct(obj,defaultValue);
}
public static SQLItem toSQLItem(Object value, int type) {
return new SQLItemImpl(value,type);
}
public static Object[] toNativeArray(Object obj) throws PageException {
return Caster.toNativeArray(obj);
}
public static String toTypeName(Object obj) {
return caster().toTypeName(obj);
}
public static Node toXML(Object obj) throws PageException {
return caster().toXML(obj);
}
public static Node toXML(Object obj, Node defaultValue) {
return caster().toXML(obj,defaultValue);
}
public static Document toDocument(Resource res) throws IOException, SAXException {
return XMLUtil.parse(XMLUtil.toInputSource(res), null, false);
}
public static boolean isArray(Object obj) {
return decision().isArray(obj);
}
public static boolean isStruct(Object obj) {
return decision().isStruct(obj);
}
public static Array createArray(){
return creator().createArray();
}
public static DateTime createDateTime(long time) {
return creator().createDateTime(time);
}
public static Property createProperty(String name, String type) {
PropertyImpl pi = new PropertyImpl();
pi.setName(name);
pi.setType(type);
return pi;
}
public static Struct createStruct(){
return creator().createStruct();
}
public static Collection.Key createKey(String key){
return creator().createKey(key);
}
public static Query createQuery(Collection.Key[] columns, int rows, String name) throws PageException{
return creator().createQuery(columns, rows, name);
}
public static Query createQuery(Array names, Array types, int rows, String name) throws PageException{
return new QueryImpl(names,types,rows,name);
}
public static RefBoolean createRefBoolean() {
return new RefBooleanImpl();
}
public static Key[] keys(Collection coll) {
if(coll==null) return new Key[0];
Iterator<Key> it = coll.keyIterator();
List<Key> rtn=new ArrayList<Key>();
if(it!=null)while(it.hasNext()){
rtn.add(it.next());
}
return rtn.toArray(new Key[rtn.size()]);
}
private static Creation creator() {
if(creator==null)
creator=CFMLEngineFactory.getInstance().getCreationUtil();
return creator;
}
private static Decision decision() {
if(decision==null)
decision=CFMLEngineFactory.getInstance().getDecisionUtil();
return decision;
}
private static Cast caster() {
if(caster==null)
caster=CFMLEngineFactory.getInstance().getCastUtil();
return caster;
}
/**
* represents a SQL Statement with his defined arguments for a prepared statement
*/
static class SQLImpl implements SQL {
private String strSQL;
/**
* Constructor only with SQL String
* @param strSQL SQL String
*/
public SQLImpl(String strSQL) {
this.strSQL=strSQL;
}
public void addItems(SQLItem item) {
}
@Override
public SQLItem[] getItems() {
return new SQLItem[0];
}
@Override
public int getPosition() {
return 0;
}
@Override
public void setPosition(int position) {
}
@Override
public String getSQLString() {
return strSQL;
}
@Override
public void setSQLString(String strSQL) {
this.strSQL= strSQL;
}
@Override
public String toString() {
return strSQL;
}
@Override
public String toHashString() {
return strSQL;
}
}
/**
* Integer Type that can be modified
*/
public static final class RefBooleanImpl implements RefBoolean {//MUST add interface Castable
private boolean value;
public RefBooleanImpl() {}
/**
* @param value
*/
public RefBooleanImpl(boolean value) {
this.value=value;
}
/**
* @param value
*/
public void setValue(boolean value) {
this.value = value;
}
/**
* @return returns value as Boolean Object
*/
public Boolean toBoolean() {
return value?Boolean.TRUE:Boolean.FALSE;
}
/**
* @return returns value as boolean value
*/
public boolean toBooleanValue() {
return value;
}
@Override
public String toString() {
return value?"true":"false";
}
}
public static DataSource getDataSource(PageContext pc, String name) throws PageException {
return ((PageContextImpl)pc).getDataSource(name); // TODO use reflection
}
public static DatasourceConnection getDatasourceConnection(PageContext pc, DataSource ds) throws PageException {
return ((ConfigWebImpl)pc.getConfig()).getDatasourceConnectionPool().getDatasourceConnection(pc,ds,null,null); // TODO use reflection
}
public static void releaseDatasourceConnection(PageContext pc, DatasourceConnection dc) {
((ConfigWebImpl)pc.getConfig()).getDatasourceConnectionPool().releaseDatasourceConnection(dc); // TODO use reflection
}
public static MappingImpl createMapping(Config config, String virtual, String physical) {
return new MappingImpl(config,
virtual,
physical,
null,INSPECT_UNDEFINED,true,false,false,false,true,true,null
);
}
public static String last(String list, char delimiter) {
return ListUtil.last(list, delimiter);
}
public static String last(String list, String delimiter) {
return ListUtil.last(list, delimiter,true);
}
public static int listFindNoCaseIgnoreEmpty(String list, String value, char delimiter) {
return ListUtil.listFindNoCaseIgnoreEmpty(list,value,delimiter);
}
public static String[] trimItems(String[] arr) {
for(int i=0;i<arr.length;i++) {
arr[i]=arr[i].trim();
}
return arr;
}
public static Document getDocument(Node node) {
return XMLUtil.getDocument(node);
}
public static Document newDocument() throws ParserConfigurationException, FactoryConfigurationError {
return XMLUtil.newDocument();
}
public static void setFirst(Node parent, Node node) {
XMLUtil.setFirst(parent, node);
}
public static Property[] getProperties(Component c,boolean onlyPeristent, boolean includeBaseProperties, boolean preferBaseProperties, boolean inheritedMappedSuperClassOnly) {
if(c instanceof ComponentPro)
return ((ComponentPro)c).getProperties(onlyPeristent, includeBaseProperties,preferBaseProperties,preferBaseProperties);
return c.getProperties(onlyPeristent);
}
public static void write(Resource res, String string, Charset charset, boolean append) throws IOException {
IOUtil.write(res, string, charset, append);
}
public static BufferedReader toBufferedReader(Resource res, Charset charset) throws IOException {
return IOUtil.toBufferedReader(IOUtil.getReader(res,(Charset)null));
}
public static boolean equalsComplexEL(Object left, Object right) {
return Operator.equalsComplexEL(left, right, false,true);
}
public static void setEntity(Component c, boolean entity) {
((ComponentAccess)c).setEntity(entity);
}
public static PageContext pc() {
//return CFMLEngineFactory.getInstance().getThreadPageContext();
return ThreadLocalPageContext.get();
}
public static Config config() {
//return CFMLEngineFactory.getInstance().getThreadPageContext().getConfig();
return ThreadLocalPageContext.getConfig();
}
}