001/*
002 * SPDX-License-Identifier: Apache-2.0
003 *
004 * Copyright 2024-2026 The Enola <https://enola.dev> Authors
005 *
006 * Licensed under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 *     https://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package dev.enola.rdf.io;
019
020import dev.enola.common.convert.ConversionException;
021import dev.enola.common.convert.ConverterInto;
022import dev.enola.common.io.resource.WritableResource;
023
024import org.eclipse.rdf4j.model.Namespace;
025import org.eclipse.rdf4j.model.NamespaceAware;
026import org.eclipse.rdf4j.model.Statement;
027
028import java.io.IOException;
029
030/**
031 * Writes RDFJ4j {@link Statement}s (like {@link org.eclipse.rdf4j.model.Model}) into a {@link
032 * WritableResource}.
033 */
034public class RdfWriterConverter implements ConverterInto<Iterable<Statement>, WritableResource> {
035
036    @Override
037    public boolean convertInto(Iterable<Statement> from, WritableResource into)
038            throws ConversionException {
039
040        try {
041            var opt = WritableResourceRDFHandler.create(into);
042            if (opt.isEmpty()) return false;
043
044            try (var closeableRDFHandler = opt.get()) {
045                if (from instanceof NamespaceAware) {
046                    for (Namespace ns : ((NamespaceAware) from).getNamespaces()) {
047                        closeableRDFHandler.handleNamespace(ns.getPrefix(), ns.getName());
048                    }
049                }
050                for (var statement : from) closeableRDFHandler.handleStatement(statement);
051
052                return true;
053            }
054
055        } catch (IOException e) {
056            throw new ConversionException("WritableResourceRDFHandler.create failed: " + into, e);
057        }
058    }
059}