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

/*
 * 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.AuxiliaryCacheAttributes;
import org.apache.commons.jcs3.auxiliary.remote.RemoteLocation;
import org.apache.commons.jcs3.auxiliary.remote.server.behavior.RemoteType;

/**
 * This specifies what a remote cache configuration object should look like.
 */
public interface ICommonRemoteCacheAttributes
    extends AuxiliaryCacheAttributes
{
    /** The default timeout for the custom RMI socket factory */
    int DEFAULT_RMI_SOCKET_FACTORY_TIMEOUT_MILLIS = 10000;

    /**
     * Gets the remoteTypeName attribute of the IRemoteCacheAttributes object
     * <p>
     * @return The remoteTypeName value
     */
    String getRemoteTypeName();

    /**
     * Sets the remoteTypeName attribute of the IRemoteCacheAttributes object
     * <p>
     * @param s The new remoteTypeName value
     */
    void setRemoteTypeName( String s );

    /**
     * Gets the remoteType attribute of the IRemoteCacheAttributes object
     * <p>
     * @return The remoteType value
     */
    RemoteType getRemoteType();

    /**
     * Sets the remoteType attribute of the IRemoteCacheAttributes object
     * <p>
     * @param p The new remoteType value
     */
    void setRemoteType( RemoteType p );

    /**
     * Gets the remoteServiceName attribute of the IRemoteCacheAttributes object
     * <p>
     * @return The remoteServiceName value
     */
    String getRemoteServiceName();

    /**
     * Sets the remoteServiceName attribute of the IRemoteCacheAttributes object
     * <p>
     * @param s The new remoteServiceName value
     */
    void setRemoteServiceName( String s );

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

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

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

    /**
     * Gets the clusterServers attribute of the IRemoteCacheAttributes object
     * <p>
     * @return The clusterServers value
     */
    String getClusterServers();

    /**
     * Sets the clusterServers attribute of the IRemoteCacheAttributes object
     * <p>
     * @param s The new clusterServers value
     */
    void setClusterServers( String s );

    /**
     * Gets the removeUponRemotePut attribute of the IRemoteCacheAttributes object
     * <p>
     * @return The removeUponRemotePut value
     */
    boolean getRemoveUponRemotePut();

    /**
     * Sets the removeUponRemotePut attribute of the IRemoteCacheAttributes object
     * <p>
     * @param r The new removeUponRemotePut value
     */
    void setRemoveUponRemotePut( boolean r );

    /**
     * Gets the getOnly attribute of the IRemoteCacheAttributes object
     * <p>
     * @return The getOnly value
     */
    boolean getGetOnly();

    /**
     * Sets the getOnly attribute of the IRemoteCacheAttributes object
     * <p>
     * @param r The new getOnly value
     */
    void setGetOnly( boolean r );

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

    /**
     * Should cluster updates be propagated to the locals
     * <p>
     * @param r The new localClusterConsistency value
     */
    void setLocalClusterConsistency( boolean r );

    /**
     * This sets a general timeout on the rmi socket factory. By default the socket factory will
     * block forever.
     * <p>
     * We have a default setting. The default rmi behavior should never be used.
     * <p>
     * @return int milliseconds
     */
    int getRmiSocketFactoryTimeoutMillis();

    /**
     * This sets a general timeout on the RMI socket factory. By default the socket factory will
     * block forever.
     * <p>
     * @param rmiSocketFactoryTimeoutMillis
     */
    void setRmiSocketFactoryTimeoutMillis( int rmiSocketFactoryTimeoutMillis );
}
