package net.mms_projects.copy_it; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ApplicationLock { private File lockFile; private ServerSocket server; private ServerThread thread; private boolean locked = false; private final Logger log = LoggerFactory.getLogger(this.getClass()); public ApplicationLock(File path) { this.lockFile = new File(path, ".lock"); } public void lock() throws LockException { log.info("Application locked"); if (this.isLocked()) { throw new LockException("The app is already locked"); } BufferedWriter writer = null; try { this.server = new ServerSocket(0); this.thread = new ServerThread(); this.thread.setDaemon(true); this.thread.start(); writer = new BufferedWriter(new FileWriter(this.lockFile)); writer.write(Integer.toString(this.server.getLocalPort())); } catch (IOException e) { throw new LockException(e); } finally { try { if (writer != null) { writer.close(); } } catch (IOException e) { } } this.locked = true; } public void unlock() { log.info("Application unlocked"); if (!this.isLocked()) { return; } this.lockFile.delete(); this.thread.interrupt(); try { this.server.close(); } catch (IOException e) { } this.locked = false; } public boolean isLocked() { return this.locked; } public boolean isRunning() { BufferedReader reader = null; Socket socket = null; try { if (!this.lockFile.exists()) { return false; } reader = new BufferedReader(new FileReader(this.lockFile)); String content = reader.readLine(); if (content == null) { return false; } SocketAddress sockaddr = new InetSocketAddress("127.0.0.1", Integer.parseInt(content)); socket = new Socket(); socket.connect(sockaddr, 100); if (socket.isConnected()) { return true; } } catch (FileNotFoundException e) { } catch (IOException e) { return false; } finally { try { if (reader != null) { reader.close(); } if (socket != null) { socket.close(); } } catch (IOException e) { } } return false; } public class LockException extends Exception { private static final long serialVersionUID = -1567053088980704966L; public LockException(String message) { super(message); } public LockException(Throwable clause) { super(clause); } } private class ServerThread extends Thread { @Override public void run() { log.info("Lock server thread running"); while (true) { if (this.isInterrupted()) { log.info("Lock server thread interrupted"); break; } try { if (!server.isClosed()) { server.accept(); } } catch (IOException e) { } } } } }