/*
 * 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.
 */
package org.apache.directory.api.ldap.model.message.controls;


import org.apache.directory.api.ldap.model.message.Control;


/**
 * A persistence search object
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public interface PersistentSearch extends Control
{
    /** This control OID */
    String OID = "2.16.840.1.113730.3.4.3";

    /** Min and Max values for the possible combined change types */
    int CHANGE_TYPES_MIN = ChangeType.ADD.getValue();

    int CHANGE_TYPES_MAX = ChangeType.ADD.getValue()
        | ChangeType.DELETE.getValue()
        | ChangeType.MODIFY.getValue()
        | ChangeType.MODDN.getValue();


    void setChangesOnly( boolean changesOnly );


    boolean isChangesOnly();


    void setReturnECs( boolean returnECs );


    boolean isReturnECs();


    void setChangeTypes( int changeTypes );


    int getChangeTypes();


    boolean isNotificationEnabled( ChangeType changeType );


    void enableNotification( ChangeType changeType );
}
