public boolean filterMatchesEntry(String filter, FeedEntry entry) throws FeedEntryFilterException {
		if (StringUtils.isBlank(filter)) {
			return true;
		}

		Script script;
		try {
			script = ENGINE.createScript(filter);
		} catch (JexlException e) {
			throw new FeedEntryFilterException("Exception while parsing expression " + filter, e);
		}

		JexlContext context = new MapContext();
		context.set("title", entry.getContent().getTitle() == null ? "" : Jsoup.parse(entry.getContent().getTitle()).text().toLowerCase());
		context.set("author", entry.getContent().getAuthor() == null ? "" : entry.getContent().getAuthor().toLowerCase());
		context.set("content",
				entry.getContent().getContent() == null ? "" : Jsoup.parse(entry.getContent().getContent()).text().toLowerCase());
		context.set("url", entry.getUrl() == null ? "" : entry.getUrl().toLowerCase());
		context.set("categories", entry.getContent().getCategories() == null ? "" : entry.getContent().getCategories().toLowerCase());

		context.set("year", Year.now().getValue());

		Callable<Object> callable = script.callable(context);
		Future<Object> future = executor.submit(callable);
		Object result;
		try {
			result = future.get(config.feedRefresh().filteringExpressionEvaluationTimeout().toMillis(), TimeUnit.MILLISECONDS);
		} catch (InterruptedException e) {
			Thread.currentThread().interrupt();
			throw new FeedEntryFilterException("interrupted while evaluating expression " + filter, e);
		} catch (ExecutionException e) {
			throw new FeedEntryFilterException("Exception while evaluating expression " + filter, e);
		} catch (TimeoutException e) {
			throw new FeedEntryFilterException("Took too long evaluating expression " + filter, e);
		}
		try {
			return (boolean) result;
		} catch (ClassCastException e) {
			throw new FeedEntryFilterException(e.getMessage(), e);
		}
	}
@Test
	void incorrectReturnTypeThrowsException() {
		Assertions.assertThrows(FeedEntryFilterException.class, () -> service.filterMatchesEntry("1", entry));
	}