/* * #%L * ===================================================== * _____ _ ____ _ _ _ _ * |_ _|_ __ _ _ ___| |_ / __ \| | | | ___ | | | | * | | | '__| | | / __| __|/ / _` | |_| |/ __|| |_| | * | | | | | |_| \__ \ |_| | (_| | _ |\__ \| _ | * |_| |_| \__,_|___/\__|\ \__,_|_| |_||___/|_| |_| * \____/ * * ===================================================== * * Hochschule Hannover * (University of Applied Sciences and Arts, Hannover) * Faculty IV, Dept. of Computer Science * Ricklinger Stadtweg 118, 30459 Hannover, Germany * * Email: trust@f4-i.fh-hannover.de * Website: http://trust.f4.hs-hannover.de/ * * This file is part of visitmeta-dataservice, version 0.6.0, * implemented by the Trust@HsH research group at the Hochschule Hannover. * %% * Copyright (C) 2012 - 2016 Trust@HsH * %% * 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. * #L% */ package de.hshannover.f4.trust.visitmeta.persistence.neo4j; import static de.hshannover.f4.trust.visitmeta.persistence.neo4j.Neo4JPropertyConstants.KEY_HASH; import java.io.File; import java.io.IOException; import org.apache.log4j.Logger; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.factory.GraphDatabaseFactory; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.kernel.impl.util.FileUtils; /** * Connection handling for Neo4J database. * * @author rosso * */ public class Neo4JConnection { private String mDbPath; private GraphDatabaseService mGraphDb; private Neo4JTimestampManager mTimestampManager; private static final Logger log = Logger.getLogger(Neo4JConnection.class); /** * Establish a connection to the database. * @param dbPath Path to the Neo4J database. */ public Neo4JConnection(String dbPath) { this(); mDbPath = dbPath; mGraphDb = new GraphDatabaseFactory(). newEmbeddedDatabaseBuilder(mDbPath). setConfig( GraphDatabaseSettings.node_keys_indexable, KEY_HASH ). setConfig( GraphDatabaseSettings.node_auto_indexing, "true" ). newGraphDatabase(); registerShutdownHook(mGraphDb); log.trace("... new Neo4JConnection() OK"); } private Neo4JConnection() { log.trace("new Neo4JConnection() ..."); mTimestampManager = new Neo4JTimestampManager(this); } public GraphDatabaseService getConnection() { return mGraphDb; } public Neo4JTimestampManager getTimestampManager() { return mTimestampManager; } /** * Clears all data in the DB and reconnects to it afterwards. */ public void ClearDatabase(){ // Shutdown database before erasing it log.debug("Shutting down the database"); mGraphDb.shutdown(); try { log.debug("Erasing the database files"); FileUtils.deleteRecursively( new File( mDbPath ) ); } catch ( IOException e ) { throw new RuntimeException( e ); } // Restart database log.debug("Reconnecting to database"); mGraphDb = new GraphDatabaseFactory(). newEmbeddedDatabaseBuilder(mDbPath). setConfig( GraphDatabaseSettings.node_keys_indexable, KEY_HASH ). setConfig( GraphDatabaseSettings.node_auto_indexing, "true" ). newGraphDatabase(); registerShutdownHook(mGraphDb); } private void registerShutdownHook( final GraphDatabaseService graphDb ) { // Shutdown the server if closed unexpectedly Runtime.getRuntime().addShutdownHook( new Thread() { @Override public void run() { log.error("Database was forced to shut down"); graphDb.shutdown(); } } ); } }