View Javadoc
1   package net.sumaris.core.dao.administration.user;
2   
3   /*-
4    * #%L
5    * SUMARiS:: Core
6    * %%
7    * Copyright (C) 2018 SUMARiS Consortium
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  import com.google.common.base.Preconditions;
26  import net.sumaris.core.util.Beans;
27  import net.sumaris.core.util.Dates;
28  import net.sumaris.core.dao.technical.hibernate.HibernateDaoSupport;
29  import net.sumaris.core.exception.BadUpdateDateException;
30  import net.sumaris.core.model.administration.user.UserSettings;
31  import net.sumaris.core.vo.administration.user.UserSettingsVO;
32  import org.nuiton.i18n.I18n;
33  import org.slf4j.Logger;
34  import org.slf4j.LoggerFactory;
35  import org.springframework.dao.EmptyResultDataAccessException;
36  import org.springframework.stereotype.Repository;
37  
38  import javax.persistence.EntityManager;
39  import javax.persistence.NoResultException;
40  import javax.persistence.criteria.CriteriaBuilder;
41  import javax.persistence.criteria.CriteriaQuery;
42  import javax.persistence.criteria.ParameterExpression;
43  import javax.persistence.criteria.Root;
44  import java.sql.Timestamp;
45  import java.util.List;
46  import java.util.Objects;
47  import java.util.stream.Collectors;
48  
49  @Repository("userSettingsDao")
50  public class UserSettingsDaoImpl extends HibernateDaoSupport implements UserSettingsDao {
51  
52      /** Logger. */
53      private static final Logger log =
54              LoggerFactory.getLogger(UserSettingsDaoImpl.class);
55  
56      @Override
57      public UserSettingsVO getByIssuer(String issuer) {
58  
59          EntityManager session = getEntityManager();
60          CriteriaBuilder builder = session.getCriteriaBuilder();
61          CriteriaQuery<UserSettings> query = builder.createQuery(UserSettings.class);
62          Root<UserSettings> root = query.from(UserSettings.class);
63  
64          ParameterExpression<String> issuerParam = builder.parameter(String.class);
65  
66          query.select(root)
67               .where(builder.equal(root.get(UserSettingsVO.Fields.ISSUER), issuerParam));
68  
69          try {
70              return toUserSettingsVO(session.createQuery(query)
71                      .setParameter(issuerParam, issuer)
72                      .getSingleResult());
73          } catch (EmptyResultDataAccessException | NoResultException e) {
74              return null;
75          }
76      }
77  
78      @Override
79      public UserSettingsVO get(int id) {
80          return toUserSettingsVO(get(UserSettings.class, id));
81      }
82  
83      @Override
84      public UserSettingsVO../../../../../net/sumaris/core/vo/administration/user/UserSettingsVO.html#UserSettingsVO">UserSettingsVO save(UserSettingsVO source) {
85          Preconditions.checkNotNull(source);
86          Preconditions.checkNotNull(source.getLocale(), "Missing 'settings.locale'");
87          Preconditions.checkNotNull(source.getLatLongFormat(), "Missing 'settings.latLongformat'");
88  
89          EntityManager entityManager = getEntityManager();
90          UserSettings entity = null;
91          if (source.getId() != null) {
92              entity = get(UserSettings.class, source.getId());
93          }
94          boolean isNew = (entity == null);
95          if (isNew) {
96              entity = new UserSettings();
97          }
98  
99          if (!isNew) {
100             // Check update date
101             if (entity.getUpdateDate() != null) {
102                 Timestamp serverUpdateDtNoMillisecond = Dates.resetMillisecond(entity.getUpdateDate());
103                 Timestamp sourceUpdateDtNoMillisecond = Dates.resetMillisecond(source.getUpdateDate());
104                 if (!Objects.equals(sourceUpdateDtNoMillisecond, serverUpdateDtNoMillisecond)) {
105                     throw new BadUpdateDateException(I18n.t("sumaris.persistence.error.badUpdateDate",
106                             I18n.t("sumaris.persistence.table.userSettings"), source.getId(), serverUpdateDtNoMillisecond,
107                             sourceUpdateDtNoMillisecond));
108                 }
109             }
110 
111             // Lock entityName
112             /*try {
113                 Session.LockRequest lockRequest = entityManager.buildLockRequest(LockOptions.UPGRADE);
114                 lockRequest.setLockMode(LockMode.UPGRADE_NOWAIT);
115                 lockRequest.setScope(true); // cascaded to owned collections and relationships.
116                 lockRequest.lock(entity);
117             } catch (LockTimeoutException e) {
118                 throw new DataLockedException(I18n.t("sumaris.persistence.error.locked",
119                         I18n.t("sumaris.persistence.table.userSettings"), source.getId()), e);
120             }*/
121         }
122 
123         userSettingsVOToEntity(source, entity, true);
124 
125         // Update update_dt
126         Timestamp newUpdateDate = getDatabaseCurrentTimestamp();
127         entity.setUpdateDate(newUpdateDate);
128 
129         // Save entityName
130         if (isNew) {
131             entityManager.persist(entity);
132             source.setId(entity.getId());
133         } else {
134             entityManager.merge(entity);
135         }
136 
137         source.setUpdateDate(newUpdateDate);
138 
139         getEntityManager().flush();
140         getEntityManager().clear();
141 
142         return source;
143     }
144 
145     @Override
146     public void delete(int id) {
147 
148         log.debug(String.format("Deleting user settings {id=%s}...", id));
149         delete(UserSettings.class, id);
150     }
151 
152     @Override
153     public UserSettingsVO toUserSettingsVO(UserSettings source) {
154         if (source == null) return null;
155         UserSettingsVOtion/user/UserSettingsVO.html#UserSettingsVO">UserSettingsVO target = new UserSettingsVO();
156 
157         Beans.copyProperties(source, target);
158 
159         // Issuer
160         //target.setIssuer(source.getIssuer());
161 
162         return target;
163     }
164 
165     /* -- protected methods -- */
166 
167     protected List<UserSettingsVO> toUserSettingsVOs(List<UserSettings> source) {
168         return source.stream()
169                 .map(this::toUserSettingsVO)
170                 .filter(Objects::nonNull)
171                 .collect(Collectors.toList());
172     }
173 
174     protected void userSettingsVOToEntity(UserSettingsVO source, UserSettings target, boolean copyIfNull) {
175 
176         Beans.copyProperties(source, target);
177 
178        /* // Person
179         if (copyIfNull || source.getPersonId() != null) {
180             if (source.getPersonId() == null) {
181                 target.setPerson(null);
182             }
183             else {
184                 target.setPerson(load(Person.class, source.getPersonId()));
185             }
186         }*/
187 
188     }
189 }