/*-
 * ~~~~~~licensing~~~~~~
 * core-support-runtime
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
package ru.entaxy.platform.core.support.runtime.cluster;

import java.util.concurrent.TimeUnit;

import org.apache.camel.support.cluster.AbstractCamelClusterService;
import org.jgroups.blocks.locking.LockService;

import ru.entaxy.platform.core.support.runtime.service.ServiceHolder;

public class JGroupsLockClusterService extends AbstractCamelClusterService<JGroupsLockClusterView> {

    private LockService lockService;
    private long acquireLockDelay = 1;
    private TimeUnit acquireLockDelayUnit = TimeUnit.SECONDS;
    
    public JGroupsLockClusterService(ServiceHolder<LockService> lockService) throws Exception {
        this.lockService = lockService.getService();
    }

    @Override
    protected JGroupsLockClusterView createView(String namespace) throws Exception {
        return new JGroupsLockClusterView(this, namespace);
    }
	
	public LockService getLockService() throws Exception {
		return lockService;
	}
	
	public void setLockService(LockService lockService) {
		this.lockService = lockService;
	}
    
    public long getAcquireLockDelay() {
        return acquireLockDelay;
    }

    /**
     * The time to wait before starting to try to acquire lock, default 1.
     */
    public void setAcquireLockDelay(long acquireLockDelay) {
        this.acquireLockDelay = acquireLockDelay;
    }

    public void setAcquireLockDelay(long pollDelay, TimeUnit pollDelayUnit) {
        setAcquireLockDelay(pollDelay);
        setAcquireLockDelayUnit(pollDelayUnit);
    }

    public TimeUnit getAcquireLockDelayUnit() {
        return acquireLockDelayUnit;
    }

    /**
     * The time unit of the acquireLockDelay, default to TimeUnit.SECONDS.
     */
    public void setAcquireLockDelayUnit(TimeUnit acquireLockDelayUnit) {
        this.acquireLockDelayUnit = acquireLockDelayUnit;
    }
}
