package org.neo4j.smack.test.util; import java.io.IOException; import org.neo4j.smack.Neo4jServer; public class ServerHolder extends Thread { private static AssertionError allocation; private static Neo4jServer server; static synchronized Neo4jServer allocate() throws IOException { if ( allocation != null ) throw allocation; if ( server == null ) server = startServer(); allocation = new AssertionError( "The server was allocated from here but not released properly" ); return server; } static synchronized void release( Neo4jServer server ) { if ( server == null ) return; if ( server != ServerHolder.server ) throw new AssertionError( "trying to release a server not allocated from here" ); if ( allocation == null ) throw new AssertionError( "releasing the server although it is not allocated" ); allocation = null; } static synchronized void ensureNotRunning() { if ( allocation != null ) throw allocation; shutdown(); } private static Neo4jServer startServer() throws IOException { Neo4jServer server = ServerHelper.createServer(); server.start(); return server; } private static synchronized void shutdown() { allocation = null; try { if ( server != null ) server.stop(); } finally { server = null; } } @Override public void run() { shutdown(); } static { Runtime.getRuntime().addShutdownHook( new ServerHolder() ); } private ServerHolder() { super( ServerHolder.class.getName() ); } }