/** @see DiscoveryServerService#mergeInventoryReport(InventoryReport) */
  @Override
  public MergeInventoryReportResults mergeInventoryReport(InventoryReport report)
      throws InvalidInventoryReportException, StaleTypeException {

    InventoryReportSerializer.getSingleton().lock(report.getAgent().getName());
    try {
      long start = System.currentTimeMillis();
      DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
      MergeInventoryReportResults results;
      try {
        results = discoveryBoss.mergeInventoryReport(report);
      } catch (StaleTypeException e) {
        // There is no need to log this exception as it is part of a normal work flow
        // that occurs as a result of a user deleting a plugin. DiscoveryBossBean
        // already logs a message about the stale types that can be useful for
        // debugging; so, we just need to propagate the exception to the agent.
        throw e;
      } catch (InvalidInventoryReportException e) {
        Agent agent = report.getAgent();
        if (log.isDebugEnabled()) {
          log.error("Received invalid inventory report from agent [" + agent + "]", e);
        } else {
          /*
           * this is expected when the platform is uninventoried, because the agent often has in-flight reports
           * going to the server at the time the platform's agent is being deleted from the database
           */
          log.error(
              "Received invalid inventory report from agent [" + agent + "]: " + e.getMessage());
        }
        throw e;
      } catch (RuntimeException e) {
        log.error(
            "Fatal error occurred during merging of inventory report from agent ["
                + report.getAgent()
                + "].",
            e);
        throw e;
      }

      long elapsed = (System.currentTimeMillis() - start);
      if (elapsed > 30000L) {
        log.warn("Performance: inventory merge (" + elapsed + ")ms");
      } else {
        if (log.isDebugEnabled()) {
          log.debug("Performance: inventory merge (" + elapsed + ")ms");
        }
      }

      return results;
    } finally {
      InventoryReportSerializer.getSingleton().unlock(report.getAgent().getName());
    }
  }
  @Override
  public Collection<ResourceSyncInfo> getResourceSyncInfo(int resourceId) {
    long start = System.currentTimeMillis();
    DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
    Collection<ResourceSyncInfo> results;

    results = discoveryBoss.getResourceSyncInfo(resourceId);

    long elapsed = (System.currentTimeMillis() - start);
    if (elapsed > 30000L) {
      log.warn("Performance: get resource sync info (" + elapsed + ")ms");
    } else {
      if (log.isDebugEnabled()) {
        log.debug("Performance: get resource sync info (" + elapsed + ")ms");
      }
    }

    return results;
  }
 @Override
 public Set<ResourceUpgradeResponse> upgradeResources(
     Set<ResourceUpgradeRequest> upgradeRequests) {
   DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
   return discoveryBoss.upgradeResources(upgradeRequests);
 }
 @Override
 public boolean updateResourceVersion(int resourceId, String version) {
   DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
   return discoveryBoss.updateResourceVersion(resourceId, version);
 }
 @Override
 public MergeResourceResponse addResource(Resource resource, int creatorSubjectId) {
   DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
   return discoveryBoss.addResource(resource, creatorSubjectId);
 }