Skip to content

Commit 3a2e9c6

Browse files
committed
DatabaseImagePersistenceStrategy.save(): replace usage of ImageData.
Addressed to #120 No functional changes.
1 parent b39d3d5 commit 3a2e9c6

File tree

7 files changed

+87
-21
lines changed

7 files changed

+87
-21
lines changed

src/main/java/ru/mystamps/web/config/StrategiesConfig.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.springframework.context.annotation.Profile;
2424
import org.springframework.core.env.Environment;
2525

26-
import ru.mystamps.web.dao.ImageDataDao;
2726
import ru.mystamps.web.service.DatabaseImagePersistenceStrategy;
2827
import ru.mystamps.web.service.FilesystemImagePersistenceStrategy;
2928
import ru.mystamps.web.service.ImagePersistenceStrategy;
@@ -36,17 +35,13 @@ public interface StrategiesConfig {
3635
@Profile("test")
3736
class DbStrategiesConfig implements StrategiesConfig {
3837

39-
@Autowired
40-
private ImageDataDao imageDataDao;
41-
4238
@Autowired
4339
private DaoConfig daoConfig;
4440

4541
@Bean
4642
@Override
4743
public ImagePersistenceStrategy getImagePersistenceStrategy() {
4844
return new DatabaseImagePersistenceStrategy(
49-
imageDataDao,
5045
daoConfig.getJdbcImageDataDao()
5146
);
5247
}

src/main/java/ru/mystamps/web/dao/JdbcImageDataDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
*/
1818
package ru.mystamps.web.dao;
1919

20+
import ru.mystamps.web.dao.dto.AddImageDataDbDto;
2021
import ru.mystamps.web.service.dto.DbImageDto;
2122

2223
public interface JdbcImageDataDao {
2324
DbImageDto findByImageId(Integer imageId);
25+
Integer add(AddImageDataDbDto imageData);
2426
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright (C) 2009-2016 Slava Semushin <[email protected]>
3+
*
4+
* This program is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation; either version 2 of the License, or
7+
* (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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17+
*/
18+
package ru.mystamps.web.dao.dto;
19+
20+
import lombok.Getter;
21+
import lombok.Setter;
22+
23+
@Getter
24+
@Setter
25+
public class AddImageDataDbDto {
26+
private Integer imageId;
27+
private byte[] content;
28+
}

src/main/java/ru/mystamps/web/dao/impl/JdbcImageDataDaoImpl.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,22 @@
1818
package ru.mystamps.web.dao.impl;
1919

2020
import java.util.Collections;
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
import org.apache.commons.lang3.Validate;
2125

2226
import org.springframework.beans.factory.annotation.Value;
2327
import org.springframework.dao.EmptyResultDataAccessException;
28+
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
2429
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
30+
import org.springframework.jdbc.support.GeneratedKeyHolder;
31+
import org.springframework.jdbc.support.KeyHolder;
2532

2633
import lombok.RequiredArgsConstructor;
2734

2835
import ru.mystamps.web.dao.JdbcImageDataDao;
36+
import ru.mystamps.web.dao.dto.AddImageDataDbDto;
2937
import ru.mystamps.web.service.dto.DbImageDto;
3038

3139
@RequiredArgsConstructor
@@ -36,6 +44,9 @@ public class JdbcImageDataDaoImpl implements JdbcImageDataDao {
3644
@Value("${image_data.find_by_image_id}")
3745
private String findByImageIdSql;
3846

47+
@Value("${image_data.add}")
48+
private String addImageDataSql;
49+
3950
@Override
4051
public DbImageDto findByImageId(Integer imageId) {
4152
try {
@@ -49,4 +60,27 @@ public DbImageDto findByImageId(Integer imageId) {
4960
}
5061
}
5162

63+
@Override
64+
public Integer add(AddImageDataDbDto imageData) {
65+
Map<String, Object> params = new HashMap<>();
66+
params.put("image_id", imageData.getImageId());
67+
params.put("content", imageData.getContent());
68+
69+
KeyHolder holder = new GeneratedKeyHolder();
70+
71+
int affected = jdbcTemplate.update(
72+
addImageDataSql,
73+
new MapSqlParameterSource(params),
74+
holder
75+
);
76+
77+
Validate.validState(
78+
affected == 1,
79+
"Unexpected number of affected rows after creation of image's data: %d",
80+
affected
81+
);
82+
83+
return Integer.valueOf(holder.getKey().intValue());
84+
}
85+
5286
}

src/main/java/ru/mystamps/web/service/DatabaseImagePersistenceStrategy.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@
2828

2929
import lombok.RequiredArgsConstructor;
3030

31-
import ru.mystamps.web.dao.ImageDataDao;
3231
import ru.mystamps.web.dao.JdbcImageDataDao;
32+
import ru.mystamps.web.dao.dto.AddImageDataDbDto;
3333
import ru.mystamps.web.entity.Image;
34-
import ru.mystamps.web.entity.ImageData;
3534
import ru.mystamps.web.service.dto.DbImageDto;
3635
import ru.mystamps.web.service.dto.ImageDto;
3736
import ru.mystamps.web.service.exception.ImagePersistenceException;
@@ -41,7 +40,6 @@ public class DatabaseImagePersistenceStrategy implements ImagePersistenceStrateg
4140
private static final Logger LOG =
4241
LoggerFactory.getLogger(DatabaseImagePersistenceStrategy.class);
4342

44-
private final ImageDataDao imageDataDao;
4543
private final JdbcImageDataDao jdbcImageDataDao;
4644

4745
@PostConstruct
@@ -52,12 +50,12 @@ public void init() {
5250
@Override
5351
public void save(MultipartFile file, Image image) {
5452
try {
55-
ImageData imageData = new ImageData();
56-
imageData.setImage(image);
53+
AddImageDataDbDto imageData = new AddImageDataDbDto();
54+
imageData.setImageId(image.getId());
5755
imageData.setContent(file.getBytes());
5856

59-
ImageData entity = imageDataDao.save(imageData);
60-
LOG.info("Image's data entity saved to database ({})", entity);
57+
Integer id = jdbcImageDataDao.add(imageData);
58+
LOG.info("Image's data #{} for image #{} have been saved", id, image.getId());
6159

6260
} catch (IOException e) {
6361
// throw RuntimeException for rolling back transaction

src/main/resources/sql/image_dao_queries.properties

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,14 @@ SELECT d.content AS data \
2121
JOIN images i \
2222
ON i.id = d.image_id \
2323
WHERE d.image_id = :image_id
24+
25+
image_data.add = \
26+
INSERT \
27+
INTO images_data \
28+
( image_id \
29+
, content \
30+
) \
31+
VALUES \
32+
( :image_id \
33+
, :content \
34+
)

src/test/groovy/ru/mystamps/web/service/DatabaseImagePersistenceStrategyTest.groovy

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,20 @@ import org.springframework.web.multipart.MultipartFile
2121

2222
import spock.lang.Specification
2323

24-
import ru.mystamps.web.dao.ImageDataDao
2524
import ru.mystamps.web.dao.JdbcImageDataDao
25+
import ru.mystamps.web.dao.dto.AddImageDataDbDto
2626
import ru.mystamps.web.entity.Image
27-
import ru.mystamps.web.entity.ImageData
2827
import ru.mystamps.web.service.dto.ImageDto
2928
import ru.mystamps.web.service.exception.ImagePersistenceException
3029

3130
class DatabaseImagePersistenceStrategyTest extends Specification {
3231

33-
private ImageDataDao imageDataDao = Mock()
3432
private JdbcImageDataDao jdbcImageDataDao = Mock()
3533
private MultipartFile multipartFile = Mock()
3634
private Image image = TestObjects.createImage()
3735

3836
private ImagePersistenceStrategy strategy =
39-
new DatabaseImagePersistenceStrategy(imageDataDao, jdbcImageDataDao)
37+
new DatabaseImagePersistenceStrategy(jdbcImageDataDao)
4038

4139
//
4240
// Tests for save()
@@ -60,20 +58,20 @@ class DatabaseImagePersistenceStrategyTest extends Specification {
6058
when:
6159
strategy.save(multipartFile, image)
6260
then:
63-
1 * imageDataDao.save({ ImageData imageData ->
61+
1 * jdbcImageDataDao.add({ AddImageDataDbDto imageData ->
6462
assert imageData?.content == expected
6563
return true
6664
})
6765
}
6866

6967
def "save() should pass image to image data dao"() {
7068
given:
71-
Image expectedImage = TestObjects.createImage()
69+
Integer expectedImageId = image.getId()
7270
when:
73-
strategy.save(multipartFile, expectedImage)
71+
strategy.save(multipartFile, image)
7472
then:
75-
1 * imageDataDao.save({ ImageData imageData ->
76-
assert imageData?.image == expectedImage
73+
1 * jdbcImageDataDao.add({ AddImageDataDbDto imageData ->
74+
assert imageData?.imageId == expectedImageId
7775
return true
7876
})
7977
}

0 commit comments

Comments
 (0)