diff --git a/vipra-cmd/pom.xml b/vipra-cmd/pom.xml index 591333397e2de67d754d220ad6bf14da9457ca98..e6d8ba395abdb86d4d2fa41371e6a7415326e90c 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 21ff41afd34c739464a2235d3ea1993d09a82e29..946eb6b9d5d57dacbdfde5c51a1186fbe3766805 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 5f05e98a856994ebd3015753e67beb5af51f4d33..f23a3d2b1e3d8ba401c8a600c5ae179d47bc4714 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 1195e0990a3d417c34af4841f02b17d2ad955335..1676bbdb979653c6085b8ced6fe6a03c2b10f833 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 7edcca04e1c916a2c207c52b84957cf38546af64..4c0bc3ca1e25af40c38e0b5b84defbaa3a48d067 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 9f8ac68ac6cf5249e19b01c2ca6393237daa91b5..2cfbafd675dc7af7bbf097f59d7e38aeff23cd2e 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 07d1dea32963cc1e64dea6910b503a3fc984716a..677f5782f1f8a5a2351d56095bb55b75e99aeae6 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 a993eef4839af59d6460fb496b2ecbc2695bd8db..379d5f253b2609021ab5ab1dddda526311eed1e0 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 ada3548380e8d43197d8aa57cb6b930bf5f45643..52b04d76f5483fbb042ad0c5ae09d5a9c3db50da 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 2c266b9354837bcd5285c41e6127a0d1a16e2a22..c09049ec12c3952c03abcbf102d92a48de13bc80 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 6d25b1ab1acd2183d9d7f380c6f91927c9efb05c..4b9c58cc4649aa2a4d0ca558e8dcb4ecc5335c75 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 e071fa0b69a7965faf796a06433b86ef72217ad0..fcbf65746d181c2f76e730ba17eb98f29b057625 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 f50677279cb79362f0bd6c2ccf20f1c4a8d16143..497bc6903e4afba0f3e93e27ee3878f609276b7e 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 0d442b61c170d4fa40db3aae849cc2e0cc783dc3..c14dc91b50c796761e9b28c764ce301880937f35 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 515e97df12b1b03388212b06d14bb94a8b53ad4b..daa885aaab75647786c334887bb428eb86a6db3c 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 943f4383634dd01815161f64761f94d877b1e062..c56f6a2998d067460525ea0b6b37bb057cbbc615 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 0c92154dcc743a885777732e46cc0ad419008932..95c3264defc6dc5789b70b42b0d62128e873cf8d 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 fca89724ff36297f31d18c1b7928d224d979d1c3..c120cf8d55b13b000d10b1879ebb3f02e8ca1939 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 0a606205b442c1df26e2551c5ce37fc06004a68f..0000000000000000000000000000000000000000 --- 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 6a628f6253bc8db22157d283580fd80ae5202a9f..666b7dc5e76314a7444bbdd2d890570771cab803 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 01382adbb45dcf8c903b41425b0f3ddf1a83472f..adc0f061703b734a4597734abee4849bd66a8c98 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 a55aa98feca3284f1843d03c627fb430fba5d0ba..3891fc8a45f409604555ee3895175bd2d3961548 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 0debc17548004dc659c1ba11317c2aa02b77e761..18c0fb204db0c7a59b556df6e8b9f1479a086c30 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 91e1bbf310458cda248eaaf8724fd10ec0ea30b9..b5d61665083eb32a458e3acbc69ec27134f49319 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 54adc442d6c6c3f6d2582473110ffc269ba81331..c5a4af26939f2a8bf857a163137d98b929035e20 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 a55b1aea721109f0f3dd141a266df08954a6f10e..f3a4129c8edbdf46a58e888b79831efdaa2e0da2 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();