You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.1 KiB
78 lines
2.1 KiB
package com.crawler.repository;
|
|
|
|
import com.crawler.model.Article;
|
|
import java.util.*;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.stream.Collectors;
|
|
|
|
public class InMemoryArticleRepository implements ArticleRepository {
|
|
private final Map<String, Article> articles = new ConcurrentHashMap<>();
|
|
private final Map<String, String> urlToIdMap = new ConcurrentHashMap<>();
|
|
private final AtomicInteger idGenerator = new AtomicInteger(1);
|
|
|
|
@Override
|
|
public void save(Article article) {
|
|
if (article.getId() == null) {
|
|
article.setId(String.valueOf(idGenerator.getAndIncrement()));
|
|
}
|
|
articles.put(article.getId(), article);
|
|
if (article.getUrl() != null) {
|
|
urlToIdMap.put(article.getUrl(), article.getId());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void saveAll(List<Article> articleList) {
|
|
for (Article article : articleList) {
|
|
save(article);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Optional<Article> findById(String id) {
|
|
return Optional.ofNullable(articles.get(id));
|
|
}
|
|
|
|
@Override
|
|
public Optional<Article> findByUrl(String url) {
|
|
String id = urlToIdMap.get(url);
|
|
return id != null ? Optional.ofNullable(articles.get(id)) : Optional.empty();
|
|
}
|
|
|
|
@Override
|
|
public List<Article> findAll() {
|
|
return new ArrayList<>(articles.values());
|
|
}
|
|
|
|
@Override
|
|
public List<Article> findBySource(String source) {
|
|
return articles.values().stream()
|
|
.filter(a -> source.equals(a.getSource()))
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
@Override
|
|
public void deleteById(String id) {
|
|
Article article = articles.remove(id);
|
|
if (article != null && article.getUrl() != null) {
|
|
urlToIdMap.remove(article.getUrl());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void deleteAll() {
|
|
articles.clear();
|
|
urlToIdMap.clear();
|
|
}
|
|
|
|
@Override
|
|
public int count() {
|
|
return articles.size();
|
|
}
|
|
|
|
@Override
|
|
public boolean existsByUrl(String url) {
|
|
return urlToIdMap.containsKey(url);
|
|
}
|
|
}
|
|
|