Exemplo n.º 1
0
  public List<StorageItem> doRetrieveItems(ResourceStoreRequest request)
      throws GroupItemNotFoundException, StorageException {
    ArrayList<StorageItem> items = new ArrayList<StorageItem>();

    RepositoryItemUid uid = createUid(request.getRequestPath());

    final boolean isRequestGroupLocalOnly =
        request.isRequestGroupLocalOnly()
            || uid.getBooleanAttributeValue(IsGroupLocalOnlyAttribute.class);

    final HashMap<Repository, Throwable> memberThrowables = new HashMap<Repository, Throwable>();

    if (!isRequestGroupLocalOnly) {
      if (USE_CHARGER_FOR_GROUP_REQUESTS) {
        List<Callable<StorageItem>> callables = new ArrayList<Callable<StorageItem>>();

        for (Repository repository : getRequestRepositories(request)) {
          if (!request.getProcessedRepositories().contains(repository.getId())) {
            callables.add(new ItemRetrieveCallable(getLogger(), repository, request));
          } else {
            if (getLogger().isDebugEnabled()) {
              getLogger()
                  .debug(
                      String.format(
                          "Repository %s member of group %s was already processed during this request! Skipping it from processing. Request: %s",
                          RepositoryStringUtils.getHumanizedNameString(repository),
                          RepositoryStringUtils.getHumanizedNameString(this),
                          request.toString()));
            }
          }
        }

        try {
          return chargerHolder
              .getCharger()
              .submit(callables, new AllArrivedChargeStrategy<StorageItem>(), this)
              .getResult();
        } catch (RejectedExecutionException e) {
          // this will not happen
        } catch (StorageException e) {
          throw e;
        } catch (Exception e) {
          // will not happen, ItemRetrieveCallable supresses all except StorageException!
          // just to make compiler happy
          throw new LocalStorageException("Ouch!", e);
        }
      } else {
        for (Repository repository : getRequestRepositories(request)) {
          if (!request.getProcessedRepositories().contains(repository.getId())) {
            try {
              StorageItem item = repository.retrieveItem(false, request);

              items.add(item);
            } catch (ItemNotFoundException e) {
              // ignored, but bookkeeping happens now
              memberThrowables.put(repository, e);
            } catch (RepositoryNotAvailableException e) {
              if (getLogger().isDebugEnabled()) {
                getLogger()
                    .debug(
                        RepositoryStringUtils.getFormattedMessage(
                            "Member repository %s is not available, request failed.",
                            e.getRepository()));
              }
              // ignored, but bookkeeping happens now
              memberThrowables.put(repository, e);
            } catch (StorageException e) {
              throw e;
            } catch (IllegalOperationException e) {
              getLogger().warn("Member repository request failed", e);
              // ignored, but bookkeeping happens now
              memberThrowables.put(repository, e);
            }
          } else {
            if (getLogger().isDebugEnabled()) {
              getLogger()
                  .debug(
                      String.format(
                          "Repository %s member of group %s was already processed during this request! Skipping it from processing. Request: %s",
                          RepositoryStringUtils.getHumanizedNameString(repository),
                          RepositoryStringUtils.getHumanizedNameString(this),
                          request.toString()));
            }
          }
        }
      }
    }

    if (items.isEmpty()) {
      if (!isRequestGroupLocalOnly) {
        throw new GroupItemNotFoundException(request, this, memberThrowables);
      } else {
        throw new GroupItemNotFoundException(
            reasonFor(
                request,
                this,
                "The %s not found in local storage of group repository %s (no member processing happened).",
                request.getRequestPath(),
                this),
            memberThrowables);
      }
    }

    return items;
  }