001    /****************************************************************
002     * Licensed to the Apache Software Foundation (ASF) under one   *
003     * or more contributor license agreements.  See the NOTICE file *
004     * distributed with this work for additional information        *
005     * regarding copyright ownership.  The ASF licenses this file   *
006     * to you under the Apache License, Version 2.0 (the            *
007     * "License"); you may not use this file except in compliance   *
008     * with the License.  You may obtain a copy of the License at   *
009     *                                                              *
010     *   http://www.apache.org/licenses/LICENSE-2.0                 *
011     *                                                              *
012     * Unless required by applicable law or agreed to in writing,   *
013     * software distributed under the License is distributed on an  *
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015     * KIND, either express or implied.  See the License for the    *
016     * specific language governing permissions and limitations      *
017     * under the License.                                           *
018     ****************************************************************/
019    
020    package org.apache.james.user.jdbc;
021    
022    import org.apache.james.user.api.model.User;
023    import org.apache.james.user.lib.model.DefaultJamesUser;
024    import org.apache.james.user.lib.model.DefaultUser;
025    import org.apache.mailet.MailAddress;
026    
027    import java.sql.PreparedStatement;
028    import java.sql.ResultSet;
029    import java.sql.SQLException;
030    
031    /**
032     * A Jdbc-backed UserRepository which handles User instances of the
033     * <code>DefaultJamesUser</code> class, or any superclass.
034     */
035    @Deprecated
036    public class JamesUsersJdbcRepository extends AbstractJdbcUsersRepository {
037    
038        /**
039         * @see org.apache.james.user.jdbc.AbstractJdbcUsersRepository#readUserFromResultSet(java.sql.ResultSet)
040         */
041        protected User readUserFromResultSet(ResultSet rsUsers) throws SQLException {
042            // Get the column values
043            String username = rsUsers.getString(1);
044            String pwdHash = rsUsers.getString(2);
045            String pwdAlgorithm = rsUsers.getString(3);
046            boolean useForwarding = rsUsers.getBoolean(4);
047            String forwardingDestination = rsUsers.getString(5);
048            boolean useAlias = rsUsers.getBoolean(6);
049            String alias = rsUsers.getString(7);
050    
051            MailAddress forwardAddress = null;
052            if (forwardingDestination != null) {
053                try {
054                    forwardAddress = new MailAddress(forwardingDestination);
055                } catch (javax.mail.internet.ParseException pe) {
056                    StringBuffer exceptionBuffer = new StringBuffer(256).append("Invalid mail address in database: ").append(forwardingDestination).append(", for user ").append(username).append(".");
057                    throw new RuntimeException(exceptionBuffer.toString());
058                }
059            }
060    
061            // Build a DefaultJamesUser with these values, and add to the list.
062            DefaultJamesUser user = new DefaultJamesUser(username, pwdHash, pwdAlgorithm);
063            user.setForwarding(useForwarding);
064            user.setForwardingDestination(forwardAddress);
065            user.setAliasing(useAlias);
066            user.setAlias(alias);
067    
068            return user;
069        }
070    
071        /**
072         * @see org.apache.james.user.jdbc.AbstractJdbcUsersRepository#setUserForInsertStatement(org.apache.james.user.api.model.User,
073         *      java.sql.PreparedStatement)
074         */
075        protected void setUserForInsertStatement(User user, PreparedStatement userInsert) throws SQLException {
076            setUserForStatement(user, userInsert, false);
077        }
078    
079        /**
080         * @see org.apache.james.user.jdbc.AbstractJdbcUsersRepository#setUserForUpdateStatement(org.apache.james.user.api.model.User,
081         *      java.sql.PreparedStatement)
082         */
083        protected void setUserForUpdateStatement(User user, PreparedStatement userUpdate) throws SQLException {
084            setUserForStatement(user, userUpdate, true);
085        }
086    
087        /**
088         * Sets the data for the prepared statement to match the information in the
089         * user object.
090         * 
091         * @param user
092         *            the user whose data is to be stored in the PreparedStatement.
093         * @param stmt
094         *            the PreparedStatement to be modified.
095         * @param userNameLast
096         *            whether the user id is the last or the first column
097         */
098        private void setUserForStatement(User user, PreparedStatement stmt, boolean userNameLast) throws SQLException {
099            // Determine column offsets to use, based on username column pos.
100            int nameIndex = 1;
101            int colOffset = 1;
102            if (userNameLast) {
103                nameIndex = 7;
104                colOffset = 0;
105            }
106    
107            // Can handle instances of DefaultJamesUser and DefaultUser.
108            DefaultJamesUser jamesUser;
109            if (user instanceof DefaultJamesUser) {
110                jamesUser = (DefaultJamesUser) user;
111            } else if (user instanceof DefaultUser) {
112                DefaultUser aUser = (DefaultUser) user;
113                jamesUser = new DefaultJamesUser(aUser.getUserName(), aUser.getHashedPassword(), aUser.getHashAlgorithm());
114            }
115            // Can't handle any other implementations.
116            else {
117                throw new RuntimeException("An unknown implementation of User was " + "found. This implementation cannot be " + "persisted to a UsersJDBCRepsitory.");
118            }
119    
120            // Get the user details to save.
121            stmt.setString(nameIndex, jamesUser.getUserName());
122            stmt.setString(1 + colOffset, jamesUser.getHashedPassword());
123            stmt.setString(2 + colOffset, jamesUser.getHashAlgorithm());
124            stmt.setInt(3 + colOffset, (jamesUser.getForwarding() ? 1 : 0));
125    
126            MailAddress forwardAddress = jamesUser.getForwardingDestination();
127            String forwardDestination = null;
128            if (forwardAddress != null) {
129                forwardDestination = forwardAddress.toString();
130            }
131            stmt.setString(4 + colOffset, forwardDestination);
132            stmt.setInt(5 + colOffset, (jamesUser.getAliasing() ? 1 : 0));
133            stmt.setString(6 + colOffset, jamesUser.getAlias());
134        }
135    
136    }