View Javadoc
1   package fr.ifremer.dali.dao.data.photo;
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.Lists;
27  import fr.ifremer.dali.config.DaliConfiguration;
28  import fr.ifremer.dali.dao.DaliDatabaseResource;
29  import fr.ifremer.dali.dao.referential.DaliReferentialDao;
30  import fr.ifremer.dali.dao.technical.Daos;
31  import fr.ifremer.dali.dto.DaliBeanFactory;
32  import fr.ifremer.dali.dto.DaliBeans;
33  import fr.ifremer.dali.dto.data.photo.PhotoDTO;
34  import fr.ifremer.dali.dto.data.sampling.SamplingOperationDTO;
35  import fr.ifremer.dali.service.DaliServiceLocator;
36  import fr.ifremer.quadrige3.core.dao.technical.Files;
37  import fr.ifremer.quadrige3.core.test.AbstractDaoTest;
38  import org.apache.commons.io.FileUtils;
39  import org.junit.Before;
40  import org.junit.ClassRule;
41  import org.junit.Test;
42  
43  import java.io.IOException;
44  import java.net.URISyntaxException;
45  import java.nio.file.Path;
46  import java.nio.file.Paths;
47  import java.util.Date;
48  import java.util.List;
49  import java.util.Map;
50  
51  import static org.junit.Assert.*;
52  
53  public class PhotoDaoWriteTest extends AbstractDaoTest {
54      
55      @ClassRule
56      public static final DaliDatabaseResource dbResource = DaliDatabaseResource.writeDb();
57      
58      private DaliConfiguration config;
59      private DaliPhotoDao photoDao;
60      private DaliReferentialDao referentialDao;
61      private static final int SURVEY_ID = 103;
62      private static final int SAMPLING_OPERATION_1_ID = 101;
63      private static final int SAMPLING_OPERATION_2_ID = 102;
64      
65      @Before
66      @Override
67      public void setUp() throws Exception {
68          super.setUp();
69          config = DaliConfiguration.getInstance();
70          photoDao = DaliServiceLocator.instance().getService("daliPhotoDao", DaliPhotoDao.class);
71          referentialDao = DaliServiceLocator.instance().getService("daliReferentialDao", DaliReferentialDao.class);
72          setCommitOnTearDown(true);
73      }
74      
75      @Test
76      public void createPhoto() throws URISyntaxException, IOException {
77          
78          Path sourcePhoto1 = getPhoto("/photo/poisson1.jpg");
79          Path sourcePhoto2 = getPhoto("/photo/poisson2.jpg");
80          Path sourcePhoto3 = getPhoto("/photo/poisson3.jpg");
81          
82          Path testPhoto1 = createTestPhoto(sourcePhoto1);
83          Path testPhoto2 = createTestPhoto(sourcePhoto2);
84          Path testPhoto3 = createTestPhoto(sourcePhoto3);
85          assertNotNull(testPhoto1);
86          assertNotNull(testPhoto2);
87          assertNotNull(testPhoto3);
88  
89          PhotoDTO photo1 = DaliBeanFactory.newPhotoDTO();
90          photo1.setDirty(true);
91          photo1.setDate(new Date());
92          photo1.setDirection("NW");
93          photo1.setCaption("legende 1");
94          photo1.setName("photo 1");
95          photo1.setPhotoType(referentialDao.getPhotoTypeByCode("PAN"));
96          photo1.setSamplingOperation(null); // link by survey
97          photo1.setFullPath(testPhoto1.toString());
98          PhotoDTO photo2 = DaliBeanFactory.newPhotoDTO();
99          photo2.setDirty(true);
100         photo2.setDate(new Date());
101         photo2.setDirection("NE");
102         photo2.setCaption("legende 2");
103         photo2.setName("photo 2");
104         photo2.setPhotoType(referentialDao.getPhotoTypeByCode("SOL"));
105         SamplingOperationDTO prel1 = DaliBeanFactory.newSamplingOperationDTO();
106         prel1.setId(SAMPLING_OPERATION_1_ID);
107         photo2.setSamplingOperation(prel1);
108         photo2.setFullPath(testPhoto2.toString());
109         PhotoDTO photo3 = DaliBeanFactory.newPhotoDTO();
110         photo3.setDirty(true);
111         photo3.setDate(new Date());
112         photo3.setDirection("SE");
113         photo3.setCaption("legende 3");
114         photo3.setName("photo 3");
115         photo3.setPhotoType(referentialDao.getPhotoTypeByCode("MACRO"));
116         SamplingOperationDTO prel2 = DaliBeanFactory.newSamplingOperationDTO();
117         prel2.setId(SAMPLING_OPERATION_2_ID);
118         photo3.setSamplingOperation(prel2);
119         photo3.setFullPath(testPhoto3.toString());
120         
121         List<PhotoDTO> photos = Lists.newArrayList(photo1,photo2,photo3);
122         
123         // save
124         photoDao.savePhotosBySurveyId(SURVEY_ID, photos);
125         assertNotNull(photo1.getId());
126         assertNotNull(photo2.getId());
127         assertNotNull(photo3.getId());
128         
129         // test generated file path
130         String filePath1 = Daos.computePhotoFilePath(Daos.SURVEY_OBJECT_TYPE, SURVEY_ID, photo1.getId(), "jpg");
131         String filePath2 = Daos.computePhotoFilePath(Daos.SAMPLING_OPERATION_OBJECT_TYPE, SAMPLING_OPERATION_1_ID, photo2.getId(), "jpg");
132         String filePath3 = Daos.computePhotoFilePath(Daos.SAMPLING_OPERATION_OBJECT_TYPE, SAMPLING_OPERATION_2_ID, photo3.getId(), "jpg");
133         assertNotNull(filePath1);
134         assertNotNull(filePath2);
135         assertNotNull(filePath3);
136         assertEquals(filePath1, photo1.getPath());
137         assertEquals(filePath2, photo2.getPath());
138         assertEquals(filePath3, photo3.getPath());
139         
140         // reload photos
141         photos = photoDao.getPhotosBySurveyId(SURVEY_ID);
142         assertNotNull(photos);
143         assertEquals(3, photos.size());
144 
145         // compare photo
146         Map<Integer, PhotoDTO> map = DaliBeans.mapById(photos);
147         assertPhotoEquals(photo1, map.get(photo1.getId()));
148         assertPhotoEquals(photo2, map.get(photo2.getId()));
149         assertPhotoEquals(photo3, map.get(photo3.getId()));
150         
151         // compare saved photo file to original files
152         Path persistedPhotoFile1 = config.getDbPhotoDirectory().toPath().resolve(filePath1);
153         Path persistedPhotoFile2 = config.getDbPhotoDirectory().toPath().resolve(filePath2);
154         Path persistedPhotoFile3 = config.getDbPhotoDirectory().toPath().resolve(filePath3);
155         assertFileEquals(sourcePhoto1, persistedPhotoFile1);
156         assertFileEquals(sourcePhoto2, persistedPhotoFile2);
157         assertFileEquals(sourcePhoto3, persistedPhotoFile3);
158         
159         // delete photo of sampling operation
160         photoDao.removeBySamplingOperationId(SAMPLING_OPERATION_1_ID);
161         
162         // reload and check size
163         photos = photoDao.getPhotosBySurveyId(SURVEY_ID);
164         assertNotNull(photos);
165         assertEquals(2, photos.size());
166         // check photo deletation
167         assertFalse(java.nio.file.Files.exists(persistedPhotoFile2));
168         // assert other files still exists
169         assertTrue(java.nio.file.Files.exists(persistedPhotoFile1));
170         assertTrue(java.nio.file.Files.exists(persistedPhotoFile3));
171     }
172 
173     private Path getPhoto(String source) throws URISyntaxException {
174         return Paths.get(getClass().getResource(source).toURI());
175     }
176 
177     private Path createTestPhoto(Path photo) throws IOException {
178         Path testFile = config.getTempDirectory().toPath().resolve(photo.getFileName().toString());
179         Files.copyFile(photo, testFile);
180         return testFile;
181     }
182     
183     private void assertPhotoEquals(PhotoDTO expectedPhoto, PhotoDTO photoToTest) {
184         
185         assertNotSame(expectedPhoto, photoToTest);
186         
187         assertEquals(expectedPhoto.getId(), photoToTest.getId());
188         assertEquals(expectedPhoto.getName(), photoToTest.getName());
189         assertEquals(expectedPhoto.getPhotoType(), photoToTest.getPhotoType());
190         assertEquals(expectedPhoto.getCaption(), photoToTest.getCaption());
191         assertEquals(expectedPhoto.getDate(), photoToTest.getDate());
192         assertEquals(expectedPhoto.getDirection(), photoToTest.getDirection());
193         assertEquals(expectedPhoto.getPath(), photoToTest.getPath());
194         assertEquals(expectedPhoto.getSamplingOperation(), photoToTest.getSamplingOperation());
195         
196     }
197     
198     private void assertFileEquals(Path expectedFile, Path fileToTest) {
199         
200         try {
201             assertTrue(FileUtils.contentEquals(expectedFile.toFile(), fileToTest.toFile()));
202         } catch (IOException ex) {
203             fail(ex.getLocalizedMessage());
204         }
205         
206     }
207     
208     @Test
209     public void deleteAllPhotos() {
210         photoDao.removeBySurveyId(SURVEY_ID);
211     }
212 }