diff --git a/vipra-cmd/.project b/vipra-cmd/.project index 3ac9cb904e07c158393db9e1b69cfe3cb80a2da6..e6b85466c1e3c9aa9198c926ed97d5b7c87344ed 100644 --- a/vipra-cmd/.project +++ b/vipra-cmd/.project @@ -33,11 +33,4 @@ <nature>org.eclipse.m2e.core.maven2Nature</nature> <nature>org.eclipse.wst.common.project.facet.core.nature</nature> </natures> - <linkedResources> - <link> - <name>src/main/resources/config.properties</name> - <type>1</type> - <locationURI>PARENT-1-PROJECT_LOC/vipra-config/config.properties</locationURI> - </link> - </linkedResources> </projectDescription> diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java b/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java index 6cfd7f0a2afe3be3f195cae357de7ae2260d4fb5..f7619cd020eba22fc17e06dcb716e58910b6cb19 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java @@ -2,6 +2,7 @@ package de.vipra.cmd; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; +import org.apache.commons.cli.OptionGroup; import org.apache.commons.cli.Options; public class CmdOptions extends Options { @@ -11,15 +12,24 @@ public class CmdOptions extends Options { public static final String OPT_HELP = "h"; public static final String OPT_HELP_LONG = "help"; public static final String OPT_IMPORT = "i"; + public static final String OPT_IMPORT_LONG = "import"; public static final String OPT_SHELL = "x"; + public static final String OPT_SHELL_LONG = "shell"; + public static final String OPT_DELETE = "d"; + public static final String OPT_DELETE_LONG = "delete"; public CmdOptions() { - addOption(Option.builder(OPT_HELP).longOpt("help").desc("print this message").build()); - addOption(Option.builder(OPT_SHELL).longOpt("shell").hasArg(true).argName("name") + addOption(Option.builder(OPT_HELP).longOpt(OPT_HELP_LONG).desc("print this message").build()); + addOption(Option.builder(OPT_SHELL).longOpt(OPT_SHELL_LONG).hasArg(true).argName("name") .desc("run from a shell script").build()); - addOption(Option.builder(OPT_IMPORT).longOpt("import").hasArgs().argName("files/dirs...") + + OptionGroup group = new OptionGroup(); + group.addOption(Option.builder(OPT_IMPORT).longOpt(OPT_IMPORT_LONG).hasArgs().argName("files/dirs...") .desc("import articles into the database").build()); + group.addOption(Option.builder(OPT_DELETE).longOpt(OPT_DELETE_LONG).hasArgs().argName("files/ids...") + .desc("delete articles from the database").build()); + addOptionGroup(group); } public void printHelp(String cmd) { 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 9ffcc8bfeb21dd0f39c2dd7a91f46cb21b017713..899ac92aa72c3b7fbfe6c17125c3d8a6b2f7f4b9 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java @@ -1,8 +1,6 @@ package de.vipra.cmd; -import static de.vipra.cmd.CmdOptions.OPT_HELP; -import static de.vipra.cmd.CmdOptions.OPT_IMPORT; -import static de.vipra.cmd.CmdOptions.OPT_SHELL; +import static de.vipra.cmd.CmdOptions.*; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -12,6 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.vipra.cmd.option.Command; +import de.vipra.cmd.option.DeleteCommand; import de.vipra.cmd.option.ImportCommand; public class Main { @@ -44,8 +43,9 @@ public class Main { if (cline.hasOption(OPT_HELP)) { options.printHelp(cmd); } else if (cline.hasOption(OPT_IMPORT)) { - String[] paths = cline.getOptionValues(OPT_IMPORT); - c = new ImportCommand(paths); + c = new ImportCommand(cline.getOptionValues(OPT_IMPORT)); + } else if (cline.hasOption(OPT_DELETE)) { + c = new DeleteCommand(cline.getOptionValues(OPT_DELETE)); } if (c != null) { diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/DeleteCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/DeleteCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..350d543c7afd7c96acbf4f79ca1364115d8b94c1 --- /dev/null +++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/DeleteCommand.java @@ -0,0 +1,72 @@ +package de.vipra.cmd.option; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import de.vipra.cmd.ExecutionException; +import de.vipra.cmd.model.Article; +import de.vipra.util.Config; +import de.vipra.util.ConfigException; +import de.vipra.util.Constants; +import de.vipra.util.service.DatabaseService; +import de.vipra.util.service.FilebaseService; + +public class DeleteCommand implements Command { + + public static final Logger log = LoggerFactory.getLogger(DeleteCommand.class); + public static final Logger out = LoggerFactory.getLogger("shellout"); + + private ArrayList<String> ids = new ArrayList<>(); + private Config config; + private DatabaseService<Article> dbArticles; + private FilebaseService<Article> fbArticles; + + public DeleteCommand(String[] strings) { + addIds(strings); + } + + private void addIds(String[] strings) { + for (String str : strings) { + if (str.contains(File.pathSeparator)) { + String[] parts = str.split(File.pathSeparator); + str = parts[parts.length - 1]; + } + ids.add(str); + } + } + + private void deleteEntry(String id) { + // 1. delete mongodb entry + // 2. delete file + // 3. delete elasticsearch index entry + } + + @Override + public void run() throws ExecutionException { + try { + config = new Config(); + dbArticles = config.getDatabaseService(Constants.Collection.ARTICLES, Article.class); + fbArticles = config.getFilebaseService(Article.class); + } catch (IOException | ConfigException e) { + throw new ExecutionException(e); + } + + List<Exception> ex = new ArrayList<>(); + for (String id : ids) { + try { + deleteEntry(id); + } catch (Exception e) { + ex.add(e); + } + } + if (ex.size() > 0) { + throw new ExecutionException(ex); + } + } + +} 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 807335a3bcba66192ceb872727cafd257467e269..572b2bbe1da81a5445d0a9096e7d595993610c7d 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 @@ -18,7 +18,6 @@ import de.vipra.cmd.model.Article; import de.vipra.util.Config; import de.vipra.util.ConfigException; import de.vipra.util.Constants; -import de.vipra.util.Mongo; import de.vipra.util.StringUtils; import de.vipra.util.ex.DatabaseException; import de.vipra.util.ex.FilebaseException; @@ -100,8 +99,6 @@ public class ImportCommand implements Command { } private void importArticle(JSONObject obj) throws FilebaseException, DatabaseException { - // 4. topic modeling - // 3. index article via elasticsearch, include topics out.info("importing \"" + StringUtils.ellipsize(obj.get("title").toString(), 80) + "\""); Article article = new Article(); article.fromJSON(obj); @@ -111,16 +108,17 @@ public class ImportCommand implements Command { // add article to filebase article = fbArticles.createSingle(article); + + // 3. index article via elasticsearch, include topics + // 4. topic modeling } @Override public void run() throws ExecutionException { try { config = new Config(); - File dataDir = null; - Mongo mongo = Mongo.getInstance(config); - dbArticles = new DatabaseService<Article>(mongo, Constants.Collection.ARTICLES, Article.class); - fbArticles = new FilebaseService<Article>(dataDir, Article.class); + dbArticles = config.getDatabaseService(Constants.Collection.ARTICLES, Article.class); + fbArticles = config.getFilebaseService(Article.class); } catch (IOException | ConfigException e) { throw new ExecutionException(e); } diff --git a/vipra-cmd/src/main/resources/config.properties b/vipra-cmd/src/main/resources/config.properties new file mode 100644 index 0000000000000000000000000000000000000000..ae859d297d92ab50c7cec64fba62b4fab4a3ab11 --- /dev/null +++ b/vipra-cmd/src/main/resources/config.properties @@ -0,0 +1,4 @@ +db.host=localhost +db.port=27017 +db.name=test +fb.path=/home/eike/.local/share/vipra \ No newline at end of file diff --git a/vipra-rest/.project b/vipra-rest/.project index 7641716f5406382c8b896bb6aa2c95959d062e07..e24244ea68a972f817781145661bc0723916096b 100644 --- a/vipra-rest/.project +++ b/vipra-rest/.project @@ -41,11 +41,4 @@ <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature> </natures> - <linkedResources> - <link> - <name>src/main/resources/config.properties</name> - <type>1</type> - <locationURI>PARENT-1-PROJECT_LOC/vipra-config/config.properties</locationURI> - </link> - </linkedResources> </projectDescription> diff --git a/vipra-rest/src/main/resources/config.properties b/vipra-rest/src/main/resources/config.properties new file mode 100644 index 0000000000000000000000000000000000000000..06623e215e66a3dfaefbdf3baabce5e5aeb14412 --- /dev/null +++ b/vipra-rest/src/main/resources/config.properties @@ -0,0 +1,5 @@ +db.host=localhost +db.port=27017 +db.name=test + +fb.path=${datadir}/vipra \ No newline at end of file diff --git a/vipra-util/.project b/vipra-util/.project index 97df63f9e9fce517725586539ba319c7ccfedbbd..3eb2ee19593ed7f5d6c146794b6965a00956e603 100644 --- a/vipra-util/.project +++ b/vipra-util/.project @@ -33,11 +33,4 @@ <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.wst.common.project.facet.core.nature</nature> </natures> - <linkedResources> - <link> - <name>src/main/resources/config.properties</name> - <type>1</type> - <locationURI>PARENT-1-PROJECT_LOC/vipra-config/config.properties</locationURI> - </link> - </linkedResources> </projectDescription> diff --git a/vipra-util/src/main/java/de/vipra/util/Config.java b/vipra-util/src/main/java/de/vipra/util/Config.java index f10013558603df1d99bcd1ad622071c508715bdc..b4b795b3bc93dfdb7db7407dbb21842f0a855f57 100644 --- a/vipra-util/src/main/java/de/vipra/util/Config.java +++ b/vipra-util/src/main/java/de/vipra/util/Config.java @@ -1,5 +1,6 @@ package de.vipra.util; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Properties; @@ -7,6 +8,10 @@ import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import de.vipra.util.model.Model; +import de.vipra.util.service.DatabaseService; +import de.vipra.util.service.FilebaseService; + public class Config { public static final Logger log = LoggerFactory.getLogger(Config.class); @@ -14,11 +19,18 @@ public class Config { private final Properties props = new Properties(); public Config() throws IOException, ConfigException { - this(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties")); - + InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(Constants.CONFIG_FILE); + if (is == null) { + is = Config.class.getResourceAsStream(Constants.CONFIG_FILE); + } + load(is); } public Config(InputStream is) throws IOException, ConfigException { + load(is); + } + + private void load(InputStream is) throws ConfigException, IOException { if (is == null) { log.error("config file input stream is null"); throw new ConfigException("config file input stream is null"); @@ -47,4 +59,24 @@ public class Config { } } + public File getDataDirectory() throws ConfigException { + File dataDir = new File(getString("fb.path")); + if (!dataDir.exists()) { + if (!dataDir.mkdirs()) { + throw new ConfigException("could not create data directory: " + dataDir.getAbsolutePath()); + } + } + return dataDir; + } + + public <T extends Model> DatabaseService<T> getDatabaseService(Constants.Collection collection, Class<T> clazz) + throws ConfigException { + Mongo mongo = Mongo.getInstance(this); + return new DatabaseService<T>(mongo, collection, clazz); + } + + public <T extends Model> FilebaseService<T> getFilebaseService(Class<T> clazz) throws ConfigException { + return new FilebaseService<T>(getDataDirectory(), clazz); + } + } diff --git a/vipra-util/src/main/java/de/vipra/util/Constants.java b/vipra-util/src/main/java/de/vipra/util/Constants.java index fe0679afe7d3a83013928e66324a931f6da31173..4146b9c2c7878ce182b35e55ed64d76730a73f18 100644 --- a/vipra-util/src/main/java/de/vipra/util/Constants.java +++ b/vipra-util/src/main/java/de/vipra/util/Constants.java @@ -7,6 +7,8 @@ public class Constants { public static final String FB_DIR = "vipra"; public static final Charset FB_ENCODING = StandardCharsets.UTF_8; + + public static final String CONFIG_FILE = "config.properties"; public static final String DEFAULT_HOST = "localhost"; public static final int DEFAULT_PORT = 27017; 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 0009ca6f50910d94f63903f86070b17861215656..264b7ab6e3cc52cc5ad805cd730d63c411f184bb 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 @@ -36,13 +36,9 @@ public abstract class Model { } } - public boolean writeToFile(File file) throws IOException { - if (file.exists()) { - String data = toFileString(); - FileUtils.writeStringToFile(file, data, Constants.FB_ENCODING, false); - return true; - } - return false; + public void writeToFile(File file) throws IOException { + String data = toFileString(); + FileUtils.writeStringToFile(file, data, Constants.FB_ENCODING, false); } public abstract String getType(); diff --git a/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java b/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java index e369e216cbc894636de0d51038d6a0aa1ea8d381..49c8ec34e1dc8a357a3917a58303f97f540442d5 100644 --- a/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java +++ b/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java @@ -54,6 +54,7 @@ public class FilebaseService<T extends Model> implements Service<T, FilebaseExce } try { t.writeToFile(file); + log.info("file created: " + file.getAbsolutePath()); } catch (IOException e) { throw new FilebaseException(e); } diff --git a/vipra-util/src/main/resources/config.properties b/vipra-util/src/main/resources/config.properties new file mode 100644 index 0000000000000000000000000000000000000000..06623e215e66a3dfaefbdf3baabce5e5aeb14412 --- /dev/null +++ b/vipra-util/src/main/resources/config.properties @@ -0,0 +1,5 @@ +db.host=localhost +db.port=27017 +db.name=test + +fb.path=${datadir}/vipra \ No newline at end of file