/**************************************************************
 * 
 * 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
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef __com_sun_star_rdf_XDocumentRepository_idl__
#define __com_sun_star_rdf_XDocumentRepository_idl__

#ifndef __com_sun_star_beans_Pair_idl__
#include <com/sun/star/beans/Pair.idl>
#endif

#ifndef __com_sun_star_rdf_XMetadatable_idl__
#include <com/sun/star/rdf/XMetadatable.idl>
#endif

#ifndef __com_sun_star_rdf_XRepository_idl__
#include <com/sun/star/rdf/XRepository.idl>
#endif


//=============================================================================

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

//=============================================================================
/** extends <type>XRepository</type> with document-specific functionality.

    <p>
    This subclass of <type>XRepository</type> 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 <atom>string</atom>,
            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 <atom>string</atom>,
            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 <member>XNamedGraph::addStatement</member> would be
        ambiguous:
        if the object is a <type>XMetadatable</type>, 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
            <atom>string</atom>).

        @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
        <member>XNamedGraph::getStatements</member>.
        </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 <type>Statement</type>

        @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