Skip to content

Commit f40fb3e

Browse files
committed
Allow to different series to have the same catalog numbers.
Fix #287
1 parent f4d8d90 commit f40fb3e

40 files changed

+146
-882
lines changed

NEWS.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- (user interface) ported to Bootstrap 3
44
- (infrastructure) ported to Spring Boot
55
- (functionality) implemented possibility to user to add additional images to series
6+
- (functionality) allow to different series to have the same catalog numbers
67

78
0.3
89
- (functionality) implemented possibility to user to add series to his collection

src/main/java/ru/mystamps/web/controller/SeriesController.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@
5252
import ru.mystamps.web.entity.User;
5353
import ru.mystamps.web.model.AddImageForm;
5454
import ru.mystamps.web.model.AddSeriesForm;
55-
import ru.mystamps.web.model.AddSeriesForm.GibbonsCatalogChecks;
56-
import ru.mystamps.web.model.AddSeriesForm.MichelCatalogChecks;
57-
import ru.mystamps.web.model.AddSeriesForm.ScottCatalogChecks;
58-
import ru.mystamps.web.model.AddSeriesForm.YvertCatalogChecks;
5955
import ru.mystamps.web.service.CategoryService;
6056
import ru.mystamps.web.service.CollectionService;
6157
import ru.mystamps.web.service.CountryService;
@@ -155,10 +151,7 @@ public String showFormWithCountry(
155151

156152
@RequestMapping(value = Url.ADD_SERIES_PAGE, method = RequestMethod.POST)
157153
public String processInput(
158-
@Validated({
159-
Default.class, MichelCatalogChecks.class, ScottCatalogChecks.class,
160-
YvertCatalogChecks.class, GibbonsCatalogChecks.class, AddSeriesForm.ImageChecks.class
161-
}) AddSeriesForm form,
154+
@Validated({ Default.class, AddSeriesForm.ImageChecks.class }) AddSeriesForm form,
162155
BindingResult result,
163156
HttpServletRequest request,
164157
User currentUser) {

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

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

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

2223
public interface GibbonsCatalogDao {
23-
void add(Set<String> gibbonsNumbers);
24+
List<String> add(Set<String> gibbonsNumbers);
2425
void addToSeries(Integer seriesId, Set<String> gibbonsNumbers);
2526
}

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ public interface JdbcSeriesDao {
3737
long countSeriesOfCollection(Integer collectionId);
3838
long countStampsOfCollection(Integer collectionId);
3939

40-
long countByMichelNumberCode(String michelNumber);
41-
long countByScottNumberCode(String scottNumber);
42-
long countByYvertNumberCode(String yvertNumber);
43-
long countByGibbonsNumberCode(String gibbonsNumber);
44-
4540
Optional<Integer> findSeriesIdByMichelNumberCode(String michelNumber);
4641
Optional<Integer> findSeriesIdByScottNumberCode(String scottNumber);
4742
Optional<Integer> findSeriesIdByYvertNumberCode(String yvertNumber);

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

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

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

2223
public interface MichelCatalogDao {
23-
void add(Set<String> michelNumbers);
24+
List<String> add(Set<String> michelNumbers);
2425
void addToSeries(Integer seriesId, Set<String> michelNumbers);
2526
}

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

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

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

2223
public interface ScottCatalogDao {
23-
void add(Set<String> scottNumbers);
24+
List<String> add(Set<String> scottNumbers);
2425
void addToSeries(Integer seriesId, Set<String> scottNumbers);
2526
}

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

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

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

2223
public interface YvertCatalogDao {
23-
void add(Set<String> yvertNumbers);
24+
List<String> add(Set<String> yvertNumbers);
2425
void addToSeries(Integer seriesId, Set<String> yvertNumbers);
2526
}

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

Lines changed: 15 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
*/
1818
package ru.mystamps.web.dao.impl;
1919

20+
import java.util.ArrayList;
21+
import java.util.Collections;
2022
import java.util.HashMap;
23+
import java.util.List;
2124
import java.util.Map;
2225
import java.util.Set;
2326

2427
import org.apache.commons.lang3.Validate;
2528

26-
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
2729
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
2830

2931
import lombok.AccessLevel;
@@ -34,15 +36,21 @@ class JdbcCatalogDao {
3436

3537
private final NamedParameterJdbcTemplate jdbcTemplate;
3638

37-
// Inserts all values with multirow INSERT expression
38-
protected void add(Set<String> numbers, String addNumberSql) {
39-
Validate.validState(!numbers.isEmpty(), "Numbers must be non empty");
39+
protected List<String> add(Set<String> numbers, String addNumberSql) {
4040
Validate.validState(!"".equals(addNumberSql), "Query must be non empty");
4141

42-
Map<String, Object> params = prepareNumberedParamsWithBaseName("code", numbers);
43-
String sql = prepareMultirowQueryWithSingleValue(addNumberSql, "code", numbers);
42+
List<String> inserted = new ArrayList<>();
43+
for (String number : numbers) {
44+
int affected = jdbcTemplate.update(
45+
addNumberSql,
46+
Collections.singletonMap("code", number)
47+
);
48+
if (affected > 0) {
49+
inserted.add(number);
50+
}
51+
}
4452

45-
jdbcTemplate.update(sql, new MapSqlParameterSource(params));
53+
return inserted;
4654
}
4755

4856
// CheckStyle: ignore LineLength for next 1 line
@@ -58,41 +66,4 @@ protected void addToSeries(Integer seriesId, Set<String> numbers, String addNumb
5866
jdbcTemplate.update(addNumbersToSeriesSql, params);
5967
}
6068

61-
// func("code", [10, 20, 30]) -> { "code1":"10", "code2":"20", "code3":"30" }
62-
private static Map<String, Object> prepareNumberedParamsWithBaseName(
63-
String paramBaseName,
64-
Set<String> values) {
65-
66-
Map<String, Object> params = new HashMap<>();
67-
int paramNum = 1;
68-
for (String value : values) {
69-
String key = paramBaseName + Integer.valueOf(paramNum);
70-
params.put(key, value);
71-
paramNum++;
72-
}
73-
return params;
74-
}
75-
76-
// "INSERT INTO t(code) VALUES(:code1)" ->
77-
// "INSERT INTO t(code) VALUES(:code1),(:code2),(:code3)"
78-
private static String prepareMultirowQueryWithSingleValue(
79-
String sql,
80-
String paramBaseName,
81-
Set<String> values) {
82-
83-
// don't modify query with single parameter
84-
if (values.size() == 1) { // NOPMD: AvoidLiteralsInIfCondition
85-
return sql;
86-
}
87-
88-
StringBuilder sb = new StringBuilder(sql);
89-
90-
// start from 2 to skip first parameter (it's already in SQL query)
91-
for (int paramNum = 2; paramNum <= values.size(); paramNum++) {
92-
sb.append(",(:").append(paramBaseName).append(paramNum).append(')');
93-
}
94-
95-
return sb.toString();
96-
}
97-
9869
}

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

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

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

2223
import org.springframework.beans.factory.annotation.Value;
@@ -37,8 +38,8 @@ public JdbcGibbonsCatalogDaoImpl(NamedParameterJdbcTemplate jdbcTemplate) {
3738
}
3839

3940
@Override
40-
public void add(Set<String> gibbonsNumbers) {
41-
add(gibbonsNumbers, addGibbonsNumberSql);
41+
public List<String> add(Set<String> gibbonsNumbers) {
42+
return add(gibbonsNumbers, addGibbonsNumberSql);
4243
}
4344

4445
@Override

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

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

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

2223
import org.springframework.beans.factory.annotation.Value;
@@ -37,8 +38,8 @@ public JdbcMichelCatalogDaoImpl(NamedParameterJdbcTemplate jdbcTemplate) {
3738
}
3839

3940
@Override
40-
public void add(Set<String> michelNumbers) {
41-
add(michelNumbers, addMichelNumberSql);
41+
public List<String> add(Set<String> michelNumbers) {
42+
return add(michelNumbers, addMichelNumberSql);
4243
}
4344

4445
@Override

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

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

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

2223
import org.springframework.beans.factory.annotation.Value;
@@ -37,8 +38,8 @@ public JdbcScottCatalogDaoImpl(NamedParameterJdbcTemplate jdbcTemplate) {
3738
}
3839

3940
@Override
40-
public void add(Set<String> scottNumbers) {
41-
add(scottNumbers, addScottNumberSql);
41+
public List<String> add(Set<String> scottNumbers) {
42+
return add(scottNumbers, addScottNumberSql);
4243
}
4344

4445
@Override

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

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import ru.mystamps.web.service.dto.SitemapInfoDto;
4040

4141
// TODO: move stamps related methods to separate interface (#88)
42-
@SuppressWarnings({ "PMD.AvoidDuplicateLiterals", "PMD.TooManyMethods", "PMD.TooManyFields" })
42+
@SuppressWarnings({ "PMD.AvoidDuplicateLiterals", "PMD.TooManyMethods" })
4343
@RequiredArgsConstructor
4444
public class JdbcSeriesDaoImpl implements JdbcSeriesDao {
4545

@@ -75,18 +75,6 @@ public class JdbcSeriesDaoImpl implements JdbcSeriesDao {
7575
@Value("${series.count_stamps_of_collection}")
7676
private String countStampsOfCollectionSql;
7777

78-
@Value("${series.count_stamps_by_michel_number}")
79-
private String countStampsByMichelNumberSql;
80-
81-
@Value("${series.count_stamps_by_scott_number}")
82-
private String countStampsByScottNumberSql;
83-
84-
@Value("${series.count_stamps_by_yvert_number}")
85-
private String countStampsByYvertNumberSql;
86-
87-
@Value("${series.count_stamps_by_gibbons_number}")
88-
private String countStampsByGibbonsNumberSql;
89-
9078
@Value("${series.find_series_id_by_michel_number}")
9179
private String findSeriesIdByMichelNumberSql;
9280

@@ -222,42 +210,6 @@ public long countStampsOfCollection(Integer collectionId) {
222210
);
223211
}
224212

225-
@Override
226-
public long countByMichelNumberCode(String michelNumber) {
227-
return jdbcTemplate.queryForObject(
228-
countStampsByMichelNumberSql,
229-
Collections.singletonMap("michel_number", michelNumber),
230-
Long.class
231-
);
232-
}
233-
234-
@Override
235-
public long countByScottNumberCode(String scottNumber) {
236-
return jdbcTemplate.queryForObject(
237-
countStampsByScottNumberSql,
238-
Collections.singletonMap("scott_number", scottNumber),
239-
Long.class
240-
);
241-
}
242-
243-
@Override
244-
public long countByYvertNumberCode(String yvertNumber) {
245-
return jdbcTemplate.queryForObject(
246-
countStampsByYvertNumberSql,
247-
Collections.singletonMap("yvert_number", yvertNumber),
248-
Long.class
249-
);
250-
}
251-
252-
@Override
253-
public long countByGibbonsNumberCode(String gibbonsNumber) {
254-
return jdbcTemplate.queryForObject(
255-
countStampsByGibbonsNumberSql,
256-
Collections.singletonMap("gibbons_number", gibbonsNumber),
257-
Long.class
258-
);
259-
}
260-
261213
@Override
262214
public Optional<Integer> findSeriesIdByMichelNumberCode(String michelNumber) {
263215
try {

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

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

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

2223
import org.springframework.beans.factory.annotation.Value;
@@ -37,8 +38,8 @@ public JdbcYvertCatalogDaoImpl(NamedParameterJdbcTemplate jdbcTemplate) {
3738
}
3839

3940
@Override
40-
public void add(Set<String> yvertNumbers) {
41-
add(yvertNumbers, addYvertNumberSql);
41+
public List<String> add(Set<String> yvertNumbers) {
42+
return add(yvertNumbers, addYvertNumberSql);
4243
}
4344

4445
@Override

0 commit comments

Comments
 (0)