private long _initCompany(ServletContext servletContext, String webId) {

    // Begin initializing company

    if (_log.isDebugEnabled()) {
      _log.debug("Begin initializing company with web id " + webId);
    }

    long companyId = 0;

    try {
      Company company = CompanyLocalServiceUtil.checkCompany(webId);

      companyId = company.getCompanyId();
    } catch (Exception e) {
      _log.error(e, e);
    }

    CompanyThreadLocal.setCompanyId(companyId);

    // Lucene

    LuceneHelperUtil.startup(companyId);

    // Initialize display

    if (_log.isDebugEnabled()) {
      _log.debug("Initialize display");
    }

    try {
      String xml = HttpUtil.URLtoString(servletContext.getResource("/WEB-INF/liferay-display.xml"));

      PortletCategory portletCategory =
          (PortletCategory) WebAppPool.get(companyId, WebKeys.PORTLET_CATEGORY);

      if (portletCategory == null) {
        portletCategory = new PortletCategory();
      }

      PortletCategory newPortletCategory = PortletLocalServiceUtil.getEARDisplay(xml);

      portletCategory.merge(newPortletCategory);

      for (int i = 0; i < _companyIds.length; i++) {
        long currentCompanyId = _companyIds[i];

        PortletCategory currentPortletCategory =
            (PortletCategory) WebAppPool.get(currentCompanyId, WebKeys.PORTLET_CATEGORY);

        if (currentPortletCategory != null) {
          portletCategory.merge(currentPortletCategory);
        }
      }

      WebAppPool.put(companyId, WebKeys.PORTLET_CATEGORY, portletCategory);
    } catch (Exception e) {
      _log.error(e, e);
    }

    // Check journal content search

    if (_log.isDebugEnabled()) {
      _log.debug("Check journal content search");
    }

    if (GetterUtil.getBoolean(PropsUtil.get(PropsKeys.JOURNAL_SYNC_CONTENT_SEARCH_ON_STARTUP))) {

      try {
        JournalContentSearchLocalServiceUtil.checkContentSearches(companyId);
      } catch (Exception e) {
        _log.error(e, e);
      }
    }

    // Process application startup events

    if (_log.isDebugEnabled()) {
      _log.debug("Process application startup events");
    }

    try {
      EventsProcessorUtil.process(
          PropsKeys.APPLICATION_STARTUP_EVENTS,
          PropsValues.APPLICATION_STARTUP_EVENTS,
          new String[] {String.valueOf(companyId)});
    } catch (Exception e) {
      _log.error(e, e);
    }

    // End initializing company

    if (_log.isDebugEnabled()) {
      _log.debug("End initializing company with web id " + webId + " and company id " + companyId);
    }

    addCompanyId(companyId);

    return companyId;
  }
  protected void reindex(ActionRequest actionRequest) throws Exception {
    String portletId = ParamUtil.getString(actionRequest, "portletId");

    long[] companyIds = PortalInstances.getCompanyIds();

    if (LuceneHelperUtil.isLoadIndexFromClusterEnabled()) {
      MessageValuesThreadLocal.setValue(ClusterLink.CLUSTER_FORWARD_MESSAGE, true);
    }

    Set<String> usedSearchEngineIds = new HashSet<String>();

    if (Validator.isNull(portletId)) {
      for (long companyId : companyIds) {
        try {
          LuceneIndexer luceneIndexer = new LuceneIndexer(companyId);

          luceneIndexer.reindex();

          usedSearchEngineIds.addAll(luceneIndexer.getUsedSearchEngineIds());
        } catch (Exception e) {
          _log.error(e, e);
        }
      }
    } else {
      Portlet portlet = PortletLocalServiceUtil.getPortletById(companyIds[0], portletId);

      if (portlet == null) {
        return;
      }

      List<Indexer> indexers = portlet.getIndexerInstances();

      if (indexers == null) {
        return;
      }

      Set<String> searchEngineIds = new HashSet<String>();

      for (Indexer indexer : indexers) {
        searchEngineIds.add(indexer.getSearchEngineId());
      }

      for (String searchEngineId : searchEngineIds) {
        for (long companyId : companyIds) {
          SearchEngineUtil.deletePortletDocuments(searchEngineId, companyId, portletId);
        }
      }

      for (Indexer indexer : indexers) {
        for (long companyId : companyIds) {
          ShardUtil.pushCompanyService(companyId);

          try {
            indexer.reindex(new String[] {String.valueOf(companyId)});

            usedSearchEngineIds.add(indexer.getSearchEngineId());
          } catch (Exception e) {
            _log.error(e, e);
          } finally {
            ShardUtil.popCompanyService();
          }
        }
      }
    }

    if (LuceneHelperUtil.isLoadIndexFromClusterEnabled()) {
      Set<BaseAsyncDestination> searchWriterDestinations = new HashSet<BaseAsyncDestination>();

      MessageBus messageBus = MessageBusUtil.getMessageBus();

      for (String usedSearchEngineId : usedSearchEngineIds) {
        String searchWriterDestinationName =
            SearchEngineUtil.getSearchWriterDestinationName(usedSearchEngineId);

        Destination destination = messageBus.getDestination(searchWriterDestinationName);

        if (destination instanceof BaseAsyncDestination) {
          BaseAsyncDestination baseAsyncDestination = (BaseAsyncDestination) destination;

          searchWriterDestinations.add(baseAsyncDestination);
        }
      }

      submitClusterIndexLoadingSyncJob(searchWriterDestinations, companyIds);
    }
  }