source: DASISH/t5.6/backend/annotator-backend/trunk/annotator-backend/src/main/java/eu/dasish/annotation/backend/dao/impl/JdbcUserDao.java @ 4603

Last change on this file since 4603 was 4603, checked in by olhsha, 10 years ago

test commit after disaster

File size: 12.9 KB
Line 
1/*
2 * Copyright (C) 2013 DASISH
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17 */
18package eu.dasish.annotation.backend.dao.impl;
19
20import eu.dasish.annotation.backend.dao.UserDao;
21import eu.dasish.annotation.schema.Permission;
22import eu.dasish.annotation.schema.User;
23import java.sql.ResultSet;
24import java.sql.SQLException;
25import java.util.HashMap;
26import java.util.List;
27import java.util.Map;
28import java.util.UUID;
29import javax.sql.DataSource;
30import org.slf4j.Logger;
31import org.slf4j.LoggerFactory;
32import org.springframework.jdbc.core.RowMapper;
33
34/**
35 *
36 * @author olhsha
37 */
38public class JdbcUserDao extends JdbcResourceDao implements UserDao {
39
40    private final Logger loggerUserDao = LoggerFactory.getLogger(JdbcUserDao.class);
41
42    public JdbcUserDao(DataSource dataSource) {
43        setDataSource(dataSource);
44        internalIdName = principal_id;
45        resourceTableName = principalTableName;
46    }
47
48    @Override
49    public void setServiceURI(String serviceURI) {
50        _serviceURI = serviceURI;
51    }
52
53    /////////// GETTERS //////////////////////
54    @Override
55    public User getUser(Number internalID) {
56
57        if (internalID == null) {
58            loggerUserDao.debug("internalID: " + nullArgument);
59            return null;
60        }
61
62        StringBuilder sql = new StringBuilder("SELECT ");
63        sql.append(principalStar).append(" FROM ").append(principalTableName).append(" WHERE ").append(principal_id).append("= ? LIMIT 1");
64        List<User> result = this.loggedQuery(sql.toString(), userRowMapper, internalID);
65        return (!result.isEmpty() ? result.get(0) : null);
66    }
67    private final RowMapper<User> userRowMapper = new RowMapper<User>() {
68        @Override
69        public User mapRow(ResultSet rs, int rowNumber) throws SQLException {
70            User result = new User();
71            result.setURI(externalIDtoURI(rs.getString(external_id)));
72            result.setDisplayName(rs.getString(principal_name));
73            result.setEMail(rs.getString(e_mail));
74            return result;
75        }
76    };
77
78    @Override
79    public User getUserByInfo(String eMail) {
80        StringBuilder sql = new StringBuilder("SELECT ");
81        sql.append(principalStar).append(" FROM ").append(principalTableName).append(" WHERE ").append("LOWER(").append(e_mail).append(")").append("= ? LIMIT 1");
82        List<User> result = this.loggedQuery(sql.toString(), userRowMapper, eMail.toLowerCase());
83        return (!result.isEmpty() ? result.get(0) : null);
84    }
85
86    @Override
87    public boolean userIsInUse(Number userID) {
88
89        if (userID == null) {
90            loggerUserDao.debug("userID: " + nullArgument);
91            return false;
92        }
93
94        StringBuilder sqlPermissions = new StringBuilder("SELECT ");
95        sqlPermissions.append(principal_id).append(" FROM ").append(permissionsTableName).append(" WHERE ").append(principal_id).append("= ? LIMIT 1");
96        List<Number> resultTargets = this.loggedQuery(sqlPermissions.toString(), internalIDRowMapper, userID);
97        if (resultTargets.size() > 0) {
98            return true;
99        };
100
101        StringBuilder sqlNotebooks = new StringBuilder("SELECT ");
102        sqlNotebooks.append(owner_id).append(" FROM ").append(notebookTableName).append(" WHERE ").append(owner_id).append("= ? LIMIT 1");
103        List<Number> resultNotebooks = this.loggedQuery(sqlNotebooks.toString(), ownerIDRowMapper, userID);
104        if (resultNotebooks.size() > 0) {
105            return true;
106        };
107        return false;
108    }
109
110    @Override
111    public boolean userExists(User user) {
112        if (user == null) {
113            loggerUserDao.debug("user: " + nullArgument);
114            return false;
115        }
116
117        String emailCriterion = user.getEMail().toLowerCase();
118        StringBuilder sqlTargets = new StringBuilder("SELECT ");
119        sqlTargets.append(principal_id).append(" FROM ").append(principalTableName).append(" WHERE ").append("LOWER(").append(e_mail).append(")= ? LIMIT 1");
120        List<Number> resultTargets = this.loggedQuery(sqlTargets.toString(), internalIDRowMapper, emailCriterion);
121        if (resultTargets.size() > 0) {
122            return true;
123        } else {
124            return false;
125        }
126    }
127
128    @Override
129    public String getRemoteID(Number internalID) {
130
131        if (internalID == null) {
132            loggerUserDao.debug("internalID: " + nullArgument);
133            return null;
134        }
135
136        StringBuilder requestDB = new StringBuilder("SELECT ");
137        requestDB.append(remote_id).append(" FROM ").append(principalTableName).append(" WHERE ").append(principal_id).append("= ? LIMIT 1");
138        List<String> result = this.loggedQuery(requestDB.toString(), remoteIDRowMapper, internalID);
139        return (result.size() > 0) ? result.get(0) : null;
140    }
141    private final RowMapper<String> remoteIDRowMapper = new RowMapper<String>() {
142        @Override
143        public String mapRow(ResultSet rs, int rowNumber) throws SQLException {
144            return rs.getString(remote_id);
145        }
146    };
147
148    @Override
149    public Number getUserInternalIDFromRemoteID(String remoteID) {
150
151        if (remoteID == null) {
152            loggerUserDao.debug("remoteID: " + nullArgument);
153            return null;
154        }
155
156        StringBuilder requestDB = new StringBuilder("SELECT ");
157        requestDB.append(principal_id).append(" FROM ").append(principalTableName).append(" WHERE ").append(remote_id).append("= ? LIMIT 1");
158        List<Number> result = this.loggedQuery(requestDB.toString(), internalIDRowMapper, remoteID);
159        return (result.size() > 0) ? result.get(0) : null;
160    }
161
162    @Override
163    public String getTypeOfUserAccount(Number internalID) {
164
165        if (internalID == null) {
166            loggerUserDao.debug("internalID: " + nullArgument);
167            return null;
168        }
169
170        StringBuilder requestDB = new StringBuilder("SELECT ");
171        requestDB.append(account).append(" FROM ").append(principalTableName).append(" WHERE ").append(principal_id).append("= ? LIMIT 1");
172        List<String> result = this.loggedQuery(requestDB.toString(), adminRightsRowMapper, internalID);
173        return (result.size() > 0) ? result.get(0) : null;
174    }
175    private final RowMapper<String> adminRightsRowMapper = new RowMapper<String>() {
176        @Override
177        public String mapRow(ResultSet rs, int rowNumber) throws SQLException {
178            return rs.getString(account);
179        }
180    };
181
182    @Override
183    public Number getDBAdminID() {
184        StringBuilder requestDB = new StringBuilder("SELECT ");
185        requestDB.append(principal_id).append(" FROM ").append(principalTableName).append(" WHERE account = 'admin'  LIMIT 1");
186        List<Number> result = this.loggedQuery(requestDB.toString(), internalIDRowMapper);
187        return (result.size() > 0) ? result.get(0) : null;
188    }
189
190    @Override
191    public List<Number> getPrincipalIDsWithPermissionForNotebook(Number notebookID, Permission permission) {
192        if (notebookID == null) {
193            loggerUserDao.debug("notebookID: " + nullArgument);
194            return null;
195        }
196
197        if (permission == null) {
198            loggerUserDao.debug("permission: " + nullArgument);
199            return null;
200        }
201        Map<String, Object> params = new HashMap<String, Object>();
202        params.put("notebookID", notebookID);
203        params.put("accessMode", permission.value());
204
205        StringBuilder sql = new StringBuilder("SELECT ");
206        sql.append(principal_id).append(" FROM ").append(notebookPermissionsTableName).append(" WHERE ").
207                append(notebook_id).append(" = :notebookID AND ").append(this.permission).append(" = :accessMode");
208
209        return this.loggedQuery(sql.toString(), internalIDRowMapper, params);
210
211    }
212
213    ///////////////////// ADDERS ////////////////////////////
214    @Override
215    public Number addUser(User user, String remoteID) {
216
217        if (remoteID == null) {
218            loggerUserDao.debug("remoteID: " + nullArgument);
219            return null;
220        }
221
222        if (user == null) {
223            loggerUserDao.debug("user: " + nullArgument);
224            return null;
225        }
226
227        UUID externalIdentifier = UUID.randomUUID();
228        String newExternalIdentifier = externalIdentifier.toString();
229        Map<String, Object> params = new HashMap<String, Object>();
230        params.put("externalId", newExternalIdentifier);
231        params.put("principalName", user.getDisplayName());
232        params.put("email", user.getEMail());
233        params.put("remoteID", remoteID);
234        params.put("accountType", this.user);
235        StringBuilder sql = new StringBuilder("INSERT INTO ");
236        sql.append(principalTableName).append("(").append(external_id).append(",").
237                append(principal_name).append(",").append(e_mail).append(",").
238                append(remote_id).append(",").append(account).append(" ) VALUES (:externalId, :principalName, :email, :remoteID, :accountType)");
239        final int affectedRows = this.loggedUpdate(sql.toString(), params);
240        return (affectedRows > 0 ? getInternalID(externalIdentifier) : null);
241    }
242
243    ////////// UPDATERS ///////////////////////
244    @Override
245    public boolean updateAccount(UUID externalID, String account) {
246
247        if (externalID == null) {
248            loggerUserDao.debug("eternalId: " + nullArgument);
249            return false;
250        }
251
252        if (account == null) {
253            loggerUserDao.debug("account: " + nullArgument);
254            return false;
255        }
256
257        if (!account.equals(admin) && !account.equals(developer) && !account.equals(user)) {
258            logger.error("the given type of account '" + account + "' does not exist.");
259            return false;
260        }
261        Number principalID = this.getInternalID(externalID);
262        if (principalID != null) {
263            Map<String, Object> params = new HashMap<String, Object>();
264            params.put("externalId", externalID.toString());
265            params.put("accountType", account);
266            StringBuilder sql = new StringBuilder("UPDATE ");
267            sql.append(principalTableName).append(" SET ").
268                    append(this.account).append("= :accountType").
269                    append(" WHERE ").append(external_id).append("= :externalId");
270            int affectedRows = this.loggedUpdate(sql.toString(), params);
271            if (affectedRows > 0) {
272                return true;
273            } else {
274                logger.error("For some reason the database refuses update the account of " + externalID.toString() + " . Consult the servers' respond.");
275                return false;
276            }
277        } else {
278            logger.error("The user with external ID " + externalID.toString() + " is not found in the data base");
279            return false;
280        }
281
282    }
283
284    @Override
285    public Number updateUser(User user) {
286
287        if (user == null) {
288            loggerUserDao.debug("user: " + nullArgument);
289            return null;
290        }
291
292        Number principalID = this.getInternalIDFromURI(user.getURI());
293        StringBuilder sql = new StringBuilder("UPDATE ");
294        sql.append(principalTableName).append(" SET ").
295                append(e_mail).append("= '").append(user.getEMail()).append("',").
296                append(principal_name).append("= '").append(user.getDisplayName()).append("' ").
297                append(" WHERE ").append(principal_id).append("= ?");
298        int affectedRows = this.loggedUpdate(sql.toString(), principalID);
299        return principalID;
300    }
301
302    ////// DELETERS ////////////
303    @Override
304    public int deleteUser(Number internalID) {
305        if (internalID == null) {
306            loggerUserDao.debug("internalID: " + nullArgument);
307            return 0;
308        }
309
310
311        StringBuilder sql = new StringBuilder("DELETE FROM ");
312        sql.append(principalTableName).append(" where ").append(principal_id).append(" = ?");
313        return this.loggedUpdate(sql.toString(), internalID);
314
315    }
316
317    @Override
318    public int deleteUserSafe(Number internalID) {
319
320        if (internalID == null) {
321            loggerUserDao.debug("internalID: " + nullArgument);
322            return 0;
323        }
324
325
326        if (userIsInUse(internalID)) {
327            loggerUserDao.debug("User is in use, and cannot be deleted.");
328            return 0;
329        }
330        StringBuilder sql = new StringBuilder("DELETE FROM ");
331        sql.append(principalTableName).append(" where ").append(principal_id).append(" = ?");
332        return this.loggedUpdate(sql.toString(), internalID);
333
334    }
335}
Note: See TracBrowser for help on using the repository browser.