package org.apache.commons.jcs.auxiliary.lateral.socket.tcp.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.jcs.auxiliary.lateral.behavior.ILateralCacheAttributes;

/**
 * This interface defines functions that are particular to the TCP Lateral Cache
 * plugin. It extends the generic LateralCacheAttributes interface which in turn
 * extends the AuxiliaryCache interface.
 * <p>
 * @author Aaron Smuts
 */
public interface ITCPLateralCacheAttributes
    extends ILateralCacheAttributes
{
    /**
     * Sets the tcpServer attribute of the ILateralCacheAttributes object
     * <p>
     * @param val
     *            The new tcpServer value
     */
    void setTcpServer( String val );

    /**
     * Gets the tcpServer attribute of the ILateralCacheAttributes object
     * <p>
     * @return The tcpServer value
     */
    String getTcpServer();

    /**
     * Sets the tcpServers attribute of the ILateralCacheAttributes object
     * <p>
     * @param val
     *            The new tcpServers value
     */
    void setTcpServers( String val );

    /**
     * Gets the tcpServers attribute of the ILateralCacheAttributes object
     * <p>
     * @return The tcpServers value
     */
    String getTcpServers();

    /**
     * Sets the tcpListenerPort attribute of the ILateralCacheAttributes object
     * <p>
     * @param val
     *            The new tcpListenerPort value
     */
    void setTcpListenerPort( int val );

    /**
     * Gets the tcpListenerPort attribute of the ILateralCacheAttributes object
     * <p>
     * @return The tcpListenerPort value
     */
    int getTcpListenerPort();

    /**
     * Sets the tcpListenerHost attribute of the ILateralCacheAttributes object
     * <p>
     * @param val
     *            The new tcpListenerHost value
     */
    void setTcpListenerHost( String val );

    /**
     * Gets the tcpListenerHost attribute of the ILateralCacheAttributes object
     * <p>
     * @return The tcpListenerHost value
     */
    String getTcpListenerHost();

    /**
     * Can setup UDP Discovery. This only works for TCp laterals right now. It
     * allows TCP laterals to find each other by broadcasting to a multicast
     * port.
     * <p>
     * @param udpDiscoveryEnabled
     *            The udpDiscoveryEnabled to set.
     */
    void setUdpDiscoveryEnabled( boolean udpDiscoveryEnabled );

    /**
     * Whether or not TCP laterals can try to find each other by multicast
     * communication.
     * <p>
     * @return Returns the udpDiscoveryEnabled.
     */
    boolean isUdpDiscoveryEnabled();

    /**
     * The port to use if UDPDiscovery is enabled.
     * <p>
     * @return Returns the udpDiscoveryPort.
     */
    int getUdpDiscoveryPort();

    /**
     * Sets the port to use if UDPDiscovery is enabled.
     * <p>
     * @param udpDiscoveryPort
     *            The udpDiscoveryPort to set.
     */
    void setUdpDiscoveryPort( int udpDiscoveryPort );

    /**
     * The address to broadcast to if UDPDiscovery is enabled.
     * <p>
     * @return Returns the udpDiscoveryAddr.
     */
    String getUdpDiscoveryAddr();

    /**
     * Sets the address to broadcast to if UDPDiscovery is enabled.
     * <p>
     * @param udpDiscoveryAddr
     *            The udpDiscoveryAddr to set.
     */
    void setUdpDiscoveryAddr( String udpDiscoveryAddr );

    /**
     * Is the lateral allowed to try and get from other laterals.
     * <p>
     * This replaces the old putOnlyMode
     * <p>
     * @param allowGet
     */
    void setAllowGet( boolean allowGet );

    /**
     * Is the lateral allowed to try and get from other laterals.
     * <p>
     * @return true if the lateral will try to get
     */
    boolean isAllowGet();

    /**
     * Is the lateral allowed to put objects to other laterals.
     * <p>
     * @param allowPut
     */
    void setAllowPut( boolean allowPut );

    /**
     * Is the lateral allowed to put objects to other laterals.
     * <p>
     * @return true if puts are allowed
     */
    boolean isAllowPut();

    /**
     * Should the client send a remove command rather than a put when update is
     * called. This is a client option, not a receiver option. This allows you
     * to prevent the lateral from serializing objects.
     * <p>
     * @param issueRemoveOnPut
     */
    void setIssueRemoveOnPut( boolean issueRemoveOnPut );

    /**
     * Should the client send a remove command rather than a put when update is
     * called. This is a client option, not a receiver option. This allows you
     * to prevent the lateral from serializing objects.
     * <p>
     * @return true if updates will result in a remove command being sent.
     */
    boolean isIssueRemoveOnPut();

    /**
     * Should the receiver try to match hashcodes. If true, the receiver will
     * see if the client supplied a hashcode. If it did, then it will try to get
     * the item locally. If the item exists, then it will compare the hashcode.
     * if they are the same, it will not remove. This isn't perfect since
     * different objects can have the same hashcode, but it is unlikely of
     * objects of the same type.
     * <p>
     * @return boolean
     */
    boolean isFilterRemoveByHashCode();

    /**
     * Should the receiver try to match hashcodes. If true, the receiver will
     * see if the client supplied a hashcode. If it did, then it will try to get
     * the item locally. If the item exists, then it will compare the hashcode.
     * if they are the same, it will not remove. This isn't perfect since
     * different objects can have the same hashcode, but it is unlikely of
     * objects of the same type.
     * <p>
     * @param filter
     */
    void setFilterRemoveByHashCode( boolean filter );

    /**
     * @param socketTimeOut the socketTimeOut to set
     */
    void setSocketTimeOut( int socketTimeOut );

    /**
     * @return the socketTimeOut
     */
    int getSocketTimeOut();

    /**
     * @param openTimeOut the openTimeOut to set
     */
    void setOpenTimeOut( int openTimeOut );

    /**
     * @return the openTimeOut
     */
    int getOpenTimeOut();
}
