View Javadoc
1   package fr.ifremer.dali.dao.referential.pmfm;
2   
3   /*
4    * #%L
5    * Dali :: Core
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import com.google.common.collect.ImmutableList;
27  import com.google.common.collect.Lists;
28  import fr.ifremer.dali.config.DaliConfiguration;
29  import fr.ifremer.dali.dao.referential.DaliReferentialDao;
30  import fr.ifremer.dali.dao.referential.transcribing.DaliTranscribingItemDao;
31  import fr.ifremer.quadrige3.core.dao.referential.pmfm.QualitativeValueDaoImpl;
32  import fr.ifremer.quadrige3.core.service.technical.CacheService;
33  import fr.ifremer.dali.dao.technical.Daos;
34  import fr.ifremer.dali.dto.DaliBeanFactory;
35  import fr.ifremer.dali.dto.referential.pmfm.QualitativeValueDTO;
36  import fr.ifremer.dali.service.StatusFilter;
37  import org.hibernate.SessionFactory;
38  import org.hibernate.type.IntegerType;
39  import org.hibernate.type.StringType;
40  import org.springframework.beans.factory.annotation.Autowired;
41  import org.springframework.cache.Cache;
42  import org.springframework.dao.DataRetrievalFailureException;
43  import org.springframework.stereotype.Repository;
44  
45  import javax.annotation.Resource;
46  import java.util.Arrays;
47  import java.util.Iterator;
48  import java.util.List;
49  import java.util.Map;
50  
51  /**
52   * Dao for QualitativeValue
53   * Created by Ludovic on 22/09/2015.
54   */
55  @Repository("daliQualitativeValueDao")
56  public class DaliQualitativeValueDaoImpl extends QualitativeValueDaoImpl implements DaliQualitativeValueDao {
57  
58      @Resource
59      protected CacheService cacheService;
60  
61      @Resource
62      protected DaliConfiguration config;
63  
64      @Resource(name = "daliTranscribingItemDao")
65      private DaliTranscribingItemDao transcribingItemDao;
66  
67      @Resource(name = "daliReferentialDao")
68      protected DaliReferentialDao referentialDao;
69  
70      /**
71       * Constructor used by Spring
72       *
73       * @param sessionFactory a {@link org.hibernate.SessionFactory} object.
74       */
75      @Autowired
76      public DaliQualitativeValueDaoImpl(SessionFactory sessionFactory) {
77          super(sessionFactory);
78      }
79  
80      /** {@inheritDoc} */
81      @Override
82      public List<QualitativeValueDTO> getQualitativeValuesByParameterCode(String parameterCode) {
83  
84          Cache cacheById = cacheService.getCache(QUALITATIVE_VALUE_BY_ID_CACHE);
85          List<QualitativeValueDTO> result = Lists.newArrayList();
86          Map<Integer, String> transcribingNamesById = getTranscribingNames();
87  
88          Iterator<Object[]> it = Daos.queryIteratorWithStatus(
89                  createQuery("allQualitativeValuesByParameterCode", "parameterCode", StringType.INSTANCE, parameterCode),
90                  StatusFilter.ALL.toStatusCodes());
91  
92          while (it.hasNext()) {
93              Object[] source = it.next();
94              QualitativeValueDTO qualitativeValue = toQualitativeValueDTO(Arrays.asList(source).iterator(), transcribingNamesById);
95              result.add(qualitativeValue);
96              cacheById.put(qualitativeValue.getId(), qualitativeValue);
97          }
98  
99          return ImmutableList.copyOf(result);
100     }
101 
102     /** {@inheritDoc} */
103     @Override
104     public List<QualitativeValueDTO> getQualitativeValuesByPmfmId(Integer pmfmId) {
105 
106         List<QualitativeValueDTO> result = Lists.newArrayList();
107         Map<Integer, String> transcribingNamesById = getTranscribingNames();
108 
109         Iterator<Object[]> it = Daos.queryIteratorWithStatus(
110                 createQuery("allQualitativeValuesByPmfmId", "pmfmId", IntegerType.INSTANCE, pmfmId),
111                 StatusFilter.ACTIVE.toStatusCodes());
112 
113         while (it.hasNext()) {
114             Object[] source = it.next();
115             QualitativeValueDTO qualitativeValue = toQualitativeValueDTO(Arrays.asList(source).iterator(), transcribingNamesById);
116             result.add(qualitativeValue);
117         }
118 
119         return ImmutableList.copyOf(result);
120     }
121 
122     /** {@inheritDoc} */
123     @Override
124     public QualitativeValueDTO getQualitativeValueById(int qualitativeValueId) {
125         Object[] source = queryUnique("qualitativeValueById", "qualitativeValueId", IntegerType.INSTANCE, qualitativeValueId);
126 
127         if (source == null) {
128             throw new DataRetrievalFailureException("can't load qualitative value with id = " + qualitativeValueId);
129         }
130 
131         return toQualitativeValueDTO(Arrays.asList(source).iterator(), getTranscribingNames());
132     }
133 
134     private Map<Integer, String> getTranscribingNames() {
135         return transcribingItemDao.getAllTranscribingItemsById(config.getTranscribingItemTypeLbForQualitativeValueNm());
136     }
137 
138     private QualitativeValueDTO toQualitativeValueDTO(Iterator<Object> source, Map<Integer, String> transcribingNamesById) {
139         QualitativeValueDTO result = DaliBeanFactory.newQualitativeValueDTO();
140         result.setId((Integer) source.next());
141         result.setName((String) source.next());
142         result.setDescription((String) source.next());
143         result.setStatus(referentialDao.getStatusByCode((String) source.next()));
144 
145         // transcribed name
146         result.setName(transcribingNamesById.getOrDefault(result.getId(), result.getName()));
147 
148         return result;
149     }
150 
151 }