001    /*
002     * Copyright 2002-2006 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.settings.jdbc;
017    
018    import java.io.IOException;
019    import java.util.Map;
020    
021    import javax.sql.DataSource;
022    
023    import org.springframework.beans.factory.InitializingBean;
024    import org.springframework.dao.IncorrectResultSizeDataAccessException;
025    import org.springframework.jdbc.core.JdbcTemplate;
026    import org.springframework.richclient.settings.Settings;
027    import org.springframework.richclient.settings.SettingsException;
028    import org.springframework.richclient.settings.SettingsFactory;
029    import org.springframework.util.Assert;
030    
031    /**
032     * 
033     * @author Peter De Bruycker
034     */
035    public class JdbcSettingsFactory implements SettingsFactory, InitializingBean {
036        private DataSource dataSource;
037        private UserNameProvider userNameProvider;
038    
039        public JdbcSettingsFactory() {
040        }
041    
042        public void setDataSource( DataSource dataSource ) {
043            this.dataSource = dataSource;
044        }
045    
046        public DataSource getDataSource() {
047            return dataSource;
048        }
049    
050        /**
051         * TODO: somehow make the key unique by adding a user name or login or something
052         */
053        public Settings createSettings( String key ) throws SettingsException {
054            try {
055                JdbcTemplate template = new JdbcTemplate( dataSource );
056                Map result = template.queryForMap( "SELECT * FROM SETTINGS WHERE KEY=? AND USER=?", new Object[] { key,
057                        userNameProvider.getUser() } );
058    
059                JdbcSettings settings = new JdbcSettings( dataSource, userNameProvider.getUser(), (Integer) result
060                        .get( "ID" ), key );
061                settings.load();
062                return settings;
063            } catch( IncorrectResultSizeDataAccessException e ) {
064                return new JdbcSettings( dataSource, userNameProvider.getUser(), null, key );
065            } catch( IOException e ) {
066                throw new SettingsException( "Unable to create settings with name " + key, e );
067            }
068        }
069    
070        public void setUserNameProvider( UserNameProvider userNameProvider ) {
071            this.userNameProvider = userNameProvider;
072        }
073    
074        public UserNameProvider getUserNameProvider() {
075            return userNameProvider;
076        }
077    
078        public void afterPropertiesSet() throws Exception {
079            Assert.notNull( userNameProvider, "UserNameProvider must be set" );
080            Assert.notNull( dataSource, "DataSource must be set" );
081        }
082    }