Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Filebase.java 2.41 KiB
package de.vipra.cmd.file;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import de.vipra.cmd.ex.FilebaseException;
import de.vipra.util.Config;
import de.vipra.util.Constants;
import de.vipra.util.ex.ConfigException;
import de.vipra.util.model.ArticleFull;

public abstract class Filebase implements Closeable {

	public static final Logger log = LogManager.getLogger(Filebase.class);

	private final String modelName;
	private final File modelDir;
	private final FilebaseIndex index;
	private final List<ArticleFull> articles;

	public Filebase(final File dataDir, final String modelName) throws FilebaseException {
		this.modelName = modelName;
		modelDir = new File(dataDir, modelName);
		if (!modelDir.exists()) {
			if (!modelDir.mkdirs()) {
				throw new FilebaseException("could not create model directory: " + modelDir.getAbsolutePath());
			}
		}
		try {
			index = new FilebaseIndex(modelDir);
		} catch (final IOException e) {
			throw new FilebaseException("could not read index: " + e.getMessage());
		}
		articles = new ArrayList<>(Constants.IMPORT_BUFFER_MAX);
	}

	public File getModelDir() {
		return modelDir;
	}

	public File getModelFile(final String fileName) {
		if (fileName != null)
			return new File(modelDir, fileName);
		return new File(modelDir, modelName);
	}

	public FilebaseIndex getIndex() {
		return index;
	}

	public List<ArticleFull> getArticles() {
		return articles;
	}

	@Override
	public synchronized void close() throws IOException {
		write(articles);
		index.close();
	}

	public void add(final ArticleFull article) throws FilebaseException {
		index.add(article.getId().toString());
		articles.add(article);
		if (articles.size() >= Constants.IMPORT_BUFFER_MAX) {
			try {
				log.info("buffer filled, writing filebase");
				write(articles);
				articles.clear();
			} catch (final IOException e) {
				throw new FilebaseException(e);
			}
		}
	}

	public abstract void write(List<ArticleFull> articles) throws IOException;

	public static Filebase getFilebase(final Config config) throws FilebaseException, ConfigException {
		final File dataDir = config.getDataDirectory();
		switch (Constants.ANALYZER) {
			case DTM:
				return new DTMFilebase(dataDir);
			case JGIBB:
				return new JGibbFilebase(dataDir);
			default:
				return null;
		}
	}

}