class RemoteSnapshotMetadataGenerator implements MetadataGenerator {

    private final Map<Object, RemoteSnapshotMetadata> snapshots;

    private final Date timestamp;

    private final Integer buildNumber;

    RemoteSnapshotMetadataGenerator(RepositorySystemSession session, DeployRequest request) {
        timestamp = (Date) ConfigUtils.getObject(session, new Date(), "maven.startTime");
        Object bn = ConfigUtils.getObject(session, null, "maven.buildNumber");
        if (bn instanceof Integer) {
            this.buildNumber = (Integer) bn;
        } else if (bn instanceof String) {
            this.buildNumber = Integer.valueOf((String) bn);
        } else {
            this.buildNumber = null;
        }

        snapshots = new LinkedHashMap<>();

        /*
         * NOTE: This should be considered a quirk to support interop with Maven's legacy ArtifactDeployer which
         * processes one artifact at a time and hence cannot associate the artifacts from the same project to use the
         * same timestamp+buildno for the snapshot versions. Allowing the caller to pass in metadata from a previous
         * deployment allows to re-establish the association between the artifacts of the same project.
         */
        for (Metadata metadata : request.getMetadata()) {
            if (metadata instanceof RemoteSnapshotMetadata) {
                RemoteSnapshotMetadata snapshotMetadata = (RemoteSnapshotMetadata) metadata;
                snapshots.put(snapshotMetadata.getKey(), snapshotMetadata);
            }
        }
    }

    @Override
    public Collection<? extends Metadata> prepare(Collection<? extends Artifact> artifacts) {
        for (Artifact artifact : artifacts) {
            if (artifact.isSnapshot()) {
                Object key = RemoteSnapshotMetadata.getKey(artifact);
                RemoteSnapshotMetadata snapshotMetadata = snapshots.get(key);
                if (snapshotMetadata == null) {
                    snapshotMetadata = new RemoteSnapshotMetadata(artifact, timestamp, buildNumber);
                    snapshots.put(key, snapshotMetadata);
                }
                snapshotMetadata.bind(artifact);
            }
        }

        return snapshots.values();
    }

    @Override
    public Artifact transformArtifact(Artifact artifact) {<FILL_FUNCTION_BODY>}

    @Override
    public Collection<? extends Metadata> finish(Collection<? extends Artifact> artifacts) {
        return Collections.emptyList();
    }
}

        if (artifact.isSnapshot() && artifact.getVersion().equals(artifact.getBaseVersion())) {
            Object key = RemoteSnapshotMetadata.getKey(artifact);
            RemoteSnapshotMetadata snapshotMetadata = snapshots.get(key);
            if (snapshotMetadata != null) {
                artifact = artifact.setVersion(snapshotMetadata.getExpandedVersion(artifact));
            }
        }

        return artifact;
    
<no_super_class>