Java tutorial
//Copyright 2012 Joe McTee // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.jeklsoft.cassandraclient; import static org.apache.commons.io.FileUtils.copyFileToDirectory; import static org.apache.commons.io.FileUtils.deleteDirectory; import static org.apache.commons.io.FileUtils.forceMkdir; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.cassandra.cli.CliMain; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.service.EmbeddedCassandraService; public class EmbeddedCassandra { private String cassandraConfigDirPath = "/tmp"; private List<String> cassandraStartupCommands = new ArrayList<String>(); private boolean cleanCassandra = false; private String hostname = "localhost"; private int hostport = 9161; private File cassandraYaml = null; public static EmbeddedCassandraBuilder builder() { return new EmbeddedCassandraBuilder(); } public static class EmbeddedCassandraBuilder { private final EmbeddedCassandra instance = new EmbeddedCassandra(); public EmbeddedCassandraBuilder withCleanDataStore() { instance.setCleanCassandra(true); return this; } public EmbeddedCassandraBuilder withStartupCommands(List<String> cassandraCommands) { instance.setCassandraStartupCommands(cassandraCommands); return this; } public EmbeddedCassandraBuilder withHostname(String hostname) { instance.setHostname(hostname); return this; } public EmbeddedCassandraBuilder withHostport(int port) { instance.setHostport(port); return this; } public EmbeddedCassandraBuilder withCassandaConfigurationDirectoryPath(String path) { instance.setCassandraConfigDirPath(path); return this; } public EmbeddedCassandraBuilder withCassandaYamlFile(File cassandraYaml) { instance.setCassandraYamlFile(cassandraYaml); return this; } public EmbeddedCassandra build() { try { instance.init(); return instance; } catch (IOException e) { throw new RuntimeException("Error building embedded Cassandra instance", e); } } } private EmbeddedCassandra() { } private void init() throws IOException { setupStorageConfigPath(); if (cleanCassandra) { clean(); } EmbeddedCassandraService cassandra = new EmbeddedCassandraService(); cassandra.start(); if (cassandraStartupCommands != null) { executeCommands(); } } private void setupStorageConfigPath() throws IOException { if (cassandraConfigDirPath != null) { File configFile = new File(cassandraConfigDirPath); String configFileName = "file:" + configFile.getPath() + "/cassandra.yaml"; System.setProperty("cassandra.config", configFileName); } else { throw new IOException("CassandraConfigDirPath is not configured, bailing."); } } private void setCassandraConfigDirPath(String cassandraConfigDirPath) { this.cassandraConfigDirPath = cassandraConfigDirPath; } private void setHostname(String hostname) { this.hostname = hostname; } private void setHostport(int hostport) { this.hostport = hostport; } private void setCassandraStartupCommands(List<String> cassandraCommands) { cassandraStartupCommands = cassandraCommands; } private void setCleanCassandra(Boolean cleanCassandra) { this.cleanCassandra = cleanCassandra; } private void setCassandraYamlFile(File cassandraYaml) { this.cassandraYaml = cassandraYaml; } private void executeCommands() { CliMain.connect(hostname, hostport); for (String command : cassandraStartupCommands) { try { CliMain.processStatement(command); } catch (Exception e) { e.printStackTrace(); } } CliMain.disconnect(); } private void clean() throws IOException { cleanupDataDirectories(); initializeCassandraYaml(); makeDirsIfNotExist(); } private void cleanupDataDirectories() throws IOException { deleteDirectory(new File(cassandraConfigDirPath)); } private void initializeCassandraYaml() throws IOException { if (cassandraYaml != null) { copyFileToDirectory(cassandraYaml, new File(cassandraConfigDirPath)); } } private void makeDirsIfNotExist() throws IOException { for (String s : Arrays.asList(DatabaseDescriptor.getAllDataFileLocations())) { forceMkdir(new File(s)); } forceMkdir(new File(DatabaseDescriptor.getCommitLogLocation())); } }