/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package servidor.utiles;

import java.io.*;
import java.nio.channels.*;

public class InstanciaUnica {

   public InstanciaUnica(String appName) {
      this.appName = appName;
   }
   private final String appName;
   private File file;
   private FileChannel channel;
   private FileLock lock;

   public boolean isAppActive() {
      try {
         file = new File(System.getProperty("user.home"), appName + ".lock");
         channel = new RandomAccessFile(file, "rw").getChannel();

         try {
            lock = channel.tryLock();
         } catch (OverlappingFileLockException e) {
            closeLock();
            return true;
         }
         if (lock == null) {
            closeLock();
            return true;
         }
         // Destruir el bloque al cerrar la máquina virtual
         Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
               closeLock();
               deleteFile();
            }
         });
         return false;
      } catch (Exception e) {
         closeLock();
         return true;
      }
   }

   private void closeLock() {
      try {
         lock.release();
      } catch (Exception e) {}
      try {
         channel.close();
      } catch (Exception e) {}
   }

   private void deleteFile() {
      try {
         file.delete();
      } catch (Exception e) {}
   }
}

