/* * 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.plugin.jabberaccregwizz; import java.awt.*; import java.util.*; import java.util.List; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.Logger; import org.osgi.framework.*; /** * The JabberAccountRegistrationWizard is an implementation of the * AccountRegistrationWizard for the Jabber protocol. It should allow * the user to create and configure a new Jabber account. * * @author Yana Stamcheva */ public class JabberAccountRegistrationWizard extends AccountRegistrationWizard { /** * The logger. */ private static final Logger logger = Logger.getLogger(JabberAccountRegistrationWizard.class); /** * Account suffix for Google service. */ private static final String GOOGLE_USER_SUFFIX = "gmail.com"; /** * XMPP server for Google service. */ private static final String GOOGLE_CONNECT_SRV = "talk.google.com"; /** * The first wizard page. */ private FirstWizardPage firstWizardPage; /** * The registration object, where all properties related to the account * are stored. */ private JabberAccountRegistration registration; /** * The ProtocolProviderService of this account. */ private ProtocolProviderService protocolProvider; /** * Creates an instance of JabberAccountRegistrationWizard. * @param wizardContainer the wizard container, where this wizard * is added */ public JabberAccountRegistrationWizard(WizardContainer wizardContainer) { setWizardContainer(wizardContainer); wizardContainer .setFinishButtonText(Resources.getString("service.gui.SIGN_IN")); } /** * Implements the AccountRegistrationWizard.getIcon method. * Returns the icon to be used for this wizard. * @return byte[] */ public byte[] getIcon() { return Resources.getImage(Resources.PROTOCOL_ICON); } /** * Implements the AccountRegistrationWizard.getPageImage method. * Returns the image used to decorate the wizard page * * @return byte[] the image used to decorate the wizard page */ public byte[] getPageImage() { return Resources.getImage(Resources.PAGE_IMAGE); } /** * Implements the AccountRegistrationWizard.getProtocolName * method. Returns the protocol name for this wizard. * @return String */ public String getProtocolName() { return Resources.getString("plugin.jabberaccregwizz.PROTOCOL_NAME"); } /** * Implements the AccountRegistrationWizard.getProtocolDescription * method. Returns the description of the protocol for this wizard. * @return String */ public String getProtocolDescription() { return Resources .getString("plugin.jabberaccregwizz.PROTOCOL_DESCRIPTION"); } /** * Returns the set of pages contained in this wizard. * @return Iterator */ public Iterator getPages() { return getPages(new JabberAccountRegistration()); } /** * Returns the set of pages contained in this wizard. * * @param registration the registration object * @return Iterator */ public Iterator getPages(JabberAccountRegistration registration) { java.util.List pages = new ArrayList(); // create new registration, our container needs the pages // this means this is a new wizard and we must reset all data // it will be invoked and when the wizard cleans and unregister // our pages, but this fix don't hurt in this situation. this.registration = registration; if (firstWizardPage == null) firstWizardPage = new FirstWizardPage(this); pages.add(firstWizardPage); return pages.iterator(); } /** * Returns the set of data that user has entered through this wizard. * @return Iterator */ public Iterator> getSummary() { Hashtable summaryTable = new Hashtable(); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.USERNAME"), registration.getUserID()); summaryTable.put( Resources.getString("service.gui.REMEMBER_PASSWORD"), Boolean.toString(registration.isRememberPassword())); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.SERVER"), registration.getServerAddress()); summaryTable.put( Resources.getString("service.gui.PORT"), String.valueOf(registration.getPort())); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.ENABLE_KEEP_ALIVE"), String.valueOf(registration.isSendKeepAlive())); summaryTable.put( Resources.getString( "plugin.jabberaccregwizz.ENABLE_GMAIL_NOTIFICATIONS"), String.valueOf(registration.isGmailNotificationEnabled())); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.RESOURCE"), registration.getResource()); summaryTable.put( Resources.getString("plugin.jabberaccregwizz.PRIORITY"), String.valueOf(registration.getPriority())); return summaryTable.entrySet().iterator(); } /** * Installs the account defined in this wizard. * @return the created ProtocolProviderService corresponding to the * new account * @throws OperationFailedException if the operation didn't succeed */ public ProtocolProviderService signin() throws OperationFailedException { firstWizardPage.commitPage(); return signin( registration.getUserID(), registration.getPassword()); } /** * Installs the account defined in this wizard. * * @param userName the user name to sign in with * @param password the password to sign in with * @return the created ProtocolProviderService corresponding to the * new account * @throws OperationFailedException if the operation didn't succeed */ public ProtocolProviderService signin(String userName, String password) throws OperationFailedException { // if firstWizardPage is null we are requested sign-in from // initial account registration form we must init // firstWizardPage in order to init default values if(firstWizardPage == null) { firstWizardPage = new FirstWizardPage(this); AccountPanel accPanel = (AccountPanel)firstWizardPage.getSimpleForm(); accPanel.setUsername(userName); accPanel.setPassword(password); accPanel.setRememberPassword(true); } if(!firstWizardPage.isCommitted()) firstWizardPage.commitPage(); ProtocolProviderFactory factory = JabberAccRegWizzActivator.getJabberProtocolProviderFactory(); return this.installAccount( factory, registration.getUserID(), // The user id may get changed.Server // part can be added in the data // commit. password); } /** * Creates an account for the given user and password. * * @param providerFactory the ProtocolProviderFactory which will create * the account * @param userName the user identifier * @param passwd the password * @return the ProtocolProviderService for the new account. * @throws OperationFailedException if the operation didn't succeed */ protected ProtocolProviderService installAccount( ProtocolProviderFactory providerFactory, String userName, String passwd) throws OperationFailedException { if(logger.isTraceEnabled()) { logger.trace("Preparing to install account for user " + userName); } Hashtable accountProperties = new Hashtable(); accountProperties.put(ProtocolProviderFactory.IS_PREFERRED_PROTOCOL, Boolean.toString(isPreferredProtocol())); accountProperties.put(ProtocolProviderFactory.PROTOCOL, getProtocol()); String protocolIconPath = getProtocolIconPath(); if (protocolIconPath != null) accountProperties.put( ProtocolProviderFactory.PROTOCOL_ICON_PATH, protocolIconPath); String accountIconPath = getAccountIconPath(); if (accountIconPath != null) accountProperties.put( ProtocolProviderFactory.ACCOUNT_ICON_PATH, accountIconPath); if (registration.isRememberPassword()) { accountProperties.put(ProtocolProviderFactory.PASSWORD, passwd); } accountProperties.put("SEND_KEEP_ALIVE", String.valueOf(registration.isSendKeepAlive())); accountProperties.put("GMAIL_NOTIFICATIONS_ENABLED", String.valueOf(registration.isGmailNotificationEnabled())); accountProperties.put("GOOGLE_CONTACTS_ENABLED", String.valueOf(registration.isGoogleContactsEnabled())); String serverName = null; if (registration.getServerAddress() != null && registration.getServerAddress().length() > 0) { serverName = registration.getServerAddress(); if (userName.indexOf(serverName) < 0) accountProperties.put( ProtocolProviderFactory.IS_SERVER_OVERRIDDEN, Boolean.toString(true)); } else { serverName = getServerFromUserName(userName); } if (serverName == null || serverName.length() <= 0) throw new OperationFailedException( "Should specify a server for user name " + userName + ".", OperationFailedException.SERVER_NOT_SPECIFIED); if(userName.indexOf('@') < 0 && registration.getDefaultUserSufix() != null) userName = userName + '@' + registration.getDefaultUserSufix(); accountProperties.put(ProtocolProviderFactory.SERVER_ADDRESS, serverName); accountProperties.put(ProtocolProviderFactory.SERVER_PORT, String.valueOf(registration.getPort())); accountProperties.put(ProtocolProviderFactory.AUTO_GENERATE_RESOURCE, String.valueOf(registration.isResourceAutogenerated())); accountProperties.put(ProtocolProviderFactory.RESOURCE, registration.getResource()); accountProperties.put(ProtocolProviderFactory.RESOURCE_PRIORITY, String.valueOf(registration.getPriority())); accountProperties.put(ProtocolProviderFactory.IS_USE_ICE, String.valueOf(registration.isUseIce())); accountProperties.put(ProtocolProviderFactory.AUTO_DISCOVER_STUN, String.valueOf(registration.isAutoDiscoverStun())); accountProperties.put(ProtocolProviderFactory.USE_DEFAULT_STUN_SERVER, String.valueOf(registration.isUseDefaultStunServer())); List stunServers = registration.getAdditionalStunServers(); int serverIndex = -1; for(StunServerDescriptor stunServer : stunServers) { serverIndex ++; stunServer.storeDescriptor(accountProperties, ProtocolProviderFactory.STUN_PREFIX + serverIndex); } accountProperties.put(ProtocolProviderFactory.IS_USE_JINGLE_NODES, String.valueOf(registration.isUseJingleNodes())); accountProperties.put( ProtocolProviderFactory.AUTO_DISCOVER_JINGLE_NODES, String.valueOf(registration.isAutoDiscoverJingleNodes())); List jnRelays = registration.getAdditionalJingleNodes(); serverIndex = -1; for(JingleNodeDescriptor jnRelay : jnRelays) { serverIndex ++; jnRelay.storeDescriptor(accountProperties, JingleNodeDescriptor.JN_PREFIX + serverIndex); } accountProperties.put(ProtocolProviderFactory.IS_USE_UPNP, String.valueOf(registration.isUseUPNP())); if (isModification()) { providerFactory.modifyAccount( protocolProvider, accountProperties); setModification(false); return protocolProvider; } try { if(logger.isTraceEnabled()) { logger.trace("Will install account for user " + userName + " with the following properties." + accountProperties); } AccountID accountID = providerFactory.installAccount( userName, accountProperties); ServiceReference serRef = providerFactory .getProviderForAccount(accountID); protocolProvider = (ProtocolProviderService) JabberAccRegWizzActivator.bundleContext .getService(serRef); } catch (IllegalArgumentException exc) { logger.warn(exc.getMessage()); throw new OperationFailedException( "Username, password or server is null.", OperationFailedException.ILLEGAL_ARGUMENT); } catch (IllegalStateException exc) { logger.warn(exc.getMessage()); throw new OperationFailedException( "Account already exists.", OperationFailedException.IDENTIFICATION_CONFLICT); } catch (Exception exc) { logger.warn(exc.getMessage()); throw new OperationFailedException( "Failed to add account.", OperationFailedException.GENERAL_ERROR); } return protocolProvider; } /** * Fills the User ID and Password fields in this panel with the data coming * from the given protocolProvider. * @param protocolProvider The ProtocolProviderService to load the * data from. */ public void loadAccount(ProtocolProviderService protocolProvider) { setModification(true); this.protocolProvider = protocolProvider; this.registration = new JabberAccountRegistration(); this.firstWizardPage.loadAccount(protocolProvider); } /** * Returns the registration object, which will store all the data through * the wizard. * * @return the registration object, which will store all the data through * the wizard */ public JabberAccountRegistration getRegistration() { if (registration == null) registration = new JabberAccountRegistration(); return registration; } /** * Returns the size of this wizard. * @return the size of this wizard */ public Dimension getSize() { return new Dimension(300, 480); } /** * Returns the identifier of the page to show first in the wizard. * @return the identifier of the page to show first in the wizard. */ public Object getFirstPageIdentifier() { return firstWizardPage.getIdentifier(); } /** * Returns the identifier of the page to show last in the wizard. * @return the identifier of the page to show last in the wizard. */ public Object getLastPageIdentifier() { return firstWizardPage.getIdentifier(); } /** * Returns an example string, which should indicate to the user how the * user name should look like. * @return an example string, which should indicate to the user how the * user name should look like. */ public String getUserNameExample() { return "Ex: johnsmith@jabber.org"; } /** * Parse the server part from the jabber id and set it to server as default * value. If Advanced option is enabled Do nothing. * * @param userName the full JID that we'd like to parse. * * @return returns the server part of a full JID */ protected String getServerFromUserName(String userName) { int delimIndex = userName.indexOf("@"); if (delimIndex != -1) { String newServerAddr = userName.substring(delimIndex + 1); if (newServerAddr.equals(GOOGLE_USER_SUFFIX)) { return GOOGLE_CONNECT_SRV; } else { return newServerAddr; } } return null; } /** * Opens the Gmail signup URI in the OS's default browser. */ public void webSignup() { JabberAccRegWizzActivator.getBrowserLauncher() .openURL("https://register.jabber.org/"); } /** * Returns true if the web sign up is supported by the current * implementation, false - otherwise. * @return true if the web sign up is supported by the current * implementation, false - otherwise */ public boolean isWebSignupSupported() { return true; } /** * Returns a simple account registration form that would be the first form * shown to the user. Only if the user needs more settings she'll choose * to open the advanced wizard, consisted by all pages. * * @param isCreateAccount indicates if the simple form should be opened as * a create account form or as a login form * @return a simple account registration form */ public Object getSimpleForm(boolean isCreateAccount) { // when creating first wizard page, create and new // AccountRegistration to avoid reusing old instances and // data left from old registrations return getSimpleForm(new JabberAccountRegistration(), isCreateAccount); } /** * Returns the first wizard page. * * @param registration the registration object * @return the first wizard page. */ public Object getSimpleForm(JabberAccountRegistration registration, boolean isCreateAccount) { this.registration = registration; firstWizardPage = new FirstWizardPage(this); return firstWizardPage.getSimpleForm(); } /** * Returns the protocol name as listed in "ProtocolNames" or just the name * of the service. * @return the protocol name */ public String getProtocol() { return ProtocolNames.JABBER; } /** * Returns the protocol icon path. * @return the protocol icon path */ public String getProtocolIconPath() { return null; } /** * Returns the account icon path. * @return the account icon path */ public String getAccountIconPath() { return null; } /** * Returns an instance of CreateAccountService through which the * user could create an account. This method is meant to be implemented by * specific protocol provider wizards. * @return an instance of CreateAccountService */ protected JabberAccountCreationFormService getCreateAccountService() { return null; } /** * Returns the display label used for the jabber id field. * @return the jabber id display label string. */ protected String getUsernameLabel() { return Resources.getString("plugin.jabberaccregwizz.USERNAME"); } /** * Return the string for add existing account button. * @return the string for add existing account button. */ protected String getCreateAccountButtonLabel() { return Resources.getString( "plugin.jabberaccregwizz.NEW_ACCOUNT_TITLE"); } /** * Return the string for create new account button. * @return the string for create new account button. */ protected String getCreateAccountLabel() { return Resources.getString( "plugin.jabberaccregwizz.REGISTER_NEW_ACCOUNT_TEXT"); } /** * Return the string for home page link label. * @return the string for home page link label */ protected String getHomeLinkLabel() { return null; } }