/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.impl.protocol.irc;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
/**
* Contact group for IRC.
*
* @author Danny van Heumen
*/
public class ContactGroupIrcImpl
implements ContactGroup
{
/**
* The protocol provider service instance.
*/
private final ProtocolProviderServiceIrcImpl provider;
/**
* Group name.
*/
private String name;
/**
* Subgroups.
*/
private final ArrayList<ContactGroupIrcImpl> subgroups =
new ArrayList<ContactGroupIrcImpl>();
/**
* Contacts in this group.
*/
private final ArrayList<ContactIrcImpl> contacts =
new ArrayList<ContactIrcImpl>();
/**
* Parent contact group.
*/
private ContactGroup parent;
/**
* Flag for persistence.
*/
private boolean persistent;
/**
* Contact Group IRC implementation.
*
* @param provider IRC protocol provider service instance.
*/
ContactGroupIrcImpl(final ProtocolProviderServiceIrcImpl provider)
{
this(provider, null, "root");
}
/**
* Contact Group IRC implementation.
*
* @param provider IRC protocol provider service instance.
* @param parentGroup Parent group
* @param name Group name
*/
public ContactGroupIrcImpl(final ProtocolProviderServiceIrcImpl provider,
final ContactGroupIrcImpl parentGroup, final String name)
{
if (provider == null)
{
throw new IllegalArgumentException("provider cannot be null");
}
this.provider = provider;
this.parent = parentGroup;
if (name == null)
{
throw new IllegalArgumentException("name cannot be null");
}
this.name = name;
this.persistent = true;
}
/**
* Get subgroups of this group.
*
* @return returns subgroups iterator
*/
@Override
public Iterator<ContactGroup> subgroups()
{
return new ArrayList<ContactGroup>(this.subgroups).iterator();
}
/**
* Get number of subgroups.
*
* @return returns number of subgroups
*/
@Override
public int countSubgroups()
{
return this.subgroups.size();
}
/**
* Get subgroup by index.
*
* @param index index of subgroup
* @return returns subgroup
*/
@Override
public ContactGroup getGroup(final int index)
{
return this.subgroups.get(index);
}
/**
* Get subgroup by name.
*
* @param groupName Name of subgroup.
* @return returns subgroup or null if no group exists with that name
*/
@Override
public ContactGroup getGroup(final String groupName)
{
if (groupName == null)
{
return null;
}
for (ContactGroupIrcImpl group : this.subgroups)
{
if (groupName.equals(group.getGroupName()))
{
return group;
}
}
return null;
}
/**
* Get contacts in group.
*
* @return returns group's contacts
*/
@Override
public Iterator<Contact> contacts()
{
return new ArrayList<Contact>(this.contacts).iterator();
}
/**
* Get number of contacts in group.
*
* @return returns number of contacts in group
*/
@Override
public int countContacts()
{
return this.contacts.size();
}
/**
* Get group contact by id.
*
* @param id contact ID
* @return returns contact or null if contact cannot be found
*/
@Override
public ContactIrcImpl getContact(final String id)
{
if (id == null || id.isEmpty())
{
return null;
}
for (ContactIrcImpl contact : this.contacts)
{
if (id.equals(contact.getAddress()))
{
return contact;
}
}
return null;
}
/**
* Find contact by searching through direct contacts and subsequently
* continue searching in subgroups.
*
* @param id the contact id
* @return returns found contact instance or <tt>null</tt> if contact is not
* found
*/
public ContactIrcImpl findContact(final String id)
{
// search own contacts
ContactIrcImpl contact = getContact(id);
if (contact != null)
{
return contact;
}
// search in subgroups
for (ContactGroupIrcImpl subgroup : this.subgroups)
{
contact = subgroup.findContact(id);
if (contact != null)
{
return contact;
}
}
return null;
}
/**
* Check if group can contain subgroups.
*
* @return returns true if group can contain subgroups, or false otherwise.
*/
@Override
public boolean canContainSubgroups()
{
return true;
}
/**
* Get name of the group.
*
* @return returns group name
*/
@Override
public String getGroupName()
{
return this.name;
}
/**
* Set name of the group.
*
* @param name new name
*/
public void setGroupName(final String name)
{
if (name == null)
{
throw new IllegalArgumentException("name cannot be null");
}
this.name = name;
}
/**
* Get protocol provider service implementation.
*
* @return returns protocol provider service implementation
*/
@Override
public ProtocolProviderServiceIrcImpl getProtocolProvider()
{
return this.provider;
}
/**
* Get parent contact group.
*
* @return returns parent contact group or null if no parent group exists
*/
@Override
public ContactGroup getParentContactGroup()
{
return this.parent;
}
/**
* Is persistent group.
*
* @return returns true if group is persistent, or false if not.
*/
@Override
public boolean isPersistent()
{
return this.persistent;
}
/**
* Set persistence.
*
* @param persistent <tt>true</tt> for persistent group, <tt>false</tt> for
* non-persistent group
*/
public void setPersistent(final boolean persistent)
{
this.persistent = persistent;
}
/**
* Get group UUID.
*
* @return returns group UUID
*/
@Override
public String getUID()
{
return this.name;
}
/**
* Is group resolved.
*
* @return returns true if group is resolved, or false otherwise
*/
@Override
public boolean isResolved()
{
return true;
}
/**
* Get group persistent data.
*
* @return returns persistent data
*/
@Override
public String getPersistentData()
{
return null;
}
/**
* Add contact to the group.
*
* @param contact Contact to be added.
*/
public void addContact(final ContactIrcImpl contact)
{
if (contact == null)
{
throw new IllegalArgumentException("contact cannot be null");
}
this.contacts.add(contact);
}
/**
* Remove contact.
*
* @param contact the contact to remove
*/
public void removeContact(final ContactIrcImpl contact)
{
if (contact == null)
{
throw new IllegalArgumentException("contact cannot be null");
}
this.contacts.remove(contact);
}
/**
* Add group as subgroup to this group.
*
* @param group the group
*/
public void addSubGroup(final ContactGroupIrcImpl group)
{
if (group == null)
{
throw new IllegalArgumentException("group cannot be null");
}
this.subgroups.add(group);
}
/**
* Remove subgroup from this group.
*
* @param group the group
*/
public void removeSubGroup(final ContactGroupIrcImpl group)
{
if (group == null)
{
throw new IllegalArgumentException("group cannot be null");
}
this.subgroups.remove(group);
}
}