001    package railo.runtime.db;
002    
003    import java.util.Iterator;
004    import java.util.Map.Entry;
005    import java.util.TimeZone;
006    
007    import railo.commons.lang.ClassException;
008    import railo.commons.lang.StringUtil;
009    import railo.runtime.config.ConfigWebFactory;
010    import railo.runtime.op.Caster;
011    import railo.runtime.type.Collection.Key;
012    import railo.runtime.type.KeyImpl;
013    import railo.runtime.type.Struct;
014    import railo.runtime.type.util.CollectionUtil;
015    
016    
017    /**
018     * 
019     */
020    public final class DataSourceImpl  extends DataSourceSupport {
021    
022        private String connStr;
023        private String host;
024        private String database;
025        private int port;
026        private String connStrTranslated;
027        private Struct custom;
028            private boolean validate;
029        
030            /**
031             * constructor of the class
032             * @param name 
033             * @param clazz 
034             * @param host 
035             * @param dsn
036             * @param database 
037             * @param port 
038             * @param username
039             * @param password
040             * @param connectionLimit 
041             * @param connectionTimeout 
042             * @param blob 
043             * @param clob 
044             * @param allow 
045             * @param custom 
046             * @param readOnly 
047             * @throws ClassException 
048             */
049        public DataSourceImpl(String name,String className, String host, String dsn, String database, int port, String username, String password, 
050                int connectionLimit, int connectionTimeout,long metaCacheTimeout, boolean blob, boolean clob, int allow, Struct custom, boolean readOnly, 
051                boolean validate,boolean storage, TimeZone timezone) throws ClassException {
052            this(name, toClass(className), host, dsn, database, port, username, password, connectionLimit, connectionTimeout,metaCacheTimeout, blob, clob, allow, custom, readOnly,validate,storage,timezone);
053            
054            }
055    
056            private DataSourceImpl(String name,Class<?> clazz, String host, String dsn, String database, int port, String username, String password, 
057                int connectionLimit, int connectionTimeout,long metaCacheTimeout, boolean blob, boolean clob, int allow, Struct custom, boolean readOnly, 
058                boolean validate,boolean storage,TimeZone timezone) {
059                    super(name, clazz,username,ConfigWebFactory.decrypt(password),blob,clob,connectionLimit, connectionTimeout, metaCacheTimeout, timezone, allow<0?ALLOW_ALL:allow, storage, readOnly);
060                            
061            this.host=host;
062            this.database=database;
063            this.connStr=dsn; 
064            this.port=port;
065    
066            this.custom=custom;
067            this.validate=validate;
068            
069            this.connStrTranslated=dsn; 
070            translateDsn();
071            
072            //      throw new DatabaseException("can't find class ["+classname+"] for jdbc driver, check if driver (jar file) is inside lib folder",e.getMessage(),null,null,null);
073            
074            }
075        private void translateDsn() {
076            connStrTranslated=replace(connStrTranslated,"host",host,false);
077            connStrTranslated=replace(connStrTranslated,"database",database,false);
078            connStrTranslated=replace(connStrTranslated,"port",Caster.toString(port),false);
079            connStrTranslated=replace(connStrTranslated,"username",getUsername(),false);
080            connStrTranslated=replace(connStrTranslated,"password",getPassword(),false);
081            
082            //Collection.Key[] keys = custom==null?new Collection.Key[0]:custom.keys();
083            if(custom!=null) {
084                    Iterator<Entry<Key, Object>> it = custom.entryIterator();
085                    Entry<Key, Object> e;
086                while(it.hasNext()) {
087                            e = it.next();
088                        connStrTranslated=replace(connStrTranslated,e.getKey().getString(),Caster.toString(e.getValue(),""),true);
089                    }
090            }
091        }
092    
093        private String replace(String src, String name, String value,boolean doQueryString) {
094            if(StringUtil.indexOfIgnoreCase(src,"{"+name+"}")!=-1) {
095                return StringUtil.replace(connStrTranslated,"{"+name+"}",value,false);
096            }
097            if(!doQueryString) return src;
098            if(getClazz().getName().indexOf("microsoft")!=-1 || getClazz().getName().indexOf("jtds")!=-1)
099                    return src+=';'+name+'='+value;
100            return src+=((src.indexOf('?')!=-1)?'&':'?')+name+'='+value;
101        }
102    
103        @Override
104        public String getDsnOriginal() {
105            return getConnectionString();
106        }
107    
108        @Override
109        public String getConnectionString() {
110            return connStr;
111        }
112        
113        @Override
114        public String getDsnTranslated() {
115            return getConnectionStringTranslated();
116        }
117        
118        @Override
119        public String getConnectionStringTranslated() {
120            return connStrTranslated;
121        }
122    
123        @Override
124        public String getDatabase() {
125            return database;
126        }
127    
128        @Override
129        public int getPort() {
130            return port;
131        }
132    
133        @Override
134        public String getHost() {
135            return host;
136        }
137        
138        @Override
139        public Object clone() {
140            return new DataSourceImpl(getName(),getClazz(), host, connStr, database, port, getUsername(), getPassword(), getConnectionLimit(), getConnectionTimeout(),getMetaCacheTimeout(), isBlob(), isClob(), allow, custom, isReadOnly(),validate,isStorage(),getTimeZone());
141        }
142    
143        @Override
144        public DataSource cloneReadOnly() {
145            return new DataSourceImpl(getName(),getClazz(), host, connStr, database, port, getUsername(), getPassword(), getConnectionLimit(), getConnectionTimeout(),getMetaCacheTimeout(), isBlob(), isClob(), allow,custom, true,validate,isStorage(),getTimeZone());
146        }
147    
148        @Override
149        public String getCustomValue(String key) {
150            return Caster.toString(custom.get(KeyImpl.init(key),null),"");
151        }
152        
153        @Override
154        public String[] getCustomNames() {
155            return CollectionUtil.keysAsString(custom);
156        }
157        
158        @Override
159        public Struct getCustoms() {
160            return (Struct)custom.clone();
161        }
162    
163        @Override
164        public boolean validate() {
165                    return validate;
166            }
167    }