10
10
import java .util .ArrayList ;
11
11
import java .util .Comparator ;
12
12
import java .util .List ;
13
+ import java .util .Map ;
13
14
import java .util .Optional ;
14
15
import java .util .UUID ;
15
- import org .jetbrains .annotations .NotNull ;
16
+ import java .util .concurrent .atomic .AtomicInteger ;
17
+ import java .util .stream .Collectors ;
16
18
import org .springframework .stereotype .Repository ;
17
19
import org .springframework .transaction .annotation .Transactional ;
18
20
@@ -60,15 +62,34 @@ public List<LegalPeriodicalEdition> findAllByLegalPeriodicalId(UUID legalPeriodi
60
62
@ Transactional (transactionManager = "jpaTransactionManager" )
61
63
public LegalPeriodicalEdition save (LegalPeriodicalEdition legalPeriodicalEdition ) {
62
64
63
- List <ReferenceDTO > referenceDTOS = createReferenceDTOs (legalPeriodicalEdition );
64
- List <DependentLiteratureCitationDTO > dependentLiteratureCitationDTOS =
65
- createLiteratureReferenceDTOs (legalPeriodicalEdition );
66
- deleteDocUnitLinksForDeletedReferences (legalPeriodicalEdition );
65
+ List <ReferenceDTO > referenceDTOS = new ArrayList <>();
66
+ List <DependentLiteratureCitationDTO > dependentLiteratureCitationDTOS = new ArrayList <>();
67
+
68
+ AtomicInteger editionRank = new AtomicInteger (1 );
69
+ for (Reference reference :
70
+ Optional .ofNullable (legalPeriodicalEdition .references ()).orElse (List .of ())) {
71
+
72
+ var docUnit =
73
+ documentationUnitRepository .findByDocumentNumber (
74
+ reference .documentationUnit ().getDocumentNumber ());
75
+
76
+ if (docUnit .isEmpty ()) {
77
+ continue ;
78
+ }
79
+ if (reference .referenceType ().equals (ReferenceType .CASELAW )) {
80
+ referenceDTOS .add (createReferenceDTO (reference , docUnit .get (), editionRank ));
81
+ }
82
+ if (reference .referenceType ().equals (ReferenceType .LITERATURE )) {
83
+ dependentLiteratureCitationDTOS .add (
84
+ createLiteratureCitationDTO (reference , docUnit .get (), editionRank ));
85
+ }
86
+ }
67
87
68
88
var editionDTO = LegalPeriodicalEditionTransformer .transformToDTO (legalPeriodicalEdition );
69
- editionDTO .setReferences (referenceDTOS ); // Add the new references
70
- editionDTO .setLiteratureCitations (
71
- dependentLiteratureCitationDTOS ); // Add the new literature references
89
+ editionDTO .setReferences (referenceDTOS );
90
+ editionDTO .setLiteratureCitations (dependentLiteratureCitationDTOS );
91
+
92
+ deleteDocUnitLinksForDeletedReferences (legalPeriodicalEdition );
72
93
73
94
return LegalPeriodicalEditionTransformer .transformToDomain (repository .save (editionDTO ))
74
95
.toBuilder ()
@@ -81,20 +102,32 @@ private ArrayList<Reference> addReferences(LegalPeriodicalEditionDTO editionDTO)
81
102
82
103
if (editionDTO .getReferences () != null ) {
83
104
references .addAll (
84
- editionDTO .getReferences ().stream ()
85
- .map (id -> referenceRepository .findById (id ).orElse (null ))
105
+ editionDTO .getReferences ().entrySet ().stream ()
106
+ .map (
107
+ entry ->
108
+ referenceRepository
109
+ .findById (entry .getKey ())
110
+ .map (dto -> dto .toBuilder ().editionRank (entry .getValue ()).build ())
111
+ .orElse (null ))
86
112
.map (ReferenceTransformer ::transformToDomain )
87
113
.toList ());
88
114
}
89
115
90
116
if (editionDTO .getLiteratureCitations () != null ) {
91
117
references .addAll (
92
- editionDTO .getLiteratureCitations ().stream ()
93
- .map (id -> dependentLiteratureCitationRepository .findById (id ).orElse (null ))
118
+ editionDTO .getLiteratureCitations ().entrySet ().stream ()
119
+ .map (
120
+ entry ->
121
+ dependentLiteratureCitationRepository
122
+ .findById (entry .getKey ())
123
+ .map (dto -> dto .toBuilder ().editionRank (entry .getValue ()).build ())
124
+ .orElse (null ))
94
125
.map (DependentLiteratureTransformer ::transformToDomain )
95
126
.toList ());
96
127
}
97
- return references ;
128
+ return references .stream ()
129
+ .sorted (Comparator .comparingInt (Reference ::rank ))
130
+ .collect (Collectors .toCollection (ArrayList ::new ));
98
131
}
99
132
100
133
private void deleteDocUnitLinksForDeletedReferences (LegalPeriodicalEdition updatedEdition ) {
@@ -103,12 +136,12 @@ private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updat
103
136
return ;
104
137
}
105
138
// Ensure it's removed from DocumentationUnit's references
106
- for (UUID reference : oldEdition .get ().getReferences ()) {
139
+ for (Map . Entry < UUID , Integer > reference : oldEdition .get ().getReferences (). entrySet ()) {
107
140
// skip all existing and null references
108
- var referenceDTO = referenceRepository .findById (reference );
141
+ var referenceDTO = referenceRepository .findById (reference . getKey () );
109
142
if (referenceDTO .isEmpty ()
110
143
|| updatedEdition .references ().stream ()
111
- .anyMatch (newReference -> newReference .id ().equals (reference ))) {
144
+ .anyMatch (newReference -> newReference .id ().equals (reference . getKey () ))) {
112
145
continue ;
113
146
}
114
147
@@ -121,7 +154,7 @@ private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updat
121
154
if (docUnit .getSource ().stream ()
122
155
.findFirst ()
123
156
.map (SourceDTO ::getReference )
124
- .filter (ref -> ref .getId ().equals (reference ))
157
+ .filter (ref -> ref .getId ().equals (reference . getKey () ))
125
158
.isPresent ()) {
126
159
docUnit .getSource ().removeFirst ();
127
160
}
@@ -130,74 +163,51 @@ private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updat
130
163
}
131
164
}
132
165
133
- @ NotNull
134
- private List <ReferenceDTO > createReferenceDTOs (LegalPeriodicalEdition legalPeriodicalEdition ) {
135
- List <ReferenceDTO > referenceDTOS = new ArrayList <>();
136
- if (legalPeriodicalEdition .references () == null ) {
137
- return referenceDTOS ;
138
- }
139
- for (Reference reference : legalPeriodicalEdition .references ()) {
140
- var docUnit =
141
- documentationUnitRepository .findByDocumentNumber (
142
- reference .documentationUnit ().getDocumentNumber ());
143
- if (docUnit .isEmpty () || !reference .referenceType ().equals (ReferenceType .CASELAW )) {
144
- continue ;
145
- }
146
- var newReference = ReferenceTransformer .transformToDTO (reference );
147
- newReference .setDocumentationUnit (docUnit .get ());
148
-
149
- // keep rank for existing references and set to max rank +1 for new references
150
- newReference .setRank (
151
- docUnit .get ().getReferences ().stream ()
152
- .filter (referenceDTO -> referenceDTO .getId ().equals (reference .id ()))
153
- .findFirst ()
154
- .map (ReferenceDTO ::getRank )
155
- .orElseGet (
156
- () ->
157
- docUnit .get ().getReferences ().stream ()
158
- .map (ReferenceDTO ::getRank )
159
- .max (Comparator .naturalOrder ())
160
- .orElse (0 )
161
- + 1 ));
162
-
163
- referenceDTOS .add (referenceRepository .save (newReference ));
164
- }
165
-
166
- return referenceDTOS ;
166
+ private ReferenceDTO createReferenceDTO (
167
+ Reference reference , DocumentationUnitDTO docUnit , AtomicInteger editionRank ) {
168
+ var newReference = ReferenceTransformer .transformToDTO (reference );
169
+ newReference .setDocumentationUnit (docUnit );
170
+
171
+ // keep rank for existing references and set to max rank +1 for new references
172
+ newReference .setRank (
173
+ docUnit .getReferences ().stream ()
174
+ .filter (referenceDTO -> referenceDTO .getId ().equals (reference .id ()))
175
+ .findFirst ()
176
+ .map (ReferenceDTO ::getRank )
177
+ .orElseGet (
178
+ () ->
179
+ docUnit .getReferences ().stream ()
180
+ .map (ReferenceDTO ::getRank )
181
+ .max (Comparator .naturalOrder ())
182
+ .orElse (0 )
183
+ + 1 ));
184
+
185
+ return referenceRepository .save (newReference ).toBuilder ()
186
+ .editionRank (editionRank .getAndIncrement ())
187
+ .build ();
167
188
}
168
189
169
- private List <DependentLiteratureCitationDTO > createLiteratureReferenceDTOs (
170
- LegalPeriodicalEdition legalPeriodicalEdition ) {
171
- List <DependentLiteratureCitationDTO > dependentLiteratureCitationDTOS = new ArrayList <>();
172
- if (legalPeriodicalEdition .references () == null ) {
173
- return dependentLiteratureCitationDTOS ;
174
- }
175
- for (Reference reference : legalPeriodicalEdition .references ()) {
176
- var docUnit =
177
- documentationUnitRepository .findByDocumentNumber (
178
- reference .documentationUnit ().getDocumentNumber ());
179
- if (docUnit .isEmpty () || !reference .referenceType ().equals (ReferenceType .LITERATURE )) {
180
- continue ;
181
- }
182
-
183
- var newReference = DependentLiteratureTransformer .transformToDTO (reference );
184
- newReference .setDocumentationUnit (docUnit .get ());
185
- // keep rank for existing references and set to max rank +1 for new references
186
- newReference .setRank (
187
- docUnit .get ().getReferences ().stream ()
188
- .filter (referenceDTO -> referenceDTO .getId ().equals (reference .id ()))
189
- .findFirst ()
190
- .map (ReferenceDTO ::getRank )
191
- .orElseGet (
192
- () ->
193
- docUnit .get ().getDependentLiteratureCitations ().stream ()
194
- .map (DependentLiteratureCitationDTO ::getRank )
195
- .max (Comparator .naturalOrder ())
196
- .orElse (0 )
197
- + 1 ));
198
- dependentLiteratureCitationDTOS .add (dependentLiteratureCitationRepository .save (newReference ));
199
- }
200
- return dependentLiteratureCitationDTOS ;
190
+ private DependentLiteratureCitationDTO createLiteratureCitationDTO (
191
+ Reference reference , DocumentationUnitDTO docUnit , AtomicInteger editionRank ) {
192
+ var newReference = DependentLiteratureTransformer .transformToDTO (reference );
193
+ newReference .setDocumentationUnit (docUnit );
194
+
195
+ // keep rank for existing references and set to max rank +1 for new references
196
+ newReference .setRank (
197
+ docUnit .getReferences ().stream ()
198
+ .filter (referenceDTO -> referenceDTO .getId ().equals (reference .id ()))
199
+ .findFirst ()
200
+ .map (ReferenceDTO ::getRank )
201
+ .orElseGet (
202
+ () ->
203
+ docUnit .getDependentLiteratureCitations ().stream ()
204
+ .map (DependentLiteratureCitationDTO ::getRank )
205
+ .max (Comparator .naturalOrder ())
206
+ .orElse (0 )
207
+ + 1 ));
208
+ return dependentLiteratureCitationRepository .save (newReference ).toBuilder ()
209
+ .editionRank (editionRank .getAndIncrement ())
210
+ .build ();
201
211
}
202
212
203
213
@ Override
0 commit comments