package pl.radical.open.gg;
import pl.radical.open.gg.event.PublicDirListener;
import pl.radical.open.gg.packet.dicts.SessionState;
import pl.radical.open.gg.packet.out.GGPubdirRequest;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import com.google.common.base.Preconditions;
/**
* The default implementation of <code>IPublicDirectoryService</code>.
* <p>
* Created on 2004-12-14
*
* @author <a href="mailto:mati@sz.home.pl">Mateusz Szczap</a>
*/
public class DefaultPublicDirectoryService implements IPublicDirectoryService {
private final Set<PublicDirListener> m_directoryListeners = new HashSet<PublicDirListener>();
private Session m_session = null;
// friendly
DefaultPublicDirectoryService(final Session session) {
Preconditions.checkNotNull(session, new IllegalArgumentException("session cannot be null"));
m_session = session;
}
/**
* @see pl.radical.open.gg.IPublicDirectoryService#search(pl.radical.open.gg.PublicDirSearchQuery)
*/
@Override
public void search(final PublicDirSearchQuery publicDirQuery) throws GGException {
Preconditions.checkNotNull(publicDirQuery, new IllegalArgumentException("publicDirQuery cannot be null"));
checkSessionState();
try {
final GGPubdirRequest pubdirRequest = GGPubdirRequest.createSearchPubdirRequest(publicDirQuery);
m_session.getSessionAccessor().sendPackage(pubdirRequest);
} catch (final IOException ex) {
throw new GGException("Unable to perform search.", ex);
}
}
/**
* * @see pl.radical.open.gg.IPublicDirectoryService#readFromPublicDirectory()
*/
@Override
public void readFromPublicDirectory() throws GGException {
checkSessionState();
try {
final GGPubdirRequest pubdirRequest = GGPubdirRequest.createReadPubdirRequest();
m_session.getSessionAccessor().sendPackage(pubdirRequest);
} catch (final IOException ex) {
throw new GGException("Unable to read information from public directory.", ex);
}
}
/**
* @see pl.radical.open.gg.IPublicDirectoryService#writeToPublicDirectory(pl.radical.open.gg.PersonalInfo)
*/
@Override
public void writeToPublicDirectory(final PersonalInfo publicDirInfo) throws GGException {
Preconditions.checkNotNull(publicDirInfo, new IllegalArgumentException("publicDirInfo cannot be null"));
checkSessionState();
try {
final GGPubdirRequest pubdirRequest = GGPubdirRequest.createWritePubdirRequest(publicDirInfo);
m_session.getSessionAccessor().sendPackage(pubdirRequest);
} catch (final IOException ex) {
throw new GGException("Unable to write or update information in public directory.", ex);
}
}
/**
* @see pl.radical.open.gg.IPublicDirectoryService#addPublicDirListener(pl.radical.open.gg.event.PublicDirListener)
*/
@Override
public void addPublicDirListener(final PublicDirListener publicDirListener) {
Preconditions.checkNotNull(publicDirListener, new IllegalArgumentException("publicDirListener cannot be null"));
m_directoryListeners.add(publicDirListener);
}
/**
* @see pl.radical.open.gg.IPublicDirectoryService#removePublicDirListener(pl.radical.open.gg.event.PublicDirListener)
*/
@Override
public void removePublicDirListener(final PublicDirListener publicDirListener) {
Preconditions.checkNotNull(publicDirListener, new IllegalArgumentException("pubDirListener cannot be null"));
m_directoryListeners.remove(publicDirListener);
}
protected void notifyPubdirRead(final int queryID, final PersonalInfo publicDirInfo) {
Preconditions.checkNotNull(publicDirInfo, new IllegalArgumentException("publicDirInfo cannot be null"));
for (final Object element : m_directoryListeners) {
final PublicDirListener publicDirListener = (PublicDirListener) element;
publicDirListener.onPublicDirectoryRead(queryID, publicDirInfo);
}
}
protected void notifyPubdirUpdated(final int queryID) {
for (final Object element : m_directoryListeners) {
final PublicDirListener publicDirListener = (PublicDirListener) element;
publicDirListener.onPublicDirectoryUpdated(queryID);
}
}
protected void notifyPubdirGotSearchResults(final int queryID, final PublicDirSearchReply publicDirSearchReply) {
Preconditions.checkNotNull(publicDirSearchReply, new IllegalArgumentException("publicDirSearchReply cannot be null"));
for (final Object element : m_directoryListeners) {
final PublicDirListener publicDirListener = (PublicDirListener) element;
publicDirListener.onPublicDirectorySearchReply(queryID, publicDirSearchReply);
}
}
private void checkSessionState() throws GGSessionException {
if (m_session.getSessionState() != SessionState.LOGGED_IN) {
throw new GGSessionException(m_session.getSessionState());
}
}
}