/** * Gets the artifact type from the resource. * * @param gavInfo * @param archiveType */ private ArtifactType getArtifactType(MavenGavInfo gavInfo, String archiveType) { String customAT = getParamFromRepositoryUrl("artifactType"); // $NON-NLS-1$ if (gavInfo.getType().equals("pom")) { // $NON-NLS-1$ return ArtifactType.valueOf("MavenPom"); // $NON-NLS-1$ } else if (isPrimaryArtifact(gavInfo) && customAT != null) { return ArtifactType.valueOf(customAT); } else if (isPrimaryArtifact(gavInfo) && archiveType != null) { return ArtifactType.valueOf("ext", archiveType, true); // $NON-NLS-1$ } else if ("jar".equals(gavInfo.getType())) { // $NON-NLS-1$ return ArtifactType.valueOf(JavaModel.TYPE_ARCHIVE); } else if ("xml".equals(gavInfo.getType())) { // $NON-NLS-1$ return ArtifactType.XmlDocument(); } else { return ArtifactType.valueOf(ArtifactTypeEnum.Document.name()); } }
/** * Gets the hash data from the s-ramp repository and stores it in the {@link InputData} for use by * Maven. * * @param gavInfo * @param inputData * @throws TransferFailedException * @throws ResourceDoesNotExistException * @throws AuthorizationException */ private void doGetHash(MavenGavInfo gavInfo, InputData inputData) throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException { String artyPath = gavInfo.getFullName(); String hashPropName; if (gavInfo.getType().endsWith(".md5")) { // $NON-NLS-1$ hashPropName = "maven.hash.md5"; // $NON-NLS-1$ artyPath = artyPath.substring(0, artyPath.length() - 4); } else { hashPropName = "maven.hash.sha1"; // $NON-NLS-1$ artyPath = artyPath.substring(0, artyPath.length() - 5); } // See the comment in {@link SrampWagon#fillInputData(InputData)} about why we're doing this // context classloader magic. ClassLoader oldCtxCL = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(SrampWagon.class.getClassLoader()); try { SrampArchiveEntry entry = this.archive.getEntry(artyPath); if (entry == null) { throw new ResourceDoesNotExistException( Messages.i18n.format("MISSING_RESOURCE_HASH", gavInfo.getName())); // $NON-NLS-1$ } BaseArtifactType metaData = entry.getMetaData(); String hashValue = SrampModelUtils.getCustomProperty(metaData, hashPropName); if (hashValue == null) { throw new ResourceDoesNotExistException( Messages.i18n.format("MISSING_RESOURCE_HASH", gavInfo.getName())); // $NON-NLS-1$ } inputData.setInputStream(IOUtils.toInputStream(hashValue)); } finally { Thread.currentThread().setContextClassLoader(oldCtxCL); } }
/** * Updates an artifact by storing its hash value as an S-RAMP property. * * @param gavInfo * @param resourceInputStream * @throws TransferFailedException */ private void doPutHash(MavenGavInfo gavInfo, InputStream resourceInputStream) throws TransferFailedException { logger.info(Messages.i18n.format("STORING_HASH_AS_PROP", gavInfo.getName())); // $NON-NLS-1$ try { String artyPath = gavInfo.getFullName(); String hashPropName; if (gavInfo.getType().endsWith(".md5")) { // $NON-NLS-1$ hashPropName = "maven.hash.md5"; // $NON-NLS-1$ artyPath = artyPath.substring(0, artyPath.length() - 4); } else { hashPropName = "maven.hash.sha1"; // $NON-NLS-1$ artyPath = artyPath.substring(0, artyPath.length() - 5); } String hashValue = IOUtils.toString(resourceInputStream); // See the comment in {@link SrampWagon#fillInputData(InputData)} about why we're doing this // context classloader magic. ClassLoader oldCtxCL = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(SrampWagon.class.getClassLoader()); try { SrampArchiveEntry entry = this.archive.getEntry(artyPath); // Re-fetch the artifact meta-data in case it changed on the server since we uploaded it. BaseArtifactType metaData = client.getArtifactMetaData(entry.getMetaData().getUuid()); SrampModelUtils.setCustomProperty(metaData, hashPropName, hashValue); this.archive.updateEntry(entry, null); // The meta-data has been updated in the local/temp archive - now send it to the remote repo client.updateArtifactMetaData(metaData); } catch (Throwable t) { throw new TransferFailedException(t.getMessage(), t); } finally { Thread.currentThread().setContextClassLoader(oldCtxCL); } } catch (Exception e) { throw new TransferFailedException( Messages.i18n.format("FAILED_TO_STORE_HASH", gavInfo.getName()), e); // $NON-NLS-1$ } }
/** * Finds an existing artifact in the s-ramp repository that matches the GAV information. * * @param client * @param gavInfo * @return an s-ramp artifact (if found) or null (if not found) * @throws SrampClientException * @throws SrampAtomException * @throws JAXBException */ private BaseArtifactType findExistingArtifactByGAV( SrampAtomApiClient client, MavenGavInfo gavInfo) throws SrampAtomException, SrampClientException, JAXBException { SrampClientQuery clientQuery = null; StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append("/s-ramp"); // $NON-NLS-1$ List<String> criteria = new ArrayList<String>(); List<Object> params = new ArrayList<Object>(); criteria.add("@maven.groupId = ?"); // $NON-NLS-1$ params.add(gavInfo.getGroupId()); criteria.add("@maven.artifactId = ?"); // $NON-NLS-1$ params.add(gavInfo.getArtifactId()); criteria.add("@maven.version = ?"); // $NON-NLS-1$ params.add(gavInfo.getVersion()); if (StringUtils.isNotBlank(gavInfo.getType())) { criteria.add("@maven.type = ?"); // $NON-NLS-1$ params.add(gavInfo.getType()); } if (StringUtils.isNotBlank(gavInfo.getClassifier())) { criteria.add("@maven.classifier = ?"); // $NON-NLS-1$ params.add(gavInfo.getClassifier()); } if (StringUtils.isNotBlank(gavInfo.getSnapshotId())) { return null; } else { criteria.add("xp2:not(@maven.snapshot.id)"); // $NON-NLS-1$ } if (criteria.size() > 0) { queryBuilder.append("["); // $NON-NLS-1$ queryBuilder.append(StringUtils.join(criteria, " and ")); // $NON-NLS-1$ queryBuilder.append("]"); // $NON-NLS-1$ } clientQuery = client.buildQuery(queryBuilder.toString()); for (Object param : params) { if (param instanceof String) { clientQuery.parameter((String) param); } if (param instanceof Calendar) { clientQuery.parameter((Calendar) param); } } QueryResultSet rset = clientQuery.count(100).query(); if (rset.size() > 0) { for (ArtifactSummary summary : rset) { String uuid = summary.getUuid(); ArtifactType artifactType = summary.getType(); BaseArtifactType arty = client.getArtifactMetaData(artifactType, uuid); // If no classifier in the GAV info, only return the artifact that also has no classifier // TODO replace this with "not(@maven.classifer)" in the query, then force the result set to // return 2 items (expecting only 1) if (gavInfo.getClassifier() == null) { String artyClassifier = SrampModelUtils.getCustomProperty(arty, "maven.classifier"); // $NON-NLS-1$ if (artyClassifier == null) { return arty; } } else { // If classifier was supplied in the GAV info, we'll get the first artifact <shrug> return arty; } } } return null; }
/** * Puts the artifact into the s-ramp repository. * * @param gavInfo * @param resourceInputStream * @throws TransferFailedException */ private void doPutArtifact(final MavenGavInfo gavInfo, InputStream resourceInputStream) throws TransferFailedException { // See the comment in {@link SrampWagon#fillInputData(InputData)} about why we're doing this // context classloader magic. ClassLoader oldCtxCL = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(SrampWagon.class.getClassLoader()); File tempResourceFile = null; ZipToSrampArchive expander = null; SrampArchive archive = null; BaseArtifactType artifactGrouping = null; try { // First, stash the content in a temp file - we may need it multiple times. tempResourceFile = stashResourceContent(resourceInputStream); resourceInputStream = FileUtils.openInputStream(tempResourceFile); ArchiveInfo archiveInfo = ZipToSrampArchiveRegistry.inspectArchive(resourceInputStream); ArtifactType artifactType = getArtifactType(gavInfo, archiveInfo.type); resourceInputStream = FileUtils.openInputStream(tempResourceFile); // Is the artifact grouping option enabled? if (isPrimaryArtifact(gavInfo) && getParamFromRepositoryUrl("artifactGrouping") != null) { // $NON-NLS-1$ artifactGrouping = ensureArtifactGrouping(); } // Only search for existing artifacts by GAV info here BaseArtifactType artifact = findExistingArtifactByGAV(client, gavInfo); // If we found an artifact, we should update its content. If not, we should upload // the artifact to the repository. if (artifact != null) { throw new TransferFailedException( Messages.i18n.format( "ARTIFACT_UPDATE_NOT_ALLOWED", gavInfo.getFullName())); // $NON-NLS-1$ } else { // Upload the content, then add the maven properties to the artifact // as meta-data artifact = client.uploadArtifact(artifactType, resourceInputStream, gavInfo.getName()); SrampModelUtils.setCustomProperty( artifact, "maven.groupId", gavInfo.getGroupId()); // $NON-NLS-1$ SrampModelUtils.setCustomProperty( artifact, "maven.artifactId", gavInfo.getArtifactId()); // $NON-NLS-1$ SrampModelUtils.setCustomProperty( artifact, "maven.version", gavInfo.getVersion()); // $NON-NLS-1$ artifact.setVersion(gavInfo.getVersion()); if (gavInfo.getClassifier() != null) { SrampModelUtils.setCustomProperty( artifact, "maven.classifier", gavInfo.getClassifier()); // $NON-NLS-1$ } if (gavInfo.getSnapshotId() != null && !gavInfo.getSnapshotId().equals("")) { // $NON-NLS-1$ SrampModelUtils.setCustomProperty( artifact, "maven.snapshot.id", gavInfo.getSnapshotId()); // $NON-NLS-1$ } SrampModelUtils.setCustomProperty(artifact, "maven.type", gavInfo.getType()); // $NON-NLS-1$ // Also create a relationship to the artifact grouping, if necessary if (artifactGrouping != null) { SrampModelUtils.addGenericRelationship( artifact, "groupedBy", artifactGrouping.getUuid()); // $NON-NLS-1$ SrampModelUtils.addGenericRelationship( artifactGrouping, "groups", artifact.getUuid()); // $NON-NLS-1$ client.updateArtifactMetaData(artifactGrouping); } client.updateArtifactMetaData(artifact); this.archive.addEntry(gavInfo.getFullName(), artifact, null); } // Now also add "expanded" content to the s-ramp repository expander = ZipToSrampArchiveRegistry.createExpander(artifactType, tempResourceFile); if (expander != null) { expander.setContextParam(DefaultMetaDataFactory.PARENT_UUID, artifact.getUuid()); expander.addMetaDataProvider( new MetaDataProvider() { @Override public void provideMetaData(BaseArtifactType artifact) { SrampModelUtils.setCustomProperty( artifact, "maven.parent-groupId", gavInfo.getGroupId()); // $NON-NLS-1$ SrampModelUtils.setCustomProperty( artifact, "maven.parent-artifactId", gavInfo.getArtifactId()); // $NON-NLS-1$ SrampModelUtils.setCustomProperty( artifact, "maven.parent-version", gavInfo.getVersion()); // $NON-NLS-1$ SrampModelUtils.setCustomProperty( artifact, "maven.parent-type", gavInfo.getType()); // $NON-NLS-1$ } }); archive = expander.createSrampArchive(); client.uploadBatch(archive); } } catch (Throwable t) { throw new TransferFailedException(t.getMessage(), t); } finally { Thread.currentThread().setContextClassLoader(oldCtxCL); SrampArchive.closeQuietly(archive); ZipToSrampArchive.closeQuietly(expander); FileUtils.deleteQuietly(tempResourceFile); } }