Skip to content

Commit eae4e51

Browse files
committed
Merge remote-tracking branch 'refs/remotes/php-coder/master'
2 parents 884cd70 + cec3ccc commit eae4e51

File tree

52 files changed

+509
-622
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+509
-622
lines changed

pom.xml

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@
428428
<commons-pool.version>1.5.4</commons-pool.version>
429429

430430
<commons.lang.version>3.4</commons.lang.version>
431-
<compiler.plugin.version>3.6.0</compiler.plugin.version>
431+
<compiler.plugin.version>3.6.1</compiler.plugin.version>
432432
<coveralls.plugin.version>2.2.0</coveralls.plugin.version>
433433
<enforcer.plugin.version>1.4.1</enforcer.plugin.version>
434434
<failsafe.plugin.version>2.19.1</failsafe.plugin.version>
@@ -475,9 +475,9 @@
475475
<liquibase.version>3.5.3</liquibase.version>
476476

477477
<!-- Redefine default value from spring-boot-dependencies (https://github.com/spring-projects/spring-boot/blob/v1.4.3.RELEASE/spring-boot-dependencies/pom.xml) -->
478-
<lombok.version>1.16.12</lombok.version>
478+
<lombok.version>1.16.14</lombok.version>
479479

480-
<minify.plugin.version>1.7.4</minify.plugin.version>
480+
<minify.plugin.version>1.7.6</minify.plugin.version>
481481

482482
<!-- Redefine default value from spring-boot-dependencies (https://github.com/spring-projects/spring-boot/blob/v1.4.3.RELEASE/spring-boot-dependencies/pom.xml) -->
483483
<mysql.version>5.1.40</mysql.version>
@@ -488,9 +488,9 @@
488488
<!-- Dependency can be safely removed when pmd plugin will require this version -->
489489
<pmd.version>5.5.2</pmd.version>
490490
<resources.plugin.version>3.0.2</resources.plugin.version>
491-
<robotframework-plugin.version>1.4.6</robotframework-plugin.version>
491+
<robotframework-plugin.version>1.4.7</robotframework-plugin.version>
492492
<robotframework-selenium.version>1.4.0.8</robotframework-selenium.version>
493-
<robotframework.version>3.0</robotframework.version>
493+
<robotframework.version>3.0.2</robotframework.version>
494494

495495
<!-- Don't forget to update version in the Url class -->
496496
<selectizejs.version>0.12.3</selectizejs.version>
@@ -504,7 +504,7 @@
504504
<skipUnitTests>false</skipUnitTests>
505505

506506
<!-- Redefine default value from spring-boot-dependencies (https://github.com/spring-projects/spring-boot/blob/v1.4.3.RELEASE/spring-boot-dependencies/pom.xml) -->
507-
<slf4j.version>1.7.22</slf4j.version>
507+
<slf4j.version>1.7.24</slf4j.version>
508508

509509
<sortpom.plugin.version>2.5.0</sortpom.plugin.version>
510510

@@ -519,12 +519,12 @@
519519
<testng.version>6.8.8</testng.version>
520520

521521
<!-- Redefine default value from spring-boot-dependencies (https://github.com/spring-projects/spring-boot/blob/v1.4.3.RELEASE/spring-boot-dependencies/pom.xml) -->
522-
<thymeleaf-extras-springsecurity4.version>3.0.1.RELEASE</thymeleaf-extras-springsecurity4.version>
522+
<thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
523523

524524
<thymeleaf.togglz.version>2.0.0.RELEASE</thymeleaf.togglz.version>
525525

526526
<!-- Redefine default value from spring-boot-dependencies (https://github.com/spring-projects/spring-boot/blob/v1.4.3.RELEASE/spring-boot-dependencies/pom.xml) -->
527-
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
527+
<thymeleaf.version>3.0.3.RELEASE</thymeleaf.version>
528528

529529
<togglz.version>2.3.0.Final</togglz.version>
530530
<war.plugin.version>3.0.0</war.plugin.version>
@@ -706,29 +706,29 @@
706706
<groupId>org.apache.maven.plugins</groupId>
707707
<artifactId>maven-enforcer-plugin</artifactId>
708708
<version>${enforcer.plugin.version}</version>
709+
<configuration>
710+
<rules>
711+
<bannedDependencies>
712+
<excludes>
713+
<!-- Because we use jcl-over-slf4j instead -->
714+
<exclude>commons-logging</exclude>
715+
<!-- Because we use org.mortbay.jasper:apache-el instead -->
716+
<exclude>org.apache.tomcat.embed:tomcat-embed-el</exclude>
717+
<exclude>junit:*:*:*:compile</exclude>
718+
<exclude>org.yaml:snakeyaml</exclude>
719+
</excludes>
720+
</bannedDependencies>
721+
<requireJavaVersion>
722+
<version>${java.version}</version>
723+
</requireJavaVersion>
724+
</rules>
725+
</configuration>
709726
<executions>
710727
<execution>
711728
<id>enforce-banned-dependencies</id>
712729
<goals>
713730
<goal>enforce</goal>
714731
</goals>
715-
<configuration>
716-
<rules>
717-
<bannedDependencies>
718-
<excludes>
719-
<!-- Because we use jcl-over-slf4j instead -->
720-
<exclude>commons-logging</exclude>
721-
<!-- Because we use org.mortbay.jasper:apache-el instead -->
722-
<exclude>org.apache.tomcat.embed:tomcat-embed-el</exclude>
723-
<exclude>junit:*:*:*:compile</exclude>
724-
<exclude>org.yaml:snakeyaml</exclude>
725-
</excludes>
726-
</bannedDependencies>
727-
<requireJavaVersion>
728-
<version>${java.version}</version>
729-
</requireJavaVersion>
730-
</rules>
731-
</configuration>
732732
</execution>
733733
</executions>
734734
</plugin>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public CronService getCronService() {
6767
return new CronServiceImpl(
6868
getCategoryService(),
6969
getCountryService(),
70+
getCollectionService(),
7071
getSeriesService(),
7172
getSuspiciousActivityService(),
7273
getUserService(),

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

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

20+
import java.util.Date;
2021
import java.util.List;
2122

2223
import ru.mystamps.web.dao.dto.AddCollectionDbDto;
@@ -26,7 +27,9 @@
2627
public interface CollectionDao {
2728
List<LinkEntityDto> findLastCreated(int quantity);
2829
long countCollectionsOfUsers();
30+
long countUpdatedSince(Date date);
2931
Integer add(AddCollectionDbDto collection);
32+
void markAsModified(Integer userId, Date updatedAt);
3033
boolean isSeriesInUserCollection(Integer userId, Integer seriesId);
3134
void addSeriesToUserCollection(Integer userId, Integer seriesId);
3235
void removeSeriesFromUserCollection(Integer userId, Integer seriesId);

src/main/java/ru/mystamps/web/dao/dto/AddCollectionDbDto.java

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

20+
import java.util.Date;
21+
2022
import lombok.Getter;
2123
import lombok.Setter;
2224
import lombok.ToString;
@@ -27,4 +29,5 @@
2729
public class AddCollectionDbDto {
2830
private Integer ownerId;
2931
private String slug;
32+
private Date updatedAt;
3033
}

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

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

2020
import java.util.Collections;
21+
import java.util.Date;
2122
import java.util.HashMap;
2223
import java.util.List;
2324
import java.util.Map;
@@ -54,8 +55,14 @@ public class JdbcCollectionDao implements CollectionDao {
5455
@Value("${collection.count_collections_of_users}")
5556
private String countCollectionsOfUsersSql;
5657

58+
@Value("${collection.count_updated_since}")
59+
private String countUpdatedSinceSql;
60+
5761
@Value("${collection.create}")
5862
private String addCollectionSql;
63+
64+
@Value("${collection.mark_as_modified}")
65+
private String markAsModifiedSql;
5966

6067
@Value("${collection.is_series_in_collection}")
6168
private String isSeriesInUserCollectionSql;
@@ -87,11 +94,22 @@ public long countCollectionsOfUsers() {
8794
);
8895
}
8996

97+
@Override
98+
public long countUpdatedSince(Date date) {
99+
return jdbcTemplate.queryForObject(
100+
countUpdatedSinceSql,
101+
Collections.singletonMap("date", date),
102+
Long.class
103+
);
104+
}
105+
90106
@Override
91107
public Integer add(AddCollectionDbDto collection) {
92108
Map<String, Object> params = new HashMap<>();
93109
params.put("user_id", collection.getOwnerId());
94110
params.put("slug", collection.getSlug());
111+
params.put("updated_at", collection.getUpdatedAt());
112+
params.put("updated_by", collection.getOwnerId());
95113

96114
KeyHolder holder = new GeneratedKeyHolder();
97115

@@ -110,6 +128,29 @@ public Integer add(AddCollectionDbDto collection) {
110128

111129
return Integer.valueOf(holder.getKey().intValue());
112130
}
131+
132+
/**
133+
* @author John Shkarin
134+
* @author Slava Semushin
135+
*/
136+
@Override
137+
public void markAsModified(Integer userId, Date updatedAt) {
138+
Map<String, Object> params = new HashMap<>();
139+
params.put("user_id", userId);
140+
params.put("updated_at", updatedAt);
141+
params.put("updated_by", userId);
142+
143+
int affected = jdbcTemplate.update(
144+
markAsModifiedSql,
145+
params
146+
);
147+
148+
Validate.validState(
149+
affected == 1,
150+
"Unexpected number of affected rows after updating collection: %d",
151+
affected
152+
);
153+
}
113154

114155
@Override
115156
public boolean isSeriesInUserCollection(Integer userId, Integer seriesId) {

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

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

20+
import java.util.Date;
2021
import java.util.List;
2122

2223
import ru.mystamps.web.dao.dto.CollectionInfoDto;
@@ -28,6 +29,7 @@ public interface CollectionService {
2829
void removeFromCollection(Integer userId, Integer seriesId);
2930
boolean isSeriesInCollection(Integer userId, Integer seriesId);
3031
long countCollectionsOfUsers();
32+
long countUpdatedSince(Date date);
3133
List<LinkEntityDto> findRecentlyCreated(int quantity);
3234
CollectionInfoDto findBySlug(String slug);
3335
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package ru.mystamps.web.service;
1919

20+
import java.util.Date;
2021
import java.util.List;
2122

2223
import org.apache.commons.lang3.StringUtils;
@@ -59,6 +60,7 @@ public void createCollection(Integer ownerId, String ownerLogin) {
5960
"Slug for string '%s' must be non empty", ownerLogin
6061
);
6162
collection.setSlug(slug);
63+
collection.setUpdatedAt(new Date());
6264

6365
Integer id = collectionDao.add(collection);
6466

@@ -73,6 +75,7 @@ public void addToCollection(Integer userId, Integer seriesId) {
7375
Validate.isTrue(seriesId != null, "Series id must be non null");
7476

7577
collectionDao.addSeriesToUserCollection(userId, seriesId);
78+
collectionDao.markAsModified(userId, new Date());
7679

7780
LOG.info("Series #{} has been added to collection of user #{}", seriesId, userId);
7881
}
@@ -85,6 +88,7 @@ public void removeFromCollection(Integer userId, Integer seriesId) {
8588
Validate.isTrue(seriesId != null, "Series id must be non null");
8689

8790
collectionDao.removeSeriesFromUserCollection(userId, seriesId);
91+
collectionDao.markAsModified(userId, new Date());
8892

8993
LOG.info("Series #{} has been removed from collection of user #{}", seriesId, userId);
9094
}
@@ -117,6 +121,14 @@ public long countCollectionsOfUsers() {
117121
return collectionDao.countCollectionsOfUsers();
118122
}
119123

124+
@Override
125+
@Transactional(readOnly = true)
126+
public long countUpdatedSince(Date date) {
127+
Validate.isTrue(date != null, "Date must be non null");
128+
129+
return collectionDao.countUpdatedSince(date);
130+
}
131+
120132
@Override
121133
@Transactional(readOnly = true)
122134
public List<LinkEntityDto> findRecentlyCreated(int quantity) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class CronServiceImpl implements CronService {
4444

4545
private final CategoryService categoryService;
4646
private final CountryService countryService;
47+
private final CollectionService collectionService;
4748
private final SeriesService seriesService;
4849
private final SuspiciousActivityService suspiciousActivityService;
4950
private final UserService userService;
@@ -71,6 +72,7 @@ public void sendDailyStatistics() {
7172

7273
report.setAddedSeriesCounter(seriesService.countAddedSince(yesterday));
7374
report.setUpdatedSeriesCounter(seriesService.countUpdatedSince(yesterday));
75+
report.setUpdatedCollectionsCounter(collectionService.countUpdatedSince(yesterday));
7476
report.setRegistrationRequestsCounter(usersActivationService.countCreatedSince(yesterday));
7577
report.setRegisteredUsersCounter(userService.countRegisteredSince(yesterday));
7678

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

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,20 @@ public class FilesystemImagePersistenceStrategy implements ImagePersistenceStrat
4040

4141
private final File storageDir;
4242

43-
public FilesystemImagePersistenceStrategy(String directory) {
44-
this.storageDir = new File(directory);
43+
public FilesystemImagePersistenceStrategy(String storageDir) {
44+
this.storageDir = new File(storageDir);
4545
}
4646

4747
@PostConstruct
4848
public void init() {
4949
LOG.info("Images will be saved into {} directory", storageDir);
5050

51-
if (!storageDir.exists()) {
51+
if (!storageDir.exists()) { // NOPMD: ConfusingTernary (it's ok for me)
5252
LOG.warn("Directory '{}' doesn't exist! Image uploading won't work.", storageDir);
53-
}
5453

55-
if (!storageDir.canWrite()) {
54+
} else if (!storageDir.canWrite()) {
5655
LOG.warn(
57-
"Directory '{}' exists but doesn't writable for current user! "
56+
"Directory '{}' exists but isn't writable for the current user! "
5857
+ "Image uploading won't work.",
5958
storageDir
6059
);
@@ -64,7 +63,7 @@ public void init() {
6463
@Override
6564
public void save(MultipartFile file, ImageInfoDto image) {
6665
try {
67-
Path dest = createFile(image);
66+
Path dest = generateFilePath(storageDir, image);
6867
writeToFile(file, dest);
6968

7069
LOG.info("Image's data was written into file {}", dest);
@@ -76,24 +75,12 @@ public void save(MultipartFile file, ImageInfoDto image) {
7675

7776
@Override
7877
public ImageDto get(ImageInfoDto image) {
79-
Path dest = createFile(image);
80-
if (!exists(dest)) {
81-
LOG.warn("Found image without content: #{} ({} doesn't exist)", image.getId(), dest);
82-
return null;
83-
}
84-
85-
try {
86-
byte[] content = toByteArray(dest);
87-
return new FsImageDto(image, content);
88-
89-
} catch (IOException ex) {
90-
throw new ImagePersistenceException(ex);
91-
}
78+
return get(storageDir, image);
9279
}
9380

9481
// protected to allow spying
95-
protected Path createFile(ImageInfoDto image) {
96-
return new File(storageDir, generateFileName(image)).toPath();
82+
protected Path generateFilePath(File dir, ImageInfoDto image) {
83+
return new File(dir, generateFileName(image)).toPath();
9784
}
9885

9986
// protected to allow spying
@@ -115,6 +102,22 @@ protected byte[] toByteArray(Path dest) throws IOException {
115102
return Files.readAllBytes(dest);
116103
}
117104

105+
private ImageDto get(File dir, ImageInfoDto image) {
106+
Path dest = generateFilePath(dir, image);
107+
if (!exists(dest)) {
108+
LOG.warn("Found image without content: #{} ({} doesn't exist)", image.getId(), dest);
109+
return null;
110+
}
111+
112+
try {
113+
byte[] content = toByteArray(dest);
114+
return new FsImageDto(image, content);
115+
116+
} catch (IOException ex) {
117+
throw new ImagePersistenceException(ex);
118+
}
119+
}
120+
118121
private static String generateFileName(ImageInfoDto image) {
119122
// TODO(performance): specify initial capacity explicitly
120123
return new StringBuilder()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ private String getTextOfDailyStatisticsMail(AdminDailyReport report) {
197197
put(ctx, "untranslated_categories_cnt", report.getUntranslatedCategoriesCounter());
198198
put(ctx, "added_series_cnt", report.getAddedSeriesCounter());
199199
put(ctx, "updated_series_cnt", report.getUpdatedSeriesCounter());
200-
put(ctx, "updated_collections_cnt", -1L); // TODO: #357
200+
put(ctx, "updated_collections_cnt", report.getUpdatedCollectionsCounter());
201201
put(ctx, "registration_requests_cnt", report.getRegistrationRequestsCounter());
202202
put(ctx, "registered_users_cnt", report.getRegisteredUsersCounter());
203203
put(ctx, "events_cnt", report.countEvents());

0 commit comments

Comments
 (0)