protected void addRepositoryDetails(
      Request request, SearchNGResponse response, Repository repository) {
    boolean add = true;

    for (NexusNGRepositoryDetail repoDetail : response.getRepoDetails()) {
      if (repoDetail.getRepositoryId().equals(repository.getId())) {
        add = false;
        break;
      }
    }

    if (add) {
      NexusNGRepositoryDetail repoDetail = new NexusNGRepositoryDetail();

      repoDetail.setRepositoryId(repository.getId());

      repoDetail.setRepositoryName(repository.getName());

      repoDetail.setRepositoryURL(
          createRepositoryReference(request, repository.getId()).getTargetRef().toString());

      repoDetail.setRepositoryContentClass(repository.getRepositoryContentClass().getId());

      repoDetail.setRepositoryKind(extractRepositoryKind(repository));

      MavenRepository mavenRepo = repository.adaptToFacet(MavenRepository.class);

      if (mavenRepo != null) {
        repoDetail.setRepositoryPolicy(mavenRepo.getRepositoryPolicy().name());
      }

      response.addRepoDetail(repoDetail);
    }
  }
Пример #2
0
    public boolean releaseExistsForSnapshot(Gav snapshotGav, Map<String, Object> context) {
      for (Repository repository : repositoryRegistry.getRepositories()) {
        // we need to filter for:
        // repository that is MavenRepository and is hosted or proxy
        // repository that has release policy
        if (repository.getRepositoryKind().isFacetAvailable(MavenHostedRepository.class)
            || repository.getRepositoryKind().isFacetAvailable(MavenProxyRepository.class)) {
          // actually, we don't care is it proxy or hosted, we only need to filter out groups and
          // other
          // "composite" reposes like shadows
          MavenRepository mrepository = repository.adaptToFacet(MavenRepository.class);

          // look in release reposes only
          if (mrepository.isUserManaged()
              && RepositoryPolicy.RELEASE.equals(mrepository.getRepositoryPolicy())) {
            try {
              String releaseVersion = null;

              // NEXUS-3148
              if (snapshotGav.getBaseVersion().endsWith("-SNAPSHOT")) {
                // "-SNAPSHOT" :== 9 chars
                releaseVersion =
                    snapshotGav
                        .getBaseVersion()
                        .substring(0, snapshotGav.getBaseVersion().length() - 9);
              } else {
                // "SNAPSHOT" :== 8 chars
                releaseVersion =
                    snapshotGav
                        .getBaseVersion()
                        .substring(0, snapshotGav.getBaseVersion().length() - 8);
              }

              Gav releaseGav =
                  new Gav(
                      snapshotGav.getGroupId(),
                      snapshotGav.getArtifactId(),
                      releaseVersion,
                      snapshotGav.getClassifier(),
                      snapshotGav.getExtension(),
                      null,
                      null,
                      null,
                      false,
                      null,
                      false,
                      null);

              String path = mrepository.getGavCalculator().gavToPath(releaseGav);

              ResourceStoreRequest req = new ResourceStoreRequest(path, true);

              req.getRequestContext().putAll(context);

              mrepository.retrieveItem(false, req);

              return true;
            } catch (ItemNotFoundException e) {
              // nothing
            } catch (Exception e) {
              // nothing
            }
          }
        }
      }

      return false;
    }
Пример #3
0
  /**
   * Removes the snapshots from maven repository.
   *
   * @param repository the repository
   * @throws Exception the exception
   */
  protected SnapshotRemovalRepositoryResult removeSnapshotsFromMavenRepository(
      MavenRepository repository, SnapshotRemovalRequest request) {
    TaskUtil.checkInterruption();

    SnapshotRemovalRepositoryResult result =
        new SnapshotRemovalRepositoryResult(repository.getId(), 0, 0, true);

    if (!repository.getLocalStatus().shouldServiceRequest()) {
      return result;
    }

    // we are already processed here, so skip repo
    if (request.isProcessedRepo(repository.getId())) {
      return new SnapshotRemovalRepositoryResult(repository.getId(), true);
    }

    request.addProcessedRepo(repository.getId());

    // if this is not snap repo, do nothing
    if (!RepositoryPolicy.SNAPSHOT.equals(repository.getRepositoryPolicy())) {
      return result;
    }

    if (getLogger().isDebugEnabled()) {
      getLogger()
          .debug(
              "Collecting deletable snapshots on repository "
                  + repository.getId()
                  + " from storage directory "
                  + repository.getLocalUrl());
    }

    request.getMetadataRebuildPaths().clear();

    // create a walker to collect deletables and let it loose on collections only
    SnapshotRemoverWalkerProcessor snapshotRemoveProcessor =
        new SnapshotRemoverWalkerProcessor(repository, request);

    DefaultWalkerContext ctxMain =
        new DefaultWalkerContext(
            repository, new ResourceStoreRequest("/"), new DottedStoreWalkerFilter());

    ctxMain.getProcessors().add(snapshotRemoveProcessor);

    walker.walk(ctxMain);

    if (ctxMain.getStopCause() != null) {
      result.setSuccessful(false);
    }

    // and collect results
    result.setDeletedSnapshots(snapshotRemoveProcessor.getDeletedSnapshots());
    result.setDeletedFiles(snapshotRemoveProcessor.getDeletedFiles());

    if (getLogger().isDebugEnabled()) {
      getLogger()
          .debug(
              "Collected and deleted "
                  + snapshotRemoveProcessor.getDeletedSnapshots()
                  + " snapshots with alltogether "
                  + snapshotRemoveProcessor.getDeletedFiles()
                  + " files on repository "
                  + repository.getId());
    }

    repository.expireCaches(new ResourceStoreRequest(RepositoryItemUid.PATH_ROOT));

    RecreateMavenMetadataWalkerProcessor metadataRebuildProcessor =
        new RecreateMavenMetadataWalkerProcessor(getLogger());

    for (String path : request.getMetadataRebuildPaths()) {
      DefaultWalkerContext ctxMd =
          new DefaultWalkerContext(
              repository, new ResourceStoreRequest(path), new DottedStoreWalkerFilter());

      ctxMd.getProcessors().add(metadataRebuildProcessor);

      try {
        walker.walk(ctxMd);
      } catch (WalkerException e) {
        if (!(e.getCause() instanceof ItemNotFoundException)) {
          // do not ignore it
          throw e;
        }
      }
    }

    return result;
  }
  @Override
  public Object upload(Context context, Request request, Response response, List<FileItem> files)
      throws ResourceException {
    // we have "nibbles": (params,fileA,[fileB])+
    // the second file is optional
    // if two files are present, one of them should be POM
    String repositoryId = null;

    boolean hasPom = false;

    boolean isPom = false;

    InputStream is = null;

    String groupId = null;

    String artifactId = null;

    String version = null;

    String classifier = null;

    String packaging = null;

    String extension = null;

    ArtifactCoordinate coords = null;

    PomArtifactManager pomManager =
        new PomArtifactManager(getNexus().getNexusConfiguration().getTemporaryDirectory());

    try {
      for (FileItem fi : files) {
        if (fi.isFormField()) {
          // a parameter
          if ("r".equals(fi.getFieldName())) {
            repositoryId = fi.getString();
          } else if ("g".equals(fi.getFieldName())) {
            groupId = fi.getString();
          } else if ("a".equals(fi.getFieldName())) {
            artifactId = fi.getString();
          } else if ("v".equals(fi.getFieldName())) {
            version = fi.getString();
          } else if ("p".equals(fi.getFieldName())) {
            packaging = fi.getString();
          } else if ("c".equals(fi.getFieldName())) {
            classifier = fi.getString();
          } else if ("e".equals(fi.getFieldName())) {
            extension = fi.getString();
          } else if ("hasPom".equals(fi.getFieldName())) {
            hasPom = Boolean.parseBoolean(fi.getString());
          }

          coords = new ArtifactCoordinate();
          coords.setGroupId(groupId);
          coords.setArtifactId(artifactId);
          coords.setVersion(version);
          coords.setPackaging(packaging);
        } else {
          // a file
          isPom = fi.getName().endsWith(".pom") || fi.getName().endsWith("pom.xml");

          ArtifactStoreRequest gavRequest = null;

          if (hasPom) {
            if (isPom) {
              // let it "thru" the pomManager to be able to get GAV from it on later pass
              pomManager.storeTempPomFile(fi.getInputStream());

              is = pomManager.getTempPomFileInputStream();
            } else {
              is = fi.getInputStream();
            }

            try {
              coords = pomManager.getArtifactCoordinateFromTempPomFile();
            } catch (IOException e) {
              getLogger().info(e.getMessage());

              throw new ResourceException(
                  Status.CLIENT_ERROR_BAD_REQUEST,
                  "Error occurred while reading the POM file. Malformed POM?");
            }

            if (isPom) {
              gavRequest =
                  getResourceStoreRequest(
                      request,
                      true,
                      repositoryId,
                      coords.getGroupId(),
                      coords.getArtifactId(),
                      coords.getVersion(),
                      coords.getPackaging(),
                      null,
                      null);
            } else {
              gavRequest =
                  getResourceStoreRequest(
                      request,
                      true,
                      repositoryId,
                      coords.getGroupId(),
                      coords.getArtifactId(),
                      coords.getVersion(),
                      coords.getPackaging(),
                      classifier,
                      extension);
            }
          } else {
            is = fi.getInputStream();

            gavRequest =
                getResourceStoreRequest(
                    request,
                    true,
                    repositoryId,
                    groupId,
                    artifactId,
                    version,
                    packaging,
                    classifier,
                    extension);
          }

          MavenRepository mr = gavRequest.getMavenRepository();

          ArtifactStoreHelper helper = mr.getArtifactStoreHelper();

          // temporarily we disable SNAPSHOT upload
          // check is it a Snapshot repo
          if (RepositoryPolicy.SNAPSHOT.equals(mr.getRepositoryPolicy())) {
            getLogger()
                .info("Upload to SNAPSHOT maven repository attempted, returning Bad Request.");

            throw new ResourceException(
                Status.CLIENT_ERROR_BAD_REQUEST,
                "This is a Maven SNAPSHOT repository, and manual upload against it is forbidden!");
          }

          if (!versionMatchesPolicy(gavRequest.getVersion(), mr.getRepositoryPolicy())) {
            getLogger()
                .warn("Version (" + gavRequest.getVersion() + ") and Repository Policy mismatch");
            throw new ResourceException(
                Status.CLIENT_ERROR_BAD_REQUEST,
                "The version "
                    + gavRequest.getVersion()
                    + " does not match the repository policy!");
          }

          if (isPom) {
            helper.storeArtifactPom(gavRequest, is, null);

            isPom = false;
          } else {
            if (hasPom) {
              helper.storeArtifact(gavRequest, is, null);
            } else {
              helper.storeArtifactWithGeneratedPom(gavRequest, packaging, is, null);
            }
          }
        }
      }
    } catch (Throwable t) {
      return buildUploadFailedHtmlResponse(t, request, response);
    } finally {
      if (hasPom) {
        pomManager.removeTempPomFile();
      }
    }

    return coords;
  }