/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.protocol.jabber;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
import org.jivesoftware.smack.util.*;
import org.osgi.framework.*;
/**
* The Jabber implementation of the ProtocolProviderFactory.
* @author Damian Minkov
*/
public class ProtocolProviderFactoryJabberImpl
extends ProtocolProviderFactory
{
/**
* Creates an instance of the ProtocolProviderFactoryJabberImpl.
*/
protected ProtocolProviderFactoryJabberImpl()
{
super(JabberActivator.getBundleContext(), ProtocolNames.JABBER);
}
/**
* Initializes and creates an account corresponding to the specified
* accountProperties and registers the resulting ProtocolProvider in the
* context BundleContext parameter. This method has a persistent
* effect. Once created the resulting account will remain installed until
* removed through the uninstall account method.
*
* @param userIDStr the user identifier for the new account
* @param accountProperties a set of protocol (or implementation)
* specific properties defining the new account.
* @return the AccountID of the newly created account
*/
public AccountID installAccount( String userIDStr,
Map accountProperties)
{
BundleContext context
= JabberActivator.getBundleContext();
if (context == null)
throw new NullPointerException("The specified BundleContext was null");
if (userIDStr == null)
throw new NullPointerException("The specified AccountID was null");
if (accountProperties == null)
throw new NullPointerException("The specified property map was null");
accountProperties.put(USER_ID, userIDStr);
// if server address is null, we must extract it from userID
if(accountProperties.get(SERVER_ADDRESS) == null)
{
accountProperties.put(SERVER_ADDRESS,
StringUtils.parseServer(userIDStr));
}
// if server port is null, we will set default value
if(accountProperties.get(SERVER_PORT) == null)
{
accountProperties.put(SERVER_PORT,
"5222");
}
AccountID accountID = new JabberAccountID(userIDStr, accountProperties);
//make sure we haven't seen this account id before.
if( registeredAccounts.containsKey(accountID) )
throw new IllegalStateException(
"An account for id " + userIDStr + " was already installed!");
//first store the account and only then load it as the load generates
//an osgi event, the osgi event triggers (trhgough the UI) a call to
//the register() method and it needs to acces the configuration service
//and check for a password.
this.storeAccount(accountID);
accountID = loadAccount(accountProperties);
return accountID;
}
protected AccountID createAccountID(String userID, Map accountProperties)
{
return new JabberAccountID(userID, accountProperties);
}
protected ProtocolProviderService createService(String userID,
AccountID accountID)
{
ProtocolProviderServiceJabberImpl service =
new ProtocolProviderServiceJabberImpl();
service.initialize(userID, accountID);
return service;
}
@Override
public void modifyAccount( ProtocolProviderService protocolProvider,
Map accountProperties)
throws NullPointerException
{
BundleContext context
= JabberActivator.getBundleContext();
if (context == null)
throw new NullPointerException(
"The specified BundleContext was null");
if (protocolProvider == null)
throw new NullPointerException(
"The specified Protocol Provider was null");
JabberAccountID accountID
= (JabberAccountID) protocolProvider.getAccountID();
// If the given accountID doesn't correspond to an existing account
// we return.
if(!registeredAccounts.containsKey(accountID))
return;
ServiceRegistration registration = registeredAccounts.get(accountID);
// kill the service
if (registration != null)
{
// unregister provider before removing it.
try
{
if(protocolProvider.isRegistered())
protocolProvider.unregister();
} catch (Throwable e)
{
// we don't care for this, cause we are modifying and
// will unregister the service and will register again
}
registration.unregister();
}
if (accountProperties == null)
throw new NullPointerException(
"The specified property map was null");
accountProperties.put(USER_ID, accountID.getUserID());
String serverAddress = accountProperties.get(SERVER_ADDRESS);
if(serverAddress == null)
throw new NullPointerException("null is not a valid ServerAddress");
// if server port is null, we will set default value
if(accountProperties.get(SERVER_PORT) == null)
{
accountProperties.put(SERVER_PORT,
"5222");
}
if (!accountProperties.containsKey(PROTOCOL))
accountProperties.put(PROTOCOL, ProtocolNames.JABBER);
accountID.setAccountProperties(accountProperties);
// First store the account and only then load it as the load generates
// an osgi event, the osgi event triggers (trhgough the UI) a call to
// the register() method and it needs to acces the configuration service
// and check for a password.
this.storeAccount(accountID);
Hashtable properties = new Hashtable();
properties.put(PROTOCOL, ProtocolNames.JABBER);
properties.put(USER_ID, accountID.getUserID());
((ProtocolProviderServiceJabberImpl) protocolProvider)
.initialize(accountID.getUserID(), accountID);
// We store again the account in order to store all properties added
// during the protocol provider initialization.
this.storeAccount(accountID);
registration
= context.registerService(
ProtocolProviderService.class.getName(),
protocolProvider,
properties);
registeredAccounts.put(accountID, registration);
}
}