/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   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 .
 */

#ifndef __com_sun_star_rdf_XDocumentRepository_idl__
#define __com_sun_star_rdf_XDocumentRepository_idl__

#include <com/sun/star/beans/Pair.idl>
#include <com/sun/star/rdf/XMetadatable.idl>
#include <com/sun/star/rdf/XRepository.idl>



module com {   module sun {   module star {   module rdf {

/** extends XRepository with document-specific functionality.

    <p>
    This subclass of XRepository provides some methods which
    only make sense for repositories that are attached to a document.
    For example, the methods allow for manipulating in-content metadata,
    which is stored as RDFa.
    </p>

    @since OOo 3.2

    @see XRepositorySupplier
    @see XDocumentMetadataAccess
 */
interface XDocumentRepository : XRepository
{

    /** update the RDFa statement(s) that correspond to an ODF element in the
        repository.

        <p>
        This method will do the following steps:
        <ol>
        <li>Remove all previously set RDFa statements for the Object parameter
             from the repository</li>
        <li>If the RDFaContent parameter is the empty `string`,
            for every Predicate in the given list of Predicates,
            add the following RDF statement to an unspecified named graph:
            <ul>
            <li><code>Subject Predicate
                      XLiteral(Object->getText()^^RDFaDatatype)</code></li>
            </ul>
        </li>
        <li>If the RDFaContent parameter is not the empty `string`,
            for every Predicate in the given list of Predicates,
            add the following RDF statement to an unspecified named graph:
            <ul>
            <li>
            <code>Subject Predicate XLiteral(RDFaContent^^RDFaDatatype)</code>
            </li>
            </ul>
        </li>
        </ol>
        </p>

        <p>
        RDFa statements are handled specially because they are not logically
        part of any named graph in the repository.
        Also, they have rather unusual semantics;
        just using XNamedGraph::addStatement() would be
        ambiguous:
        if the object is a XMetadatable, do we insert
        the object itself (URI) or its literal content (RDFa)?
        </p>

        @param Subject
            the subject of the RDF triple(s).

        @param Predicates
            the predicates of the RDF triple(s).

        @param Object
            the object of the RDF triple(s) is the text content of this
            parameter.

        @param RDFaContent
            the <code>rdfa:content</code> attribute (may be the empty
            `string`).

        @param RDFaDatatype
            the <code>rdfa:datatype</code> attribute (may be `NULL`)

        @throws com::sun::star::lang::IllegalArgumentException
            if any parameter is `NULL`, Predicates is empty,
            or Object is of a type that can not have RDFa metadata attached.

        @throws RepositoryException
            if an error occurs when accessing the repository.
     */
    void setStatementRDFa(
            [in] XResource Subject,
            [in] sequence<XURI> Predicates,
            [in] XMetadatable Object,
            [in] string RDFaContent,
            [in] XURI RDFaDatatype)
        raises( com::sun::star::lang::IllegalArgumentException,
                RepositoryException );

    /** remove the RDFa statement(s) that correspond to an ODF element from the
        repository.

        <p>
        RDFa statements are handled specially because they are not logically
        part of any graph.
        </p>

        @param Element
            the element whose RDFa statement(s) should be removed

        @throws com::sun::star::lang::IllegalArgumentException
            if the given Element is `NULL`, or of a type that can not have
            RDFa metadata attached.

        @throws RepositoryException
            if an error occurs when accessing the repository.
     */
    void removeStatementRDFa([in] XMetadatable Element)
        raises( com::sun::star::lang::IllegalArgumentException,
                RepositoryException );

    /** find the RDFa statement(s) associated with an ODF element.

        @param Element
            the ODF element for which RDFa statements should be found

        @returns
            <ul>
            <li>if the element has no RDFa meta-data attributes:
                the empty sequence.</li>
            <li>if the element has RDFa meta-data attributes:
                <ul>
                <li>a sequence with the RDFa-statements corresponding to the
                attributes.</li>
                <li>a flag indicating whether there is a xhtml:content
                attribute.</li>
                </ul>
            </li>
            </ul>

        @throws com::sun::star::lang::IllegalArgumentException
            if the given Element is `NULL`, or of a type that can not have
            RDFa metadata attached.

        @throws RepositoryException
            if an error occurs when accessing the repository.

        @see Statement
     */
    com::sun::star::beans::Pair< sequence<Statement>, boolean >
            getStatementRDFa([in] XMetadatable Element)
        raises( com::sun::star::lang::IllegalArgumentException,
                RepositoryException );

    /** gets matching RDFa statements from the repository.

        <p>
        This method exists because RDFa statements are not part of any named
        graph, and thus they cannot be enumerated with
        XNamedGraph::getStatements().
        </p>

        <p>
        Any parameter may be `NULL`, which acts as a wildcard.
        For example, to get all statements about myURI:
        <code>getStatementsRDFa(myURI, null, null)</code>
        </p>

        @param Subject
            the subject of the RDF triple.

        @param Predicate
            the predicate of the RDF triple.

        @param Object
            the object of the RDF triple.

        @returns
            an iterator over all RDFa statements in the repository that match
            the parameters, represented as an
            enumeration of Statement

        @throws RepositoryException
            if an error occurs when accessing the repository.

        @see Statement
        @see XRepository::getStatements
        @see XNamedGraph::getStatements
     */
    com::sun::star::container::XEnumeration/*<Statement>*/ getStatementsRDFa(
            [in] XResource Subject,
            [in] XURI Predicate,
            [in] XNode Object)
        raises( RepositoryException );

};


}; }; }; };

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
