diff --git a/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java b/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java index 368c1e34..eb05776b 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/HttpClientFactory.java @@ -66,11 +66,10 @@ public class HttpClientFactory { String userAgent = config.httpClient() .userAgent() - .orElseGet( - () -> - String.format( - "CommaFeed/%s (https://github.com/Athou/commafeed)", - version.getVersion())); + .orElseGet(() -> + String.format( + "CommaFeed/%s (https://github.com/Athou/commafeed)", + version.getVersion())); return newClient(config, connectionManager, userAgent); } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java b/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java index aad4e02f..a6563473 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java @@ -283,9 +283,8 @@ public class HttpGetter { } return CacheBuilder.newBuilder() - .weigher( - (HttpRequest key, HttpResponse value) -> - value.content() != null ? value.content().length : 0) + .weigher((HttpRequest key, HttpResponse value) -> + value.content() != null ? value.content().length : 0) .maximumWeight(cacheConfig.maximumMemorySize().asLongValue()) .expireAfterWrite(cacheConfig.expiration()) .build(); diff --git a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java index d7b32951..f8fdc4c1 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java @@ -124,10 +124,8 @@ public class FeedSubscriptionDAO extends GenericDAO { Set categoryIds = categories.stream().map(AbstractModel::getId).collect(Collectors.toSet()); return findAll(user).stream() - .filter( - s -> - s.getCategory() != null - && categoryIds.contains(s.getCategory().getId())) + .filter(s -> + s.getCategory() != null && categoryIds.contains(s.getCategory().getId())) .toList(); } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java index 4f85b3cb..fbfeef65 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java @@ -104,56 +104,52 @@ public class FeedRefreshEngine { private void startFeedProcessingLoop() { // take a feed from the queue, process it, rince, repeat - feedProcessingLoopExecutor.submit( - () -> { - while (!feedProcessingLoopExecutor.isShutdown()) { - try { - // take() is blocking until a feed is available from the queue - Feed feed = queue.take(); + feedProcessingLoopExecutor.submit(() -> { + while (!feedProcessingLoopExecutor.isShutdown()) { + try { + // take() is blocking until a feed is available from the queue + Feed feed = queue.take(); - // send the feed to be processed - log.debug( - "got feed {} from the queue, send it for processing", - feed.getId()); - processFeedAsync(feed); + // send the feed to be processed + log.debug("got feed {} from the queue, send it for processing", feed.getId()); + processFeedAsync(feed); - // we removed a feed from the queue, try to refill it as it may now be - // empty - if (queue.isEmpty()) { - log.debug("took the last feed from the queue, try to refill"); - refillQueueAsync(); - } - } catch (InterruptedException e) { - log.debug("interrupted while waiting for a feed in the queue"); - Thread.currentThread().interrupt(); - } catch (Exception e) { - log.error(e.getMessage(), e); - } + // we removed a feed from the queue, try to refill it as it may now be + // empty + if (queue.isEmpty()) { + log.debug("took the last feed from the queue, try to refill"); + refillQueueAsync(); } - }); + } catch (InterruptedException e) { + log.debug("interrupted while waiting for a feed in the queue"); + Thread.currentThread().interrupt(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + }); } private void startRefillLoop() { // refill the queue at regular intervals if it's empty - refillLoopExecutor.submit( - () -> { - while (!refillLoopExecutor.isShutdown()) { - try { - if (queue.isEmpty()) { - log.debug("refilling queue"); - refillQueueAsync(); - } - - log.debug("sleeping for 15s"); - TimeUnit.SECONDS.sleep(15); - } catch (InterruptedException e) { - log.debug("interrupted while sleeping"); - Thread.currentThread().interrupt(); - } catch (Exception e) { - log.error(e.getMessage(), e); - } + refillLoopExecutor.submit(() -> { + while (!refillLoopExecutor.isShutdown()) { + try { + if (queue.isEmpty()) { + log.debug("refilling queue"); + refillQueueAsync(); } - }); + + log.debug("sleeping for 15s"); + TimeUnit.SECONDS.sleep(15); + } catch (InterruptedException e) { + log.debug("interrupted while sleeping"); + Thread.currentThread().interrupt(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + }); } public void refreshImmediately(Feed feed) { @@ -184,65 +180,53 @@ public class FeedRefreshEngine { } }, refillExecutor) - .whenComplete( - (data, ex) -> { - if (ex != null) { - log.error("error while refilling the queue", ex); - } - }); + .whenComplete((data, ex) -> { + if (ex != null) { + log.error("error while refilling the queue", ex); + } + }); } private void processFeedAsync(Feed feed) { CompletableFuture.supplyAsync(() -> worker.update(feed), workerExecutor) .thenApplyAsync(r -> updater.update(r.feed(), r.entries()), databaseUpdaterExecutor) - .thenCompose( - r -> { - List> futures = - r.insertedUnreadEntriesBySubscription().entrySet().stream() - .map( - e -> { - FeedSubscription sub = e.getKey(); - List entries = e.getValue(); + .thenCompose(r -> { + List> futures = + r.insertedUnreadEntriesBySubscription().entrySet().stream() + .map(e -> { + FeedSubscription sub = e.getKey(); + List entries = e.getValue(); - notifier.notifyOverWebsocket(sub, entries); - return CompletableFuture.runAsync( - () -> - notifier - .sendPushNotifications( - sub, - entries), - notifierExecutor); - }) - .toList(); - return CompletableFuture.allOf( - futures.toArray(CompletableFuture[]::new)); - }) - .exceptionally( - ex -> { - log.error("error while processing feed {}", feed.getUrl(), ex); - return null; - }); + notifier.notifyOverWebsocket(sub, entries); + return CompletableFuture.runAsync( + () -> notifier.sendPushNotifications(sub, entries), + notifierExecutor); + }) + .toList(); + return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); + }) + .exceptionally(ex -> { + log.error("error while processing feed {}", feed.getUrl(), ex); + return null; + }); } private List getNextUpdatableFeeds(int max) { - return unitOfWork.call( - () -> { - Instant lastLoginThreshold = - config.feedRefresh().userInactivityPeriod().isZero() - ? null - : Instant.now() - .minus(config.feedRefresh().userInactivityPeriod()); - List feeds = feedDAO.findNextUpdatable(max, lastLoginThreshold); - if (!feeds.isEmpty()) { - // update disabledUntil to prevent feeds from being returned again by - // feedDAO.findNextUpdatable() - Instant nextUpdateDate = - Instant.now().plus(config.feedRefresh().interval()); - feedDAO.setDisabledUntil( - feeds.stream().map(AbstractModel::getId).toList(), nextUpdateDate); - } - return feeds; - }); + return unitOfWork.call(() -> { + Instant lastLoginThreshold = + config.feedRefresh().userInactivityPeriod().isZero() + ? null + : Instant.now().minus(config.feedRefresh().userInactivityPeriod()); + List feeds = feedDAO.findNextUpdatable(max, lastLoginThreshold); + if (!feeds.isEmpty()) { + // update disabledUntil to prevent feeds from being returned again by + // feedDAO.findNextUpdatable() + Instant nextUpdateDate = Instant.now().plus(config.feedRefresh().interval()); + feedDAO.setDisabledUntil( + feeds.stream().map(AbstractModel::getId).toList(), nextUpdateDate); + } + return feeds; + }); } private int getBatchSize() { @@ -292,19 +276,18 @@ public class FeedRefreshEngine { ThreadPoolExecutor pool = new ThreadPoolExecutor( threads, threads, 0L, TimeUnit.MILLISECONDS, new SynchronousQueue<>()); - pool.setRejectedExecutionHandler( - (r, e) -> { - if (e.isShutdown()) { - return; - } + pool.setRejectedExecutionHandler((r, e) -> { + if (e.isShutdown()) { + return; + } - try { - e.getQueue().put(r); - } catch (InterruptedException ex) { - log.debug("interrupted while waiting for a slot in the queue.", ex); - Thread.currentThread().interrupt(); - } - }); + try { + e.getQueue().put(r); + } catch (InterruptedException ex) { + log.debug("interrupted while waiting for a slot in the queue.", ex); + Thread.currentThread().interrupt(); + } + }); return pool; } } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java index 4dde767f..a7b0ae67 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java @@ -91,24 +91,22 @@ public class FeedRefreshUpdater { if (locked1 && locked2) { processed = true; insertedEntry = - unitOfWork.call( - () -> { - if (feedEntryService.find(feed, entry) != null) { - // entry already exists, nothing to do - return null; - } + unitOfWork.call(() -> { + if (feedEntryService.find(feed, entry) != null) { + // entry already exists, nothing to do + return null; + } - FeedEntry feedEntry = feedEntryService.create(feed, entry); - entryInserted.mark(); - for (FeedSubscription sub : subscriptions) { - boolean unread = - feedEntryService.applyFilter(sub, feedEntry); - if (unread) { - subscriptionsForWhichEntryIsUnread.add(sub); - } - } - return feedEntry; - }); + FeedEntry feedEntry = feedEntryService.create(feed, entry); + entryInserted.mark(); + for (FeedSubscription sub : subscriptions) { + boolean unread = feedEntryService.applyFilter(sub, feedEntry); + if (unread) { + subscriptionsForWhichEntryIsUnread.add(sub); + } + } + return feedEntry; + }); } else { log.error("lock timeout for {} - {}", feed.getUrl(), key1); } @@ -147,14 +145,13 @@ public class FeedRefreshUpdater { AddEntryResult addEntryResult = addEntry(feed, entry, subscriptions); processed &= addEntryResult.processed; inserted += addEntryResult.insertedEntry != null ? 1 : 0; - addEntryResult.subscriptionsForWhichEntryIsUnread.forEach( - sub -> { - if (addEntryResult.insertedEntry != null) { - insertedUnreadEntriesBySubscription - .computeIfAbsent(sub, k -> new ArrayList<>()) - .add(addEntryResult.insertedEntry); - } - }); + addEntryResult.subscriptionsForWhichEntryIsUnread.forEach(sub -> { + if (addEntryResult.insertedEntry != null) { + insertedUnreadEntriesBySubscription + .computeIfAbsent(sub, k -> new ArrayList<>()) + .add(addEntryResult.insertedEntry); + } + }); } if (inserted == 0) { diff --git a/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLExporter.java b/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLExporter.java index 53c7fea3..1de3f7ea 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLExporter.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLExporter.java @@ -65,20 +65,17 @@ public class OPMLExporter { for (FeedCategory child : categories.stream() - .filter( - c -> - c.getParent() != null - && c.getParent().getId().equals(cat.getId())) + .filter(c -> + c.getParent() != null && c.getParent().getId().equals(cat.getId())) .toList()) { outline.getChildren().add(buildCategoryOutline(child, categories, subscriptions)); } for (FeedSubscription sub : subscriptions.stream() - .filter( - s -> - s.getCategory() != null - && s.getCategory().getId().equals(cat.getId())) + .filter(s -> + s.getCategory() != null + && s.getCategory().getId().equals(cat.getId())) .toList()) { outline.getChildren().add(buildSubscriptionOutline(sub)); } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java index 548d7f91..d56b0138 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java @@ -148,26 +148,23 @@ public class FeedEntryService { List statusesToMark = statuses.stream() .filter(FeedEntryStatus::isMarkable) - .filter( - s -> { - Instant entryDate = s.getEntry().getPublished(); - return olderThan == null - || entryDate == null - || entryDate.isBefore(olderThan); - }) - .filter( - s -> { - Instant insertedDate = s.getEntry().getInserted(); - return insertedBefore == null - || insertedDate == null - || insertedDate.isBefore(insertedBefore); - }) + .filter(s -> { + Instant entryDate = s.getEntry().getPublished(); + return olderThan == null + || entryDate == null + || entryDate.isBefore(olderThan); + }) + .filter(s -> { + Instant insertedDate = s.getEntry().getInserted(); + return insertedBefore == null + || insertedDate == null + || insertedDate.isBefore(insertedBefore); + }) .toList(); - statusesToMark.forEach( - s -> { - s.setRead(true); - feedEntryStatusDAO.merge(s); - }); + statusesToMark.forEach(s -> { + s.setRead(true); + feedEntryStatusDAO.merge(s); + }); } } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java index c81ae2c0..0f99d6a6 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java @@ -47,14 +47,13 @@ public class FeedSubscriptionService { // we need to use this hook because the feed needs to have been persisted before being // processed // by the feed engine - feedSubscriptionDAO.onPostCommitInsert( - sub -> { - Feed feed = sub.getFeed(); - if (feed.getDisabledUntil() == null - || feed.getDisabledUntil().isBefore(Instant.now())) { - feedRefreshEngine.refreshImmediately(feed); - } - }); + feedSubscriptionDAO.onPostCommitInsert(sub -> { + Feed feed = sub.getFeed(); + if (feed.getDisabledUntil() == null + || feed.getDisabledUntil().isBefore(Instant.now())) { + feedRefreshEngine.refreshImmediately(feed); + } + }); } public long subscribe( diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java index 72d1b89c..3e01517b 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java @@ -79,13 +79,10 @@ public class DatabaseCleaningService { } while (entriesDeleted > 0); } deleted = - unitOfWork.call( - () -> - feedDAO.delete( - feedDAO.findByIds( - feeds.stream() - .map(AbstractModel::getId) - .toList()))); + unitOfWork.call(() -> + feedDAO.delete( + feedDAO.findByIds( + feeds.stream().map(AbstractModel::getId).toList()))); total += deleted; log.debug("removed {} feeds without subscriptions", total); } while (deleted != 0); @@ -119,10 +116,9 @@ public class DatabaseCleaningService { } List feeds = - unitOfWork.call( - () -> - feedEntryDAO.findFeedsExceedingCapacity( - maxFeedCapacity, batchSize, keepStarredEntries)); + unitOfWork.call(() -> + feedEntryDAO.findFeedsExceedingCapacity( + maxFeedCapacity, batchSize, keepStarredEntries)); if (feeds.isEmpty()) { break; } @@ -139,12 +135,11 @@ public class DatabaseCleaningService { final long rem = remaining; deleted = - unitOfWork.call( - () -> - feedEntryDAO.deleteOldEntries( - feed.id(), - Math.min(batchSize, rem), - keepStarredEntries)); + unitOfWork.call(() -> + feedEntryDAO.deleteOldEntries( + feed.id(), + Math.min(batchSize, rem), + keepStarredEntries)); entriesDeletedMeter.mark(deleted); total += deleted; remaining -= deleted; @@ -166,10 +161,9 @@ public class DatabaseCleaningService { } deleted = - unitOfWork.call( - () -> - feedEntryDAO.deleteEntriesOlderThan( - olderThan, batchSize, keepStarredEntries)); + unitOfWork.call(() -> + feedEntryDAO.deleteEntriesOlderThan( + olderThan, batchSize, keepStarredEntries)); entriesDeletedMeter.mark(deleted); total += deleted; log.debug("removed {} old entries", total); diff --git a/commafeed-server/src/main/java/com/commafeed/backend/task/DemoAccountCleanupTask.java b/commafeed-server/src/main/java/com/commafeed/backend/task/DemoAccountCleanupTask.java index 79e1e18d..ab55fec7 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/task/DemoAccountCleanupTask.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/task/DemoAccountCleanupTask.java @@ -31,16 +31,15 @@ public class DemoAccountCleanupTask extends ScheduledTask { } log.info("recreating demo user account"); - unitOfWork.run( - () -> { - User demoUser = userDAO.findByName(CommaFeedConstants.USERNAME_DEMO); - if (demoUser == null) { - return; - } + unitOfWork.run(() -> { + User demoUser = userDAO.findByName(CommaFeedConstants.USERNAME_DEMO); + if (demoUser == null) { + return; + } - userService.unregister(demoUser); - userService.createDemoUser(); - }); + userService.unregister(demoUser); + userService.createDemoUser(); + }); } @Override diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java b/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java index 28d6362f..b0c3e654 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java @@ -140,14 +140,9 @@ public class FeverREST { Map params = new HashMap<>(); uri.getQueryParameters().forEach((k, v) -> params.put(k, v.getFirst())); form.getValues() - .forEach( - (k, v) -> - params.put( - k, - v.stream() - .map(FormValue::getValue) - .findFirst() - .orElse(null))); + .forEach((k, v) -> + params.put( + k, v.stream().map(FormValue::getValue).findFirst().orElse(null))); return handle(userId, params); } @@ -246,46 +241,42 @@ public class FeverREST { s -> s.getCategory() == null ? 0 : s.getCategory().getId())) .entrySet() .stream() - .map( - e -> { - FeverFeedGroup fg = new FeverFeedGroup(); - fg.setGroupId(e.getKey()); - fg.setFeedIds( - e.getValue().stream().map(FeedSubscription::getId).toList()); - return fg; - }) + .map(e -> { + FeverFeedGroup fg = new FeverFeedGroup(); + fg.setGroupId(e.getKey()); + fg.setFeedIds(e.getValue().stream().map(FeedSubscription::getId).toList()); + return fg; + }) .toList(); } private List buildGroups(List categories) { return categories.stream() - .map( - c -> { - FeverGroup g = new FeverGroup(); - g.setId(c.getId()); - g.setTitle(c.getName()); - return g; - }) + .map(c -> { + FeverGroup g = new FeverGroup(); + g.setId(c.getId()); + g.setTitle(c.getName()); + return g; + }) .toList(); } private List buildFeeds(List subscriptions) { return subscriptions.stream() - .map( - s -> { - FeverFeed f = new FeverFeed(); - f.setId(s.getId()); - f.setFaviconId(s.getId()); - f.setTitle(s.getTitle()); - f.setUrl(s.getFeed().getUrl()); - f.setSiteUrl(s.getFeed().getLink()); - f.setSpark(false); - f.setLastUpdatedOnTime( - s.getFeed().getLastUpdated() == null - ? 0 - : s.getFeed().getLastUpdated().getEpochSecond()); - return f; - }) + .map(s -> { + FeverFeed f = new FeverFeed(); + f.setId(s.getId()); + f.setFaviconId(s.getId()); + f.setTitle(s.getTitle()); + f.setUrl(s.getFeed().getUrl()); + f.setSiteUrl(s.getFeed().getLink()); + f.setSpark(false); + f.setLastUpdatedOnTime( + s.getFeed().getLastUpdated() == null + ? 0 + : s.getFeed().getLastUpdated().getEpochSecond()); + return f; + }) .toList(); } @@ -367,19 +358,18 @@ public class FeverREST { private List buildFavicons(List subscriptions) { return subscriptions.stream() - .map( - s -> { - Favicon favicon = feedFaviconService.fetchFavicon(s.getFeed()); + .map(s -> { + Favicon favicon = feedFaviconService.fetchFavicon(s.getFeed()); - FeverFavicon f = new FeverFavicon(); - f.setId(s.getFeed().getId()); - f.setData( - String.format( - "data:%s;base64,%s", - favicon.mediaType(), - Base64.getEncoder().encodeToString(favicon.icon()))); - return f; - }) + FeverFavicon f = new FeverFavicon(); + f.setId(s.getFeed().getId()); + f.setData( + String.format( + "data:%s;base64,%s", + favicon.mediaType(), + Base64.getEncoder().encodeToString(favicon.icon()))); + return f; + }) .toList(); } diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/resource/googlereader/GoogleReaderREST.java b/commafeed-server/src/main/java/com/commafeed/frontend/resource/googlereader/GoogleReaderREST.java index 9af83b74..9b25693b 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/resource/googlereader/GoogleReaderREST.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/resource/googlereader/GoogleReaderREST.java @@ -216,11 +216,10 @@ public class GoogleReaderREST { List tags = new ArrayList<>(); feedCategoryDAO .findAll(user) - .forEach( - c -> - tags.add( - new GoogleReaderModel.Tag( - GoogleReaderStreamId.label(c.getName())))); + .forEach(c -> + tags.add( + new GoogleReaderModel.Tag( + GoogleReaderStreamId.label(c.getName())))); tags.add(new GoogleReaderModel.Tag(GoogleReaderStreamId.STARRED)); GoogleReaderModel.TagList resp = new GoogleReaderModel.TagList(); @@ -259,21 +258,19 @@ public class GoogleReaderREST { Map categoriesById = feedCategoryDAO.findAll(user).stream() .collect(Collectors.toMap(FeedCategory::getId, c -> c)); - unreadByCategory.forEach( - (categoryId, count) -> { - if (categoryId == 0) { - return; - } - FeedCategory category = categoriesById.get(categoryId); - if (category == null) { - return; - } - GoogleReaderModel.UnreadCountEntry entry = - new GoogleReaderModel.UnreadCountEntry(); - entry.setId(GoogleReaderStreamId.label(category.getName())); - entry.setCount(count); - entries.add(entry); - }); + unreadByCategory.forEach((categoryId, count) -> { + if (categoryId == 0) { + return; + } + FeedCategory category = categoriesById.get(categoryId); + if (category == null) { + return; + } + GoogleReaderModel.UnreadCountEntry entry = new GoogleReaderModel.UnreadCountEntry(); + entry.setId(GoogleReaderStreamId.label(category.getName())); + entry.setCount(count); + entries.add(entry); + }); GoogleReaderModel.UnreadCountEntry readingList = new GoogleReaderModel.UnreadCountEntry(); readingList.setId(GoogleReaderStreamId.READING_LIST); @@ -334,10 +331,8 @@ public class GoogleReaderREST { GoogleReaderModel.ItemRefs resp = new GoogleReaderModel.ItemRefs(); resp.setItemRefs( paged.statuses().stream() - .map( - s -> - new GoogleReaderModel.ItemRef( - String.valueOf(s.getEntry().getId()))) + .map(s -> + new GoogleReaderModel.ItemRef(String.valueOf(s.getEntry().getId()))) .toList()); resp.setContinuation(paged.continuation()); return resp; diff --git a/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseApiKeyIdentityProvider.java b/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseApiKeyIdentityProvider.java index 32727ea8..ff1b6cae 100644 --- a/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseApiKeyIdentityProvider.java +++ b/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseApiKeyIdentityProvider.java @@ -38,20 +38,18 @@ public class DatabaseApiKeyIdentityProvider @Override public Uni authenticate( TokenAuthenticationRequest request, AuthenticationRequestContext context) { - return context.runBlocking( - () -> { - Optional user = - unitOfWork.call(() -> userService.login(request.getToken().getToken())); - if (user.isEmpty()) { - throw new AuthenticationFailedException( - "could not find a user with this api key"); - } + return context.runBlocking(() -> { + Optional user = + unitOfWork.call(() -> userService.login(request.getToken().getToken())); + if (user.isEmpty()) { + throw new AuthenticationFailedException("could not find a user with this api key"); + } - Set roles = unitOfWork.call(() -> userService.getRoles(user.get())); - return QuarkusSecurityIdentity.builder() - .setPrincipal(new QuarkusPrincipal(String.valueOf(user.get().getId()))) - .addRoles(roles.stream().map(Enum::name).collect(Collectors.toSet())) - .build(); - }); + Set roles = unitOfWork.call(() -> userService.getRoles(user.get())); + return QuarkusSecurityIdentity.builder() + .setPrincipal(new QuarkusPrincipal(String.valueOf(user.get().getId()))) + .addRoles(roles.stream().map(Enum::name).collect(Collectors.toSet())) + .build(); + }); } } diff --git a/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseUsernamePasswordIdentityProvider.java b/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseUsernamePasswordIdentityProvider.java index 321ed8c9..0bc30eca 100644 --- a/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseUsernamePasswordIdentityProvider.java +++ b/commafeed-server/src/main/java/com/commafeed/security/identity/DatabaseUsernamePasswordIdentityProvider.java @@ -39,25 +39,22 @@ public class DatabaseUsernamePasswordIdentityProvider @Override public Uni authenticate( UsernamePasswordAuthenticationRequest request, AuthenticationRequestContext context) { - return context.runBlocking( - () -> { - Optional user = - unitOfWork.call( - () -> - userService.login( - request.getUsername(), - new String( - request.getPassword().getPassword()))); - if (user.isEmpty()) { - throw new CommaFeedApplicationException( - CommaFeedExceptionType.WRONG_USERNAME_OR_PASSWORD); - } + return context.runBlocking(() -> { + Optional user = + unitOfWork.call(() -> + userService.login( + request.getUsername(), + new String(request.getPassword().getPassword()))); + if (user.isEmpty()) { + throw new CommaFeedApplicationException( + CommaFeedExceptionType.WRONG_USERNAME_OR_PASSWORD); + } - Set roles = unitOfWork.call(() -> userService.getRoles(user.get())); - return QuarkusSecurityIdentity.builder() - .setPrincipal(new QuarkusPrincipal(String.valueOf(user.get().getId()))) - .addRoles(roles.stream().map(Enum::name).collect(Collectors.toSet())) - .build(); - }); + Set roles = unitOfWork.call(() -> userService.getRoles(user.get())); + return QuarkusSecurityIdentity.builder() + .setPrincipal(new QuarkusPrincipal(String.valueOf(user.get().getId()))) + .addRoles(roles.stream().map(Enum::name).collect(Collectors.toSet())) + .build(); + }); } } diff --git a/commafeed-server/src/main/java/com/commafeed/security/identity/TrustedIdentityProvider.java b/commafeed-server/src/main/java/com/commafeed/security/identity/TrustedIdentityProvider.java index 1d87ef04..b6ce09bd 100644 --- a/commafeed-server/src/main/java/com/commafeed/security/identity/TrustedIdentityProvider.java +++ b/commafeed-server/src/main/java/com/commafeed/security/identity/TrustedIdentityProvider.java @@ -40,24 +40,23 @@ public class TrustedIdentityProvider implements IdentityProvider authenticate( TrustedAuthenticationRequest request, AuthenticationRequestContext context) { - return context.runBlocking( - () -> { - Long userId = Long.valueOf(request.getPrincipal()); - User user = unitOfWork.call(() -> userDAO.findById(userId)); - if (user == null) { - throw new AuthenticationFailedException("user not found"); - } + return context.runBlocking(() -> { + Long userId = Long.valueOf(request.getPrincipal()); + User user = unitOfWork.call(() -> userDAO.findById(userId)); + if (user == null) { + throw new AuthenticationFailedException("user not found"); + } - // execute post login activities manually because we didn't call login() since - // we received - // a trusted authentication request - unitOfWork.run(() -> postLoginActivities.executeFor(user)); + // execute post login activities manually because we didn't call login() since + // we received + // a trusted authentication request + unitOfWork.run(() -> postLoginActivities.executeFor(user)); - Set roles = unitOfWork.call(() -> userService.getRoles(user)); - return QuarkusSecurityIdentity.builder() - .setPrincipal(new QuarkusPrincipal(String.valueOf(userId))) - .addRoles(roles.stream().map(Enum::name).collect(Collectors.toSet())) - .build(); - }); + Set roles = unitOfWork.call(() -> userService.getRoles(user)); + return QuarkusSecurityIdentity.builder() + .setPrincipal(new QuarkusPrincipal(String.valueOf(userId))) + .addRoles(roles.stream().map(Enum::name).collect(Collectors.toSet())) + .build(); + }); } } diff --git a/commafeed-server/src/test/java/com/commafeed/NativeImageClassesTest.java b/commafeed-server/src/test/java/com/commafeed/NativeImageClassesTest.java index 8bfb430c..e6efc464 100644 --- a/commafeed-server/src/test/java/com/commafeed/NativeImageClassesTest.java +++ b/commafeed-server/src/test/java/com/commafeed/NativeImageClassesTest.java @@ -41,11 +41,10 @@ class NativeImageClassesTest { WireFeedGenerator.class)) { Set> moduleClasses = new HashSet<>(reflections.get(Scanners.SubTypes.of(clazz).asClass())); - moduleClasses.removeIf( - c -> - c.isInterface() - || Modifier.isAbstract(c.getModifiers()) - || !Modifier.isPublic(c.getModifiers())); + moduleClasses.removeIf(c -> + c.isInterface() + || Modifier.isAbstract(c.getModifiers()) + || !Modifier.isPublic(c.getModifiers())); moduleClasses.removeAll(classesInAnnotation); missingClasses.addAll(moduleClasses); } diff --git a/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java b/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java index 591f0c08..d75736e6 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java @@ -317,18 +317,17 @@ class HttpGetterTest { this.mockServerClient .when(HttpRequest.request().withMethod("GET")) - .respond( - req -> { - calls.incrementAndGet(); + .respond(req -> { + calls.incrementAndGet(); - if (req.containsHeader(HttpHeaders.COOKIE)) { - throw new Exception("cookie should not be sent by the client"); - } + if (req.containsHeader(HttpHeaders.COOKIE)) { + throw new Exception("cookie should not be sent by the client"); + } - return HttpResponse.response() - .withBody("ok") - .withHeader(HttpHeaders.SET_COOKIE, "foo=bar"); - }); + return HttpResponse.response() + .withBody("ok") + .withHeader(HttpHeaders.SET_COOKIE, "foo=bar"); + }); Assertions.assertDoesNotThrow(() -> getter.get(this.feedUrl)); Assertions.assertDoesNotThrow(() -> getter.get(this.feedUrl + "?foo=bar")); @@ -341,11 +340,10 @@ class HttpGetterTest { this.mockServerClient .when(HttpRequest.request().withMethod("GET")) - .respond( - req -> { - calls.incrementAndGet(); - return HttpResponse.response().withBody("ok"); - }); + .respond(req -> { + calls.incrementAndGet(); + return HttpResponse.response().withBody("ok"); + }); HttpResult result = getter.get(this.feedUrl); Assertions.assertEquals(result, getter.get(this.feedUrl)); @@ -400,17 +398,15 @@ class HttpGetterTest { this.mockServerClient .when(HttpRequest.request().withMethod("GET")) - .respond( - req -> { - calls.incrementAndGet(); + .respond(req -> { + calls.incrementAndGet(); - if (req.containsHeader(HttpHeaders.UPGRADE)) { - throw new Exception( - "upgrade header should not be sent by the client"); - } + if (req.containsHeader(HttpHeaders.UPGRADE)) { + throw new Exception("upgrade header should not be sent by the client"); + } - return HttpResponse.response().withBody("ok"); - }); + return HttpResponse.response().withBody("ok"); + }); Assertions.assertDoesNotThrow(() -> getter.get(this.feedUrl)); Assertions.assertEquals(1, calls.get()); @@ -438,33 +434,30 @@ class HttpGetterTest { HttpGetterTest.this .mockServerClient .when(HttpRequest.request().withMethod("GET")) - .respond( - req -> { - try { - String acceptEncodingHeader = - req.getFirstHeader(HttpHeaders.ACCEPT_ENCODING); - if (!ACCEPT_ENCODING.equals(acceptEncodingHeader)) { - throw new Exception( - "Wrong value in the Accept-Encoding header, should be '%s' but was '%s'" - .formatted( - ACCEPT_ENCODING, - acceptEncodingHeader)); - } + .respond(req -> { + try { + String acceptEncodingHeader = + req.getFirstHeader(HttpHeaders.ACCEPT_ENCODING); + if (!ACCEPT_ENCODING.equals(acceptEncodingHeader)) { + throw new Exception( + "Wrong value in the Accept-Encoding header, should be '%s' but was '%s'" + .formatted(ACCEPT_ENCODING, acceptEncodingHeader)); + } - ByteArrayOutputStream output = new ByteArrayOutputStream(); - try (OutputStream compressionOutputStream = - compressionFunction.apply(output)) { - compressionOutputStream.write(body.getBytes()); - } + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try (OutputStream compressionOutputStream = + compressionFunction.apply(output)) { + compressionOutputStream.write(body.getBytes()); + } - return HttpResponse.response() - .withBody(output.toByteArray()) - .withHeader(HttpHeaders.CONTENT_ENCODING, encoding); - } catch (Exception e) { - log.error("Error in compression callback", e); - throw e; - } - }); + return HttpResponse.response() + .withBody(output.toByteArray()) + .withHeader(HttpHeaders.CONTENT_ENCODING, encoding); + } catch (Exception e) { + log.error("Error in compression callback", e); + throw e; + } + }); HttpResult result = getter.get(HttpGetterTest.this.feedUrl); Assertions.assertEquals(body, new String(result.content())); diff --git a/commafeed-server/src/test/java/com/commafeed/backend/favicon/YoutubeFaviconFetcherTest.java b/commafeed-server/src/test/java/com/commafeed/backend/favicon/YoutubeFaviconFetcherTest.java index 667b844c..7968475f 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/favicon/YoutubeFaviconFetcherTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/favicon/YoutubeFaviconFetcherTest.java @@ -68,7 +68,8 @@ class YoutubeFaviconFetcherTest { byte[] apiResponse = """ - {"items":[{"snippet":{"thumbnails":{"default":{"url":"https://example.com/icon.png"}}}}]}""" + {"items":[{"snippet":{"thumbnails":{"default":{"url":"https://example.com/icon.png"}}}}]}\ + """ .getBytes(); HttpResult apiHttpResult = new HttpResult(apiResponse, "application/json", null, null, null, Duration.ZERO); @@ -102,7 +103,8 @@ class YoutubeFaviconFetcherTest { byte[] apiResponse = """ - {"items":[{"snippet":{"thumbnails":{"default":{"url":"https://example.com/icon.png"}}}}]}""" + {"items":[{"snippet":{"thumbnails":{"default":{"url":"https://example.com/icon.png"}}}}]}\ + """ .getBytes(); HttpResult apiHttpResult = new HttpResult(apiResponse, "application/json", null, null, null, Duration.ZERO); @@ -136,7 +138,8 @@ class YoutubeFaviconFetcherTest { byte[] playlistResponse = """ - {"items":[{"snippet":{"channelId":"testChannelId"}}]}""" + {"items":[{"snippet":{"channelId":"testChannelId"}}]}\ + """ .getBytes(); HttpResult playlistHttpResult = new HttpResult( @@ -151,7 +154,8 @@ class YoutubeFaviconFetcherTest { byte[] channelResponse = """ - {"items":[{"snippet":{"thumbnails":{"default":{"url":"https://example.com/icon.png"}}}}]}""" + {"items":[{"snippet":{"thumbnails":{"default":{"url":"https://example.com/icon.png"}}}}]}\ + """ .getBytes(); HttpResult channelHttpResult = new HttpResult( diff --git a/commafeed-server/src/test/java/com/commafeed/backend/feed/parser/XMLCleanerTest.java b/commafeed-server/src/test/java/com/commafeed/backend/feed/parser/XMLCleanerTest.java index b6ae35af..0ee3d618 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/feed/parser/XMLCleanerTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/feed/parser/XMLCleanerTest.java @@ -226,14 +226,16 @@ class XMLCleanerTest { void testRemoveMultilineDoctype() { String source = """ - - """; + + \ + """; Assertions.assertEquals( """ - """, + \ + """, xmlCleaner.removeDoctypeDeclarations(source)); } diff --git a/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryContentCleaningServiceTest.java b/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryContentCleaningServiceTest.java index 82515921..eaffc9bc 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryContentCleaningServiceTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryContentCleaningServiceTest.java @@ -12,23 +12,23 @@ class FeedEntryContentCleaningServiceTest { void testClean() { String content = """ -

- Some text - alt-desc - - aaa - """; +

+ Some text + alt-desc + + aaa + """; String result = feedEntryContentCleaningService.clean(content, "baseUri", false); Assertions.assertLinesMatch( """ -

- Some text - alt-desc - - aaa -

- """ +

+ Some text + alt-desc + + aaa +

+ """ .lines(), result.lines()); } diff --git a/commafeed-server/src/test/java/com/commafeed/backend/service/PushNotificationServiceTest.java b/commafeed-server/src/test/java/com/commafeed/backend/service/PushNotificationServiceTest.java index 5b8c425b..8151b0f2 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/service/PushNotificationServiceTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/service/PushNotificationServiceTest.java @@ -98,19 +98,19 @@ class PushNotificationServiceTest { .withBody( JsonBody.json( """ - { - "title": "Test Feed", - "message": "Test Entry", - "priority": 5, - "extras": { - "client::notification": { - "click": { - "url": "http://example.com/entry" - } - } - } - } - """))) + { + "title": "Test Feed", + "message": "Test Entry", + "priority": 5, + "extras": { + "client::notification": { + "click": { + "url": "http://example.com/entry" + } + } + } + } + """))) .respond(HttpResponse.response().withStatusCode(200)); Assertions.assertDoesNotThrow( diff --git a/commafeed-server/src/test/java/com/commafeed/backend/urlprovider/InPageReferenceFeedURLProviderTest.java b/commafeed-server/src/test/java/com/commafeed/backend/urlprovider/InPageReferenceFeedURLProviderTest.java index 509519fc..a28ed4c8 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/urlprovider/InPageReferenceFeedURLProviderTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/urlprovider/InPageReferenceFeedURLProviderTest.java @@ -14,14 +14,15 @@ class InPageReferenceFeedURLProviderTest { String url = "http://example.com"; String html = """ - - - - - - - - """; + + + + + + + + \ + """; Assertions.assertIterableEquals( List.of("http://example.com/feed.atom", "http://example.com/feed.rss"), @@ -33,9 +34,10 @@ class InPageReferenceFeedURLProviderTest { String url = "http://example.com"; String html = """ - - - """; + + + \ + """; Assertions.assertTrue(provider.get(url, html).isEmpty()); } @@ -45,13 +47,14 @@ class InPageReferenceFeedURLProviderTest { String url = "http://example.com"; String html = """ - - - - - - - """; + + + + + + + \ + """; Assertions.assertTrue(provider.get(url, html).isEmpty()); } diff --git a/commafeed-server/src/test/java/com/commafeed/integration/rest/GoogleReaderIT.java b/commafeed-server/src/test/java/com/commafeed/integration/rest/GoogleReaderIT.java index 90c0f417..d82dc696 100644 --- a/commafeed-server/src/test/java/com/commafeed/integration/rest/GoogleReaderIT.java +++ b/commafeed-server/src/test/java/com/commafeed/integration/rest/GoogleReaderIT.java @@ -170,10 +170,9 @@ class GoogleReaderIT extends BaseIT { client.get(BASE + "/reader/api/0/unread-count").as(UnreadCounts.class); Assertions.assertTrue( counts.getUnreadCounts().stream() - .anyMatch( - c -> - c.getId().equals("user/-/state/com.google/reading-list") - && c.getCount() == 2)); + .anyMatch(c -> + c.getId().equals("user/-/state/com.google/reading-list") + && c.getCount() == 2)); } @Test