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 org.apache.commons.jcs3.auxiliary.AbstractAuxiliaryCacheAttributes;
import org.apache.commons.jcs3.auxiliary.remote.behavior.ICommonRemoteCacheAttributes;
import org.apache.commons.jcs3.auxiliary.remote.behavior.IRemoteCacheConstants;
import org.apache.commons.jcs3.auxiliary.remote.server.behavior.RemoteType;

/**
 * Attributes common to remote cache client and server.
 */
public class CommonRemoteCacheAttributes
    extends AbstractAuxiliaryCacheAttributes
    implements ICommonRemoteCacheAttributes
{
    /** Don't change */
    private static final long serialVersionUID = -1555143736942374000L;

    /** The service name */
    private String remoteServiceName = IRemoteCacheConstants.REMOTE_CACHE_SERVICE_VAL;

    /** server host and port */
    private RemoteLocation location;

    /** Cluster chain */
    private String clusterServers = "";

    /** THe type of remote cache, local or cluster */
    private RemoteType remoteType = RemoteType.LOCAL;

    /** Should we issue a local remove if we get a put from a remote server */
    private boolean removeUponRemotePut = true;

    /** Can we receive from or put to the remote. this probably shouldn't be used. Use receive. */
    private boolean getOnly = false;

    /** Should we put and get from the clusters. */
    private boolean localClusterConsistency = false;

    /** read and connect timeout */
    private int rmiSocketFactoryTimeoutMillis = DEFAULT_RMI_SOCKET_FACTORY_TIMEOUT_MILLIS;

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

    /**
     * Gets the remoteTypeName attribute of the RemoteCacheAttributes object.
     * <p>
     * @return The remoteTypeName value
     */
    @Override
    public String getRemoteTypeName()
    {
        return remoteType != null ? remoteType.toString() : RemoteType.LOCAL.toString();
    }

    /**
     * Sets the remoteTypeName attribute of the RemoteCacheAttributes object.
     * <p>
     * @param s The new remoteTypeName value
     */
    @Override
    public void setRemoteTypeName( String s )
    {
        RemoteType rt = RemoteType.valueOf(s);
        if (rt != null)
        {
            this.remoteType = rt;
        }
    }

    /**
     * Gets the remoteType attribute of the RemoteCacheAttributes object.
     * <p>
     * @return The remoteType value
     */
    @Override
    public RemoteType getRemoteType()
    {
        return remoteType;
    }

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

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

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

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

    /**
     * Sets the location attribute of the RemoteCacheAttributes object.
     * <p>
     * @param host The new remoteHost value
     * @param port The new remotePort value
     */
    @Override
    public void setRemoteLocation( String host, int port )
    {
        this.location = new RemoteLocation(host, port);
    }

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

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

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

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

    /**
     * Sets the removeUponRemotePut attribute of the RemoteCacheAttributes object.
     * <p>
     * @param r The new removeUponRemotePut value
     */
    @Override
    public void setRemoveUponRemotePut( boolean r )
    {
        this.removeUponRemotePut = r;
    }

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

    /**
     * Sets the getOnly attribute of the RemoteCacheAttributes object
     * @param r The new getOnly value
     */
    @Override
    public void setGetOnly( boolean r )
    {
        this.getOnly = r;
    }

    /**
     * Should cluster updates be propagated to the locals.
     * <p>
     * @return The localClusterConsistency value
     */
    @Override
    public boolean isLocalClusterConsistency()
    {
        return localClusterConsistency;
    }

    /**
     * Should cluster updates be propagated to the locals.
     * <p>
     * @param r The new localClusterConsistency value
     */
    @Override
    public void setLocalClusterConsistency( boolean r )
    {
        this.localClusterConsistency = r;
    }

    /**
     * @param rmiSocketFactoryTimeoutMillis The rmiSocketFactoryTimeoutMillis to set.
     */
    @Override
    public void setRmiSocketFactoryTimeoutMillis( int rmiSocketFactoryTimeoutMillis )
    {
        this.rmiSocketFactoryTimeoutMillis = rmiSocketFactoryTimeoutMillis;
    }

    /**
     * @return Returns the rmiSocketFactoryTimeoutMillis.
     */
    @Override
    public int getRmiSocketFactoryTimeoutMillis()
    {
        return rmiSocketFactoryTimeoutMillis;
    }

    /**
     * @return String, all the important values that can be configured
     */
    @Override
    public String toString()
    {
        StringBuilder buf = new StringBuilder();
        buf.append( "\n RemoteCacheAttributes " );
        if (this.location != null)
        {
            buf.append( "\n remoteHost = [" + this.location.getHost() + "]" );
            buf.append( "\n remotePort = [" + this.location.getPort() + "]" );
        }
        buf.append( "\n cacheName = [" + getCacheName() + "]" );
        buf.append( "\n remoteType = [" + remoteType + "]" );
        buf.append( "\n removeUponRemotePut = [" + this.removeUponRemotePut + "]" );
        buf.append( "\n getOnly = [" + getOnly + "]" );
        return buf.toString();
    }
}
