class MavenMetadata extends AbstractMetadata implements MergeableMetadata {

    static final String MAVEN_METADATA_XML = "maven-metadata.xml";

    protected Metadata metadata;

    private final Path path;

    protected final Date timestamp;

    private boolean merged;

    @Deprecated
    protected MavenMetadata(Metadata metadata, File file, Date timestamp) {
        this(metadata, file != null ? file.toPath() : null, timestamp);
    }

    protected MavenMetadata(Metadata metadata, Path path, Date timestamp) {
        this.metadata = metadata;
        this.path = path;
        this.timestamp = timestamp;
    }

    @Override
    public String getType() {
        return MAVEN_METADATA_XML;
    }

    @Deprecated
    @Override
    public File getFile() {
        return path != null ? path.toFile() : null;
    }

    @Override
    public Path getPath() {
        return path;
    }

    public void merge(File existing, File result) throws RepositoryException {
        merge(existing != null ? existing.toPath() : null, result != null ? result.toPath() : null);
    }

    @Override
    public void merge(Path existing, Path result) throws RepositoryException {
        Metadata recessive = read(existing);

        merge(recessive);

        write(result, metadata);

        merged = true;
    }

    @Override
    public boolean isMerged() {
        return merged;
    }

    protected abstract void merge(Metadata recessive);

    static Metadata read(Path metadataPath) throws RepositoryException {
        if (!Files.exists(metadataPath)) {
            return new Metadata();
        }

        try (InputStream input = Files.newInputStream(metadataPath)) {
            return new Metadata(new MetadataStaxReader().read(input, false));
        } catch (IOException | XMLStreamException e) {
            throw new RepositoryException("Could not parse metadata " + metadataPath + ": " + e.getMessage(), e);
        }
    }

    private void write(Path metadataPath, Metadata metadata) throws RepositoryException {<FILL_FUNCTION_BODY>}

    @Override
    public Map<String, String> getProperties() {
        return Collections.emptyMap();
    }

    @Override
    public org.eclipse.aether.metadata.Metadata setProperties(Map<String, String> properties) {
        return this;
    }
}

        try {
            Files.createDirectories(metadataPath.getParent());
            try (OutputStream output = Files.newOutputStream(metadataPath)) {
                new MetadataStaxWriter().write(output, metadata.getDelegate());
            }
        } catch (IOException | XMLStreamException e) {
            throw new RepositoryException("Could not write metadata " + metadataPath + ": " + e.getMessage(), e);
        }
    
<no_super_class>