/** | |
* $Revision$ | |
* $Date$ | |
* | |
* Copyright 2006-2007 Jive Software. | |
* | |
* All rights reserved. Licensed 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.jivesoftware.smack.packet; | |
import java.util.*; | |
/** | |
* A Privacy IQ Packet, is used by the {@link org.jivesoftware.smack.PrivacyListManager} | |
* and {@link org.jivesoftware.smack.provider.PrivacyProvider} to allow and block | |
* communications from other users. It contains the appropriate structure to suit | |
* user-defined privacy lists. Different configured Privacy packages are used in the | |
* server & manager communication in order to: | |
* <ul> | |
* <li>Retrieving one's privacy lists. | |
* <li>Adding, removing, and editing one's privacy lists. | |
* <li>Setting, changing, or declining active lists. | |
* <li>Setting, changing, or declining the default list (i.e., the list that is active by default). | |
* </ul> | |
* Privacy Items can handle different kind of blocking communications based on JID, group, | |
* subscription type or globally {@link PrivacyItem} | |
* | |
* @author Francisco Vives | |
*/ | |
public class Privacy extends IQ { | |
/** declineActiveList is true when the user declines the use of the active list **/ | |
private boolean declineActiveList=false; | |
/** activeName is the name associated with the active list set for the session **/ | |
private String activeName; | |
/** declineDefaultList is true when the user declines the use of the default list **/ | |
private boolean declineDefaultList=false; | |
/** defaultName is the name of the default list that applies to the user as a whole **/ | |
private String defaultName; | |
/** itemLists holds the set of privacy items classified in lists. It is a map where the | |
* key is the name of the list and the value a collection with privacy items. **/ | |
private Map<String, List<PrivacyItem>> itemLists = new HashMap<String, List<PrivacyItem>>(); | |
/** | |
* Set or update a privacy list with privacy items. | |
* | |
* @param listName the name of the new privacy list. | |
* @param listItem the {@link PrivacyItem} that rules the list. | |
* @return the privacy List. | |
*/ | |
public List<PrivacyItem> setPrivacyList(String listName, List<PrivacyItem> listItem) { | |
// Add new list to the itemLists | |
this.getItemLists().put(listName, listItem); | |
return listItem; | |
} | |
/** | |
* Set the active list based on the default list. | |
* | |
* @return the active List. | |
*/ | |
public List<PrivacyItem> setActivePrivacyList() { | |
this.setActiveName(this.getDefaultName()); | |
return this.getItemLists().get(this.getActiveName()); | |
} | |
/** | |
* Deletes an existing privacy list. If the privacy list being deleted was the default list | |
* then the user will end up with no default list. Therefore, the user will have to set a new | |
* default list. | |
* | |
* @param listName the name of the list being deleted. | |
*/ | |
public void deletePrivacyList(String listName) { | |
// Remove the list from the cache | |
this.getItemLists().remove(listName); | |
// Check if deleted list was the default list | |
if (this.getDefaultName() != null && listName.equals(this.getDefaultName())) { | |
this.setDefaultName(null); | |
} | |
} | |
/** | |
* Returns the active privacy list or <tt>null</tt> if none was found. | |
* | |
* @return list with {@link PrivacyItem} or <tt>null</tt> if none was found. | |
*/ | |
public List<PrivacyItem> getActivePrivacyList() { | |
// Check if we have the default list | |
if (this.getActiveName() == null) { | |
return null; | |
} else { | |
return this.getItemLists().get(this.getActiveName()); | |
} | |
} | |
/** | |
* Returns the default privacy list or <tt>null</tt> if none was found. | |
* | |
* @return list with {@link PrivacyItem} or <tt>null</tt> if none was found. | |
*/ | |
public List<PrivacyItem> getDefaultPrivacyList() { | |
// Check if we have the default list | |
if (this.getDefaultName() == null) { | |
return null; | |
} else { | |
return this.getItemLists().get(this.getDefaultName()); | |
} | |
} | |
/** | |
* Returns a specific privacy list. | |
* | |
* @param listName the name of the list to get. | |
* @return a List with {@link PrivacyItem} | |
*/ | |
public List<PrivacyItem> getPrivacyList(String listName) { | |
return this.getItemLists().get(listName); | |
} | |
/** | |
* Returns the privacy item in the specified order. | |
* | |
* @param listName the name of the privacy list. | |
* @param order the order of the element. | |
* @return a List with {@link PrivacyItem} | |
*/ | |
public PrivacyItem getItem(String listName, int order) { | |
Iterator<PrivacyItem> values = getPrivacyList(listName).iterator(); | |
PrivacyItem itemFound = null; | |
while (itemFound == null && values.hasNext()) { | |
PrivacyItem element = values.next(); | |
if (element.getOrder() == order) { | |
itemFound = element; | |
} | |
} | |
return itemFound; | |
} | |
/** | |
* Sets a given privacy list as the new user default list. | |
* | |
* @param newDefault the new default privacy list. | |
* @return if the default list was changed. | |
*/ | |
public boolean changeDefaultList(String newDefault) { | |
if (this.getItemLists().containsKey(newDefault)) { | |
this.setDefaultName(newDefault); | |
return true; | |
} else { | |
return false; | |
} | |
} | |
/** | |
* Remove the list. | |
* | |
* @param listName name of the list to remove. | |
*/ | |
public void deleteList(String listName) { | |
this.getItemLists().remove(listName); | |
} | |
/** | |
* Returns the name associated with the active list set for the session. Communications | |
* will be verified against the active list. | |
* | |
* @return the name of the active list. | |
*/ | |
public String getActiveName() { | |
return activeName; | |
} | |
/** | |
* Sets the name associated with the active list set for the session. Communications | |
* will be verified against the active list. | |
* | |
* @param activeName is the name of the active list. | |
*/ | |
public void setActiveName(String activeName) { | |
this.activeName = activeName; | |
} | |
/** | |
* Returns the name of the default list that applies to the user as a whole. Default list is | |
* processed if there is no active list set for the target session/resource to which a stanza | |
* is addressed, or if there are no current sessions for the user. | |
* | |
* @return the name of the default list. | |
*/ | |
public String getDefaultName() { | |
return defaultName; | |
} | |
/** | |
* Sets the name of the default list that applies to the user as a whole. Default list is | |
* processed if there is no active list set for the target session/resource to which a stanza | |
* is addressed, or if there are no current sessions for the user. | |
* | |
* If there is no default list set, then all Privacy Items are processed. | |
* | |
* @param defaultName is the name of the default list. | |
*/ | |
public void setDefaultName(String defaultName) { | |
this.defaultName = defaultName; | |
} | |
/** | |
* Returns the collection of privacy list that the user holds. A Privacy List contains a set of | |
* rules that define if communication with the list owner is allowed or denied. | |
* Users may have zero, one or more privacy items. | |
* | |
* @return a map where the key is the name of the list and the value the | |
* collection of privacy items. | |
*/ | |
public Map<String, List<PrivacyItem>> getItemLists() { | |
return itemLists; | |
} | |
/** | |
* Returns whether the receiver allows or declines the use of an active list. | |
* | |
* @return the decline status of the list. | |
*/ | |
public boolean isDeclineActiveList() { | |
return declineActiveList; | |
} | |
/** | |
* Sets whether the receiver allows or declines the use of an active list. | |
* | |
* @param declineActiveList indicates if the receiver declines the use of an active list. | |
*/ | |
public void setDeclineActiveList(boolean declineActiveList) { | |
this.declineActiveList = declineActiveList; | |
} | |
/** | |
* Returns whether the receiver allows or declines the use of a default list. | |
* | |
* @return the decline status of the list. | |
*/ | |
public boolean isDeclineDefaultList() { | |
return declineDefaultList; | |
} | |
/** | |
* Sets whether the receiver allows or declines the use of a default list. | |
* | |
* @param declineDefaultList indicates if the receiver declines the use of a default list. | |
*/ | |
public void setDeclineDefaultList(boolean declineDefaultList) { | |
this.declineDefaultList = declineDefaultList; | |
} | |
/** | |
* Returns all the list names the user has defined to group restrictions. | |
* | |
* @return a Set with Strings containing every list names. | |
*/ | |
public Set<String> getPrivacyListNames() { | |
return this.itemLists.keySet(); | |
} | |
public String getChildElementXML() { | |
StringBuilder buf = new StringBuilder(); | |
buf.append("<query xmlns=\"jabber:iq:privacy\">"); | |
// Add the active tag | |
if (this.isDeclineActiveList()) { | |
buf.append("<active/>"); | |
} else { | |
if (this.getActiveName() != null) { | |
buf.append("<active name=\"").append(this.getActiveName()).append("\"/>"); | |
} | |
} | |
// Add the default tag | |
if (this.isDeclineDefaultList()) { | |
buf.append("<default/>"); | |
} else { | |
if (this.getDefaultName() != null) { | |
buf.append("<default name=\"").append(this.getDefaultName()).append("\"/>"); | |
} | |
} | |
// Add the list with their privacy items | |
for (Map.Entry<String, List<PrivacyItem>> entry : this.getItemLists().entrySet()) { | |
String listName = entry.getKey(); | |
List<PrivacyItem> items = entry.getValue(); | |
// Begin the list tag | |
if (items.isEmpty()) { | |
buf.append("<list name=\"").append(listName).append("\"/>"); | |
} else { | |
buf.append("<list name=\"").append(listName).append("\">"); | |
} | |
for (PrivacyItem item : items) { | |
// Append the item xml representation | |
buf.append(item.toXML()); | |
} | |
// Close the list tag | |
if (!items.isEmpty()) { | |
buf.append("</list>"); | |
} | |
} | |
// Add packet extensions, if any are defined. | |
buf.append(getExtensionsXML()); | |
buf.append("</query>"); | |
return buf.toString(); | |
} | |
} |