import org.apache.log4j.Category;

import java.io.*;

abstract class FSLockService {
    private static final Category s_logger = Category.getInstance(FSLockService.class.getName());
    private static FSLockService s_service;

    static {
        try{
            System.loadLibrary("fslock");
            s_logger.info("Using native implementation of FSLockService");
            s_service = new NativeLockService();
        }catch(UnsatisfiedLinkError err){
            s_logger.info("Using java implementation of FSLockService");
            s_service = new JavaLockService();
        }
    }

    /**
     *  Acquire a lock
     *
     *  @param p_lock File to use for locking
     */
    public abstract boolean acquireLock(String p_lock);


    /**
     *  Releases a lock
     *
     *  @param p_lock File to use for locking
     */
    public void releaseLock(String p_lock){
        new File(p_lock).delete();
    }

    /**
     *  Get an instance of lock service
     */
    public static FSLockService getService(){
        return s_service;
    }


    /**
     *  Native implementation of locking service
     */
    private static class NativeLockService extends FSLockService
    {
        public native boolean acquireLock(String p_lock);
    }


    /**
     *  Java implementation of locking service
     */
    private static class JavaLockService extends FSLockService
    {
        public boolean acquireLock(String p_lock){
            try{
                return new File(p_lock).createNewFile();
            }catch(IOException ex){
                ex.printStackTrace();
                return false;
            }
        }
    }
}
