Skip to content

Commit a8573e7

Browse files
committed
/series/add: add fields with day and month of release.
Fixed #148 (GH #4)
1 parent a79f4db commit a8573e7

24 files changed

+224
-57
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@
602602
</propertyFile>
603603
<migrationSqlOutputFile>/dev/stdout</migrationSqlOutputFile>
604604
<!-- See also src/main/java/ru/mystamps/web/config/LiquibaseConfig.java -->
605-
<contexts>scheme,init-data</contexts>
605+
<contexts>scheme,init-data,prod-data</contexts>
606606
</configuration>
607607
</plugin>
608608

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ private static String getActiveContexts(Environment env) {
4949
return "scheme, init-data, test-data";
5050
} else {
5151
// see also duplicate definition at pom.xml
52-
return "scheme, init-data";
52+
return "scheme, init-data, prod-data";
5353
}
5454
}
5555

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

+25
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import ru.mystamps.web.service.dto.EntityInfoDto;
5656
import ru.mystamps.web.support.spring.security.SecurityContextUtils;
5757
import ru.mystamps.web.util.CatalogUtils;
58+
import ru.mystamps.web.validation.ValidationRules;
5859

5960
@Controller
6061
@RequiredArgsConstructor
@@ -63,13 +64,27 @@ public class SeriesController {
6364
private static final Integer SINCE_YEAR = 1840;
6465
private static final Integer CURRENT_YEAR = new GregorianCalendar().get(Calendar.YEAR);
6566

67+
private static final Map<Integer, Integer> DAYS;
68+
private static final Map<Integer, Integer> MONTHS;
6669
private static final Map<Integer, Integer> YEARS;
6770

6871
private final CategoryService categoryService;
6972
private final CountryService countryService;
7073
private final SeriesService seriesService;
7174

7275
static {
76+
DAYS = new LinkedHashMap<>(ValidationRules.MAX_DAYS_IN_MONTH);
77+
for (int i = 1; i <= ValidationRules.MAX_DAYS_IN_MONTH; i++) {
78+
Integer day = Integer.valueOf(i);
79+
DAYS.put(day, day);
80+
}
81+
82+
MONTHS = new LinkedHashMap<>(ValidationRules.MAX_MONTHS_IN_YEAR);
83+
for (int i = 1; i <= ValidationRules.MAX_MONTHS_IN_YEAR; i++) {
84+
Integer month = Integer.valueOf(i);
85+
MONTHS.put(month, month);
86+
}
87+
7388
YEARS = new LinkedHashMap<>();
7489
for (Integer i = CURRENT_YEAR; i >= SINCE_YEAR; i--) {
7590
YEARS.put(i, i);
@@ -86,6 +101,16 @@ protected void initBinder(WebDataBinder binder) {
86101
binder.registerCustomEditor(String.class, "comment", new StringTrimmerEditor(true));
87102
}
88103

104+
@ModelAttribute("days")
105+
public Map<Integer, Integer> getDays() {
106+
return DAYS;
107+
}
108+
109+
@ModelAttribute("months")
110+
public Map<Integer, Integer> getMonths() {
111+
return MONTHS;
112+
}
113+
89114
@ModelAttribute("years")
90115
public Map<Integer, Integer> getYears() {
91116
return YEARS;

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public interface SeriesDao extends CrudRepository<Series, Integer> {
4848
+ "s.id, "
4949
+ "cat.id, cat.name, "
5050
+ "c.id, c.name, "
51-
+ "s.releasedAt, "
51+
+ "s.releaseDay, "
52+
+ "s.releaseMonth, "
53+
+ "s.releaseYear, "
5254
+ "s.quantity, "
5355
+ "s.perforated"
5456
+ ") "
@@ -64,7 +66,9 @@ public interface SeriesDao extends CrudRepository<Series, Integer> {
6466
+ "s.id, "
6567
+ "cat.id, cat.name, "
6668
+ "c.id, c.name, "
67-
+ "s.releasedAt, "
69+
+ "s.releaseDay, "
70+
+ "s.releaseMonth, "
71+
+ "s.releaseYear, "
6872
+ "s.quantity, "
6973
+ "s.perforated"
7074
+ ") "

src/main/java/ru/mystamps/web/entity/Series.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
*/
1818
package ru.mystamps.web.entity;
1919

20-
import java.util.Date;
2120
import java.util.Set;
2221

2322
import javax.persistence.AttributeOverride;
@@ -33,8 +32,6 @@
3332
import javax.persistence.ManyToOne;
3433
import javax.persistence.OrderBy;
3534
import javax.persistence.Table;
36-
import javax.persistence.Temporal;
37-
import javax.persistence.TemporalType;
3835

3936
import lombok.Getter;
4037
import lombok.Setter;
@@ -61,9 +58,14 @@ public class Series {
6158
@ManyToOne
6259
private Country country;
6360

64-
@Temporal(TemporalType.DATE)
65-
@Column(name = "released_at")
66-
private Date releasedAt;
61+
@Column(name = "release_day")
62+
private Integer releaseDay;
63+
64+
@Column(name = "release_month")
65+
private Integer releaseMonth;
66+
67+
@Column(name = "release_year")
68+
private Integer releaseYear;
6769

6870
@Column(nullable = false)
6971
private Integer quantity;

src/main/java/ru/mystamps/web/model/AddSeriesForm.java

+17
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import javax.validation.constraints.Size;
2424
import javax.validation.GroupSequence;
2525

26+
import org.hibernate.validator.constraints.Range;
27+
2628
import org.springframework.web.multipart.MultipartFile;
2729

2830
import ru.mystamps.web.entity.Category;
@@ -42,6 +44,8 @@
4244
import static ru.mystamps.web.validation.ValidationRules.MAX_SERIES_COMMENT_LENGTH;
4345
import static ru.mystamps.web.validation.ValidationRules.MAX_STAMPS_IN_SERIES;
4446
import static ru.mystamps.web.validation.ValidationRules.MIN_STAMPS_IN_SERIES;
47+
import static ru.mystamps.web.validation.ValidationRules.MAX_DAYS_IN_MONTH;
48+
import static ru.mystamps.web.validation.ValidationRules.MAX_MONTHS_IN_YEAR;
4549

4650
import lombok.Getter;
4751
import lombok.Setter;
@@ -51,6 +55,12 @@
5155
// TODO: combine price with currency to separate class
5256
@SuppressWarnings({"PMD.TooManyFields", "PMD.AvoidDuplicateLiterals"})
5357
@NotNullIfFirstField.List({
58+
@NotNullIfFirstField(
59+
first = "month", second = "year", message = "{month.requires.year}"
60+
),
61+
@NotNullIfFirstField(
62+
first = "day", second = "month", message = "{day.requires.month}"
63+
),
5464
@NotNullIfFirstField(
5565
first = "michelPrice", second = "michelCurrency", message = "{currency.required}"
5666
),
@@ -70,6 +80,13 @@ public class AddSeriesForm implements AddSeriesDto {
7080
private Category category;
7181

7282
private Country country;
83+
84+
@Range(min = 1, max = MAX_DAYS_IN_MONTH, message = "{day.invalid}")
85+
private Integer day;
86+
87+
@Range(min = 1, max = MAX_MONTHS_IN_YEAR, message = "{month.invalid}")
88+
private Integer month;
89+
7390
private Integer year;
7491

7592
@NotNull

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

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,12 @@
1717
*/
1818
package ru.mystamps.web.service;
1919

20-
import java.util.Calendar;
2120
import java.util.Date;
22-
import java.util.GregorianCalendar;
2321
import java.util.Set;
2422

2523
import org.springframework.security.access.prepost.PreAuthorize;
2624
import org.springframework.transaction.annotation.Transactional;
2725

28-
import static java.util.Calendar.JANUARY;
29-
3026
import org.apache.commons.lang3.Validate;
3127

3228
import org.slf4j.Logger;
@@ -75,11 +71,15 @@ public Series add(AddSeriesDto dto, User user, boolean userCanAddComments) {
7571
}
7672

7773
if (dto.getYear() != null) {
78-
Calendar releaseDate = GregorianCalendar.getInstance();
79-
releaseDate.clear();
80-
releaseDate.set(dto.getYear(), JANUARY, 1);
81-
82-
series.setReleasedAt(releaseDate.getTime());
74+
series.setReleaseYear(dto.getYear());
75+
76+
if (dto.getMonth() != null) {
77+
series.setReleaseMonth(dto.getMonth());
78+
79+
if (dto.getDay() != null) {
80+
series.setReleaseDay(dto.getDay());
81+
}
82+
}
8383
}
8484

8585
series.setCategory(dto.getCategory());

src/main/java/ru/mystamps/web/service/dto/AddSeriesDto.java

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
public interface AddSeriesDto {
2727
Category getCategory();
2828
Country getCountry();
29+
Integer getDay();
30+
Integer getMonth();
2931
Integer getYear();
3032
Integer getQuantity();
3133
Boolean getPerforated();

src/main/java/ru/mystamps/web/service/dto/SeriesInfoDto.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@
1717
*/
1818
package ru.mystamps.web.service.dto;
1919

20-
import java.util.Date;
21-
2220
import lombok.Getter;
2321

2422
@Getter
2523
public class SeriesInfoDto {
2624
private final Integer id;
2725
private final EntityInfoDto category;
2826
private final EntityInfoDto country;
29-
private final Date releasedAt;
27+
private final Integer releaseDay;
28+
private final Integer releaseMonth;
29+
private final Integer releaseYear;
3030
private final Integer quantity;
3131
private final Boolean perforated;
3232

@@ -35,13 +35,15 @@ public SeriesInfoDto(
3535
Integer id,
3636
Integer categoryId, String categoryName,
3737
Integer countryId, String countryName,
38-
Date releasedAt,
38+
Integer releaseDay, Integer releaseMonth, Integer releaseYear,
3939
Integer quantity,
4040
Boolean perforated) {
4141
this.id = id;
4242
this.category = new EntityInfoDto(categoryId, categoryName);
4343
this.country = new EntityInfoDto(countryId, countryName);
44-
this.releasedAt = releasedAt;
44+
this.releaseDay = releaseDay;
45+
this.releaseMonth = releaseMonth;
46+
this.releaseYear = releaseYear;
4547
this.quantity = quantity;
4648
this.perforated = perforated;
4749
}

src/main/java/ru/mystamps/web/validation/ValidationRules.java

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ public final class ValidationRules {
5757
public static final int MAX_SERIES_COMMENT_LENGTH = Series.COMMENT_LENGTH;
5858
public static final String CATALOG_NUMBERS_REGEXP = "[1-9][0-9]{0,3}(,[1-9][0-9]{0,3})*";
5959

60+
public static final int MAX_DAYS_IN_MONTH = 31;
61+
public static final int MAX_MONTHS_IN_YEAR = 31;
62+
6063
private ValidationRules() {
6164
}
6265

src/main/resources/liquibase/version/0.3.xml

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd">
77

88
<include file="0.3/2014-02-11--categories.xml" relativeToChangelogFile="true" />
9+
<include file="0.3/2014-05-28--release_month_and_day.xml" relativeToChangelogFile="true" />
910

1011
</databaseChangeLog>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd">
7+
8+
<changeSet id="add-release_day-column-to-series-table" author="php-coder" context="scheme">
9+
<comment>Adds release_day column to series table</comment>
10+
11+
<addColumn tableName="series">
12+
<column name="release_day" type="INTEGER" />
13+
</addColumn>
14+
15+
</changeSet>
16+
17+
<changeSet id="add-release_month-column-to-series-table" author="php-coder" context="scheme">
18+
<comment>Adds release_month column to series table</comment>
19+
20+
<addColumn tableName="series">
21+
<column name="release_month" type="INTEGER" />
22+
</addColumn>
23+
24+
</changeSet>
25+
26+
<changeSet id="add-release_year-column-to-series-table" author="php-coder" context="scheme">
27+
<comment>Adds release_year column to series table</comment>
28+
29+
<addColumn tableName="series">
30+
<column name="release_year" type="INTEGER" />
31+
</addColumn>
32+
33+
</changeSet>
34+
35+
<changeSet id="fill-release_year-column-based-on-values-from-released_at" author="php-coder" context="test-data, prod-data">
36+
<comment>Migrates data from series.released_at to series.release_year</comment>
37+
38+
<sql>
39+
UPDATE series
40+
SET release_year=YEAR(released_at)
41+
WHERE released_at IS NOT NULL
42+
</sql>
43+
44+
</changeSet>
45+
46+
<changeSet id="drop-released_at-column-from-series-table" author="php-coder" context="scheme">
47+
<comment>Drops released_at column from series table</comment>
48+
49+
<dropColumn tableName="series" columnName="released_at" />
50+
51+
</changeSet>
52+
53+
</databaseChangeLog>

src/main/resources/ru/mystamps/i18n/Messages.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ t_country = Country
2020
t_add = Add
2121
t_add_country = add country
2222
t_create_category = add category
23+
t_issue_date = Date of release
2324

2425
# site/index.jsp
2526
t_index_title = create your own virtual collection!
@@ -64,7 +65,6 @@ t_enter = Sign in
6465

6566
# series/add.jsp
6667
t_add_series_ucfirst = Add stamp series
67-
t_issue_year = Year of release
6868
t_year = Year
6969
t_quantity = Quantity
7070
t_perforated = Perforated

src/main/resources/ru/mystamps/i18n/Messages_ru.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ t_country = Страна
2020
t_add = Добавить
2121
t_add_country = добавить страну
2222
t_create_category = добавить категорию
23+
t_issue_date = Дата выпуска
2324

2425
# site/index.jsp
2526
t_index_title = создай свою виртуальную коллекцию!
@@ -64,7 +65,6 @@ t_enter = Войти
6465

6566
# series/add.jsp
6667
t_add_series_ucfirst = Добавить серию марок
67-
t_issue_year = Год выпуска
6868
t_year = Год
6969
t_quantity = Количество
7070
t_perforated = Перфорированная

src/main/resources/ru/mystamps/i18n/ValidationMessages.properties

+4
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,7 @@ key.invalid = Key must consist only latin letters in lower case or digits
4545

4646
currency.required = Currency must be chosen
4747

48+
day.requires.month = Month must be specified
49+
month.requires.year = Year must be specified
50+
day.invalid = Invalid day of month
51+
month.invalid = Invalid month of year

src/main/resources/ru/mystamps/i18n/ValidationMessages_ru.properties

+4
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,7 @@ key.invalid = Код активации может состоять только
4545

4646
currency.required = Необходимо выбрать валюту
4747

48+
day.requires.month = Необходимо также указать месяц
49+
month.requires.year = Необходимо также указать год
50+
day.invalid = Некорректный день месяца
51+
month.invalid = Некорректный номер месяца

src/main/webapp/WEB-INF/tags/elem/series-info.tag

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2-
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
32
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
43

54
<%@ tag import="ru.mystamps.web.Url" %>
@@ -33,8 +32,8 @@
3332
</spring:url>
3433

3534
<a href="${seriesInfoUrl}">
36-
<c:if test="${not empty series.releasedAt}">
37-
<fmt:formatDate value="${series.releasedAt}" pattern="yyyy, " />
35+
<c:if test="${not empty series.releaseYear}">
36+
<c:out value="${series.releaseYear}, " />
3837
</c:if>
3938

4039
<c:out value="${series.quantity}" />&nbsp;<spring:message code="t_items" />

0 commit comments

Comments
 (0)