package org.carlspring.strongbox.storage.metadata;
import org.carlspring.maven.commons.util.ArtifactUtils;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Plugin;
import org.apache.maven.artifact.repository.metadata.Snapshot;
import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.project.artifact.PluginArtifact;
public class MetadataMerger
{
public Metadata updateMetadataAtVersionLevel(Artifact artifact, Metadata metadata)
{
if (metadata == null)
{
metadata = new Metadata();
metadata.setGroupId(artifact.getGroupId());
metadata.setArtifactId(artifact.getArtifactId());
String newVersion = artifact.getVersion().substring(0, artifact.getVersion().indexOf("-") +1).concat("SNAPSHOT");
metadata.setVersion(newVersion);
}
// I generate timestamp once for all the merging
String timestamp = MetadataHelper.getDateFormatInstance().format(Calendar.getInstance().getTime());
// Update metadata o fill it for first time in case I have just created it
Versioning versioning = metadata.getVersioning();
if (versioning == null)
{
versioning = new Versioning();
metadata.setVersioning(versioning);
}
Snapshot snapshot = versioning.getSnapshot();
if (snapshot == null)
{
snapshot = new Snapshot();
versioning.setSnapshot(snapshot);
}
snapshot.setBuildNumber(snapshot.getBuildNumber() + 1);
snapshot.setTimestamp(timestamp.substring(0, 7) + "." + timestamp.substring(8));
versioning.setLastUpdated(timestamp);
List<SnapshotVersion> snapshotVersions = versioning.getSnapshotVersions();
for (SnapshotVersion snapshotVersion : snapshotVersions)
{
snapshotVersion.setUpdated(timestamp);
}
snapshotVersions.addAll(createNewSnapshotVersions(artifact.getVersion(), timestamp, snapshot.getBuildNumber()));
return metadata;
}
public Metadata updateMetadataAtArtifactLevel(Artifact artifact, Metadata metadata)
{
if (metadata == null)
{
metadata = new Metadata();
metadata.setGroupId(artifact.getGroupId());
metadata.setArtifactId(artifact.getArtifactId());
}
String newVersion = ArtifactUtils.isReleaseVersion(artifact.getVersion()) ? artifact.getVersion() : artifact.getVersion().substring(0, artifact.getVersion().indexOf("-") + 1).concat("SNAPSHOT");
Versioning versioning = metadata.getVersioning();
if (versioning == null)
{
versioning = new Versioning();
metadata.setVersioning(versioning);
}
versioning.setLatest(newVersion);
if (ArtifactUtils.isReleaseVersion(artifact.getVersion()))
{
versioning.setRelease(newVersion);
}
List<String> versions = versioning.getVersions();
if (!versions.contains(newVersion))
{
versions.add(newVersion);
}
versioning.setLastUpdated(MetadataHelper.getDateFormatInstance().format(Calendar.getInstance().getTime()));
return metadata;
}
public Metadata updateMetadataAtGroupLevel(PluginArtifact artifact, Metadata metadata)
{
if (metadata == null)
{
metadata = new Metadata();
}
List<Plugin> plugins = metadata.getPlugins();
boolean found = false;
for (Plugin plugin : plugins)
{
if (plugin.getArtifactId().equals(artifact.getArtifactId()))
{
found = true;
break;
}
}
if (!found)
{
Plugin plugin = new Plugin();
// TODO: Figure out how to get plugin name from artifact
plugin.setName("");
plugin.setArtifactId(artifact.getArtifactId());
// TODO: Figure out how to get plugin prefix from artifact
plugin.setPrefix("");
plugins.add(plugin);
}
return metadata;
}
private Collection<SnapshotVersion> createNewSnapshotVersions(String version, String timestamp, int buildNumber)
{
Collection<SnapshotVersion> toReturn = new ArrayList<>();
SnapshotVersion sv1 = new SnapshotVersion();
SnapshotVersion sv2 = new SnapshotVersion();
SnapshotVersion sv3 = new SnapshotVersion();
toReturn.add(sv1);
toReturn.add(sv2);
toReturn.add(sv3);
sv1.setClassifier("javadoc");
sv1.setExtension("jar");
sv1.setVersion(version.replace("SNAPSHOT",
timestamp.substring(0, 7) + "." + timestamp.substring(8) + "-" + buildNumber));
sv1.setUpdated(timestamp);
sv2.setExtension("jar");
sv2.setVersion(version.replace("SNAPSHOT",
timestamp.substring(0, 7) + "." + timestamp.substring(8) + "-" + buildNumber));
sv2.setUpdated(timestamp);
sv3.setExtension("pom");
sv3.setVersion(version.replace("SNAPSHOT",
timestamp.substring(0, 7) + "." + timestamp.substring(8) + "-" + buildNumber));
sv3.setUpdated(timestamp);
return toReturn;
}
}