3838 * @author Oliver Drotbohm
3939 * @author Dmitry Belyaev
4040 * @author Björn Kieling
41+ * @author Cora Iberkleid
4142 */
4243@ Transactional
4344class JpaEventPublicationRepository implements EventPublicationRepository {
@@ -53,7 +54,7 @@ class JpaEventPublicationRepository implements EventPublicationRepository {
5354
5455 private static String COMPLETE = """
5556 select p
56- from JpaEventPublication p
57+ from %s p
5758 where
5859 p.completionDate is not null
5960 order by
@@ -113,14 +114,14 @@ class JpaEventPublicationRepository implements EventPublicationRepository {
113114
114115 private static final String DELETE_COMPLETED = """
115116 delete
116- from JpaEventPublication p
117+ from %s p
117118 where
118119 p.completionDate is not null
119120 """ ;
120121
121122 private static final String DELETE_COMPLETED_BEFORE = """
122123 delete
123- from JpaEventPublication p
124+ from %s p
124125 where
125126 p.completionDate < ?1
126127 """ ;
@@ -131,6 +132,8 @@ class JpaEventPublicationRepository implements EventPublicationRepository {
131132 private final EventSerializer serializer ;
132133 private final CompletionMode completionMode ;
133134
135+ private final String getCompleted , deleteCompleted , deleteCompletedBefore ;
136+
134137 /**
135138 * Creates a new {@link JpaEventPublicationRepository} for the given {@link EntityManager} and
136139 * {@link EventSerializer}.
@@ -148,7 +151,15 @@ public JpaEventPublicationRepository(EntityManager entityManager, EventSerialize
148151 this .entityManager = entityManager ;
149152 this .serializer = serializer ;
150153 this .completionMode = completionMode ;
151- }
154+
155+ var archiveEntityName = completionMode == CompletionMode .ARCHIVE
156+ ? ArchivedJpaEventPublication .class .getSimpleName ()
157+ : JpaEventPublication .class .getSimpleName ();
158+
159+ this .getCompleted = COMPLETE .formatted (archiveEntityName );
160+ this .deleteCompleted = DELETE_COMPLETED .formatted (archiveEntityName );
161+ this .deleteCompletedBefore = DELETE_COMPLETED_BEFORE .formatted (archiveEntityName );
162+ }
152163
153164 /*
154165 * (non-Javadoc)
@@ -179,6 +190,18 @@ public void markCompleted(Object event, PublicationTargetIdentifier identifier,
179190 .setParameter (2 , identifierValue )
180191 .executeUpdate ();
181192
193+ } else if (completionMode == CompletionMode .ARCHIVE ) {
194+
195+ var publication = entityManager .createQuery (BY_EVENT_AND_LISTENER_ID , JpaEventPublication .class )
196+ .setParameter (1 , serializedEvent )
197+ .setParameter (2 , identifierValue )
198+ .getSingleResult ();
199+
200+ var archived = publication .archive (completionDate );
201+
202+ entityManager .remove (publication );
203+ entityManager .persist (archived );
204+
182205 } else {
183206
184207 entityManager .createQuery (MARK_COMPLETED_BY_EVENT_AND_LISTENER_ID )
@@ -202,6 +225,15 @@ public void markCompleted(UUID identifier, Instant completionDate) {
202225 .setParameter (1 , identifier )
203226 .executeUpdate ();
204227
228+ } else if (completionMode == CompletionMode .ARCHIVE ) {
229+
230+ var publication = entityManager .find (JpaEventPublication .class , identifier );
231+
232+ var archived = publication .archive (completionDate );
233+
234+ entityManager .remove (publication );
235+ entityManager .persist (archived );
236+
205237 } else {
206238
207239 entityManager .createQuery (MARK_COMPLETED_BY_ID )
@@ -260,7 +292,11 @@ public Optional<TargetEventPublication> findIncompletePublicationsByEventAndTarg
260292 @ Override
261293 public List <TargetEventPublication > findCompletedPublications () {
262294
263- return entityManager .createQuery (COMPLETE , JpaEventPublication .class )
295+ var type = completionMode == CompletionMode .ARCHIVE
296+ ? ArchivedJpaEventPublication .class
297+ : JpaEventPublication .class ;
298+
299+ return entityManager .createQuery (getCompleted , type )
264300 .getResultList ()
265301 .stream ()
266302 .map (this ::entityToDomain )
@@ -285,7 +321,7 @@ public void deletePublications(List<UUID> identifiers) {
285321 */
286322 @ Override
287323 public void deleteCompletedPublications () {
288- entityManager .createQuery (DELETE_COMPLETED ).executeUpdate ();
324+ entityManager .createQuery (deleteCompleted ).executeUpdate ();
289325 }
290326
291327 /*
@@ -297,7 +333,7 @@ public void deleteCompletedPublicationsBefore(Instant instant) {
297333
298334 Assert .notNull (instant , "Instant must not be null!" );
299335
300- entityManager .createQuery (DELETE_COMPLETED_BEFORE )
336+ entityManager .createQuery (deleteCompletedBefore )
301337 .setParameter (1 , instant )
302338 .executeUpdate ();
303339 }
@@ -341,6 +377,7 @@ private static class JpaEventPublicationAdapter implements TargetEventPublicatio
341377
342378 private final JpaEventPublication publication ;
343379 private final EventSerializer serializer ;
380+ private Object deserializedEvent ;
344381
345382 /**
346383 * Creates a new {@link JpaEventPublicationAdapter} for the given {@link JpaEventPublication} and
@@ -373,7 +410,12 @@ public UUID getIdentifier() {
373410 */
374411 @ Override
375412 public Object getEvent () {
376- return serializer .deserialize (publication .serializedEvent , publication .eventType );
413+
414+ if (deserializedEvent == null ) {
415+ this .deserializedEvent = serializer .deserialize (publication .serializedEvent , publication .eventType );
416+ }
417+
418+ return deserializedEvent ;
377419 }
378420
379421 /*
0 commit comments