/**********************************************************************************
 * $URL: https://source.sakaiproject.org/svn/access/trunk/access-impl/impl/src/java/org/sakaiproject/access/tool/AccessServlet.java $
 * $Id: AccessServlet.java 17063 2006-10-11 19:48:42Z jimeng@umich.edu $
 ***********************************************************************************
 *
 * Copyright (c) 2006 The Sakai Foundation.
 * 
 * Licensed under the Educational Community License, Version 1.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.opensource.org/licenses/ecl1.php
 * 
 * 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.sakaiproject.api.privacy;

import java.util.Map;
import java.util.Set;
 
/**
 * <p>PrivacyManager maintains and queries user privacy settings</p>
 * 
 * <pre>
 * An implementation can modify the behavior of the Privacy Service within sakai.properties:
 * 
 * privacy.manager.defaultViewable=true|false
 *   a 'true' value will set privacy enabled for a user whose privacy settings are unknown
 *   a 'false' value will set privacy disabled for a user whose privacy settings are unknown
 *   If this value is not set, the default behavior will be to show users or make them viewable.
 *   
 * privacy.manager.overrideViewable=true|false
 *   a 'true' value will make all users viewable in the system
 *   a 'false' value will make all users hidden in the system
 *   Do not set this value for normal operation (non overridden behavior).
 *   
 * privacy.manager.userRecordHasPrecedence=true|false
 *   a 'true' value indicates that a user record has precedence over a system record
 *   a 'false' value indicates that a system record has precedence over a user record
 * 
 * </pre>
 * 
 */
public interface PrivacyManager 
{
	public static final String SYSTEM_RECORD_TYPE = "system_record";
	
	public static final String USER_RECORD_TYPE = "user_record";
	
	// Tool methods ------------------------------------------------------
	
	/**
	 * Determine user privacy within the specified context.
	 * @param contextId
	 * @param userId (UUID)
	 * @return true if privacy is enabled for the user, false otherwise
	 */
	public boolean isViewable(String contextId, String userId);
            
	/**
	 * Get a set of users who have privacy disabled within a context. (Visible)
	 * @param contextId
	 * @param userIds
	 * @return Set of <code>org.sakakproject.service.legacy.User.id</code> objects (UUID)
	 */
	Set findViewable(String contextId, Set userIds);
	
	/**
	 * Get a set of users who have privacy enabled within a context. (Hidden)
	 * @param contextId
	 * @param userIds
	 * @return Set of <code>org.sakakproject.service.legacy.User.id</code> objects (UUID)
	 */
	Set findHidden(String contextId, Set userIds);

	// Batch / Privacy Management methods --------------------------------
	
	/**
	 * Get the state of the users within the specified context filtered by a Boolean value.
	 * Implementation should delegate to AuthzGroupService to get users from Realm. 
	 * @param contextId
	 * @param value filter (True, False, NULL)
	 * @param recordType is a UUID i.e. (getSystemRecordType(), getUserRecordType())
	 * @return Set of users who satisfy the criteria
	 */
	Set getViewableState(String contextId, Boolean value, String recordType);
  
	/**
	 * Get the state of the users within the specified context.
	 * @param contextId
	 * @param recordType is a UUID i.e. (getSystemRecordType(), getUserRecordType())
	 * @return Map {key=userId, value=Boolean}
	 */
	Map getViewableState(String contextId, String recordType);
	
	/**
	 * Set user's privacy setting within the specified context given a record type.
	 * @param contextId
	 * @param userId (UUID)
	 * @param value using three-valued logic (True, False, NULL)
	 * @param recordType is a UUID i.e. (getSystemRecordType(), getUserRecordType())
	 */
	void setViewableState(String contextId, String userId, Boolean value, String recordType);
            
	/**
	 * Set the state for each entry in the userMap.
	 * @param contextId
	 * @param userMap is a Map {key=userId, value=Boolean}
	 * @param recordType is a UUID i.e. (getSystemRecordType(), getUserRecordType())
	 */
	void setViewableState(String contextId, Map userViewableState, String recordType);
	
}
