From 083708f43e0eafde4f7fd18ba2d9955e17322131 Mon Sep 17 00:00:00 2001 From: Magnus Reftel Date: Sun, 29 Mar 2020 16:04:14 +0200 Subject: [PATCH 1/2] pom: set versions for spring-expression and spring-tx --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 630107c5..cc9fe1e7 100644 --- a/pom.xml +++ b/pom.xml @@ -207,6 +207,18 @@ ${org.springframework.version} + + org.springframework + spring-expression + ${org.springframework.version} + + + + org.springframework + spring-tx + ${org.springframework.version} + + org.springframework spring-context From 302d0b070360d303d82193f3bccbda082b731929 Mon Sep 17 00:00:00 2001 From: Magnus Reftel Date: Wed, 14 Apr 2021 09:45:55 +0200 Subject: [PATCH 2/2] Add FeedRepository.Observer --- .../org/atomhopper/dbal/FeedRepository.java | 11 ++++ .../hibernate/HibernateFeedRepository.java | 63 ++++++++++++++----- .../HibernateFeedRepositoryTest.java | 8 +-- .../HibernateFeedRepositoryTestMain.java | 2 +- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/adapters/hibernate/src/main/java/org/atomhopper/dbal/FeedRepository.java b/adapters/hibernate/src/main/java/org/atomhopper/dbal/FeedRepository.java index 9affdfaf..1ffaf9ff 100644 --- a/adapters/hibernate/src/main/java/org/atomhopper/dbal/FeedRepository.java +++ b/adapters/hibernate/src/main/java/org/atomhopper/dbal/FeedRepository.java @@ -4,6 +4,7 @@ import org.atomhopper.adapter.jpa.PersistedEntry; import org.atomhopper.adapter.jpa.PersistedFeed; import org.atomhopper.hibernate.query.CategoryCriteriaGenerator; +import org.hibernate.Session; import java.util.Collection; import java.util.List; @@ -33,4 +34,14 @@ List getFeedPage(String feedName, PersistedEntry markerEntry, Pa Set updateCategories(Set categories); PersistedEntry getNextMarker(PersistedEntry persistedEntry, String feedName, CategoryCriteriaGenerator criteriaGenerator); + + void addObserver(Observer observer); + + void removeObserver(Observer observer); + + interface Observer { + void beforeAction(String name, Session session); + void afterAction(String name, Session session); + } + } diff --git a/adapters/hibernate/src/main/java/org/atomhopper/hibernate/HibernateFeedRepository.java b/adapters/hibernate/src/main/java/org/atomhopper/hibernate/HibernateFeedRepository.java index ddc8c7cf..9ced7149 100644 --- a/adapters/hibernate/src/main/java/org/atomhopper/hibernate/HibernateFeedRepository.java +++ b/adapters/hibernate/src/main/java/org/atomhopper/hibernate/HibernateFeedRepository.java @@ -1,5 +1,6 @@ package org.atomhopper.hibernate; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -7,6 +8,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; import org.atomhopper.adapter.jpa.PersistedCategory; import org.atomhopper.adapter.jpa.PersistedEntry; @@ -31,17 +33,20 @@ public class HibernateFeedRepository implements FeedRepository { private final HibernateSessionManager sessionManager; private static final String DATE_LAST_UPDATED = "dateLastUpdated"; private static final String FEED_NAME = "feed.name"; + private final List observers = Collections.synchronizedList(new ArrayList()); public HibernateFeedRepository(Map parameters) { sessionManager = new HibernateSessionManager(parameters); } - public void performSimpleAction(SimpleSessionAction action) { + public void performSimpleAction(String description, SimpleSessionAction action) { final long begin = System.currentTimeMillis(); LOG.debug("~!$: Simple Action Session begin: " + begin); final Session session = sessionManager.getSession(); + beforeAction(description, session); + Transaction tx = null; try { @@ -57,16 +62,18 @@ public void performSimpleAction(SimpleSessionAction action) { throw new AtomDatabaseException("Failure performing hibernate action: " + action.toString(), ex); } finally { + afterAction(description, session); LOG.debug("~!$: Closing session. Elapsed time: " + (System.currentTimeMillis() - begin)); session.close(); } } - public T performComplexAction(ComplexSessionAction action) { + public T performComplexAction(String description, ComplexSessionAction action) { final long begin = System.currentTimeMillis(); LOG.debug("~!$: Complex Action Session begin: " + begin); final Session session = sessionManager.getSession(); + beforeAction(description, session); T returnable = null; Transaction tx = null; @@ -86,16 +93,19 @@ public T performComplexAction(ComplexSessionAction action) { throw new AtomDatabaseException("Failure performing hibernate action: " + action.toString(), ex); } finally { + afterAction(description, session); LOG.debug("~!$: Closing session. Elapsed time: " + (System.currentTimeMillis() - begin)); session.close(); } } - public T performComplexActionNonTransactionable(ComplexSessionAction action) { + public T performComplexActionNonTransactionable(String description, ComplexSessionAction action) { final Session session = sessionManager.getSession(); T returnable = null; + beforeAction(description, session); + try { returnable = action.perform(session); @@ -103,13 +113,14 @@ public T performComplexActionNonTransactionable(ComplexSessionAction acti } catch (Exception ex) { throw new AtomDatabaseException("Failure performing hibernate action: " + action.toString(), ex); } finally { + afterAction(description, session); session.close(); } } @Override public Set getCategoriesForFeed(final String feedName) { - return performComplexAction(new ComplexSessionAction>() { + return performComplexAction("getCategoriesForFeed/" + feedName, new ComplexSessionAction>() { @Override public Set perform(Session liveSession) { @@ -129,7 +140,7 @@ public Set perform(Session liveSession) { @Override public List getFeedHead(final String feedName, final CategoryCriteriaGenerator criteriaGenerator, final int pageSize) { - return performComplexActionNonTransactionable(new ComplexSessionAction>() { + return performComplexActionNonTransactionable("getFeedHead/" + feedName, new ComplexSessionAction>() { @Override public List perform(Session liveSession) { @@ -150,7 +161,7 @@ public List perform(Session liveSession) { @Override public List getFeedPage(final String feedName, final PersistedEntry markerEntry, final PageDirection direction, final CategoryCriteriaGenerator criteriaGenerator, final int pageSize) { - return performComplexActionNonTransactionable(new ComplexSessionAction>() { + return performComplexActionNonTransactionable("getFeedPage/" + feedName, new ComplexSessionAction>() { @Override public List perform(Session liveSession) { @@ -180,7 +191,7 @@ public List perform(Session liveSession) { @Override public void saveFeed(final PersistedFeed feed) { - performSimpleAction(new SimpleSessionAction() { + performSimpleAction("saveFeed", new SimpleSessionAction() { @Override public void perform(Session liveSession) { @@ -207,7 +218,7 @@ public Set updateCategories(final Set cate AtomDatabaseException firstException = null; while (attemptsLeft-- > 0) { try { - return performComplexAction(new ComplexSessionAction>() { + return performComplexAction("updateCategories", new ComplexSessionAction>() { @Override public Set perform(Session liveSession) { @@ -245,7 +256,7 @@ public void saveEntry(final PersistedEntry entry) { AtomDatabaseException firstException = null; while (attemptsLeft-- > 0) { try { - performSimpleAction(new SimpleSessionAction() { + performSimpleAction("saveEntry", new SimpleSessionAction() { @Override public void perform(Session liveSession) { @@ -272,7 +283,7 @@ public void perform(Session liveSession) { @Override public Collection getAllFeeds() { - return performComplexActionNonTransactionable(new ComplexSessionAction>() { + return performComplexActionNonTransactionable("getAllFeeds", new ComplexSessionAction>() { @Override public Collection perform(Session liveSession) { @@ -283,7 +294,7 @@ public Collection perform(Session liveSession) { @Override public PersistedEntry getEntry(final String entryId, final String feedName) { - return performComplexActionNonTransactionable(new ComplexSessionAction() { + return performComplexActionNonTransactionable("getEntry/" + feedName, new ComplexSessionAction() { @Override public PersistedEntry perform(Session liveSession) { @@ -295,7 +306,7 @@ public PersistedEntry perform(Session liveSession) { @Override public PersistedFeed getFeed(final String name) { - return performComplexActionNonTransactionable(new ComplexSessionAction() { + return performComplexActionNonTransactionable("getFeed/" + name, new ComplexSessionAction() { @Override public PersistedFeed perform(Session liveSession) { @@ -307,7 +318,7 @@ public PersistedFeed perform(Session liveSession) { @Override public List getLastPage(final String feedName, final int pageSize, final CategoryCriteriaGenerator criteriaGenerator) { - return performComplexActionNonTransactionable(new ComplexSessionAction>() { + return performComplexActionNonTransactionable("getLastPage/" + feedName, new ComplexSessionAction>() { @Override public List perform(Session liveSession) { @@ -328,7 +339,7 @@ public List perform(Session liveSession) { @Override public PersistedEntry getNextMarker(final PersistedEntry persistedEntry, final String feedName, final CategoryCriteriaGenerator criteriaGenerator) { - return performComplexActionNonTransactionable(new ComplexSessionAction() { + return performComplexActionNonTransactionable("getNextMarker/" + feedName, new ComplexSessionAction() { @Override public PersistedEntry perform(Session liveSession) { @@ -348,6 +359,30 @@ public PersistedEntry perform(Session liveSession) { }); } + @Override + public void addObserver(Observer observer) { + observers.add(observer); + } + + @Override + public void removeObserver(Observer observer) { + observers.remove(observer); + } + + private void beforeAction(String action, Session session) { + CopyOnWriteArrayList observers = new CopyOnWriteArrayList(this.observers); + for (FeedRepository.Observer observer : observers) { + observer.beforeAction(action, session); + } + } + + private void afterAction(String action, Session session) { + CopyOnWriteArrayList observers = new CopyOnWriteArrayList(this.observers); + for (int i = observers.size() - 1; i >= 0; i--) { + observers.get(i).beforeAction(action, session); + } + } + private int safeLongToInt(long value) { if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) { throw new IllegalArgumentException diff --git a/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTest.java b/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTest.java index 5cc02888..0e30c9fd 100644 --- a/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTest.java +++ b/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTest.java @@ -61,7 +61,7 @@ public void setup() throws Exception { @Test(expected=AtomDatabaseException.class) public void shouldThrowAtomDatabaseException() throws Exception { - feedRepository.performSimpleAction(simpleSessionAction); + feedRepository.performSimpleAction("test", simpleSessionAction); } } @@ -87,7 +87,7 @@ public void setup() throws Exception { /*This should throw the error because */ @Test(expected=AtomDatabaseException.class) public void shouldThrowAtomDatabaseException() throws Exception { - feedRepository.performComplexAction(complexSessionAction); + feedRepository.performComplexAction("test", complexSessionAction); } } @@ -133,7 +133,7 @@ public void shouldFindEntry() throws Exception { @Test public void shouldCreateCategories() { - feedRepository.performSimpleAction(new SimpleSessionAction() { + feedRepository.performSimpleAction("test", new SimpleSessionAction() { @Override public void perform(Session liveSession) { final PersistedEntry entry = (PersistedEntry) liveSession.createCriteria(PersistedEntry.class) @@ -147,7 +147,7 @@ public void perform(Session liveSession) { @Test public void shouldFindEntryInFeed() throws Exception { - feedRepository.performSimpleAction(new SimpleSessionAction() { + feedRepository.performSimpleAction("test", new SimpleSessionAction() { @Override public void perform(Session liveSession) { final List feeds = liveSession.createCriteria(PersistedFeed.class).list(); diff --git a/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTestMain.java b/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTestMain.java index 846df622..779401c0 100644 --- a/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTestMain.java +++ b/adapters/hibernate/src/test/java/org/atomhopper/hibernate/HibernateFeedRepositoryTestMain.java @@ -23,7 +23,7 @@ public static void main(String[] args) { feedRepository.saveEntry(entry); - feedRepository.performSimpleAction(new SimpleSessionAction() { + feedRepository.performSimpleAction("testmain", new SimpleSessionAction() { @Override public void perform(Session liveSession) {