// Only do once, because components are stored statically within various classes,
  // which causes problems with changing genetics mocks
  @BeforeClass
  @SuppressWarnings("unchecked")
  public static void setupComponents() throws ComponentLookupException, CacheException {
    ComponentManager componentManager = mock(ComponentManager.class);
    Provider<ComponentManager> mockProvider = mock(Provider.class);
    // This is a bit fragile, let's hope the field name doesn't change
    ReflectionUtils.setFieldValue(new ComponentManagerRegistry(), "cmProvider", mockProvider);
    when(mockProvider.get()).thenReturn(componentManager);

    CacheManager cacheManager = mock(CacheManager.class);
    when(componentManager.getInstance(CacheManager.class)).thenReturn(cacheManager);

    CacheFactory cacheFactory = mock(CacheFactory.class);
    when(cacheManager.getLocalCacheFactory()).thenReturn(cacheFactory);

    Cache<Exome> cache = mock(Cache.class);
    doReturn(cache).when(cacheFactory).newCache(Matchers.any(CacheConfiguration.class));
    doReturn(null).when(cache).get(Matchers.anyString());

    // Wire up mocked genetics
    exomeManager = mock(ExomeManager.class);
    when(componentManager.getInstance(ExomeManager.class, "exomiser")).thenReturn(exomeManager);

    // Use a real GenotypeManager
    PatientGenotypeManager genotypeManager = new DefaultPatientGenotypeManager();
    when(componentManager.getInstance(PatientGenotypeManager.class)).thenReturn(genotypeManager);
  }
  /**
   * Allow to retrieve the total count of items for the given query instead of the actual results.
   * This method will only work for queries selecting document full names, see {@link CountFilter}
   * for more information.
   *
   * @return the total number of results for this query.
   */
  public long count() {
    long result = -1;

    try {
      // Create a copy of the wrapped query.
      QueryManager queryManager = (QueryManager) componentManager.getInstance(QueryManager.class);
      Query countQuery = queryManager.createQuery(getStatement(), getLanguage());
      countQuery.setWiki(getWiki());
      for (Map.Entry<Integer, Object> entry : getPositionalParameters().entrySet()) {
        countQuery.bindValue(entry.getKey(), entry.getValue());
      }
      for (Map.Entry<String, Object> entry : getNamedParameters().entrySet()) {
        countQuery.bindValue(entry.getKey(), entry.getValue());
      }
      for (QueryFilter filter : getFilters()) {
        countQuery.addFilter(filter);
      }

      // Add the count filter to it.
      countQuery.addFilter(componentManager.<QueryFilter>getInstance(QueryFilter.class, "count"));

      // Execute and retrieve the count result.
      List<Long> results = countQuery.execute();
      result = results.get(0);
    } catch (Exception e) {
      LOGGER.warn("Failed to create count query for query [{}]", getStatement());
      e.printStackTrace();
    }

    return result;
  }
 @Override
 public boolean authenticate(String username, Object password) throws Exception {
   boolean isAuthenticated = false;
   ComponentManager componentManager =
       (ComponentManager) getContext().getAttributes().get("componentManager");
   try {
     CrashConfiguration configuration = componentManager.getInstance(CrashConfiguration.class);
     CrashAuthentication authentication =
         componentManager.getInstance(
             CrashAuthentication.class, configuration.getAuthentication());
     isAuthenticated = authentication.authenticate(username, (String) password, getContext());
   } catch (Exception e) {
     // Nothing to do, isAuthenticated is false by default
   }
   return isAuthenticated;
 }
 /**
  * {@inheritDoc}
  *
  * @throws ComponentLookupException
  * @see org.xwiki.contrib.mail.IMailComponent#getMailReader(java.lang.String, int,
  *     java.lang.String, java.lang.String, java.lang.String, java.util.Properties)
  */
 @Override
 public IMailReader getMailReader(
     final String hostname,
     final int port,
     final String protocol,
     final String username,
     final String password,
     final Properties additionalProperties,
     final Boolean isAutoTrustSslCertificates)
     throws ComponentLookupException {
   final IMailReader reader = componentManager.getInstance(IMailReader.class);
   final ServerAccountSource source =
       new ServerAccountSource(
           hostname,
           port,
           protocol,
           username,
           password,
           additionalProperties,
           isAutoTrustSslCertificates);
   reader.setMailSource(source);
   return reader;
 }
  /**
   * An Event Listener Component has been dynamically registered in the system, add it to our cache.
   *
   * @param event event object containing the new component descriptor
   * @param componentManager the {@link ComponentManager} where the descriptor is registered
   * @param descriptor the component descriptor removed from component manager
   */
  private void onEventListenerComponentAdded(
      ComponentDescriptorAddedEvent event,
      ComponentManager componentManager,
      ComponentDescriptor<EventListener> descriptor) {
    try {
      EventListener eventListener =
          componentManager.getInstance(EventListener.class, event.getRoleHint());

      if (getListener(eventListener.getName()) != eventListener) {
        addListener(eventListener);
      } else {
        this.logger.warn(
            "An Event Listener named [{}] already exists, ignoring the [{}] component",
            eventListener.getName(),
            descriptor.getImplementation().getName());
      }
    } catch (ComponentLookupException e) {
      this.logger.error(
          "Failed to lookup the Event Listener [{}] corresponding to the Component registration "
              + "event for [{}]. Ignoring the event",
          new Object[] {event.getRoleHint(), descriptor.getImplementation().getName(), e});
    }
  }
 /**
  * {@inheritDoc}
  *
  * @see
  *     org.xwiki.contrib.mail.IMailComponent#getMailReader(org.xwiki.contrib.mail.internal.source.ServerAccountSource)
  */
 @Override
 public IMailReader getMailReader(ServerAccountSource source) throws ComponentLookupException {
   final IMailReader reader = componentManager.getInstance(IMailReader.class);
   reader.setMailSource(source);
   return reader;
 }