blob: 9e30f10b4dead229f6869aea8bc554af011dfa3c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.repository.metadata;
import javax.xml.stream.XMLStreamException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.metadata.io.MetadataStaxReader;
import org.apache.maven.artifact.repository.metadata.io.MetadataStaxWriter;
/**
* Shared methods of the repository metadata handling.
*
*/
@Deprecated
public abstract class AbstractRepositoryMetadata implements RepositoryMetadata {
private static final String LS = System.lineSeparator();
private Metadata metadata;
protected AbstractRepositoryMetadata(Metadata metadata) {
this.metadata = metadata;
}
public String getRemoteFilename() {
return "maven-metadata.xml";
}
public String getLocalFilename(ArtifactRepository repository) {
return "maven-metadata-" + repository.getKey() + ".xml";
}
public void storeInLocalRepository(ArtifactRepository localRepository, ArtifactRepository remoteRepository)
throws RepositoryMetadataStoreException {
try {
updateRepositoryMetadata(localRepository, remoteRepository);
} catch (IOException | XMLStreamException e) {
throw new RepositoryMetadataStoreException("Error updating group repository metadata", e);
}
}
protected void updateRepositoryMetadata(ArtifactRepository localRepository, ArtifactRepository remoteRepository)
throws IOException, XMLStreamException {
Metadata metadata = null;
File metadataFile = new File(
localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata(this, remoteRepository));
if (metadataFile.length() == 0) {
if (!metadataFile.delete()) {
// sleep for 10ms just in case this is windows holding a file lock
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// ignore
}
metadataFile.delete(); // if this fails, forget about it, we'll try to overwrite it anyway so no need
// to delete on exit
}
} else if (metadataFile.exists()) {
try (InputStream input = Files.newInputStream(metadataFile.toPath())) {
metadata = new Metadata(new MetadataStaxReader().read(input, false));
}
}
boolean changed;
// If file could not be found or was not valid, start from scratch
if (metadata == null) {
metadata = this.metadata;
changed = true;
} else {
changed = metadata.merge(this.metadata);
}
// beware meta-versions!
String version = metadata.getVersion();
if (Artifact.LATEST_VERSION.equals(version) || Artifact.RELEASE_VERSION.equals(version)) {
// meta-versions are not valid <version/> values...don't write them.
metadata.setVersion(null);
}
if (changed || !metadataFile.exists()) {
metadataFile.getParentFile().mkdirs();
try (OutputStream output = Files.newOutputStream(metadataFile.toPath())) {
MetadataStaxWriter mappingWriter = new MetadataStaxWriter();
mappingWriter.write(output, metadata.getDelegate());
}
} else {
metadataFile.setLastModified(System.currentTimeMillis());
}
}
public String toString() {
return "repository metadata for: '" + getKey() + "'";
}
protected static Metadata createMetadata(Artifact artifact, Versioning versioning) {
Metadata metadata = new Metadata();
metadata.setGroupId(artifact.getGroupId());
metadata.setArtifactId(artifact.getArtifactId());
metadata.setVersion(artifact.getVersion());
metadata.setVersioning(versioning);
return metadata;
}
protected static Versioning createVersioning(Snapshot snapshot) {
Versioning versioning = new Versioning();
versioning.setSnapshot(snapshot);
return versioning;
}
public void setMetadata(Metadata metadata) {
this.metadata = metadata;
}
public Metadata getMetadata() {
return metadata;
}
public void merge(org.apache.maven.repository.legacy.metadata.ArtifactMetadata metadata) {
// TODO not sure that it should assume this, maybe the calls to addMetadata should pre-merge, then artifact
// replaces?
AbstractRepositoryMetadata repoMetadata = (AbstractRepositoryMetadata) metadata;
this.metadata.merge(repoMetadata.getMetadata());
}
public void merge(ArtifactMetadata metadata) {
// TODO not sure that it should assume this, maybe the calls to addMetadata should pre-merge, then artifact
// replaces?
AbstractRepositoryMetadata repoMetadata = (AbstractRepositoryMetadata) metadata;
this.metadata.merge(repoMetadata.getMetadata());
}
public String extendedToString() {
StringBuilder buffer = new StringBuilder(256);
buffer.append(LS).append("Repository Metadata").append(LS).append("--------------------------");
buffer.append(LS).append("GroupId: ").append(getGroupId());
buffer.append(LS).append("ArtifactId: ").append(getArtifactId());
buffer.append(LS).append("Metadata Type: ").append(getClass().getName());
return buffer.toString();
}
public int getNature() {
return RELEASE;
}
public ArtifactRepositoryPolicy getPolicy(ArtifactRepository repository) {
int nature = getNature();
if ((nature & RepositoryMetadata.RELEASE_OR_SNAPSHOT) == RepositoryMetadata.RELEASE_OR_SNAPSHOT) {
ArtifactRepositoryPolicy policy = new ArtifactRepositoryPolicy(repository.getReleases());
policy.merge(repository.getSnapshots());
return policy;
} else if ((nature & RepositoryMetadata.SNAPSHOT) != 0) {
return repository.getSnapshots();
} else {
return repository.getReleases();
}
}
}