From f8e2b040f676c56ebdd99bf056d252f137616d4e Mon Sep 17 00:00:00 2001 From: Eike Cochu <eike@cochu.com> Date: Wed, 13 Jan 2016 16:34:21 +0100 Subject: [PATCH] added mongodb orm replaced manual de-/serialization by automatic orm with morphia --- vipra-cmd/pom.xml | 10 +++ .../src/main/java/de/vipra/cmd/Main.java | 6 ++ .../main/java/de/vipra/cmd/file/Filebase.java | 2 +- .../java/de/vipra/cmd/file/JGibbFilebase.java | 2 +- .../main/java/de/vipra/cmd/model/Article.java | 2 + .../de/vipra/cmd/option/ClearCommand.java | 3 +- .../de/vipra/cmd/option/ImportCommand.java | 4 +- .../vipra/rest/resource/ArticleResource.java | 16 +--- .../de/vipra/rest/resource/TopicResource.java | 16 +--- .../rest/serializer/ArticleSerializer.java | 2 +- .../rest/serializer/TopicSerializer.java | 2 +- .../de/vipra/rest/service/ArticleService.java | 3 +- .../de/vipra/rest/service/TopicService.java | 3 +- vipra-ui/app/adapters/application.js | 2 +- vipra-util/pom.xml | 10 +++ .../src/main/java/de/vipra/util/Mongo.java | 22 +++++ .../java/de/vipra/util/model/Article.java | 58 ++++--------- .../de/vipra/util/model/ArticleStats.java | 41 +-------- .../de/vipra/util/model/BsonDocument.java | 11 --- .../main/java/de/vipra/util/model/Model.java | 30 ++----- .../de/vipra/util/model/TermFrequency.java | 25 +----- .../main/java/de/vipra/util/model/Topic.java | 54 +++++------- .../java/de/vipra/util/model/TopicCount.java | 23 +---- .../java/de/vipra/util/model/TopicWord.java | 23 +---- .../vipra/util/service/DatabaseService.java | 84 ++++--------------- .../java/de/vipra/util/service/Service.java | 2 +- 26 files changed, 141 insertions(+), 315 deletions(-) delete mode 100644 vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java diff --git a/vipra-cmd/pom.xml b/vipra-cmd/pom.xml index 59133339..e6d8ba39 100644 --- a/vipra-cmd/pom.xml +++ b/vipra-cmd/pom.xml @@ -87,6 +87,16 @@ <artifactId>mongodb-driver</artifactId> <version>3.2.0</version> </dependency> + <dependency> + <groupId>org.mongodb.morphia</groupId> + <artifactId>morphia</artifactId> + <version>1.0.1</version> + </dependency> + <dependency> + <groupId>org.mongodb.morphia</groupId> + <artifactId>morphia-logging-slf4j</artifactId> + <version>1.0.1</version> + </dependency> <!-- Testing --> <dependency> diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java index 21ff41af..946eb6b9 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java @@ -16,6 +16,8 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.ParseException; +import org.mongodb.morphia.logging.MorphiaLoggerFactory; +import org.mongodb.morphia.logging.slf4j.SLF4JLoggerImplFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,6 +36,10 @@ public class Main { public static final Logger log = LoggerFactory.getLogger(Main.class); public static final Logger out = LoggerFactory.getLogger("shellout"); + static { + MorphiaLoggerFactory.registerLogger(SLF4JLoggerImplFactory.class); + } + public static void main(String[] args) { CommandLineParser parser = new DefaultParser(); CmdOptions options = new CmdOptions(); diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java index 5f05e98a..f23a3d2b 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java @@ -47,7 +47,7 @@ public abstract class Filebase implements Closeable { } public void remove(Article article) throws FilebaseException { - remove(article.getId()); + remove(article.getId().toString()); } @Override diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java index 1195e099..1676bbdb 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java @@ -31,7 +31,7 @@ public class JGibbFilebase extends Filebase { public void add(Article article) throws FilebaseException { String[] words = article.getProcessedText().getText().split("\\s+"); vocab.addVocabulary(words); - index.add(article.getId()); + index.add(article.getId().toString()); articles.add(article); if (articles.size() >= bufferMaxSize) { diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java b/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java index 7edcca04..4c0bc3ca 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java @@ -1,11 +1,13 @@ package de.vipra.cmd.model; import org.json.simple.JSONObject; +import org.mongodb.morphia.annotations.Transient; import de.vipra.cmd.text.ProcessedText; public class Article extends de.vipra.util.model.Article { + @Transient private ProcessedText processedText; public ProcessedText getProcessedText() { diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java index 9f8ac68a..2cfbafd6 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java @@ -57,7 +57,8 @@ public class ClearCommand implements Command { @Override public void run() throws ExecutionException { - out.info("to confirm clearing, type 'clear' and press enter"); + if (!defaults) + out.info("to confirm clearing, type 'clear' and press enter"); try { if (defaults || ConsoleUtils.confirm("clear")) { clear(); diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java index 07d1dea3..677f5782 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java @@ -108,7 +108,7 @@ public class ImportCommand implements Command { // add article to filebase filebase.add(article); } catch (Exception e) { - throw new ImportException(e, article.getId()); + throw new ImportException(e, article.getId().toString()); } } @@ -165,7 +165,7 @@ public class ImportCommand implements Command { dbTopics.drop(); for (Topic topic : topics) { Topic newTopic = dbTopics.createSingle(topic); - topicIndexMap.put(Integer.toString(newTopic.getIndex()), newTopic.getId()); + topicIndexMap.put(Integer.toString(newTopic.getIndex()), newTopic.getId().toString()); } return topicIndexMap; diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java index a993eef4..379d5f25 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java +++ b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java @@ -125,19 +125,9 @@ public class ArticleResource { Article article = wrapper.getData(); Wrapper<Article> res = new Wrapper<>(); try { - long updated = service.updateSingle(article); - int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated; - switch (updatedInt) { - case 0: - res.addError(new APIError(Response.Status.NOT_FOUND, "Article not found", - String.format(Messages.NOT_FOUND, "article", id))); - return Response.status(Response.Status.NOT_FOUND).entity(res).build(); - case 1: - res.setData(article); - return Response.ok().entity(res).tag(res.tag()).build(); - default: - return Response.serverError().build(); - } + service.updateSingle(article); + res.setData(article); + return Response.ok().entity(res).tag(res.tag()).build(); } catch (DatabaseException e) { res = new Wrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated", "item could not be updated due to an internal server error")); diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java index ada35483..52b04d76 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java +++ b/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java @@ -81,19 +81,9 @@ public class TopicResource { Topic topic = wrapper.getData(); Wrapper<Topic> res = new Wrapper<>(); try { - long updated = service.updateSingle(topic); - int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated; - switch (updatedInt) { - case 0: - res.addError(new APIError(Response.Status.NOT_FOUND, "Topic not found", - String.format(Messages.NOT_FOUND, "topic", id))); - return Response.status(Response.Status.NOT_FOUND).entity(res).build(); - case 1: - res.setData(topic); - return Response.ok().entity(res).tag(res.tag()).build(); - default: - return Response.serverError().build(); - } + service.updateSingle(topic); + res.setData(topic); + return Response.ok().entity(res).tag(res.tag()).build(); } catch (DatabaseException e) { res = new Wrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated", "item could not be updated due to an internal server error")); diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java index 2c266b93..c09049ec 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java +++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java @@ -17,7 +17,7 @@ public class ArticleSerializer extends JsonSerializer<Article> { public void serialize(Article value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { gen.writeStartObject(); - gen.writeStringField("id", value.getId()); + gen.writeStringField("id", value.getId().toString()); gen.writeStringField("type", "article"); gen.writeObjectFieldStart("attributes"); diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java index 6d25b1ab..4b9c58cc 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java +++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java @@ -15,7 +15,7 @@ public class TopicSerializer extends JsonSerializer<Topic> { public void serialize(Topic value, JsonGenerator gen, SerializerProvider serializer) throws IOException, JsonProcessingException { gen.writeStartObject(); - gen.writeStringField("id", value.getId()); + gen.writeStringField("id", value.getId().toString()); gen.writeStringField("type", "topic"); gen.writeObjectFieldStart("attributes"); diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java b/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java index e071fa0b..fcbf6574 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java +++ b/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java @@ -3,7 +3,6 @@ package de.vipra.rest.service; import java.net.URI; import java.util.List; -import de.vipra.util.Constants; import de.vipra.util.Mongo; import de.vipra.util.model.Article; import de.vipra.util.service.DatabaseService; @@ -11,7 +10,7 @@ import de.vipra.util.service.DatabaseService; public class ArticleService extends DatabaseService<Article> { public ArticleService(Mongo mongo) { - super(mongo, Constants.Collection.ARTICLES, Article.class); + super(mongo, Article.class); } public List<Article> getMultiple(URI base, int skip, int limit, String sortBy) { diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java b/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java index f5067727..497bc690 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java +++ b/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java @@ -3,7 +3,6 @@ package de.vipra.rest.service; import java.net.URI; import java.util.List; -import de.vipra.util.Constants; import de.vipra.util.Mongo; import de.vipra.util.model.Topic; import de.vipra.util.service.DatabaseService; @@ -11,7 +10,7 @@ import de.vipra.util.service.DatabaseService; public class TopicService extends DatabaseService<Topic> { public TopicService(Mongo mongo) { - super(mongo, Constants.Collection.TOPICS, Topic.class); + super(mongo, Topic.class); } public List<Topic> getMultiple(URI base, int skip, int limit, String sortBy) { diff --git a/vipra-ui/app/adapters/application.js b/vipra-ui/app/adapters/application.js index 0d442b61..c14dc91b 100644 --- a/vipra-ui/app/adapters/application.js +++ b/vipra-ui/app/adapters/application.js @@ -1,7 +1,7 @@ import DS from 'ember-data'; export default DS.JSONAPIAdapter.extend({ - host: `http://${window.location.hostname}:8080`, + host: `http://${window.location.hostname}:8000`, namespace: 'vipra-rest', updateRecord(store, type, snapshot) { var data = {}; diff --git a/vipra-util/pom.xml b/vipra-util/pom.xml index 515e97df..daa885aa 100644 --- a/vipra-util/pom.xml +++ b/vipra-util/pom.xml @@ -44,6 +44,16 @@ <artifactId>mongodb-driver</artifactId> <version>3.2.0</version> </dependency> + <dependency> + <groupId>org.mongodb.morphia</groupId> + <artifactId>morphia</artifactId> + <version>1.0.1</version> + </dependency> + <dependency> + <groupId>org.mongodb.morphia</groupId> + <artifactId>morphia-logging-slf4j</artifactId> + <version>1.0.1</version> + </dependency> <!-- ElasticSearch Adapter --> <dependency> diff --git a/vipra-util/src/main/java/de/vipra/util/Mongo.java b/vipra-util/src/main/java/de/vipra/util/Mongo.java index 943f4383..c56f6a29 100644 --- a/vipra-util/src/main/java/de/vipra/util/Mongo.java +++ b/vipra-util/src/main/java/de/vipra/util/Mongo.java @@ -1,5 +1,9 @@ package de.vipra.util; +import org.mongodb.morphia.Datastore; +import org.mongodb.morphia.Morphia; +import org.mongodb.morphia.logging.MorphiaLoggerFactory; +import org.mongodb.morphia.logging.slf4j.SLF4JLoggerImplFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,10 +17,16 @@ public class Mongo { public static final Logger log = LoggerFactory.getLogger(Mongo.class); + static { + MorphiaLoggerFactory.registerLogger(SLF4JLoggerImplFactory.class); + } + private static Mongo instance; private final MongoClient client; private final MongoDatabase database; + private final Morphia morphia; + private final Datastore datastore; private Mongo(Config config) throws ConfigException { String host = config.getString(Key.DBHOST); @@ -30,6 +40,10 @@ public class Mongo { client = new MongoClient(host, port); database = client.getDatabase(databaseName); + + morphia = new Morphia(); + morphia.mapPackage("de.vipra.util.model"); + datastore = morphia.createDatastore(client, databaseName); } public MongoClient getClient() { @@ -40,6 +54,14 @@ public class Mongo { return database; } + public Morphia getMorphia() { + return morphia; + } + + public Datastore getDatastore() { + return datastore; + } + public static Mongo getInstance(Config config) throws ConfigException { if (instance == null) { instance = new Mongo(config); diff --git a/vipra-util/src/main/java/de/vipra/util/model/Article.java b/vipra-util/src/main/java/de/vipra/util/model/Article.java index 0c92154d..95c3264d 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/Article.java +++ b/vipra-util/src/main/java/de/vipra/util/model/Article.java @@ -4,19 +4,23 @@ import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; import java.util.List; -import org.bson.Document; +import org.bson.types.ObjectId; +import org.mongodb.morphia.annotations.Entity; +import org.mongodb.morphia.annotations.Id; import de.vipra.util.Constants; import de.vipra.util.FileUtils; import de.vipra.util.MongoUtils; import de.vipra.util.StringUtils; +@Entity("articles") public class Article extends Model { + @Id + private ObjectId id; private String title; private String text; private String url; @@ -25,6 +29,18 @@ public class Article extends Model { private ArticleStats stats; private List<TopicCount> topics; + public ObjectId getId() { + return id; + } + + public void setId(ObjectId id) { + this.id = id; + } + + public void setId(String id) { + this.id = MongoUtils.objectId(id); + } + public String getTitle() { return title; } @@ -88,44 +104,6 @@ public class Article extends Model { this.topics = topics; } - @Override - public Document toDocument() { - Document document = new Document(); - if (getId() != null) - document.put("_id", MongoUtils.objectId(getId())); - document.put("title", getTitle()); - document.put("text", getText()); - document.put("url", getUrl()); - document.put("date", getDate()); - if (getStats() != null) - document.put("stats", getStats().toDocument()); - if (getTopics() != null) { - List<Document> topicDocs = new ArrayList<>(topics.size()); - for (TopicCount tc : topics) - topicDocs.add(tc.toDocument()); - document.put("topics", topicDocs); - } - return document; - } - - @Override - public void fromDocument(Document document) { - setId(document.getObjectId("_id").toString()); - setTitle(document.getString("title")); - setText(document.getString("text")); - setUrl(document.getString("url")); - setDate(document.getDate("date")); - if (document.containsKey("stats")) - setStats(new ArticleStats((Document) document.get("stats"))); - if (document.containsKey("topics")) { - @SuppressWarnings("unchecked") - List<Document> topicDocs = (List<Document>) document.get("topics"); - topics = new ArrayList<>(topicDocs.size()); - for (Document doc : topicDocs) - topics.add(new TopicCount(doc)); - } - } - @Override public void fromFile(File file) throws IOException { List<String> lines = FileUtils.readFile(file); diff --git a/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java b/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java index fca89724..c120cf8d 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java +++ b/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java @@ -3,20 +3,16 @@ package de.vipra.util.model; import java.util.HashMap; import java.util.Map; -import org.bson.Document; +import org.mongodb.morphia.annotations.Embedded; -public class ArticleStats implements BsonDocument { +@Embedded +public class ArticleStats { private long wordCount; private long uniqueWordCount; + @Embedded private Map<String, TermFrequency> uniqueWords; - public ArticleStats() {} - - public ArticleStats(Document document) { - fromDocument(document); - } - public long getWordCount() { return wordCount; } @@ -72,33 +68,4 @@ public class ArticleStats implements BsonDocument { return stats; } - @Override - public Document toDocument() { - Document document = new Document(); - document.put("wordCount", getWordCount()); - document.put("uniqueWordCount", getUniqueWordCount()); - if (getUniqueWords() != null) { - Document uniqueWords = new Document(); - for (Map.Entry<String, TermFrequency> entry : getUniqueWords().entrySet()) { - uniqueWords.put(entry.getKey(), entry.getValue().toDocument()); - } - document.put("uniqueWords", uniqueWords); - } - return document; - } - - @Override - public void fromDocument(Document document) { - setWordCount(document.getLong("wordCount")); - setUniqueWordCount(document.getLong("uniqueWordCount")); - if (document.containsKey("uniqueWords")) { - Map<String, TermFrequency> uniqueWords = new HashMap<>(); - Document docUniqueWords = (Document) document.get("uniqueWords"); - for (Map.Entry<String, Object> entry : docUniqueWords.entrySet()) { - uniqueWords.put(entry.getKey(), new TermFrequency((Document) entry.getValue())); - } - setUniqueWords(uniqueWords); - } - } - } diff --git a/vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java b/vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java deleted file mode 100644 index 0a606205..00000000 --- a/vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.vipra.util.model; - -import org.bson.Document; - -public interface BsonDocument { - - Document toDocument(); - - void fromDocument(Document document); - -} diff --git a/vipra-util/src/main/java/de/vipra/util/model/Model.java b/vipra-util/src/main/java/de/vipra/util/model/Model.java index 6a628f62..666b7dc5 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/Model.java +++ b/vipra-util/src/main/java/de/vipra/util/model/Model.java @@ -6,31 +6,15 @@ import java.net.URI; import java.net.URISyntaxException; import org.apache.commons.io.FileUtils; -import org.bson.Document; +import org.bson.types.ObjectId; import de.vipra.util.Constants; -public abstract class Model implements BsonDocument { - - private String id; - - public Model() {} - - public Model(Document document) { - fromDocument(document); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } +public abstract class Model { public URI uri(URI base) { try { - return new URI(base.toString() + "/" + getId()); + return new URI(base.toString() + "/" + getId().toString()); } catch (URISyntaxException e) { return null; } @@ -40,9 +24,11 @@ public abstract class Model implements BsonDocument { FileUtils.writeStringToFile(file, toFileString(), Constants.FB_ENCODING, false); } - public abstract void fromDocument(Document document); - - public abstract Document toDocument(); + public abstract ObjectId getId(); + + public abstract void setId(ObjectId id); + + public abstract void setId(String id); public abstract void fromFile(File file) throws IOException; diff --git a/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java b/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java index 01382adb..adc0f061 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java @@ -1,18 +1,13 @@ package de.vipra.util.model; -import org.bson.Document; +import org.mongodb.morphia.annotations.Embedded; -public class TermFrequency implements BsonDocument { +@Embedded +public class TermFrequency { private long termFrequency = 0; private double normalizedTermFrequency = 0; - public TermFrequency() {} - - public TermFrequency(Document document) { - fromDocument(document); - } - public long getTermFrequency() { return termFrequency; } @@ -37,18 +32,4 @@ public class TermFrequency implements BsonDocument { setTermFrequency(getTermFrequency() + 1); } - @Override - public Document toDocument() { - Document document = new Document(); - document.put("termFrequency", getTermFrequency()); - document.put("normalizedTermFrequency", getNormalizedTermFrequency()); - return document; - } - - @Override - public void fromDocument(Document document) { - setTermFrequency(document.getLong("termFrequency")); - setNormalizedTermFrequency(document.getDouble("normalizedTermFrequency")); - } - } diff --git a/vipra-util/src/main/java/de/vipra/util/model/Topic.java b/vipra-util/src/main/java/de/vipra/util/model/Topic.java index a55aa98f..3891fc8a 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/Topic.java +++ b/vipra-util/src/main/java/de/vipra/util/model/Topic.java @@ -2,18 +2,24 @@ package de.vipra.util.model; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import org.bson.Document; +import org.bson.types.ObjectId; +import org.mongodb.morphia.annotations.Embedded; +import org.mongodb.morphia.annotations.Entity; +import org.mongodb.morphia.annotations.Id; import de.vipra.util.MongoUtils; import de.vipra.util.ex.NotImplementedException; +@Entity("topics") public class Topic extends Model { + @Id + private ObjectId id; private int index; private String name; + @Embedded private List<TopicWord> words; public Topic() {} @@ -22,6 +28,18 @@ public class Topic extends Model { this.words = words; } + public ObjectId getId() { + return id; + } + + public void setId(ObjectId id) { + this.id = id; + } + + public void setId(String id) { + this.id = MongoUtils.objectId(id); + } + public int getIndex() { return index; } @@ -46,38 +64,6 @@ public class Topic extends Model { this.words = words; } - @SuppressWarnings("unchecked") - @Override - public void fromDocument(Document document) { - setId(document.getObjectId("_id").toString()); - setName(document.getString("name")); - setIndex(document.getInteger("index", 0)); - if (document.containsKey("words")) { - List<Document> topicWords = (List<Document>) document.get("words"); - words = new ArrayList<>(topicWords.size()); - for (Document word : topicWords) { - words.add(new TopicWord(word)); - } - } - } - - @Override - public Document toDocument() { - Document document = new Document(); - if (getId() != null) - document.put("_id", MongoUtils.objectId(getId())); - document.append("name", getName()); - document.append("index", getIndex()); - if (getWords() != null) { - List<Document> topicWords = new ArrayList<>(words.size()); - for (TopicWord word : words) { - topicWords.add(word.toDocument()); - } - document.put("words", topicWords); - } - return document; - } - @Override public void fromFile(File file) throws IOException { throw new NotImplementedException(); diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java b/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java index 0debc175..18c0fb20 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java @@ -1,8 +1,9 @@ package de.vipra.util.model; -import org.bson.Document; +import org.mongodb.morphia.annotations.Embedded; -public class TopicCount implements BsonDocument, Comparable<TopicCount> { +@Embedded +public class TopicCount implements Comparable<TopicCount> { private String id; private int count; @@ -14,10 +15,6 @@ public class TopicCount implements BsonDocument, Comparable<TopicCount> { this.count = count; } - public TopicCount(Document document) { - fromDocument(document); - } - public String getId() { return id; } @@ -34,20 +31,6 @@ public class TopicCount implements BsonDocument, Comparable<TopicCount> { this.count = count; } - @Override - public Document toDocument() { - Document document = new Document(); - document.put("id", getId()); - document.append("count", count); - return document; - } - - @Override - public void fromDocument(Document document) { - this.id = document.getString("id"); - this.count = document.getInteger("count", 0); - } - @Override public int compareTo(TopicCount arg0) { return count - arg0.getCount(); diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java index 91e1bbf3..b5d61665 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java @@ -1,8 +1,9 @@ package de.vipra.util.model; -import org.bson.Document; +import org.mongodb.morphia.annotations.Embedded; -public class TopicWord implements BsonDocument { +@Embedded +public class TopicWord { private String word; private double likeliness; @@ -14,10 +15,6 @@ public class TopicWord implements BsonDocument { this.likeliness = likeliness; } - public TopicWord(Document document) { - fromDocument(document); - } - public String getWord() { return word; } @@ -34,18 +31,4 @@ public class TopicWord implements BsonDocument { this.likeliness = likeliness; } - @Override - public void fromDocument(Document document) { - this.word = document.getString("word"); - this.likeliness = document.getDouble("likeliness"); - } - - @Override - public Document toDocument() { - Document document = new Document(); - document.put("word", getWord()); - document.put("likeliness", getLikeliness()); - return document; - } - } diff --git a/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java b/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java index 54adc442..c5a4af26 100644 --- a/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java +++ b/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java @@ -1,120 +1,64 @@ package de.vipra.util.service; -import static de.vipra.util.MongoUtils.getSorts; -import static de.vipra.util.MongoUtils.objectId; - -import java.util.ArrayList; import java.util.List; -import org.bson.Document; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.Filters; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import org.mongodb.morphia.Datastore; import de.vipra.util.Config; import de.vipra.util.Constants; import de.vipra.util.Mongo; +import de.vipra.util.MongoUtils; import de.vipra.util.ex.ConfigException; import de.vipra.util.ex.DatabaseException; import de.vipra.util.model.Model; public class DatabaseService<T extends Model> implements Service<T, DatabaseException> { - private static final Logger log = LoggerFactory.getLogger(DatabaseService.class); - - private final MongoCollection<Document> collection; + private final Datastore datastore; private final Class<T> clazz; - public DatabaseService(Mongo mongo, Constants.Collection collection, Class<T> clazz) { - this.collection = mongo.getDatabase().getCollection(collection.name); + public DatabaseService(Mongo mongo, Class<T> clazz) { + this.datastore = mongo.getDatastore(); this.clazz = clazz; } - private T newT(Document document) { - try { - T t = clazz.newInstance(); - t.fromDocument(document); - return t; - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | SecurityException e) { - log.error(e.getMessage()); - return null; - } - } - @Override public T getSingle(String id) { - ArrayList<Document> result = collection.find(Filters.eq("_id", objectId(id))).into(new ArrayList<Document>()); - if (result.size() == 1) { - return newT(result.get(0)); - } else { - return null; - } + return datastore.get(clazz, MongoUtils.objectId(id)); } public List<T> getMultiple(int skip, int limit, String sortBy) { - List<Document> documents = collection.find().skip(skip).limit(limit).sort(getSorts(sortBy)) - .into(new ArrayList<Document>()); - List<T> items = new ArrayList<>(documents.size()); - - for (Document document : documents) { - items.add(newT(document)); - } - - return items; + return datastore.createQuery(clazz).offset(skip).limit(limit).order(sortBy).asList(); } @Override public T createSingle(T t) throws DatabaseException { - Document document = new Document(t.toDocument()); - try { - collection.insertOne(document); - } catch (Exception e) { - throw new DatabaseException(e); - } - t.fromDocument(document); + datastore.save(t); return t; } @Override public long deleteSingle(String id) throws DatabaseException { - try { - DeleteResult result = collection.deleteOne(Filters.eq("_id", objectId(id))); - return result.getDeletedCount(); - } catch (Exception e) { - throw new DatabaseException("could not delete database entry: " + e.getMessage()); - } + return datastore.delete(MongoUtils.objectId(id)).getN(); } @Override - public long updateSingle(T t) throws DatabaseException { - Document docOld = new Document("_id", objectId(t.getId())); - Document docNew = t.toDocument(); - UpdateResult result; - try { - result = collection.replaceOne(docOld, docNew); - } catch (Exception e) { - throw new DatabaseException(e); - } - t.fromDocument(docNew); - return result.getModifiedCount(); + public void updateSingle(T t) throws DatabaseException { + datastore.save(t); } public void drop() { - collection.drop(); + datastore.getCollection(clazz).drop(); } public long count() { - return collection.count(); + return datastore.getCount(clazz); } public static <T extends Model> DatabaseService<T> getDatabaseService(Config config, Constants.Collection collection, Class<T> clazz) throws ConfigException { Mongo mongo = Mongo.getInstance(config); - return new DatabaseService<T>(mongo, collection, clazz); + return new DatabaseService<T>(mongo, clazz); } } diff --git a/vipra-util/src/main/java/de/vipra/util/service/Service.java b/vipra-util/src/main/java/de/vipra/util/service/Service.java index a55b1aea..f3a4129c 100644 --- a/vipra-util/src/main/java/de/vipra/util/service/Service.java +++ b/vipra-util/src/main/java/de/vipra/util/service/Service.java @@ -10,7 +10,7 @@ public interface Service<T extends Model, E extends Exception> { long deleteSingle(String id) throws E; - long updateSingle(T t) throws E; + void updateSingle(T t) throws E; void drop(); -- GitLab