PageRenderTime 54ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/roller-5.0.1/weblogger-business/src/main/java/org/apache/roller/weblogger/business/jpa/JPAUserManagerImpl.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 776 lines | 569 code | 138 blank | 69 comment | 132 complexity | d26ba4e2a2acc695973f14cf3c225b00 MD5 | raw file
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. The ASF licenses this file to You
  4. * under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License. For additional information regarding
  15. * copyright in this work, please see the NOTICE file in the top level
  16. * directory of this distribution.
  17. */
  18. package org.apache.roller.weblogger.business.jpa;
  19. import java.sql.Timestamp;
  20. import javax.persistence.NoResultException;
  21. import org.apache.commons.logging.Log;
  22. import org.apache.commons.logging.LogFactory;
  23. import org.apache.roller.weblogger.WebloggerException;
  24. import org.apache.roller.weblogger.business.UserManager;
  25. import org.apache.roller.weblogger.pojos.*;
  26. import java.util.ArrayList;
  27. import java.util.Date;
  28. import java.util.Hashtable;
  29. import java.util.Iterator;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.TreeMap;
  33. import javax.persistence.Query;
  34. import org.apache.roller.weblogger.business.Weblogger;
  35. import org.apache.roller.weblogger.config.WebloggerConfig;
  36. @com.google.inject.Singleton
  37. public class JPAUserManagerImpl implements UserManager {
  38. private static Log log = LogFactory.getLog(JPAUserManagerImpl.class);
  39. private final JPAPersistenceStrategy strategy;
  40. // cached mapping of userNames -> userIds
  41. private Map userNameToIdMap = new Hashtable();
  42. @com.google.inject.Inject
  43. protected JPAUserManagerImpl(JPAPersistenceStrategy strat) {
  44. log.debug("Instantiating JPA User Manager");
  45. this.strategy = strat;
  46. }
  47. public void release() {}
  48. //--------------------------------------------------------------- user CRUD
  49. public void saveUser(User data) throws WebloggerException {
  50. this.strategy.store(data);
  51. }
  52. public void removeUser(User user) throws WebloggerException {
  53. String userName = user.getUserName();
  54. // remove permissions, maintaining both sides of relationship
  55. List<WeblogPermission> perms = getWeblogPermissions(user);
  56. for (WeblogPermission perm : perms) {
  57. this.strategy.remove(perms);
  58. }
  59. this.strategy.remove(user);
  60. // remove entry from cache mapping
  61. this.userNameToIdMap.remove(userName);
  62. // remove all associated attributes
  63. List<UserAttribute> atts = getUserAttributes(userName);
  64. for (UserAttribute att : atts) {
  65. this.strategy.remove(att);
  66. }
  67. }
  68. public void addUser(User newUser) throws WebloggerException {
  69. if(newUser == null)
  70. throw new WebloggerException("cannot add null user");
  71. // TODO BACKEND: we must do this in a better fashion, like getUserCnt()?
  72. boolean adminUser = false;
  73. List existingUsers = this.getUsers(Boolean.TRUE, null, null, 0, 1);
  74. boolean firstUserAdmin = WebloggerConfig.getBooleanProperty("users.firstUserAdmin");
  75. if (existingUsers.size() == 0 && firstUserAdmin) {
  76. // Make first user an admin
  77. adminUser = true;
  78. //if user was disabled (because of activation user
  79. // account with e-mail property), enable it for admin user
  80. newUser.setEnabled(Boolean.TRUE);
  81. newUser.setActivationCode(null);
  82. }
  83. if (getUserByUserName(newUser.getUserName()) != null ||
  84. getUserByUserName(newUser.getUserName().toLowerCase()) != null) {
  85. throw new WebloggerException("error.add.user.userNameInUse");
  86. }
  87. this.strategy.store(newUser);
  88. grantRole("editor", newUser);
  89. if (adminUser) {
  90. grantRole("admin", newUser);
  91. }
  92. }
  93. public User getUser(String id) throws WebloggerException {
  94. return (User)this.strategy.load(User.class, id);
  95. }
  96. //------------------------------------------------------------ user queries
  97. public User getUserByUserName(String userName) throws WebloggerException {
  98. return getUserByUserName(userName, Boolean.TRUE);
  99. }
  100. public User getUserByUserName(String userName, Boolean enabled)
  101. throws WebloggerException {
  102. if (userName==null )
  103. throw new WebloggerException("userName cannot be null");
  104. // check cache first
  105. // NOTE: if we ever allow changing usernames then this needs updating
  106. if(this.userNameToIdMap.containsKey(userName)) {
  107. User user = this.getUser(
  108. (String) this.userNameToIdMap.get(userName));
  109. if(user != null) {
  110. // only return the user if the enabled status matches
  111. if(enabled == null || enabled.equals(user.getEnabled())) {
  112. log.debug("userNameToIdMap CACHE HIT - "+userName);
  113. return user;
  114. }
  115. } else {
  116. // mapping hit with lookup miss? mapping must be old, remove it
  117. this.userNameToIdMap.remove(userName);
  118. }
  119. }
  120. // cache failed, do lookup
  121. Query query;
  122. Object[] params;
  123. if (enabled != null) {
  124. query = strategy.getNamedQuery(
  125. "User.getByUserName&Enabled");
  126. params = new Object[] {userName, enabled};
  127. } else {
  128. query = strategy.getNamedQuery(
  129. "User.getByUserName");
  130. params = new Object[] {userName};
  131. }
  132. for (int i=0; i<params.length; i++) {
  133. query.setParameter(i+1, params[i]);
  134. }
  135. User user = null;
  136. try {
  137. user = (User)query.getSingleResult();
  138. } catch (NoResultException e) {
  139. user = null;
  140. }
  141. // add mapping to cache
  142. if(user != null) {
  143. log.debug("userNameToIdMap CACHE MISS - "+userName);
  144. this.userNameToIdMap.put(user.getUserName(), user.getId());
  145. }
  146. return user;
  147. }
  148. public List getUsers(Weblog weblog, Boolean enabled, Date startDate,
  149. Date endDate, int offset, int length)
  150. throws WebloggerException {
  151. Query query = null;
  152. List results = null;
  153. // if we are doing date range then we must have an end date
  154. if (startDate != null && endDate == null) {
  155. endDate = new Date();
  156. }
  157. List params = new ArrayList();
  158. int size = 0;
  159. StringBuffer queryString = new StringBuffer();
  160. StringBuffer whereClause = new StringBuffer();
  161. if (weblog != null) {
  162. queryString.append("SELECT u FROM User u JOIN u.permissions p ");
  163. params.add(size++, weblog);
  164. whereClause.append(" WHERE p.website = ?" + size);
  165. } else {
  166. queryString.append("SELECT u FROM User u ");
  167. }
  168. if (enabled != null) {
  169. if (whereClause.length() == 0) {
  170. whereClause.append(" WHERE ");
  171. } else {
  172. whereClause.append(" AND ");
  173. }
  174. params.add(size++, enabled);
  175. whereClause.append("u.enabled = ?" + size);
  176. }
  177. if (startDate != null) {
  178. if (whereClause.length() == 0) {
  179. whereClause.append(" WHERE ");
  180. } else {
  181. whereClause.append(" AND ");
  182. }
  183. // if we are doing date range then we must have an end date
  184. if(endDate == null) {
  185. endDate = new Date();
  186. }
  187. Timestamp start = new Timestamp(startDate.getTime());
  188. Timestamp end = new Timestamp(endDate.getTime());
  189. params.add(size++, start);
  190. whereClause.append("u.dateCreated > ?" + size);
  191. params.add(size++, end);
  192. whereClause.append(" AND u.dateCreated < ?" + size);
  193. }
  194. whereClause.append(" ORDER BY u.dateCreated DESC");
  195. query = strategy.getDynamicQuery(queryString.toString() + whereClause.toString());
  196. if (offset != 0) {
  197. query.setFirstResult(offset);
  198. }
  199. if (length != -1) {
  200. query.setMaxResults(length);
  201. }
  202. for (int i=0; i<params.size(); i++) {
  203. query.setParameter(i+1, params.get(i));
  204. }
  205. return query.getResultList();
  206. }
  207. public List getUsers(int offset, int length) throws WebloggerException {
  208. return getUsers(Boolean.TRUE, null, null, offset, length);
  209. }
  210. public List getUsers(Boolean enabled, Date startDate, Date endDate,
  211. int offset, int length)
  212. throws WebloggerException {
  213. Query query = null;
  214. List results = null;
  215. boolean setRange = offset != 0 || length != -1;
  216. if (endDate == null) endDate = new Date();
  217. if (enabled != null) {
  218. if (startDate != null) {
  219. Timestamp start = new Timestamp(startDate.getTime());
  220. Timestamp end = new Timestamp(endDate.getTime());
  221. query = strategy.getNamedQuery(
  222. "User.getByEnabled&EndDate&StartDateOrderByStartDateDesc");
  223. query.setParameter(1, enabled);
  224. query.setParameter(2, end);
  225. query.setParameter(3, start);
  226. } else {
  227. Timestamp end = new Timestamp(endDate.getTime());
  228. query = strategy.getNamedQuery(
  229. "User.getByEnabled&EndDateOrderByStartDateDesc");
  230. query.setParameter(1, enabled);
  231. query.setParameter(2, end);
  232. }
  233. } else {
  234. if (startDate != null) {
  235. Timestamp start = new Timestamp(startDate.getTime());
  236. Timestamp end = new Timestamp(endDate.getTime());
  237. query = strategy.getNamedQuery(
  238. "User.getByEndDate&StartDateOrderByStartDateDesc");
  239. query.setParameter(1, end);
  240. query.setParameter(2, start);
  241. } else {
  242. Timestamp end = new Timestamp(endDate.getTime());
  243. query = strategy.getNamedQuery(
  244. "User.getByEndDateOrderByStartDateDesc");
  245. query.setParameter(1, end);
  246. }
  247. }
  248. if (offset != 0) {
  249. query.setFirstResult(offset);
  250. }
  251. if (length != -1) {
  252. query.setMaxResults(length);
  253. }
  254. return query.getResultList();
  255. }
  256. /**
  257. * Get users of a website
  258. */
  259. public List getUsers(Weblog website, Boolean enabled, int offset, int length) throws WebloggerException {
  260. Query query = null;
  261. List results = null;
  262. boolean setRange = offset != 0 || length != -1;
  263. if (length == -1) {
  264. length = Integer.MAX_VALUE - offset;
  265. }
  266. if (enabled != null) {
  267. if (website != null) {
  268. query = strategy.getNamedQuery("User.getByEnabled&Permissions.website");
  269. query.setParameter(1, enabled);
  270. query.setParameter(2, website);
  271. } else {
  272. query = strategy.getNamedQuery("User.getByEnabled");
  273. query.setParameter(1, enabled);
  274. }
  275. } else {
  276. if (website != null) {
  277. query = strategy.getNamedQuery("User.getByPermissions.website");
  278. query.setParameter(1, website);
  279. } else {
  280. query = strategy.getNamedQuery("User.getAll");
  281. }
  282. }
  283. if (offset != 0) {
  284. query.setFirstResult(offset);
  285. }
  286. if (length != -1) {
  287. query.setMaxResults(length);
  288. }
  289. return query.getResultList();
  290. }
  291. public List getUsersStartingWith(String startsWith, Boolean enabled,
  292. int offset, int length) throws WebloggerException {
  293. Query query = null;
  294. if (enabled != null) {
  295. if (startsWith != null) {
  296. query = strategy.getNamedQuery(
  297. "User.getByEnabled&UserNameOrEmailAddressStartsWith");
  298. query.setParameter(1, enabled);
  299. query.setParameter(2, startsWith + '%');
  300. query.setParameter(3, startsWith + '%');
  301. } else {
  302. query = strategy.getNamedQuery(
  303. "User.getByEnabled");
  304. query.setParameter(1, enabled);
  305. }
  306. } else {
  307. if (startsWith != null) {
  308. query = strategy.getNamedQuery(
  309. "User.getByUserNameOrEmailAddressStartsWith");
  310. query.setParameter(1, startsWith + '%');
  311. } else {
  312. query = strategy.getNamedQuery("User.getAll");
  313. }
  314. }
  315. if (offset != 0) {
  316. query.setFirstResult(offset);
  317. }
  318. if (length != -1) {
  319. query.setMaxResults(length);
  320. }
  321. return query.getResultList();
  322. }
  323. public Map getUserNameLetterMap() throws WebloggerException {
  324. String lc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  325. Map results = new TreeMap();
  326. Query query = strategy.getNamedQuery(
  327. "User.getCountByUserNameLike");
  328. for (int i=0; i<26; i++) {
  329. char currentChar = lc.charAt(i);
  330. query.setParameter(1, currentChar + "%");
  331. List row = query.getResultList();
  332. Long count = (Long) row.get(0);
  333. results.put(String.valueOf(currentChar), count);
  334. }
  335. return results;
  336. }
  337. public List getUsersByLetter(char letter, int offset, int length)
  338. throws WebloggerException {
  339. Query query = strategy.getNamedQuery(
  340. "User.getByUserNameOrderByUserName");
  341. query.setParameter(1, letter + "%");
  342. if (offset != 0) {
  343. query.setFirstResult(offset);
  344. }
  345. if (length != -1) {
  346. query.setMaxResults(length);
  347. }
  348. return query.getResultList();
  349. }
  350. /**
  351. * Get count of users, enabled only
  352. */
  353. public long getUserCount() throws WebloggerException {
  354. long ret = 0;
  355. Query q = strategy.getNamedQuery("User.getCountEnabledDistinct");
  356. q.setParameter(1, Boolean.TRUE);
  357. List results = q.getResultList();
  358. ret =((Long)results.get(0)).longValue();
  359. return ret;
  360. }
  361. public User getUserByAttribute(String name, String value) throws WebloggerException {
  362. return getUserByAttribute(name, value, Boolean.TRUE);
  363. }
  364. public User getUserByAttribute(String name, String value, Boolean enabled) throws WebloggerException {
  365. if (value == null) {
  366. throw new WebloggerException("user attribute cannot be null!");
  367. }
  368. String[] parts = value.split("&");
  369. value = parts[0];
  370. Query query;
  371. query = strategy.getNamedQuery("UserAttribute.getByAttrNameAndAttrValue");
  372. query.setParameter(1, name);
  373. query.setParameter(2, value);
  374. UserAttribute attribute = null;
  375. try {
  376. attribute = (UserAttribute) query.getSingleResult();
  377. } catch (NoResultException e) {
  378. return null;
  379. }
  380. Object[] params;
  381. if (enabled != null) {
  382. query = strategy.getNamedQuery("User.getByUserName&Enabled");
  383. params = new Object[]{attribute.getUserName(), enabled};
  384. } else {
  385. query = strategy.getNamedQuery("User.getByUserName");
  386. params = new Object[]{attribute.getUserName()};
  387. }
  388. for (int i = 0; i < params.length; i++) {
  389. query.setParameter(i + 1, params[i]);
  390. }
  391. User user = null;
  392. try {
  393. user = (User) query.getSingleResult();
  394. } catch (NoResultException e) {
  395. user = null;
  396. }
  397. return user;
  398. }
  399. public UserAttribute getUserAttribute(String userName, String attribute) throws WebloggerException {
  400. Query q = strategy.getNamedQuery("UserAttribute.getByUserNameAndAttrName");
  401. q.setParameter(1, userName);
  402. q.setParameter(2, attribute);
  403. try {
  404. return (UserAttribute) q.getSingleResult();
  405. } catch (NoResultException e) {
  406. return null;
  407. }
  408. }
  409. public List<UserAttribute> getUserAttributes(String userName) throws WebloggerException {
  410. Query q = strategy.getNamedQuery("UserAttribute.getByUserName");
  411. q.setParameter(1, userName);
  412. try {
  413. return (List<UserAttribute>)q.getResultList();
  414. } catch (NoResultException e) {
  415. return null;
  416. }
  417. }
  418. public void setUserAttribute(String userName, String attribute, String value) throws WebloggerException {
  419. UserAttribute userAttribute = null;
  420. Query q = strategy.getNamedQuery("UserAttribute.getByUserNameAndAttrName");
  421. q.setParameter(1, userName);
  422. q.setParameter(2, attribute);
  423. try {
  424. userAttribute = (UserAttribute) q.getSingleResult();
  425. } catch (NoResultException ignored) {
  426. }
  427. if (userAttribute != null) {
  428. if (value.equals("")) {
  429. this.strategy.remove(userAttribute);
  430. } else {
  431. userAttribute.setValue(value);
  432. this.strategy.store(userAttribute);
  433. }
  434. } else {
  435. userAttribute = new UserAttribute(userName, attribute, value);
  436. this.strategy.store(userAttribute);
  437. }
  438. }
  439. public User getUserByActivationCode(String activationCode) throws WebloggerException {
  440. if (activationCode == null) {
  441. throw new WebloggerException("activationcode is null");
  442. }
  443. Query q = strategy.getNamedQuery("User.getUserByActivationCode");
  444. q.setParameter(1, activationCode);
  445. try {
  446. return (User)q.getSingleResult();
  447. } catch (NoResultException e) {
  448. return null;
  449. }
  450. }
  451. //-------------------------------------------------------- permissions CRUD
  452. public boolean checkPermission(RollerPermission perm, User user) throws WebloggerException {
  453. RollerPermission existingPerm = null;
  454. // if permission a weblog permission
  455. if (perm instanceof WeblogPermission) {
  456. // if user has specified permission in weblog return true
  457. WeblogPermission permToCheck = (WeblogPermission)perm;
  458. try {
  459. existingPerm = getWeblogPermission(permToCheck.getWeblog(), user);
  460. } catch (WebloggerException ignored) {}
  461. }
  462. if (existingPerm != null && existingPerm.implies(perm)) return true;
  463. // user has no existing perm in a weblog, so try his global perms
  464. GlobalPermission globalPerm = new GlobalPermission(user);
  465. if (globalPerm.implies(perm)) return true;
  466. if (log.isDebugEnabled()) {
  467. log.debug("PERM CHECK FAILED: user "+user.getUserName()+" does not have " + perm.toString());
  468. }
  469. return false;
  470. }
  471. public WeblogPermission getWeblogPermission(Weblog weblog, User user) throws WebloggerException {
  472. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&WeblogId&NotPending");
  473. q.setParameter(1, user.getUserName());
  474. q.setParameter(2, weblog.getHandle());
  475. try {
  476. return (WeblogPermission)q.getSingleResult();
  477. } catch (NoResultException ignored) {
  478. return null;
  479. }
  480. }
  481. public void grantWeblogPermission(Weblog weblog, User user, List<String> actions) throws WebloggerException {
  482. // first, see if user already has a permission for the specified object
  483. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&WeblogId");
  484. q.setParameter(1, user.getUserName());
  485. q.setParameter(2, weblog.getHandle());
  486. WeblogPermission existingPerm = null;
  487. try {
  488. existingPerm = (WeblogPermission)q.getSingleResult();
  489. } catch (NoResultException ignored) {}
  490. // permission already exists, so add any actions specified in perm argument
  491. if (existingPerm != null) {
  492. existingPerm.addActions(actions);
  493. this.strategy.store(existingPerm);
  494. } else {
  495. // it's a new permission, so store it
  496. WeblogPermission perm = new WeblogPermission(weblog, user, actions);
  497. this.strategy.store(perm);
  498. }
  499. }
  500. public void grantWeblogPermissionPending(Weblog weblog, User user, List<String> actions) throws WebloggerException {
  501. // first, see if user already has a permission for the specified object
  502. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&WeblogId");
  503. q.setParameter(1, user.getUserName());
  504. q.setParameter(2, weblog.getHandle());
  505. WeblogPermission existingPerm = null;
  506. try {
  507. existingPerm = (WeblogPermission)q.getSingleResult();
  508. } catch (NoResultException ignored) {}
  509. // permission already exists, so complain
  510. if (existingPerm != null) {
  511. throw new WebloggerException("Cannot make existing permission into pending permission");
  512. } else {
  513. // it's a new permission, so store it
  514. WeblogPermission perm = new WeblogPermission(weblog, user, actions);
  515. perm.setPending(true);
  516. this.strategy.store(perm);
  517. }
  518. }
  519. public void confirmWeblogPermission(Weblog weblog, User user) throws WebloggerException {
  520. // get specified permission
  521. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&WeblogId");
  522. q.setParameter(1, user.getUserName());
  523. q.setParameter(2, weblog.getHandle());
  524. WeblogPermission existingPerm = null;
  525. try {
  526. existingPerm = (WeblogPermission)q.getSingleResult();
  527. } catch (NoResultException ignored) {
  528. throw new WebloggerException("ERROR: permission not found");
  529. }
  530. // set pending to false
  531. existingPerm.setPending(false);
  532. this.strategy.store(existingPerm);
  533. }
  534. public void declineWeblogPermission(Weblog weblog, User user) throws WebloggerException {
  535. // get specified permission
  536. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&WeblogId");
  537. q.setParameter(1, user.getUserName());
  538. q.setParameter(2, weblog.getHandle());
  539. WeblogPermission existingPerm = null;
  540. try {
  541. existingPerm = (WeblogPermission)q.getSingleResult();
  542. } catch (NoResultException ignored) {
  543. throw new WebloggerException("ERROR: permission not found");
  544. }
  545. // remove permission
  546. this.strategy.remove(existingPerm);
  547. }
  548. public void revokeWeblogPermission(Weblog weblog, User user, List<String> actions) throws WebloggerException {
  549. // get specified permission
  550. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&WeblogId");
  551. q.setParameter(1, user.getUserName());
  552. q.setParameter(2, weblog.getHandle());
  553. WeblogPermission oldperm = null;
  554. try {
  555. oldperm = (WeblogPermission)q.getSingleResult();
  556. } catch (NoResultException ignored) {
  557. throw new WebloggerException("ERROR: permission not found");
  558. }
  559. // remove actions specified in perm agument
  560. oldperm.removeActions(actions);
  561. if (oldperm.isEmpty()) {
  562. // no actions left in permission so remove it
  563. this.strategy.remove(oldperm);
  564. } else {
  565. // otherwise save it
  566. this.strategy.store(oldperm);
  567. }
  568. }
  569. public List<WeblogPermission> getWeblogPermissions(User user) throws WebloggerException {
  570. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName");
  571. q.setParameter(1, user.getUserName());
  572. return (List<WeblogPermission>)q.getResultList();
  573. }
  574. public List<WeblogPermission> getWeblogPermissions(Weblog weblog) throws WebloggerException {
  575. Query q = strategy.getNamedQuery("WeblogPermission.getByWeblogId");
  576. q.setParameter(1, weblog.getHandle());
  577. return (List<WeblogPermission>)q.getResultList();
  578. }
  579. public List<WeblogPermission> getWeblogPermissionsPending(User user) throws WebloggerException {
  580. Query q = strategy.getNamedQuery("WeblogPermission.getByUserName&Pending");
  581. q.setParameter(1, user.getUserName());
  582. return (List<WeblogPermission>)q.getResultList();
  583. }
  584. public List<WeblogPermission> getWeblogPermissionsPending(Weblog weblog) throws WebloggerException {
  585. Query q = strategy.getNamedQuery("WeblogPermission.getByWeblogId&Pending");
  586. q.setParameter(1, weblog.getHandle());
  587. return (List<WeblogPermission>)q.getResultList();
  588. }
  589. //-------------------------------------------------------------- role CRUD
  590. /**
  591. * Returns true if user has role specified.
  592. */
  593. public boolean hasRole(String roleName, User user) throws WebloggerException {
  594. Query q = strategy.getNamedQuery("UserRole.getByUserNameAndRole");
  595. q.setParameter(1, user.getUserName());
  596. q.setParameter(2, roleName);
  597. try {
  598. q.getSingleResult();
  599. } catch (NoResultException e) {
  600. return false;
  601. }
  602. return true;
  603. }
  604. /**
  605. * Get all of user's roles.
  606. */
  607. public List<String> getRoles(User user) throws WebloggerException {
  608. Query q = strategy.getNamedQuery("UserRole.getByUserName");
  609. q.setParameter(1, user.getUserName());
  610. List roles = q.getResultList();
  611. List<String> roleNames = new ArrayList<String>();
  612. for (Iterator it = roles.iterator(); it.hasNext();) {
  613. UserRole userRole = (UserRole)it.next();
  614. roleNames.add(userRole.getRole());
  615. }
  616. return roleNames;
  617. }
  618. /**
  619. * Grant to user role specified by role name.
  620. */
  621. public void grantRole(String roleName, User user) throws WebloggerException {
  622. if (!hasRole(roleName, user)) {
  623. UserRole role = new UserRole(user.getUserName(), roleName);
  624. this.strategy.store(role);
  625. }
  626. }
  627. public void revokeRole(String roleName, User user) throws WebloggerException {
  628. Query q = strategy.getNamedQuery("UserRole.getByUserNameAndRole");
  629. q.setParameter(1, user.getUserName());
  630. q.setParameter(2, roleName);
  631. try {
  632. UserRole role = (UserRole)q.getSingleResult();
  633. this.strategy.remove(role);
  634. } catch (NoResultException e) {
  635. throw new WebloggerException("ERROR: removing role", e);
  636. }
  637. }
  638. }