package org.apache.commons.jcs3.auxiliary.remote;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.List;

import org.apache.commons.jcs3.auxiliary.remote.behavior.IRemoteCacheAttributes;

/**
 * These objects are used to configure the remote cache client.
 */
public class RemoteCacheAttributes
    extends CommonRemoteCacheAttributes
    implements IRemoteCacheAttributes
{
    /** Don't change */
    private static final long serialVersionUID = -1555143736942374000L;

    /**
     * Failover servers will be used by local caches one at a time. Listeners will be registered
     * with all cluster servers. If we add a get from cluster attribute we will have the ability to
     * chain clusters and have them get from each other.
     */
    private String failoverServers = "";

    /** callback */
    private int localPort = 0;

    /** what failover server we are connected to. */
    private int failoverIndex = 0;

    /** List of failover server addresses */
    private List<RemoteLocation> failovers;

    /** default name is remote_cache_client */
    private String threadPoolName = "remote_cache_client";

    /** must be greater than 0 for a pool to be used. */
    private int getTimeoutMillis = -1;

    /**
     * Can we receive from the server. You might have a 0 local store and keep everything on the
     * remote. If so, you don't want to be notified of updates.
     */
    private boolean receive = DEFAULT_RECEIVE;

    /** If the primary fails, we will queue items before reconnect.  This limits the number of items that can be queued. */
    private int zombieQueueMaxSize = DEFAULT_ZOMBIE_QUEUE_MAX_SIZE;

    /** Default constructor for the RemoteCacheAttributes object */
    public RemoteCacheAttributes()
    {
    }

    /**
     * Gets the failoverIndex attribute of the RemoteCacheAttributes object.
     * <p>
     * @return The failoverIndex value
     */
    @Override
    public int getFailoverIndex()
    {
        return failoverIndex;
    }

    /**
     * Sets the failoverIndex attribute of the RemoteCacheAttributes object.
     * <p>
     * @param p The new failoverIndex value
     */
    @Override
    public void setFailoverIndex( int p )
    {
        this.failoverIndex = p;
    }

    /**
     * Gets the failovers attribute of the RemoteCacheAttributes object.
     * <p>
     * @return The failovers value
     */
    @Override
    public List<RemoteLocation> getFailovers()
    {
        return this.failovers;
    }

    /**
     * Sets the failovers attribute of the RemoteCacheAttributes object.
     * <p>
     * @param failovers The new failovers value
     */
    @Override
    public void setFailovers( List<RemoteLocation> failovers )
    {
        this.failovers = failovers;
    }

    /**
     * Gets the failoverServers attribute of the RemoteCacheAttributes object.
     * <p>
     * @return The failoverServers value
     */
    @Override
    public String getFailoverServers()
    {
        return this.failoverServers;
    }

    /**
     * Sets the failoverServers attribute of the RemoteCacheAttributes object.
     * <p>
     * @param s The new failoverServers value
     */
    @Override
    public void setFailoverServers( String s )
    {
        this.failoverServers = s;
    }

    /**
     * Gets the localPort attribute of the RemoteCacheAttributes object.
     * <p>
     * @return The localPort value
     */
    @Override
    public int getLocalPort()
    {
        return this.localPort;
    }

    /**
     * Sets the localPort attribute of the RemoteCacheAttributes object
     * @param p The new localPort value
     */
    @Override
    public void setLocalPort( int p )
    {
        this.localPort = p;
    }

    /**
     * @return the name of the pool
     */
    @Override
    public String getThreadPoolName()
    {
        return threadPoolName;
    }

    /**
     * @param name
     */
    @Override
    public void setThreadPoolName( String name )
    {
        threadPoolName = name;
    }

    /**
     * @return getTimeoutMillis
     */
    @Override
    public int getGetTimeoutMillis()
    {
        return getTimeoutMillis;
    }

    /**
     * @param millis
     */
    @Override
    public void setGetTimeoutMillis( int millis )
    {
        getTimeoutMillis = millis;
    }

    /**
     * By default this option is true. If you set it to false, you will not receive updates or
     * removes from the remote server.
     * <p>
     * @param receive
     */
    @Override
    public void setReceive( boolean receive )
    {
        this.receive = receive;
    }

    /**
     * If RECEIVE is false then the remote cache will not register a listener with the remote
     * server. This allows you to configure a remote server as a repository from which you can get
     * and to which you put, but from which you do not receive any notifications. That is, you will
     * not receive updates or removes.
     * <p>
     * If you set this option to false, you should set your local memory size to 0.
     * <p>
     * The remote cache manager uses this value to decide whether or not to register a listener.
     * @return the receive value.
     */
    @Override
    public boolean isReceive()
    {
        return this.receive;
    }

    /**
     * The number of elements the zombie queue will hold. This queue is used to store events if we
     * loose our connection with the server.
     * <p>
     * @param zombieQueueMaxSize The zombieQueueMaxSize to set.
     */
    @Override
    public void setZombieQueueMaxSize( int zombieQueueMaxSize )
    {
        this.zombieQueueMaxSize = zombieQueueMaxSize;
    }

    /**
     * The number of elements the zombie queue will hold. This queue is used to store events if we
     * loose our connection with the server.
     * <p>
     * @return Returns the zombieQueueMaxSize.
     */
    @Override
    public int getZombieQueueMaxSize()
    {
        return zombieQueueMaxSize;
    }

    /**
     * @return String, all the important values that can be configured
     */
    @Override
    public String toString()
    {
        StringBuilder buf = new StringBuilder(super.toString());
        buf.append( "\n receive = [" + isReceive() + "]" );
        buf.append( "\n getTimeoutMillis = [" + getGetTimeoutMillis() + "]" );
        buf.append( "\n threadPoolName = [" + getThreadPoolName() + "]" );
        buf.append( "\n localClusterConsistency = [" + isLocalClusterConsistency() + "]" );
        buf.append( "\n zombieQueueMaxSize = [" + getZombieQueueMaxSize() + "]" );
        return buf.toString();
    }
}
