diff options
Diffstat (limited to 'src/net/java/sip/communicator/service/protocol/AccountManagerUtils.java')
-rw-r--r-- | src/net/java/sip/communicator/service/protocol/AccountManagerUtils.java | 332 |
1 files changed, 166 insertions, 166 deletions
diff --git a/src/net/java/sip/communicator/service/protocol/AccountManagerUtils.java b/src/net/java/sip/communicator/service/protocol/AccountManagerUtils.java index 5b64e06..1400a2d 100644 --- a/src/net/java/sip/communicator/service/protocol/AccountManagerUtils.java +++ b/src/net/java/sip/communicator/service/protocol/AccountManagerUtils.java @@ -1,4 +1,4 @@ -/*
+/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd @@ -15,168 +15,168 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.java.sip.communicator.service.protocol;
-
-import java.util.*;
-
-import net.java.sip.communicator.service.protocol.event.*;
-
-import org.osgi.framework.*;
-
-/**
- * Provides utilities to aid the manipulation of {@link AccountManager}.
- *
- * @author Lyubomir Marinov
- */
-public final class AccountManagerUtils
-{
- private static AccountManager getAccountManager(BundleContext bundleContext)
- {
- return
- bundleContext.getService(
- bundleContext.getServiceReference(AccountManager.class));
- }
-
- /**
- * Starts a specific <code>Bundle</code> and waits for the
- * <code>AccountManager</code> available in a specific
- * <code>BundleContext</code> to load the stored accounts of a
- * <code>ProtocolProviderFactory</code> with a specific protocol name.
- *
- * @param bundleContextWithAccountManager
- * the <code>BundleContext</code> in which an
- * <code>AccountManager</code> service is registered
- * @param bundleToStart
- * the <code>Bundle</code> to be started
- * @param protocolNameToWait
- * the protocol name of a <code>ProtocolProviderFactory</code> to
- * wait the end of the loading of the stored accounts for
- * @throws BundleException
- * @throws InterruptedException
- * if any thread interrupted the current thread before or while
- * the current thread was waiting for the loading of the stored
- * accounts
- */
- public static void startBundleAndWaitStoredAccountsLoaded(
- BundleContext bundleContextWithAccountManager,
- final Bundle bundleToStart,
- final String protocolNameToWait)
- throws BundleException,
- InterruptedException
- {
- AccountManager accountManager
- = getAccountManager(bundleContextWithAccountManager);
- final boolean[] storedAccountsAreLoaded = new boolean[1];
- AccountManagerListener listener = new AccountManagerListener()
- {
- public void handleAccountManagerEvent(AccountManagerEvent event)
- {
- if (AccountManagerEvent.STORED_ACCOUNTS_LOADED
- != event.getType())
- return;
-
- ProtocolProviderFactory factory = event.getFactory();
-
- /*
- * If the event is for a factory with a protocol name other than
- * protocolNameToWait, it's not the one we're waiting for.
- */
- if ((factory != null)
- && !protocolNameToWait
- .equals(factory.getProtocolName()))
- return;
-
- /*
- * If the event if for a factory which is no longer registered,
- * then it's not the one we're waiting for because we're waiting
- * for the specified bundle to start and register a factory.
- */
- if (factory != null)
- {
- BundleContext bundleContext
- = bundleToStart.getBundleContext();
-
- /*
- * If the specified bundle still hasn't started, the event
- * cannot be the one we're waiting for.
- */
- if (bundleContext == null)
- return;
-
- Collection<ServiceReference<ProtocolProviderFactory>> factoryRefs;
-
- try
- {
- factoryRefs
- = bundleContext.getServiceReferences(
- ProtocolProviderFactory.class,
- "("
- + ProtocolProviderFactory.PROTOCOL
- + "="
- + protocolNameToWait
- + ")");
- }
- catch (InvalidSyntaxException isex)
- {
- /*
- * Not likely so ignore it and assume the event is for
- * a valid factory.
- */
- factoryRefs = null;
- }
- if ((factoryRefs != null) && !factoryRefs.isEmpty())
- {
- boolean factoryIsRegistered = false;
-
- for (ServiceReference<ProtocolProviderFactory> factoryRef
- : factoryRefs)
- {
- if (factory == bundleContext.getService(factoryRef))
- {
- factoryIsRegistered = true;
- break;
- }
- }
- if (!factoryIsRegistered)
- return;
- }
- }
-
- synchronized (storedAccountsAreLoaded)
- {
- storedAccountsAreLoaded[0] = true;
- storedAccountsAreLoaded.notify();
- }
- }
- };
-
- accountManager.addListener(listener);
- try
- {
- bundleToStart.start();
-
- while (true)
- {
- synchronized (storedAccountsAreLoaded)
- {
- if (storedAccountsAreLoaded[0])
- {
- break;
- }
- storedAccountsAreLoaded.wait();
- }
- }
- }
- finally
- {
- accountManager.removeListener(listener);
- }
- }
-
- /**
- * Prevents the creation of <code>AccountManagerUtils</code> instances.
- */
- private AccountManagerUtils()
- {
- }
-}
+package net.java.sip.communicator.service.protocol; + +import java.util.*; + +import net.java.sip.communicator.service.protocol.event.*; + +import org.osgi.framework.*; + +/** + * Provides utilities to aid the manipulation of {@link AccountManager}. + * + * @author Lyubomir Marinov + */ +public final class AccountManagerUtils +{ + private static AccountManager getAccountManager(BundleContext bundleContext) + { + return + bundleContext.getService( + bundleContext.getServiceReference(AccountManager.class)); + } + + /** + * Starts a specific <code>Bundle</code> and waits for the + * <code>AccountManager</code> available in a specific + * <code>BundleContext</code> to load the stored accounts of a + * <code>ProtocolProviderFactory</code> with a specific protocol name. + * + * @param bundleContextWithAccountManager + * the <code>BundleContext</code> in which an + * <code>AccountManager</code> service is registered + * @param bundleToStart + * the <code>Bundle</code> to be started + * @param protocolNameToWait + * the protocol name of a <code>ProtocolProviderFactory</code> to + * wait the end of the loading of the stored accounts for + * @throws BundleException + * @throws InterruptedException + * if any thread interrupted the current thread before or while + * the current thread was waiting for the loading of the stored + * accounts + */ + public static void startBundleAndWaitStoredAccountsLoaded( + BundleContext bundleContextWithAccountManager, + final Bundle bundleToStart, + final String protocolNameToWait) + throws BundleException, + InterruptedException + { + AccountManager accountManager + = getAccountManager(bundleContextWithAccountManager); + final boolean[] storedAccountsAreLoaded = new boolean[1]; + AccountManagerListener listener = new AccountManagerListener() + { + public void handleAccountManagerEvent(AccountManagerEvent event) + { + if (AccountManagerEvent.STORED_ACCOUNTS_LOADED + != event.getType()) + return; + + ProtocolProviderFactory factory = event.getFactory(); + + /* + * If the event is for a factory with a protocol name other than + * protocolNameToWait, it's not the one we're waiting for. + */ + if ((factory != null) + && !protocolNameToWait + .equals(factory.getProtocolName())) + return; + + /* + * If the event if for a factory which is no longer registered, + * then it's not the one we're waiting for because we're waiting + * for the specified bundle to start and register a factory. + */ + if (factory != null) + { + BundleContext bundleContext + = bundleToStart.getBundleContext(); + + /* + * If the specified bundle still hasn't started, the event + * cannot be the one we're waiting for. + */ + if (bundleContext == null) + return; + + Collection<ServiceReference<ProtocolProviderFactory>> factoryRefs; + + try + { + factoryRefs + = bundleContext.getServiceReferences( + ProtocolProviderFactory.class, + "(" + + ProtocolProviderFactory.PROTOCOL + + "=" + + protocolNameToWait + + ")"); + } + catch (InvalidSyntaxException isex) + { + /* + * Not likely so ignore it and assume the event is for + * a valid factory. + */ + factoryRefs = null; + } + if ((factoryRefs != null) && !factoryRefs.isEmpty()) + { + boolean factoryIsRegistered = false; + + for (ServiceReference<ProtocolProviderFactory> factoryRef + : factoryRefs) + { + if (factory == bundleContext.getService(factoryRef)) + { + factoryIsRegistered = true; + break; + } + } + if (!factoryIsRegistered) + return; + } + } + + synchronized (storedAccountsAreLoaded) + { + storedAccountsAreLoaded[0] = true; + storedAccountsAreLoaded.notify(); + } + } + }; + + accountManager.addListener(listener); + try + { + bundleToStart.start(); + + while (true) + { + synchronized (storedAccountsAreLoaded) + { + if (storedAccountsAreLoaded[0]) + { + break; + } + storedAccountsAreLoaded.wait(); + } + } + } + finally + { + accountManager.removeListener(listener); + } + } + + /** + * Prevents the creation of <code>AccountManagerUtils</code> instances. + */ + private AccountManagerUtils() + { + } +} |