Skip to content

Commit b19bcef

Browse files
committed
ImagePersistenceStrategy.save(): replace usage of Image.
Addressed to #120 No functional changes.
1 parent 8024fda commit b19bcef

File tree

9 files changed

+73
-22
lines changed

9 files changed

+73
-22
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import ru.mystamps.web.entity.Image;
3434
import ru.mystamps.web.service.dto.DbImageDto;
3535
import ru.mystamps.web.service.dto.ImageDto;
36+
import ru.mystamps.web.service.dto.ImageInfoDto;
3637
import ru.mystamps.web.service.exception.ImagePersistenceException;
3738

3839
@RequiredArgsConstructor
@@ -48,7 +49,7 @@ public void init() {
4849
}
4950

5051
@Override
51-
public void save(MultipartFile file, Image image) {
52+
public void save(MultipartFile file, ImageInfoDto image) {
5253
try {
5354
AddImageDataDbDto imageData = new AddImageDataDbDto();
5455
imageData.setImageId(image.getId());

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import ru.mystamps.web.entity.Image;
3333
import ru.mystamps.web.service.dto.FsImageDto;
3434
import ru.mystamps.web.service.dto.ImageDto;
35+
import ru.mystamps.web.service.dto.ImageInfoDto;
3536
import ru.mystamps.web.service.exception.ImagePersistenceException;
3637

3738
public class FilesystemImagePersistenceStrategy implements ImagePersistenceStrategy {
@@ -62,7 +63,7 @@ public void init() {
6263
}
6364

6465
@Override
65-
public void save(MultipartFile file, Image image) {
66+
public void save(MultipartFile file, ImageInfoDto image) {
6667
try {
6768
Path dest = createFile(image);
6869
writeToFile(file, dest);
@@ -76,7 +77,12 @@ public void save(MultipartFile file, Image image) {
7677

7778
@Override
7879
public ImageDto get(Image image) {
79-
Path dest = createFile(image);
80+
Path dest = createFile(
81+
new ImageInfoDto(
82+
image.getId(),
83+
image.getType().toString()
84+
)
85+
);
8086
if (!exists(dest)) {
8187
LOG.warn("Found image without content: #{} ({} doesn't exist)", image.getId(), dest);
8288
return null;
@@ -92,7 +98,7 @@ public ImageDto get(Image image) {
9298
}
9399

94100
// protected to allow spying
95-
protected Path createFile(Image image) {
101+
protected Path createFile(ImageInfoDto image) {
96102
return new File(storageDir, generateFileName(image)).toPath();
97103
}
98104

@@ -114,12 +120,12 @@ protected byte[] toByteArray(Path dest) throws IOException {
114120
return Files.readAllBytes(dest);
115121
}
116122

117-
private static String generateFileName(Image image) {
123+
private static String generateFileName(ImageInfoDto image) {
118124
// TODO(performance): specify initial capacity explicitly
119125
return new StringBuilder()
120126
.append(image.getId())
121127
.append('.')
122-
.append(image.getType().toString().toLowerCase())
128+
.append(image.getType().toLowerCase())
123129
.toString();
124130
}
125131

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
import ru.mystamps.web.entity.Image;
2323
import ru.mystamps.web.service.dto.ImageDto;
24+
import ru.mystamps.web.service.dto.ImageInfoDto;
2425

2526
public interface ImagePersistenceStrategy {
26-
void save(MultipartFile file, Image image);
27+
void save(MultipartFile file, ImageInfoDto image);
2728
ImageDto get(Image image);
2829
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import ru.mystamps.web.dao.JdbcImageDao;
3737
import ru.mystamps.web.entity.Image;
3838
import ru.mystamps.web.service.dto.ImageDto;
39+
import ru.mystamps.web.service.dto.ImageInfoDto;
3940
import ru.mystamps.web.service.exception.ImagePersistenceException;
4041

4142
import static org.apache.commons.lang3.StringUtils.substringAfter;
@@ -75,7 +76,10 @@ public Integer save(MultipartFile file) {
7576

7677
LOG.info("Image entity was saved to database ({})", entity);
7778

78-
imagePersistenceStrategy.save(file, entity);
79+
imagePersistenceStrategy.save(
80+
file,
81+
new ImageInfoDto(entity.getId(), image.getType().toString())
82+
);
7983

8084
return entity.getId();
8185
}
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 <slava.semushin@gmail.com>
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.service.dto;
19+
20+
import lombok.Getter;
21+
import lombok.RequiredArgsConstructor;
22+
23+
@Getter
24+
@RequiredArgsConstructor
25+
public class ImageInfoDto {
26+
private final Integer id;
27+
private final String type;
28+
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ import ru.mystamps.web.dao.JdbcImageDataDao
2525
import ru.mystamps.web.dao.dto.AddImageDataDbDto
2626
import ru.mystamps.web.entity.Image
2727
import ru.mystamps.web.service.dto.ImageDto
28+
import ru.mystamps.web.service.dto.ImageInfoDto
2829
import ru.mystamps.web.service.exception.ImagePersistenceException
2930

3031
class DatabaseImagePersistenceStrategyTest extends Specification {
3132

3233
private JdbcImageDataDao imageDataDao = Mock()
3334
private MultipartFile multipartFile = Mock()
3435
private Image image = TestObjects.createImage()
36+
private ImageInfoDto imageInfoDto = TestObjects.createImageInfoDto()
3537

3638
private ImagePersistenceStrategy strategy = new DatabaseImagePersistenceStrategy(imageDataDao)
3739

@@ -43,7 +45,7 @@ class DatabaseImagePersistenceStrategyTest extends Specification {
4345
given:
4446
multipartFile.getBytes() >> { throw new IOException() }
4547
when:
46-
strategy.save(multipartFile, image)
48+
strategy.save(multipartFile, imageInfoDto)
4749
then:
4850
ImagePersistenceException ex = thrown()
4951
and:
@@ -55,7 +57,7 @@ class DatabaseImagePersistenceStrategyTest extends Specification {
5557
byte[] expected = 'test'.getBytes()
5658
multipartFile.getBytes() >> expected
5759
when:
58-
strategy.save(multipartFile, image)
60+
strategy.save(multipartFile, imageInfoDto)
5961
then:
6062
1 * imageDataDao.add({ AddImageDataDbDto imageData ->
6163
assert imageData?.content == expected
@@ -65,9 +67,9 @@ class DatabaseImagePersistenceStrategyTest extends Specification {
6567

6668
def "save() should pass image to image data dao"() {
6769
given:
68-
Integer expectedImageId = image.getId()
70+
Integer expectedImageId = imageInfoDto.getId()
6971
when:
70-
strategy.save(multipartFile, image)
72+
strategy.save(multipartFile, imageInfoDto)
7173
then:
7274
1 * imageDataDao.add({ AddImageDataDbDto imageData ->
7375
assert imageData?.imageId == expectedImageId

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import spock.lang.Specification
2323

2424
import ru.mystamps.web.entity.Image
2525
import ru.mystamps.web.service.dto.ImageDto
26+
import ru.mystamps.web.service.dto.ImageInfoDto
2627
import ru.mystamps.web.service.exception.ImagePersistenceException
2728

2829
import java.nio.file.Path
@@ -32,6 +33,7 @@ class FilesystemImagePersistenceStrategyTest extends Specification {
3233

3334
private MultipartFile multipartFile = Mock()
3435
private Image image = TestObjects.createImage()
36+
private ImageInfoDto imageInfoDto = TestObjects.createImageInfoDto()
3537
private Path mockFile = Mock(Path)
3638

3739
private ImagePersistenceStrategy strategy = Spy(FilesystemImagePersistenceStrategy, constructorArgs: [STORAGE_DIR])
@@ -42,7 +44,7 @@ class FilesystemImagePersistenceStrategyTest extends Specification {
4244

4345
def "save() should saves file onto the filesystem"() {
4446
when:
45-
strategy.save(multipartFile, image)
47+
strategy.save(multipartFile, imageInfoDto)
4648
then:
4749
1 * strategy.writeToFile(_ as MultipartFile, _ as Path) >> {}
4850
}
@@ -51,7 +53,7 @@ class FilesystemImagePersistenceStrategyTest extends Specification {
5153
given:
5254
String expectedDirectoryName = STORAGE_DIR
5355
when:
54-
strategy.save(multipartFile, image)
56+
strategy.save(multipartFile, imageInfoDto)
5557
then:
5658
1 * strategy.writeToFile(_ as MultipartFile, { Path path ->
5759
assert path.parent.toString() == expectedDirectoryName
@@ -61,11 +63,11 @@ class FilesystemImagePersistenceStrategyTest extends Specification {
6163

6264
def "save() should gives proper name to the file"() {
6365
given:
64-
String expectedExtension = image.type.toString().toLowerCase()
65-
String expectedName = image.id
66+
String expectedExtension = imageInfoDto.type.toLowerCase()
67+
String expectedName = imageInfoDto.id
6668
String expectedFileName = expectedName + '.' + expectedExtension
6769
when:
68-
strategy.save(multipartFile, image)
70+
strategy.save(multipartFile, imageInfoDto)
6971
then:
7072
1 * strategy.writeToFile(_ as MultipartFile, { Path path ->
7173
assert path.fileName.toString() == expectedFileName
@@ -77,7 +79,7 @@ class FilesystemImagePersistenceStrategyTest extends Specification {
7779
given:
7880
strategy.writeToFile(_ as MultipartFile, _ as Path) >> { throw new IOException() }
7981
when:
80-
strategy.save(multipartFile, image)
82+
strategy.save(multipartFile, imageInfoDto)
8183
then:
8284
ImagePersistenceException ex = thrown()
8385
and:

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import ru.mystamps.web.dao.ImageDao
2626
import ru.mystamps.web.dao.JdbcImageDao
2727
import ru.mystamps.web.entity.Image
2828
import ru.mystamps.web.service.dto.ImageDto
29+
import ru.mystamps.web.service.dto.ImageInfoDto
2930
import ru.mystamps.web.service.exception.ImagePersistenceException
3031

3132
class ImageServiceImplTest extends Specification {
@@ -124,17 +125,18 @@ class ImageServiceImplTest extends Specification {
124125

125126
def "save() should call strategy"() {
126127
given:
127-
Image expectedImage = TestObjects.createImage()
128+
Image image = TestObjects.createImage()
128129
when:
129130
String url = service.save(multipartFile)
130131
then:
131-
imageDao.save(_ as Image) >> expectedImage
132+
imageDao.save(_ as Image) >> image
132133
and:
133134
1 * imagePersistenceStrategy.save({ MultipartFile passedFile ->
134135
assert passedFile == multipartFile
135136
return true
136-
}, { Image passedImage ->
137-
assert passedImage == expectedImage
137+
}, { ImageInfoDto passedImage ->
138+
assert passedImage?.id == image.id
139+
assert passedImage?.type == image.type.toString()
138140
return true
139141
})
140142
}

src/test/java/ru/mystamps/web/service/TestObjects.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
2626
import ru.mystamps.web.entity.Image;
2727
import ru.mystamps.web.service.dto.DbImageDto;
28+
import ru.mystamps.web.service.dto.ImageInfoDto;
2829
import ru.mystamps.web.service.dto.LinkEntityDto;
2930
import ru.mystamps.web.service.dto.SeriesInfoDto;
3031
import ru.mystamps.web.service.dto.SitemapInfoDto;
@@ -107,6 +108,10 @@ public static Image createImage() {
107108
return image;
108109
}
109110

111+
public static ImageInfoDto createImageInfoDto() {
112+
return new ImageInfoDto(1, "PNG");
113+
}
114+
110115
public static DbImageDto createDbImageDto() {
111116
return new DbImageDto("PNG", "test".getBytes());
112117
}

0 commit comments

Comments
 (0)