All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.permazen.kv.xodus.XodusKVImplementation Maven / Gradle / Ivy


/*
 * Copyright (C) 2015 Archie L. Cobbs. All rights reserved.
 */

package io.permazen.kv.xodus;

import com.google.common.base.Preconditions;

import io.permazen.kv.KVDatabase;
import io.permazen.kv.KVImplementation;
import io.permazen.kv.mvcc.AtomicKVStore;

import java.io.File;

import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;

public class XodusKVImplementation implements KVImplementation {

    private OptionSpec directoryOption;
    private OptionSpec storeNameOption;

    @Override
    public void addOptions(OptionParser parser) {
        Preconditions.checkArgument(parser != null, "null parser");
        Preconditions.checkState(this.directoryOption == null, "duplicate option");
        Preconditions.checkState(this.storeNameOption == null, "duplicate option");
        this.directoryOption = parser.accepts("xodus", "Use Xodus key/value database in the specified directory")
          .withRequiredArg()
          .describedAs("directory")
          .ofType(File.class);
        this.storeNameOption = parser.accepts("xodus-store",
            String.format("Specify Xodus store name (default \"%s\")", XodusKVDatabase.DEFAULT_STORE_NAME))
          .availableIf(this.directoryOption)
          .withRequiredArg()
          .describedAs("store-name");
    }

    @Override
    public Config buildConfig(OptionSet options) {
        final File dir = options.valueOf(this.directoryOption);
        if (dir == null)
            return null;
        if (dir.exists() && !dir.isDirectory())
            throw new IllegalArgumentException(String.format("file \"%s\" is not a directory", dir));
        final Config config = new Config(dir);
        config.setStoreName(options.valueOf(this.storeNameOption));
        return config;
    }

    @Override
    public boolean providesKVDatabase(Config config) {
        return true;
    }

    @Override
    public XodusKVDatabase createKVDatabase(Config config, KVDatabase ignored, AtomicKVStore kvstore) {
        final XodusKVDatabase kvdb = new XodusKVDatabase();
        config.configure(kvdb);
        return kvdb;
    }

    @Override
    public String getDescription(Config config) {
        return "Xodus " + config.getDirectory().getName();
    }

// Options

    public static class Config {

        private File directory;
        private String storeName;

        public Config(File directory) {
            Preconditions.checkArgument(directory != null, "null directory");
            this.directory = directory;
        }

        public File getDirectory() {
            return this.directory;
        }

        public String getStoreName() {
            return this.storeName;
        }
        public void setStoreName(String storeName) {
            this.storeName = storeName;
        }

        public void configure(XodusKVDatabase kvdb) {
            kvdb.setDirectory(this.directory);
            if (this.storeName != null)
                kvdb.setStoreName(this.storeName);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy