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

org.usergrid.standalone.cassandra.EmbeddedServerHelper Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright 2012 Apigee Corporation
 * 
 * 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 org.usergrid.standalone.cassandra;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import me.prettyprint.hector.testutils.EmbeddedSchemaLoader;

import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.commitlog.CommitLog;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.thrift.CassandraDaemon;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @author Ran Tavory ([email protected])
 * 
 */
public class EmbeddedServerHelper {
	private static Logger log = LoggerFactory
			.getLogger(EmbeddedServerHelper.class);

	private static final String TMP = "tmp";

	private final String yamlFile;
	static CassandraDaemon cassandraDaemon;

	public EmbeddedServerHelper() {
		this("/cassandra.yaml");
	}

	public EmbeddedServerHelper(String yamlFile) {
		this.yamlFile = yamlFile;
	}

	static ExecutorService executor;

	/**
	 * Set embedded cassandra up and spawn it in a new thread.
	 * 
	 * @throws TTransportException
	 * @throws IOException
	 * @throws InterruptedException
	 */
	public void setup() throws TTransportException, IOException,
			InterruptedException, ConfigurationException {

		// delete tmp dir first
		rmdir(TMP);
		// make a tmp dir and copy cassandra.yaml and log4j.properties to it
		copy("/log4j-server.properties", TMP);
		copy(yamlFile, TMP);

		System.setProperty("cassandra.config", "file:" + TMP + yamlFile);
		System.setProperty("log4j.configuration", "file:" + TMP
				+ "/log4j-server.properties");
		System.setProperty("cassandra-foreground", "true");

		cleanupAndLeaveDirs();
		loadSchemaFromYaml();
		// loadYamlTables();
	}

	public void start() throws TTransportException, IOException,
			InterruptedException, ConfigurationException {
        if ( executor == null ) {
            executor = Executors.newSingleThreadExecutor();
            System.setProperty("cassandra.config", "file:" + TMP + yamlFile);
            System.setProperty("log4j.configuration", "file:" + TMP
                    + "/log4j.properties");
            System.setProperty("cassandra-foreground", "true");

            log.info("Starting executor");

            executor.execute(new CassandraRunner());
            log.info("Started executor");
        } else {
            cassandraDaemon.startRPCServer();
        }


		try {
			TimeUnit.SECONDS.sleep(3);
			log.info("Done sleeping");
		} catch (InterruptedException e) {
			throw new AssertionError(e);
		}
	}

    public static void teardown() {
        if ( cassandraDaemon != null ) {
            cassandraDaemon.deactivate();
            StorageService.instance.stopClient();
        }
		executor.shutdown();
		executor.shutdownNow();
		log.info("Teardown complete");
	}

    public void stop() {
        cassandraDaemon.stopRPCServer();
    }

	private static void rmdir(String dir) throws IOException {
		File dirFile = new File(dir);
		if (dirFile.exists()) {
			FileUtils.deleteRecursive(new File(dir));
		}
	}

	/**
	 * Copies a resource from within the jar to a directory.
	 * 
	 * @param resource
	 * @param directory
	 * @throws IOException
	 */
	private static void copy(String resource, String directory)
			throws IOException {
		mkdir(directory);
		InputStream is = EmbeddedServerHelper.class
				.getResourceAsStream(resource);
		String fileName = resource.substring(resource.lastIndexOf("/") + 1);
		File file = new File(directory + System.getProperty("file.separator")
				+ fileName);
		OutputStream out = new FileOutputStream(file);
		byte buf[] = new byte[1024];
		int len;
		while ((len = is.read(buf)) > 0) {
			out.write(buf, 0, len);
		}
		out.close();
		is.close();
	}

	/**
	 * Creates a directory
	 * 
	 * @param dir
	 * @throws IOException
	 */
	private static void mkdir(String dir) throws IOException {
		FileUtils.createDirectory(dir);
	}

	public static void cleanupAndLeaveDirs() throws IOException {
		mkdirs();
		cleanup();
		mkdirs();
		CommitLog.instance.resetUnsafe(); // cleanup screws w/ CommitLog, this
											// brings it back to safe state
	}

	public static void cleanup() throws IOException {
		// clean up commitlog
		String[] directoryNames = { DatabaseDescriptor.getCommitLogLocation(), };
		for (String dirName : directoryNames) {
			File dir = new File(dirName);
			if (!dir.exists()) {
				throw new RuntimeException("No such directory: "
						+ dir.getAbsolutePath());
			}
			FileUtils.deleteRecursive(dir);
		}

		// clean up data directory which are stored as data directory/table/data
		// files
		for (String dirName : DatabaseDescriptor.getAllDataFileLocations()) {
			File dir = new File(dirName);
			if (!dir.exists()) {
				throw new RuntimeException("No such directory: "
						+ dir.getAbsolutePath());
			}
			FileUtils.deleteRecursive(dir);
		}
	}

	public static void mkdirs() {
		try {
			DatabaseDescriptor.createAllDirectories();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public static void loadSchemaFromYaml() {
		try {
			EmbeddedSchemaLoader.loadSchema();
		} catch (RuntimeException e) {

		}
	}

	class CassandraRunner implements Runnable {

		@Override
		public void run() {

			cassandraDaemon = new CassandraDaemon();

			cassandraDaemon.activate();

		}

	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy