1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "librdf_repository.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <string.h>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <set>
29*b1cdbd2cSJim Jagielski #include <map>
30*b1cdbd2cSJim Jagielski #include <functional>
31*b1cdbd2cSJim Jagielski #include <algorithm>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <boost/utility.hpp>
34*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
35*b1cdbd2cSJim Jagielski #include <boost/shared_array.hpp>
36*b1cdbd2cSJim Jagielski #include <boost/bind.hpp>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <libxslt/security.h>
39*b1cdbd2cSJim Jagielski #include <libxml/parser.h>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski // #i114999# do not include librdf.h, it is broken in redland 1.0.11
42*b1cdbd2cSJim Jagielski #include <redland.h>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XInitialization.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XSeekableInputStream.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextRange.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/XDocumentRepository.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/XLiteral.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/FileFormat.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/URIs.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/BlankNode.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/URI.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/rdf/Literal.hpp>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
59*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
60*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
61*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx>
62*b1cdbd2cSJim Jagielski #include <cppuhelper/basemutex.hxx>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #include <comphelper/stlunosequence.hxx>
65*b1cdbd2cSJim Jagielski #include <comphelper/sequenceasvector.hxx>
66*b1cdbd2cSJim Jagielski #include <comphelper/makesequence.hxx>
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski /**
70*b1cdbd2cSJim Jagielski     Implementation of the service com.sun.star.rdf.Repository.
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski     This implementation uses the Redland RDF library (librdf).
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski     There are several classes involved:
75*b1cdbd2cSJim Jagielski     librdf_TypeConverter:   helper class to convert data types redland <-> uno
76*b1cdbd2cSJim Jagielski     librdf_Repository:      the main repository, does almost all the work
77*b1cdbd2cSJim Jagielski     librdf_NamedGraph:      the XNamedGraph, forwards everything to repository
78*b1cdbd2cSJim Jagielski     librdf_GraphResult:     an XEnumeration<Statement>
79*b1cdbd2cSJim Jagielski     librdf_QuerySelectResult:   an XEnumeration<sequence<XNode>>
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     @author mst
82*b1cdbd2cSJim Jagielski  */
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski /// anonymous implementation namespace
85*b1cdbd2cSJim Jagielski namespace {
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski class librdf_NamedGraph;
88*b1cdbd2cSJim Jagielski class librdf_Repository;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski typedef std::map< ::rtl::OUString, ::rtl::Reference<librdf_NamedGraph> >
93*b1cdbd2cSJim Jagielski     NamedGraphMap_t;
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski const char s_sparql [] = "sparql";
96*b1cdbd2cSJim Jagielski const char s_nsRDFs [] = "http://www.w3.org/2000/01/rdf-schema#";
97*b1cdbd2cSJim Jagielski const char s_label  [] = "label";
98*b1cdbd2cSJim Jagielski const char s_nsOOo  [] = "http://openoffice.org/2004/office/rdfa/";
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski //FIXME: this approach is not ideal. can we use blind nodes instead?
isInternalContext(librdf_node * i_pNode)103*b1cdbd2cSJim Jagielski bool isInternalContext(librdf_node *i_pNode) throw ()
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski     OSL_ENSURE(i_pNode, "isInternalContext: context null");
106*b1cdbd2cSJim Jagielski     OSL_ENSURE(librdf_node_is_resource(i_pNode),
107*b1cdbd2cSJim Jagielski         "isInternalContext: context not resource");
108*b1cdbd2cSJim Jagielski     if (i_pNode) {
109*b1cdbd2cSJim Jagielski         librdf_uri *pURI(librdf_node_get_uri(i_pNode));
110*b1cdbd2cSJim Jagielski         OSL_ENSURE(pURI, "isInternalContext: URI null");
111*b1cdbd2cSJim Jagielski         if (pURI) {
112*b1cdbd2cSJim Jagielski             unsigned char *pContextURI(librdf_uri_as_string(pURI));
113*b1cdbd2cSJim Jagielski             OSL_ENSURE(pContextURI,
114*b1cdbd2cSJim Jagielski                 "isInternalContext: URI string null");
115*b1cdbd2cSJim Jagielski             // if prefix matches reserved uri, it is RDFa context
116*b1cdbd2cSJim Jagielski             if (!strncmp(reinterpret_cast<char *>(pContextURI),
117*b1cdbd2cSJim Jagielski                     s_nsOOo, sizeof(s_nsOOo)-1)) {
118*b1cdbd2cSJim Jagielski                 return true;
119*b1cdbd2cSJim Jagielski             }
120*b1cdbd2cSJim Jagielski         }
121*b1cdbd2cSJim Jagielski         return false;
122*b1cdbd2cSJim Jagielski     }
123*b1cdbd2cSJim Jagielski     return true;
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski // n.b.: librdf destructor functions dereference null pointers!
130*b1cdbd2cSJim Jagielski //       so they need to be wrapped to be usable with boost::shared_ptr.
safe_librdf_free_world(librdf_world * const world)131*b1cdbd2cSJim Jagielski static void safe_librdf_free_world(librdf_world *const world)
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski     if (world) { librdf_free_world(world); }
134*b1cdbd2cSJim Jagielski }
safe_librdf_free_model(librdf_model * const model)135*b1cdbd2cSJim Jagielski static void safe_librdf_free_model(librdf_model *const model)
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski     if (model) { librdf_free_model(model); }
138*b1cdbd2cSJim Jagielski }
safe_librdf_free_node(librdf_node * node)139*b1cdbd2cSJim Jagielski static void safe_librdf_free_node(librdf_node* node)
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski     if (node) { librdf_free_node(node); }
142*b1cdbd2cSJim Jagielski }
safe_librdf_free_parser(librdf_parser * const parser)143*b1cdbd2cSJim Jagielski static void safe_librdf_free_parser(librdf_parser *const parser)
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski     if (parser) { librdf_free_parser(parser); }
146*b1cdbd2cSJim Jagielski }
safe_librdf_free_query(librdf_query * const query)147*b1cdbd2cSJim Jagielski static void safe_librdf_free_query(librdf_query *const query)
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski     if (query) { librdf_free_query(query); }
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski static void
safe_librdf_free_query_results(librdf_query_results * const query_results)152*b1cdbd2cSJim Jagielski safe_librdf_free_query_results(librdf_query_results *const query_results)
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski     if (query_results) { librdf_free_query_results(query_results); }
155*b1cdbd2cSJim Jagielski }
safe_librdf_free_serializer(librdf_serializer * const serializer)156*b1cdbd2cSJim Jagielski static void safe_librdf_free_serializer(librdf_serializer *const serializer)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski     if (serializer) { librdf_free_serializer(serializer); }
159*b1cdbd2cSJim Jagielski }
safe_librdf_free_statement(librdf_statement * const statement)160*b1cdbd2cSJim Jagielski static void safe_librdf_free_statement(librdf_statement *const statement)
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski     if (statement) { librdf_free_statement(statement); }
163*b1cdbd2cSJim Jagielski }
safe_librdf_free_storage(librdf_storage * const storage)164*b1cdbd2cSJim Jagielski static void safe_librdf_free_storage(librdf_storage *const storage)
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski     if (storage) { librdf_free_storage(storage); }
167*b1cdbd2cSJim Jagielski }
safe_librdf_free_stream(librdf_stream * const stream)168*b1cdbd2cSJim Jagielski static void safe_librdf_free_stream(librdf_stream *const stream)
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski     if (stream) { librdf_free_stream(stream); }
171*b1cdbd2cSJim Jagielski }
safe_librdf_free_uri(librdf_uri * const uri)172*b1cdbd2cSJim Jagielski static void safe_librdf_free_uri(librdf_uri *const uri)
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski     if (uri) { librdf_free_uri(uri); }
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski /** converts between librdf types and UNO API types.
181*b1cdbd2cSJim Jagielski  */
182*b1cdbd2cSJim Jagielski class librdf_TypeConverter
183*b1cdbd2cSJim Jagielski {
184*b1cdbd2cSJim Jagielski public:
librdf_TypeConverter(uno::Reference<uno::XComponentContext> const & i_xContext,librdf_Repository & i_rRep)185*b1cdbd2cSJim Jagielski     librdf_TypeConverter(
186*b1cdbd2cSJim Jagielski             uno::Reference< uno::XComponentContext > const & i_xContext,
187*b1cdbd2cSJim Jagielski             librdf_Repository &i_rRep)
188*b1cdbd2cSJim Jagielski         : m_xContext(i_xContext)
189*b1cdbd2cSJim Jagielski         , m_rRep(i_rRep)
190*b1cdbd2cSJim Jagielski     { };
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     librdf_world *createWorld() const;
193*b1cdbd2cSJim Jagielski     librdf_storage *createStorage(librdf_world *i_pWorld) const;
194*b1cdbd2cSJim Jagielski     librdf_model *createModel(librdf_world *i_pWorld,
195*b1cdbd2cSJim Jagielski         librdf_storage * i_pStorage) const;
196*b1cdbd2cSJim Jagielski     librdf_uri* mkURI( librdf_world* i_pWorld,
197*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XURI > & i_xURI) const;
198*b1cdbd2cSJim Jagielski     librdf_node* mkResource( librdf_world* i_pWorld,
199*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XResource > & i_xResource) const;
200*b1cdbd2cSJim Jagielski     librdf_node* mkNode( librdf_world* i_pWorld,
201*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XNode > & i_xNode) const;
202*b1cdbd2cSJim Jagielski     librdf_statement* mkStatement( librdf_world* i_pWorld,
203*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XResource > & i_xSubject,
204*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XURI > & i_xPredicate,
205*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XNode > & i_xObject) const;
206*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XURI> convertToXURI(librdf_uri* i_pURI) const;
207*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XURI> convertToXURI(librdf_node* i_pURI) const;
208*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XResource>
209*b1cdbd2cSJim Jagielski         convertToXResource(librdf_node* i_pNode) const;
210*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XNode> convertToXNode(librdf_node* i_pNode) const;
211*b1cdbd2cSJim Jagielski     rdf::Statement
212*b1cdbd2cSJim Jagielski         convertToStatement(librdf_statement* i_pStmt, librdf_node* i_pContext)
213*b1cdbd2cSJim Jagielski         const;
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski private:
216*b1cdbd2cSJim Jagielski     uno::Reference< uno::XComponentContext > m_xContext;
217*b1cdbd2cSJim Jagielski     librdf_Repository & m_rRep;
218*b1cdbd2cSJim Jagielski };
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski /** implements the repository service.
224*b1cdbd2cSJim Jagielski  */
225*b1cdbd2cSJim Jagielski class librdf_Repository:
226*b1cdbd2cSJim Jagielski     private boost::noncopyable,
227*b1cdbd2cSJim Jagielski //    private ::cppu::BaseMutex,
228*b1cdbd2cSJim Jagielski     public ::cppu::WeakImplHelper3<
229*b1cdbd2cSJim Jagielski         lang::XServiceInfo,
230*b1cdbd2cSJim Jagielski         rdf::XDocumentRepository,
231*b1cdbd2cSJim Jagielski         lang::XInitialization>
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski public:
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski     explicit librdf_Repository(
236*b1cdbd2cSJim Jagielski         uno::Reference< uno::XComponentContext > const & i_xContext);
237*b1cdbd2cSJim Jagielski     virtual ~librdf_Repository();
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski     // ::com::sun::star::lang::XServiceInfo:
240*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getImplementationName()
241*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
242*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL supportsService(
243*b1cdbd2cSJim Jagielski             const ::rtl::OUString & ServiceName) throw (uno::RuntimeException);
244*b1cdbd2cSJim Jagielski     virtual uno::Sequence< ::rtl::OUString > SAL_CALL
245*b1cdbd2cSJim Jagielski         getSupportedServiceNames() throw (uno::RuntimeException);
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     // ::com::sun::star::rdf::XRepository:
248*b1cdbd2cSJim Jagielski     virtual uno::Reference< rdf::XBlankNode > SAL_CALL createBlankNode()
249*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
250*b1cdbd2cSJim Jagielski     virtual uno::Reference<rdf::XNamedGraph> SAL_CALL importGraph(
251*b1cdbd2cSJim Jagielski             ::sal_Int16 i_Format,
252*b1cdbd2cSJim Jagielski             const uno::Reference< io::XInputStream > & i_xInStream,
253*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xGraphName,
254*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xBaseURI)
255*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
256*b1cdbd2cSJim Jagielski             datatransfer::UnsupportedFlavorException,
257*b1cdbd2cSJim Jagielski             container::ElementExistException, rdf::ParseException,
258*b1cdbd2cSJim Jagielski             rdf::RepositoryException, io::IOException);
259*b1cdbd2cSJim Jagielski     virtual void SAL_CALL exportGraph(::sal_Int16 i_Format,
260*b1cdbd2cSJim Jagielski             const uno::Reference< io::XOutputStream > & i_xOutStream,
261*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xGraphName,
262*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xBaseURI)
263*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
264*b1cdbd2cSJim Jagielski             datatransfer::UnsupportedFlavorException,
265*b1cdbd2cSJim Jagielski             container::NoSuchElementException, rdf::RepositoryException,
266*b1cdbd2cSJim Jagielski             io::IOException);
267*b1cdbd2cSJim Jagielski     virtual uno::Sequence< uno::Reference< rdf::XURI > > SAL_CALL
268*b1cdbd2cSJim Jagielski         getGraphNames() throw (uno::RuntimeException, rdf::RepositoryException);
269*b1cdbd2cSJim Jagielski     virtual uno::Reference< rdf::XNamedGraph > SAL_CALL getGraph(
270*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xGraphName)
271*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
272*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
273*b1cdbd2cSJim Jagielski     virtual uno::Reference< rdf::XNamedGraph > SAL_CALL createGraph(
274*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xGraphName)
275*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
276*b1cdbd2cSJim Jagielski             container::ElementExistException, rdf::RepositoryException);
277*b1cdbd2cSJim Jagielski     virtual void SAL_CALL destroyGraph(
278*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xGraphName)
279*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
280*b1cdbd2cSJim Jagielski             container::NoSuchElementException, rdf::RepositoryException);
281*b1cdbd2cSJim Jagielski     virtual uno::Reference< container::XEnumeration > SAL_CALL getStatements(
282*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
283*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
284*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject)
285*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException,
286*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
287*b1cdbd2cSJim Jagielski     virtual uno::Reference< rdf::XQuerySelectResult > SAL_CALL
288*b1cdbd2cSJim Jagielski             querySelect(const ::rtl::OUString & i_rQuery)
289*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, rdf::QueryException,
290*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
291*b1cdbd2cSJim Jagielski     virtual uno::Reference< container::XEnumeration > SAL_CALL
292*b1cdbd2cSJim Jagielski         queryConstruct(const ::rtl::OUString & i_rQuery)
293*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, rdf::QueryException,
294*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
295*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL queryAsk(const ::rtl::OUString & i_rQuery)
296*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, rdf::QueryException,
297*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski     // ::com::sun::star::rdf::XDocumentRepository:
300*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setStatementRDFa(
301*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
302*b1cdbd2cSJim Jagielski             const uno::Sequence< uno::Reference< rdf::XURI > > & i_rPredicates,
303*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XMetadatable > & i_xObject,
304*b1cdbd2cSJim Jagielski             const ::rtl::OUString & i_rRDFaContent,
305*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xRDFaDatatype)
306*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
307*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
308*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeStatementRDFa(
309*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XMetadatable > & i_xElement)
310*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
311*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
312*b1cdbd2cSJim Jagielski     virtual beans::Pair< uno::Sequence<rdf::Statement>, sal_Bool > SAL_CALL
313*b1cdbd2cSJim Jagielski         getStatementRDFa(uno::Reference< rdf::XMetadatable > const& i_xElement)
314*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
315*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
316*b1cdbd2cSJim Jagielski     virtual uno::Reference< container::XEnumeration > SAL_CALL
317*b1cdbd2cSJim Jagielski         getStatementsRDFa(
318*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
319*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
320*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject)
321*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException,
322*b1cdbd2cSJim Jagielski             rdf::RepositoryException);
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski     // ::com::sun::star::lang::XInitialization:
325*b1cdbd2cSJim Jagielski     virtual void SAL_CALL initialize(
326*b1cdbd2cSJim Jagielski             const uno::Sequence< ::com::sun::star::uno::Any > & i_rArguments)
327*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, uno::Exception);
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     // XNamedGraph forwards ---------------------------------------------
330*b1cdbd2cSJim Jagielski     const NamedGraphMap_t::iterator SAL_CALL clearGraph(
331*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xName,
332*b1cdbd2cSJim Jagielski             bool i_Internal = false );
333*b1cdbd2cSJim Jagielski     void SAL_CALL addStatementGraph(
334*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
335*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
336*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject,
337*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xName,
338*b1cdbd2cSJim Jagielski             bool i_Internal = false );
339*b1cdbd2cSJim Jagielski //        throw (uno::RuntimeException, lang::IllegalArgumentException,
340*b1cdbd2cSJim Jagielski //            container::NoSuchElementException, rdf::RepositoryException);
341*b1cdbd2cSJim Jagielski     void SAL_CALL removeStatementsGraph(
342*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
343*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
344*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject,
345*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xName );
346*b1cdbd2cSJim Jagielski //        throw (uno::RuntimeException, lang::IllegalArgumentException,
347*b1cdbd2cSJim Jagielski //            container::NoSuchElementException, rdf::RepositoryException);
348*b1cdbd2cSJim Jagielski     uno::Reference< container::XEnumeration > SAL_CALL getStatementsGraph(
349*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
350*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
351*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject,
352*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xName,
353*b1cdbd2cSJim Jagielski             bool i_Internal = false );
354*b1cdbd2cSJim Jagielski //        throw (uno::RuntimeException, lang::IllegalArgumentException,
355*b1cdbd2cSJim Jagielski //            container::NoSuchElementException, rdf::RepositoryException);
356*b1cdbd2cSJim Jagielski 
getTypeConverter()357*b1cdbd2cSJim Jagielski     const librdf_TypeConverter& getTypeConverter() { return m_TypeConverter; };
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski private:
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski     uno::Reference< uno::XComponentContext > m_xContext;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     /// librdf global data
364*b1cdbd2cSJim Jagielski     /** N.B.: The redland documentation gives the impression that you can have
365*b1cdbd2cSJim Jagielski               as many librdf_worlds as you like. This is true in the same sense
366*b1cdbd2cSJim Jagielski               that you can physically be in as many places as you like.
367*b1cdbd2cSJim Jagielski               Well, you can, just not at the same time.
368*b1cdbd2cSJim Jagielski               The ugly truth is that destroying a librdf_world kills a bunch
369*b1cdbd2cSJim Jagielski               of static variables; other librdf_worlds become very unhappy
370*b1cdbd2cSJim Jagielski               when they access these.
371*b1cdbd2cSJim Jagielski               And of course this is not documented anywhere that I could find.
372*b1cdbd2cSJim Jagielski               So we allocate a single world, and refcount that.
373*b1cdbd2cSJim Jagielski      */
374*b1cdbd2cSJim Jagielski     static boost::shared_ptr<librdf_world> m_pWorld;
375*b1cdbd2cSJim Jagielski     /// refcount
376*b1cdbd2cSJim Jagielski     static sal_uInt32 m_NumInstances;
377*b1cdbd2cSJim Jagielski     /// mutex for m_pWorld - redland is not as threadsafe as is often claimed
378*b1cdbd2cSJim Jagielski     static osl::Mutex m_aMutex;
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski     // NB: sequence of the shared pointers is important!
381*b1cdbd2cSJim Jagielski     /// librdf repository storage
382*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_storage> m_pStorage;
383*b1cdbd2cSJim Jagielski     /// librdf repository model
384*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_model> m_pModel;
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     /// all named graphs
387*b1cdbd2cSJim Jagielski     NamedGraphMap_t m_NamedGraphs;
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     /// type conversion helper
390*b1cdbd2cSJim Jagielski     librdf_TypeConverter m_TypeConverter;
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski     /// set of xml:ids of elements with xhtml:content
393*b1cdbd2cSJim Jagielski     ::std::set< ::rtl::OUString > m_RDFaXHTMLContentSet;
394*b1cdbd2cSJim Jagielski };
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski /** result of operations that return a graph, i.e.,
400*b1cdbd2cSJim Jagielski     an XEnumeration of statements.
401*b1cdbd2cSJim Jagielski  */
402*b1cdbd2cSJim Jagielski class librdf_GraphResult:
403*b1cdbd2cSJim Jagielski     private boost::noncopyable,
404*b1cdbd2cSJim Jagielski     public ::cppu::WeakImplHelper1<
405*b1cdbd2cSJim Jagielski         container::XEnumeration>
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski public:
408*b1cdbd2cSJim Jagielski 
librdf_GraphResult(librdf_Repository * i_pRepository,::osl::Mutex & i_rMutex,boost::shared_ptr<librdf_stream> const & i_pStream,boost::shared_ptr<librdf_node> const & i_pContext,boost::shared_ptr<librdf_query> const & i_pQuery=boost::shared_ptr<librdf_query> ())409*b1cdbd2cSJim Jagielski     librdf_GraphResult(librdf_Repository *i_pRepository,
410*b1cdbd2cSJim Jagielski             ::osl::Mutex & i_rMutex,
411*b1cdbd2cSJim Jagielski             boost::shared_ptr<librdf_stream> const& i_pStream,
412*b1cdbd2cSJim Jagielski             boost::shared_ptr<librdf_node> const& i_pContext,
413*b1cdbd2cSJim Jagielski             boost::shared_ptr<librdf_query>  const& i_pQuery =
414*b1cdbd2cSJim Jagielski                 boost::shared_ptr<librdf_query>() )
415*b1cdbd2cSJim Jagielski         : m_xRep(i_pRepository)
416*b1cdbd2cSJim Jagielski         , m_rMutex(i_rMutex)
417*b1cdbd2cSJim Jagielski         , m_pQuery(i_pQuery)
418*b1cdbd2cSJim Jagielski         , m_pContext(i_pContext)
419*b1cdbd2cSJim Jagielski         , m_pStream(i_pStream)
420*b1cdbd2cSJim Jagielski     { };
421*b1cdbd2cSJim Jagielski 
~librdf_GraphResult()422*b1cdbd2cSJim Jagielski     virtual ~librdf_GraphResult() {}
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski     // ::com::sun::star::container::XEnumeration:
425*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasMoreElements()
426*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
427*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL nextElement()
428*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, container::NoSuchElementException,
429*b1cdbd2cSJim Jagielski             lang::WrappedTargetException);
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski private:
432*b1cdbd2cSJim Jagielski     // NB: this is not a weak pointer: streams _must_ be deleted before the
433*b1cdbd2cSJim Jagielski     //     storage they point into, so we keep the repository alive here
434*b1cdbd2cSJim Jagielski     // also, sequence is important: the stream must be destroyed first.
435*b1cdbd2cSJim Jagielski     ::rtl::Reference< librdf_Repository > m_xRep;
436*b1cdbd2cSJim Jagielski     // needed for synchronizing access to librdf (it doesnt do win32 threading)
437*b1cdbd2cSJim Jagielski     ::osl::Mutex & m_rMutex;
438*b1cdbd2cSJim Jagielski     // the query (in case this is a result of a graph query)
439*b1cdbd2cSJim Jagielski     // not that the redland documentation spells this out explicity, but
440*b1cdbd2cSJim Jagielski     // queries must be freed only after all the results are completely read
441*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_query>  const m_pQuery;
442*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_node>   const m_pContext;
443*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_stream> const m_pStream;
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     librdf_node* getContext() const;
446*b1cdbd2cSJim Jagielski };
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XEnumeration:
450*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL
hasMoreElements()451*b1cdbd2cSJim Jagielski librdf_GraphResult::hasMoreElements() throw (uno::RuntimeException)
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_rMutex);
454*b1cdbd2cSJim Jagielski     return m_pStream.get() && !librdf_stream_end(m_pStream.get());
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski 
getContext() const457*b1cdbd2cSJim Jagielski librdf_node* librdf_GraphResult::getContext() const
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski     if (!m_pStream.get() || librdf_stream_end(m_pStream.get()))
460*b1cdbd2cSJim Jagielski         return NULL;
461*b1cdbd2cSJim Jagielski     librdf_node *pCtxt( static_cast<librdf_node *>
462*b1cdbd2cSJim Jagielski         (librdf_stream_get_context(m_pStream.get())) );
463*b1cdbd2cSJim Jagielski     if (pCtxt)
464*b1cdbd2cSJim Jagielski         return pCtxt;
465*b1cdbd2cSJim Jagielski     return m_pContext.get();
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Any SAL_CALL
nextElement()469*b1cdbd2cSJim Jagielski librdf_GraphResult::nextElement()
470*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, container::NoSuchElementException,
471*b1cdbd2cSJim Jagielski     lang::WrappedTargetException)
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_rMutex);
474*b1cdbd2cSJim Jagielski     if (!m_pStream.get() || !librdf_stream_end(m_pStream.get())) {
475*b1cdbd2cSJim Jagielski         librdf_node * pCtxt = getContext();
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski         librdf_statement *pStmt( librdf_stream_get_object(m_pStream.get()) );
478*b1cdbd2cSJim Jagielski         if (!pStmt) {
479*b1cdbd2cSJim Jagielski             rdf::QueryException e(::rtl::OUString::createFromAscii(
480*b1cdbd2cSJim Jagielski                 "librdf_GraphResult::nextElement: "
481*b1cdbd2cSJim Jagielski                 "librdf_stream_get_object failed"), *this);
482*b1cdbd2cSJim Jagielski             throw lang::WrappedTargetException(::rtl::OUString::createFromAscii(
483*b1cdbd2cSJim Jagielski                 "librdf_GraphResult::nextElement: "
484*b1cdbd2cSJim Jagielski                 "librdf_stream_get_object failed"), *this,
485*b1cdbd2cSJim Jagielski                     uno::makeAny(e));
486*b1cdbd2cSJim Jagielski         }
487*b1cdbd2cSJim Jagielski         // NB: pCtxt may be null here if this is result of a graph query
488*b1cdbd2cSJim Jagielski         if (pCtxt && isInternalContext(pCtxt)) {
489*b1cdbd2cSJim Jagielski             pCtxt = 0; // XML ID context is implementation detail!
490*b1cdbd2cSJim Jagielski         }
491*b1cdbd2cSJim Jagielski         rdf::Statement Stmt(
492*b1cdbd2cSJim Jagielski             m_xRep->getTypeConverter().convertToStatement(pStmt, pCtxt) );
493*b1cdbd2cSJim Jagielski         // NB: this will invalidate current item.
494*b1cdbd2cSJim Jagielski         librdf_stream_next(m_pStream.get());
495*b1cdbd2cSJim Jagielski         return uno::makeAny(Stmt);
496*b1cdbd2cSJim Jagielski     } else {
497*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException();
498*b1cdbd2cSJim Jagielski     }
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski /** result of tuple queries ("SELECT").
505*b1cdbd2cSJim Jagielski  */
506*b1cdbd2cSJim Jagielski class librdf_QuerySelectResult:
507*b1cdbd2cSJim Jagielski     private boost::noncopyable,
508*b1cdbd2cSJim Jagielski     public ::cppu::WeakImplHelper1<
509*b1cdbd2cSJim Jagielski         rdf::XQuerySelectResult>
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski public:
512*b1cdbd2cSJim Jagielski 
librdf_QuerySelectResult(librdf_Repository * i_pRepository,::osl::Mutex & i_rMutex,boost::shared_ptr<librdf_query> const & i_pQuery,boost::shared_ptr<librdf_query_results> const & i_pQueryResult,uno::Sequence<::rtl::OUString> const & i_rBindingNames)513*b1cdbd2cSJim Jagielski     librdf_QuerySelectResult(librdf_Repository *i_pRepository,
514*b1cdbd2cSJim Jagielski             ::osl::Mutex & i_rMutex,
515*b1cdbd2cSJim Jagielski             boost::shared_ptr<librdf_query>  const& i_pQuery,
516*b1cdbd2cSJim Jagielski             boost::shared_ptr<librdf_query_results> const& i_pQueryResult,
517*b1cdbd2cSJim Jagielski             uno::Sequence< ::rtl::OUString > const& i_rBindingNames )
518*b1cdbd2cSJim Jagielski         : m_xRep(i_pRepository)
519*b1cdbd2cSJim Jagielski         , m_rMutex(i_rMutex)
520*b1cdbd2cSJim Jagielski         , m_pQuery(i_pQuery)
521*b1cdbd2cSJim Jagielski         , m_pQueryResult(i_pQueryResult)
522*b1cdbd2cSJim Jagielski         , m_BindingNames(i_rBindingNames)
523*b1cdbd2cSJim Jagielski     { };
524*b1cdbd2cSJim Jagielski 
~librdf_QuerySelectResult()525*b1cdbd2cSJim Jagielski     virtual ~librdf_QuerySelectResult() {}
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski     // ::com::sun::star::container::XEnumeration:
528*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasMoreElements()
529*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
530*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL nextElement()
531*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, container::NoSuchElementException,
532*b1cdbd2cSJim Jagielski             lang::WrappedTargetException);
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski     // ::com::sun::star::rdf::XQuerySelectResult:
535*b1cdbd2cSJim Jagielski     virtual uno::Sequence< ::rtl::OUString > SAL_CALL getBindingNames()
536*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski private:
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski     // NB: this is not a weak pointer: streams _must_ be deleted before the
541*b1cdbd2cSJim Jagielski     //     storage they point into, so we keep the repository alive here
542*b1cdbd2cSJim Jagielski     // also, sequence is important: the stream must be destroyed first.
543*b1cdbd2cSJim Jagielski     ::rtl::Reference< librdf_Repository > m_xRep;
544*b1cdbd2cSJim Jagielski     // needed for synchronizing access to librdf (it doesnt do win32 threading)
545*b1cdbd2cSJim Jagielski     ::osl::Mutex & m_rMutex;
546*b1cdbd2cSJim Jagielski     // not that the redland documentation spells this out explicity, but
547*b1cdbd2cSJim Jagielski     // queries must be freed only after all the results are completely read
548*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_query>  m_pQuery;
549*b1cdbd2cSJim Jagielski     boost::shared_ptr<librdf_query_results> m_pQueryResult;
550*b1cdbd2cSJim Jagielski     uno::Sequence< ::rtl::OUString > m_BindingNames;
551*b1cdbd2cSJim Jagielski };
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XEnumeration:
555*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL
hasMoreElements()556*b1cdbd2cSJim Jagielski librdf_QuerySelectResult::hasMoreElements() throw (uno::RuntimeException)
557*b1cdbd2cSJim Jagielski {
558*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_rMutex);
559*b1cdbd2cSJim Jagielski     return !librdf_query_results_finished(m_pQueryResult.get());
560*b1cdbd2cSJim Jagielski }
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski class NodeArrayDeleter : public std::unary_function<librdf_node**, void>
563*b1cdbd2cSJim Jagielski {
564*b1cdbd2cSJim Jagielski     const int m_Count;
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski public:
NodeArrayDeleter(int i_Count)567*b1cdbd2cSJim Jagielski     NodeArrayDeleter(int i_Count) : m_Count(i_Count) { }
568*b1cdbd2cSJim Jagielski 
operator ()(librdf_node ** io_pArray) const569*b1cdbd2cSJim Jagielski     void operator() (librdf_node** io_pArray) const throw ()
570*b1cdbd2cSJim Jagielski     {
571*b1cdbd2cSJim Jagielski         std::for_each(io_pArray, io_pArray + m_Count, safe_librdf_free_node);
572*b1cdbd2cSJim Jagielski         delete[] io_pArray;
573*b1cdbd2cSJim Jagielski     }
574*b1cdbd2cSJim Jagielski };
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Any SAL_CALL
nextElement()577*b1cdbd2cSJim Jagielski librdf_QuerySelectResult::nextElement()
578*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, container::NoSuchElementException,
579*b1cdbd2cSJim Jagielski     lang::WrappedTargetException)
580*b1cdbd2cSJim Jagielski {
581*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_rMutex);
582*b1cdbd2cSJim Jagielski     if (!librdf_query_results_finished(m_pQueryResult.get())) {
583*b1cdbd2cSJim Jagielski         sal_Int32 count(m_BindingNames.getLength());
584*b1cdbd2cSJim Jagielski         OSL_ENSURE(count >= 0, "negative length?");
585*b1cdbd2cSJim Jagielski         boost::shared_array<librdf_node*> pNodes( new librdf_node*[count],
586*b1cdbd2cSJim Jagielski             NodeArrayDeleter(count));
587*b1cdbd2cSJim Jagielski         for (int i = 0; i < count; ++i) {
588*b1cdbd2cSJim Jagielski             pNodes[i] = 0;
589*b1cdbd2cSJim Jagielski         }
590*b1cdbd2cSJim Jagielski         if (librdf_query_results_get_bindings(m_pQueryResult.get(), NULL,
591*b1cdbd2cSJim Jagielski                     pNodes.get()))
592*b1cdbd2cSJim Jagielski         {
593*b1cdbd2cSJim Jagielski             rdf::QueryException e(::rtl::OUString::createFromAscii(
594*b1cdbd2cSJim Jagielski                 "librdf_QuerySelectResult::nextElement: "
595*b1cdbd2cSJim Jagielski                 "librdf_query_results_get_bindings failed"), *this);
596*b1cdbd2cSJim Jagielski             throw lang::WrappedTargetException(::rtl::OUString::createFromAscii(
597*b1cdbd2cSJim Jagielski                 "librdf_QuerySelectResult::nextElement: "
598*b1cdbd2cSJim Jagielski                 "librdf_query_results_get_bindings failed"), *this,
599*b1cdbd2cSJim Jagielski                 uno::makeAny(e));
600*b1cdbd2cSJim Jagielski         }
601*b1cdbd2cSJim Jagielski         uno::Sequence< uno::Reference< rdf::XNode > > ret(count);
602*b1cdbd2cSJim Jagielski         for (int i = 0; i < count; ++i) {
603*b1cdbd2cSJim Jagielski             ret[i] = m_xRep->getTypeConverter().convertToXNode(pNodes[i]);
604*b1cdbd2cSJim Jagielski         }
605*b1cdbd2cSJim Jagielski         // NB: this will invalidate current item.
606*b1cdbd2cSJim Jagielski         librdf_query_results_next(m_pQueryResult.get());
607*b1cdbd2cSJim Jagielski         return uno::makeAny(ret);
608*b1cdbd2cSJim Jagielski     } else {
609*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException();
610*b1cdbd2cSJim Jagielski     }
611*b1cdbd2cSJim Jagielski }
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski // ::com::sun::star::rdf::XQuerySelectResult:
614*b1cdbd2cSJim Jagielski uno::Sequence< ::rtl::OUString > SAL_CALL
getBindingNames()615*b1cdbd2cSJim Jagielski librdf_QuerySelectResult::getBindingNames() throw (uno::RuntimeException)
616*b1cdbd2cSJim Jagielski {
617*b1cdbd2cSJim Jagielski     return m_BindingNames;
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski /** represents a named graph, and forwards all the work to repository.
624*b1cdbd2cSJim Jagielski  */
625*b1cdbd2cSJim Jagielski class librdf_NamedGraph:
626*b1cdbd2cSJim Jagielski     private boost::noncopyable,
627*b1cdbd2cSJim Jagielski     public ::cppu::WeakImplHelper1<
628*b1cdbd2cSJim Jagielski         rdf::XNamedGraph>
629*b1cdbd2cSJim Jagielski {
630*b1cdbd2cSJim Jagielski public:
librdf_NamedGraph(librdf_Repository * i_pRep,uno::Reference<rdf::XURI> const & i_xName)631*b1cdbd2cSJim Jagielski     librdf_NamedGraph(librdf_Repository * i_pRep,
632*b1cdbd2cSJim Jagielski             uno::Reference<rdf::XURI> const & i_xName)
633*b1cdbd2cSJim Jagielski         : m_wRep(i_pRep)
634*b1cdbd2cSJim Jagielski         , m_pRep(i_pRep)
635*b1cdbd2cSJim Jagielski         , m_xName(i_xName)
636*b1cdbd2cSJim Jagielski     { };
637*b1cdbd2cSJim Jagielski 
~librdf_NamedGraph()638*b1cdbd2cSJim Jagielski     virtual ~librdf_NamedGraph() {}
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski     // ::com::sun::star::rdf::XNode:
641*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getStringValue()
642*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski     // ::com::sun::star::rdf::XURI:
645*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getNamespace()
646*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
647*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getLocalName()
648*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski     // ::com::sun::star::rdf::XNamedGraph:
651*b1cdbd2cSJim Jagielski     virtual uno::Reference<rdf::XURI> SAL_CALL getName()
652*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
653*b1cdbd2cSJim Jagielski     virtual void SAL_CALL clear()
654*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException,
655*b1cdbd2cSJim Jagielski             container::NoSuchElementException, rdf::RepositoryException);
656*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addStatement(
657*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
658*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
659*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject)
660*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException, lang::IllegalArgumentException,
661*b1cdbd2cSJim Jagielski             container::NoSuchElementException, rdf::RepositoryException);
662*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeStatements(
663*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
664*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
665*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject)
666*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException,
667*b1cdbd2cSJim Jagielski             container::NoSuchElementException, rdf::RepositoryException);
668*b1cdbd2cSJim Jagielski     virtual uno::Reference< container::XEnumeration > SAL_CALL getStatements(
669*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XResource > & i_xSubject,
670*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XURI > & i_xPredicate,
671*b1cdbd2cSJim Jagielski             const uno::Reference< rdf::XNode > & i_xObject)
672*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException,
673*b1cdbd2cSJim Jagielski             container::NoSuchElementException, rdf::RepositoryException);
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski private:
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski     /// weak reference: this is needed to check if m_pRep is valid
678*b1cdbd2cSJim Jagielski     uno::WeakReference< rdf::XRepository > m_wRep;
679*b1cdbd2cSJim Jagielski     librdf_Repository *m_pRep;
680*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XURI > m_xName;
681*b1cdbd2cSJim Jagielski };
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski // ::com::sun::star::rdf::XNode:
getStringValue()685*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL librdf_NamedGraph::getStringValue()
686*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski     return m_xName->getStringValue();
689*b1cdbd2cSJim Jagielski }
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski // ::com::sun::star::rdf::XURI:
getNamespace()692*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL librdf_NamedGraph::getNamespace()
693*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski     return m_xName->getNamespace();
696*b1cdbd2cSJim Jagielski }
697*b1cdbd2cSJim Jagielski 
getLocalName()698*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL librdf_NamedGraph::getLocalName()
699*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski     return m_xName->getLocalName();
702*b1cdbd2cSJim Jagielski }
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski // ::com::sun::star::rdf::XNamedGraph:
getName()705*b1cdbd2cSJim Jagielski uno::Reference< rdf::XURI > SAL_CALL librdf_NamedGraph::getName()
706*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
707*b1cdbd2cSJim Jagielski {
708*b1cdbd2cSJim Jagielski     return m_xName;
709*b1cdbd2cSJim Jagielski }
710*b1cdbd2cSJim Jagielski 
clear()711*b1cdbd2cSJim Jagielski void SAL_CALL librdf_NamedGraph::clear()
712*b1cdbd2cSJim Jagielski throw (uno::RuntimeException,
713*b1cdbd2cSJim Jagielski     container::NoSuchElementException, rdf::RepositoryException)
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XRepository > xRep( m_wRep );
716*b1cdbd2cSJim Jagielski     if (!xRep.is()) {
717*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
718*b1cdbd2cSJim Jagielski             "librdf_NamedGraph::clear: repository is gone"), *this);
719*b1cdbd2cSJim Jagielski     }
720*b1cdbd2cSJim Jagielski     try {
721*b1cdbd2cSJim Jagielski         m_pRep->clearGraph(m_xName);
722*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException &) {
723*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
724*b1cdbd2cSJim Jagielski     }
725*b1cdbd2cSJim Jagielski }
726*b1cdbd2cSJim Jagielski 
addStatement(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject)727*b1cdbd2cSJim Jagielski void SAL_CALL librdf_NamedGraph::addStatement(
728*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
729*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
730*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject)
731*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
732*b1cdbd2cSJim Jagielski     container::NoSuchElementException, rdf::RepositoryException)
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XRepository > xRep( m_wRep );
735*b1cdbd2cSJim Jagielski     if (!xRep.is()) {
736*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
737*b1cdbd2cSJim Jagielski             "librdf_NamedGraph::addStatement: repository is gone"), *this);
738*b1cdbd2cSJim Jagielski     }
739*b1cdbd2cSJim Jagielski     m_pRep->addStatementGraph(i_xSubject, i_xPredicate, i_xObject, m_xName);
740*b1cdbd2cSJim Jagielski }
741*b1cdbd2cSJim Jagielski 
removeStatements(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject)742*b1cdbd2cSJim Jagielski void SAL_CALL librdf_NamedGraph::removeStatements(
743*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
744*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
745*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject)
746*b1cdbd2cSJim Jagielski throw (uno::RuntimeException,
747*b1cdbd2cSJim Jagielski     container::NoSuchElementException, rdf::RepositoryException)
748*b1cdbd2cSJim Jagielski {
749*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XRepository > xRep( m_wRep );
750*b1cdbd2cSJim Jagielski     if (!xRep.is()) {
751*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
752*b1cdbd2cSJim Jagielski             "librdf_NamedGraph::removeStatements: repository is gone"), *this);
753*b1cdbd2cSJim Jagielski     }
754*b1cdbd2cSJim Jagielski     m_pRep->removeStatementsGraph(i_xSubject, i_xPredicate, i_xObject, m_xName);
755*b1cdbd2cSJim Jagielski }
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski uno::Reference< container::XEnumeration > SAL_CALL
getStatements(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject)758*b1cdbd2cSJim Jagielski librdf_NamedGraph::getStatements(
759*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
760*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
761*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject)
762*b1cdbd2cSJim Jagielski throw (uno::RuntimeException,
763*b1cdbd2cSJim Jagielski     container::NoSuchElementException, rdf::RepositoryException)
764*b1cdbd2cSJim Jagielski {
765*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XRepository > xRep( m_wRep );
766*b1cdbd2cSJim Jagielski     if (!xRep.is()) {
767*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
768*b1cdbd2cSJim Jagielski             "librdf_NamedGraph::getStatements: repository is gone"), *this);
769*b1cdbd2cSJim Jagielski     }
770*b1cdbd2cSJim Jagielski     return m_pRep->getStatementsGraph(
771*b1cdbd2cSJim Jagielski             i_xSubject, i_xPredicate, i_xObject, m_xName);
772*b1cdbd2cSJim Jagielski }
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski boost::shared_ptr<librdf_world> librdf_Repository::m_pWorld;
778*b1cdbd2cSJim Jagielski sal_uInt32 librdf_Repository::m_NumInstances = 0;
779*b1cdbd2cSJim Jagielski osl::Mutex librdf_Repository::m_aMutex;
780*b1cdbd2cSJim Jagielski 
librdf_Repository(uno::Reference<uno::XComponentContext> const & i_xContext)781*b1cdbd2cSJim Jagielski librdf_Repository::librdf_Repository(
782*b1cdbd2cSJim Jagielski         uno::Reference< uno::XComponentContext > const & i_xContext)
783*b1cdbd2cSJim Jagielski     : /*BaseMutex(),*/ m_xContext(i_xContext)
784*b1cdbd2cSJim Jagielski //    m_pWorld  (static_cast<librdf_world  *>(0), safe_librdf_free_world  ),
785*b1cdbd2cSJim Jagielski     , m_pStorage(static_cast<librdf_storage*>(0), safe_librdf_free_storage)
786*b1cdbd2cSJim Jagielski     , m_pModel  (static_cast<librdf_model  *>(0), safe_librdf_free_model  )
787*b1cdbd2cSJim Jagielski     , m_NamedGraphs()
788*b1cdbd2cSJim Jagielski     , m_TypeConverter(i_xContext, *this)
789*b1cdbd2cSJim Jagielski {
790*b1cdbd2cSJim Jagielski     OSL_ENSURE(i_xContext.is(), "librdf_Repository: null context");
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
793*b1cdbd2cSJim Jagielski     if (!m_NumInstances++) {
794*b1cdbd2cSJim Jagielski         m_pWorld.reset(m_TypeConverter.createWorld(), safe_librdf_free_world);
795*b1cdbd2cSJim Jagielski     }
796*b1cdbd2cSJim Jagielski }
797*b1cdbd2cSJim Jagielski 
~librdf_Repository()798*b1cdbd2cSJim Jagielski librdf_Repository::~librdf_Repository()
799*b1cdbd2cSJim Jagielski {
800*b1cdbd2cSJim Jagielski     // must destroy these before world!
801*b1cdbd2cSJim Jagielski     m_pModel.reset();
802*b1cdbd2cSJim Jagielski     m_pStorage.reset();
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski     // FIXME: so it turns out that calling librdf_free_world will
805*b1cdbd2cSJim Jagielski     //   (via raptor_sax2_finish) call xmlCleanupParser, which will
806*b1cdbd2cSJim Jagielski     //   free libxml2's globals! ARRRGH!!! => never call librdf_free_world
807*b1cdbd2cSJim Jagielski #if 0
808*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
809*b1cdbd2cSJim Jagielski     if (!--m_NumInstances) {
810*b1cdbd2cSJim Jagielski         m_pWorld.reset();
811*b1cdbd2cSJim Jagielski     }
812*b1cdbd2cSJim Jagielski #endif
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski // com.sun.star.uno.XServiceInfo:
getImplementationName()816*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL librdf_Repository::getImplementationName()
817*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski     return comp_librdf_Repository::_getImplementationName();
820*b1cdbd2cSJim Jagielski }
821*b1cdbd2cSJim Jagielski 
supportsService(::rtl::OUString const & serviceName)822*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL librdf_Repository::supportsService(
823*b1cdbd2cSJim Jagielski     ::rtl::OUString const & serviceName) throw (uno::RuntimeException)
824*b1cdbd2cSJim Jagielski {
825*b1cdbd2cSJim Jagielski     uno::Sequence< ::rtl::OUString > serviceNames
826*b1cdbd2cSJim Jagielski         = comp_librdf_Repository::_getSupportedServiceNames();
827*b1cdbd2cSJim Jagielski     for (::sal_Int32 i = 0; i < serviceNames.getLength(); ++i) {
828*b1cdbd2cSJim Jagielski         if (serviceNames[i] == serviceName)
829*b1cdbd2cSJim Jagielski             return sal_True;
830*b1cdbd2cSJim Jagielski     }
831*b1cdbd2cSJim Jagielski     return sal_False;
832*b1cdbd2cSJim Jagielski }
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski uno::Sequence< ::rtl::OUString > SAL_CALL
getSupportedServiceNames()835*b1cdbd2cSJim Jagielski librdf_Repository::getSupportedServiceNames() throw (uno::RuntimeException)
836*b1cdbd2cSJim Jagielski {
837*b1cdbd2cSJim Jagielski     return comp_librdf_Repository::_getSupportedServiceNames();
838*b1cdbd2cSJim Jagielski }
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski // ::com::sun::star::rdf::XRepository:
createBlankNode()841*b1cdbd2cSJim Jagielski uno::Reference< rdf::XBlankNode > SAL_CALL librdf_Repository::createBlankNode()
842*b1cdbd2cSJim Jagielski throw (uno::RuntimeException)
843*b1cdbd2cSJim Jagielski {
844*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
845*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pNode(
846*b1cdbd2cSJim Jagielski         librdf_new_node_from_blank_identifier(m_pWorld.get(), NULL),
847*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
848*b1cdbd2cSJim Jagielski     if (!pNode) {
849*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
850*b1cdbd2cSJim Jagielski             "librdf_Repository::createBlankNode: "
851*b1cdbd2cSJim Jagielski             "librdf_new_node_from_blank_identifier failed"), *this);
852*b1cdbd2cSJim Jagielski     }
853*b1cdbd2cSJim Jagielski     const unsigned char * id (librdf_node_get_blank_identifier(pNode.get()));
854*b1cdbd2cSJim Jagielski     if (!id) {
855*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
856*b1cdbd2cSJim Jagielski             "librdf_Repository::createBlankNode: "
857*b1cdbd2cSJim Jagielski             "librdf_node_get_blank_identifier failed"), *this);
858*b1cdbd2cSJim Jagielski     }
859*b1cdbd2cSJim Jagielski     const ::rtl::OUString nodeID(::rtl::OUString::createFromAscii(
860*b1cdbd2cSJim Jagielski         reinterpret_cast<const char *>(id)));
861*b1cdbd2cSJim Jagielski     try {
862*b1cdbd2cSJim Jagielski         return rdf::BlankNode::create(m_xContext, nodeID);
863*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException & iae) {
864*b1cdbd2cSJim Jagielski         throw lang::WrappedTargetRuntimeException(
865*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
866*b1cdbd2cSJim Jagielski                 "librdf_Repository::createBlankNode: "
867*b1cdbd2cSJim Jagielski                 "illegal blank node label"), *this, uno::makeAny(iae));
868*b1cdbd2cSJim Jagielski     }
869*b1cdbd2cSJim Jagielski }
870*b1cdbd2cSJim Jagielski 
formatNeedsBaseURI(::sal_Int16 i_Format)871*b1cdbd2cSJim Jagielski bool formatNeedsBaseURI(::sal_Int16 i_Format)
872*b1cdbd2cSJim Jagielski {
873*b1cdbd2cSJim Jagielski     (void) i_Format; //FIXME any which dont?
874*b1cdbd2cSJim Jagielski     return true;
875*b1cdbd2cSJim Jagielski }
876*b1cdbd2cSJim Jagielski 
myExtEntityLoader(const char *,const char *,xmlParserCtxtPtr)877*b1cdbd2cSJim Jagielski xmlParserInputPtr myExtEntityLoader( const char* /*URL*/, const char* /*ID*/, xmlParserCtxtPtr /*context*/)
878*b1cdbd2cSJim Jagielski {
879*b1cdbd2cSJim Jagielski 	return NULL;
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski //void SAL_CALL
883*b1cdbd2cSJim Jagielski uno::Reference<rdf::XNamedGraph> SAL_CALL
importGraph(::sal_Int16 i_Format,const uno::Reference<io::XInputStream> & i_xInStream,const uno::Reference<rdf::XURI> & i_xGraphName,const uno::Reference<rdf::XURI> & i_xBaseURI)884*b1cdbd2cSJim Jagielski librdf_Repository::importGraph(::sal_Int16 i_Format,
885*b1cdbd2cSJim Jagielski     const uno::Reference< io::XInputStream > & i_xInStream,
886*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xGraphName,
887*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xBaseURI)
888*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
889*b1cdbd2cSJim Jagielski     datatransfer::UnsupportedFlavorException,
890*b1cdbd2cSJim Jagielski     container::ElementExistException, rdf::ParseException,
891*b1cdbd2cSJim Jagielski     rdf::RepositoryException, io::IOException)
892*b1cdbd2cSJim Jagielski {
893*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
894*b1cdbd2cSJim Jagielski     if (!i_xInStream.is()) {
895*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
896*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
897*b1cdbd2cSJim Jagielski                 "stream is null"), *this, 1);
898*b1cdbd2cSJim Jagielski     }
899*b1cdbd2cSJim Jagielski     //FIXME: other formats
900*b1cdbd2cSJim Jagielski     if (i_Format != rdf::FileFormat::RDF_XML) {
901*b1cdbd2cSJim Jagielski         throw datatransfer::UnsupportedFlavorException(
902*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
903*b1cdbd2cSJim Jagielski                 "file format not supported"), *this);
904*b1cdbd2cSJim Jagielski     }
905*b1cdbd2cSJim Jagielski     if (!i_xGraphName.is()) {
906*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
907*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
908*b1cdbd2cSJim Jagielski                 "graph name is null"), *this, 2);
909*b1cdbd2cSJim Jagielski     }
910*b1cdbd2cSJim Jagielski     if (i_xGraphName->getStringValue().matchAsciiL(s_nsOOo, sizeof(s_nsOOo)-1))
911*b1cdbd2cSJim Jagielski     {
912*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
913*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
914*b1cdbd2cSJim Jagielski                 "URI is reserved"), *this, 0);
915*b1cdbd2cSJim Jagielski     }
916*b1cdbd2cSJim Jagielski     if (formatNeedsBaseURI(i_Format) && !i_xBaseURI.is()) {
917*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
918*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
919*b1cdbd2cSJim Jagielski                 "base URI is null"), *this, 3);
920*b1cdbd2cSJim Jagielski     }
921*b1cdbd2cSJim Jagielski     OSL_ENSURE(i_xBaseURI.is(), "no base uri");
922*b1cdbd2cSJim Jagielski     const ::rtl::OUString baseURIU( i_xBaseURI->getStringValue() );
923*b1cdbd2cSJim Jagielski     if (baseURIU.indexOf('#') >= 0) {
924*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
925*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
926*b1cdbd2cSJim Jagielski                 "base URI is not absolute"), *this, 3);
927*b1cdbd2cSJim Jagielski     }
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
930*b1cdbd2cSJim Jagielski     if (m_NamedGraphs.find(contextU) != m_NamedGraphs.end()) {
931*b1cdbd2cSJim Jagielski         throw container::ElementExistException(
932*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::importGraph: "
933*b1cdbd2cSJim Jagielski                 "graph with given URI exists"), *this);
934*b1cdbd2cSJim Jagielski     }
935*b1cdbd2cSJim Jagielski     const ::rtl::OString context(
936*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(contextU, RTL_TEXTENCODING_UTF8) );
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pContext(
939*b1cdbd2cSJim Jagielski         librdf_new_node_from_uri_string(m_pWorld.get(),
940*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (context.getStr())),
941*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
942*b1cdbd2cSJim Jagielski     if (!pContext) {
943*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
944*b1cdbd2cSJim Jagielski             "librdf_Repository::importGraph: "
945*b1cdbd2cSJim Jagielski             "librdf_new_node_from_uri_string failed"), *this);
946*b1cdbd2cSJim Jagielski     }
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski     const ::rtl::OString baseURI(
949*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(baseURIU, RTL_TEXTENCODING_UTF8) );
950*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_uri> pBaseURI(
951*b1cdbd2cSJim Jagielski         librdf_new_uri(m_pWorld.get(),
952*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (baseURI.getStr())),
953*b1cdbd2cSJim Jagielski         safe_librdf_free_uri);
954*b1cdbd2cSJim Jagielski     if (!pBaseURI) {
955*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
956*b1cdbd2cSJim Jagielski             "librdf_Repository::importGraph: "
957*b1cdbd2cSJim Jagielski             "librdf_new_uri failed"), *this);
958*b1cdbd2cSJim Jagielski     }
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_parser> pParser(
961*b1cdbd2cSJim Jagielski         librdf_new_parser(m_pWorld.get(), "rdfxml", NULL, NULL),
962*b1cdbd2cSJim Jagielski         safe_librdf_free_parser);
963*b1cdbd2cSJim Jagielski     if (!pParser) {
964*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
965*b1cdbd2cSJim Jagielski             "librdf_Repository::importGraph: "
966*b1cdbd2cSJim Jagielski             "librdf_new_parser failed"), *this);
967*b1cdbd2cSJim Jagielski     }
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski     xmlExternalEntityLoader oldExtEntityLoader = xmlGetExternalEntityLoader();
970*b1cdbd2cSJim Jagielski     xmlSetExternalEntityLoader( myExtEntityLoader);
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski     uno::Sequence<sal_Int8> buf;
973*b1cdbd2cSJim Jagielski     uno::Reference<io::XSeekable> xSeekable(i_xInStream, uno::UNO_QUERY);
974*b1cdbd2cSJim Jagielski     // UGLY: if only that redland junk could read streams...
975*b1cdbd2cSJim Jagielski     const sal_Int64 sz( xSeekable.is() ? xSeekable->getLength() : 1 << 20 );
976*b1cdbd2cSJim Jagielski     // exceptions are propagated
977*b1cdbd2cSJim Jagielski     i_xInStream->readBytes( buf, static_cast<sal_Int32>( sz ) );
978*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
979*b1cdbd2cSJim Jagielski         librdf_parser_parse_counted_string_as_stream(pParser.get(),
980*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*>(buf.getConstArray()),
981*b1cdbd2cSJim Jagielski             buf.getLength(), pBaseURI.get()),
982*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
983*b1cdbd2cSJim Jagielski     if (!pStream) {
984*b1cdbd2cSJim Jagielski         throw rdf::ParseException(::rtl::OUString::createFromAscii(
985*b1cdbd2cSJim Jagielski             "librdf_Repository::importGraph: "
986*b1cdbd2cSJim Jagielski             "librdf_parser_parse_counted_string_as_stream failed"), *this);
987*b1cdbd2cSJim Jagielski     }
988*b1cdbd2cSJim Jagielski     m_NamedGraphs.insert(std::make_pair(contextU,
989*b1cdbd2cSJim Jagielski         new librdf_NamedGraph(this, i_xGraphName)));
990*b1cdbd2cSJim Jagielski     if (librdf_model_context_add_statements(m_pModel.get(),
991*b1cdbd2cSJim Jagielski             pContext.get(), pStream.get())) {
992*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
993*b1cdbd2cSJim Jagielski             "librdf_Repository::importGraph: "
994*b1cdbd2cSJim Jagielski             "librdf_model_context_add_statements failed"), *this);
995*b1cdbd2cSJim Jagielski     }
996*b1cdbd2cSJim Jagielski 
997*b1cdbd2cSJim Jagielski     xmlSetExternalEntityLoader( oldExtEntityLoader);
998*b1cdbd2cSJim Jagielski     return getGraph(i_xGraphName);
999*b1cdbd2cSJim Jagielski }
1000*b1cdbd2cSJim Jagielski 
1001*b1cdbd2cSJim Jagielski void SAL_CALL
exportGraph(::sal_Int16 i_Format,const uno::Reference<io::XOutputStream> & i_xOutStream,const uno::Reference<rdf::XURI> & i_xGraphName,const uno::Reference<rdf::XURI> & i_xBaseURI)1002*b1cdbd2cSJim Jagielski librdf_Repository::exportGraph(::sal_Int16 i_Format,
1003*b1cdbd2cSJim Jagielski     const uno::Reference< io::XOutputStream > & i_xOutStream,
1004*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xGraphName,
1005*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xBaseURI)
1006*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1007*b1cdbd2cSJim Jagielski     datatransfer::UnsupportedFlavorException,
1008*b1cdbd2cSJim Jagielski     container::NoSuchElementException, rdf::RepositoryException,
1009*b1cdbd2cSJim Jagielski     io::IOException)
1010*b1cdbd2cSJim Jagielski {
1011*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1012*b1cdbd2cSJim Jagielski     if (!i_xOutStream.is()) {
1013*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1014*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::exportGraph: "
1015*b1cdbd2cSJim Jagielski                 "stream is null"), *this, 1);
1016*b1cdbd2cSJim Jagielski     }
1017*b1cdbd2cSJim Jagielski     // FIXME: other formats
1018*b1cdbd2cSJim Jagielski     if (i_Format != rdf::FileFormat::RDF_XML) {
1019*b1cdbd2cSJim Jagielski         throw datatransfer::UnsupportedFlavorException(
1020*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::exportGraph: "
1021*b1cdbd2cSJim Jagielski                 "file format not supported"), *this);
1022*b1cdbd2cSJim Jagielski     }
1023*b1cdbd2cSJim Jagielski     if (!i_xGraphName.is()) {
1024*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1025*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::exportGraph: "
1026*b1cdbd2cSJim Jagielski                 "graph name is null"), *this, 2);
1027*b1cdbd2cSJim Jagielski     }
1028*b1cdbd2cSJim Jagielski     if (formatNeedsBaseURI(i_Format) && !i_xBaseURI.is()) {
1029*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1030*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::exportGraph: "
1031*b1cdbd2cSJim Jagielski                 "base URI is null"), *this, 3);
1032*b1cdbd2cSJim Jagielski     }
1033*b1cdbd2cSJim Jagielski     OSL_ENSURE(i_xBaseURI.is(), "no base uri");
1034*b1cdbd2cSJim Jagielski     const ::rtl::OUString baseURIU( i_xBaseURI->getStringValue() );
1035*b1cdbd2cSJim Jagielski     if (baseURIU.indexOf('#') >= 0) {
1036*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1037*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::exportGraph: "
1038*b1cdbd2cSJim Jagielski                 "base URI is not absolute"), *this, 3);
1039*b1cdbd2cSJim Jagielski     }
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
1042*b1cdbd2cSJim Jagielski     if (m_NamedGraphs.find(contextU) == m_NamedGraphs.end()) {
1043*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException(
1044*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::exportGraph: "
1045*b1cdbd2cSJim Jagielski                 "no graph with given URI exists"), *this);
1046*b1cdbd2cSJim Jagielski     }
1047*b1cdbd2cSJim Jagielski     const ::rtl::OString context(
1048*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(contextU, RTL_TEXTENCODING_UTF8) );
1049*b1cdbd2cSJim Jagielski 
1050*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pContext(
1051*b1cdbd2cSJim Jagielski         librdf_new_node_from_uri_string(m_pWorld.get(),
1052*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (context.getStr())),
1053*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1054*b1cdbd2cSJim Jagielski     if (!pContext) {
1055*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1056*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1057*b1cdbd2cSJim Jagielski             "librdf_new_node_from_uri_string failed"), *this);
1058*b1cdbd2cSJim Jagielski     }
1059*b1cdbd2cSJim Jagielski     const ::rtl::OString baseURI(
1060*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(baseURIU, RTL_TEXTENCODING_UTF8) );
1061*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_uri> pBaseURI(
1062*b1cdbd2cSJim Jagielski         librdf_new_uri(m_pWorld.get(),
1063*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (baseURI.getStr())),
1064*b1cdbd2cSJim Jagielski         safe_librdf_free_uri);
1065*b1cdbd2cSJim Jagielski     if (!pBaseURI) {
1066*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1067*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1068*b1cdbd2cSJim Jagielski             "librdf_new_uri failed"), *this);
1069*b1cdbd2cSJim Jagielski     }
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
1072*b1cdbd2cSJim Jagielski         librdf_model_context_as_stream(m_pModel.get(), pContext.get()),
1073*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
1074*b1cdbd2cSJim Jagielski     if (!pStream) {
1075*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1076*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1077*b1cdbd2cSJim Jagielski             "librdf_model_context_as_stream failed"), *this);
1078*b1cdbd2cSJim Jagielski     }
1079*b1cdbd2cSJim Jagielski     const char *format("rdfxml");
1080*b1cdbd2cSJim Jagielski     // #i116443#: abbrev breaks when certain URIs are used as data types
1081*b1cdbd2cSJim Jagielski //    const char *format("rdfxml-abbrev");
1082*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_serializer> pSerializer(
1083*b1cdbd2cSJim Jagielski         librdf_new_serializer(m_pWorld.get(), format, NULL, NULL),
1084*b1cdbd2cSJim Jagielski         safe_librdf_free_serializer);
1085*b1cdbd2cSJim Jagielski     if (!pSerializer) {
1086*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1087*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1088*b1cdbd2cSJim Jagielski             "librdf_new_serializer failed"), *this);
1089*b1cdbd2cSJim Jagielski     }
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_uri> pRelativeURI(
1092*b1cdbd2cSJim Jagielski         librdf_new_uri(m_pWorld.get(), reinterpret_cast<const unsigned char*>
1093*b1cdbd2cSJim Jagielski                 ("http://feature.librdf.org/raptor-relativeURIs")),
1094*b1cdbd2cSJim Jagielski         safe_librdf_free_uri);
1095*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_uri> pWriteBaseURI(
1096*b1cdbd2cSJim Jagielski         librdf_new_uri(m_pWorld.get(), reinterpret_cast<const unsigned char*>
1097*b1cdbd2cSJim Jagielski             ("http://feature.librdf.org/raptor-writeBaseURI")),
1098*b1cdbd2cSJim Jagielski         safe_librdf_free_uri);
1099*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> p0(
1100*b1cdbd2cSJim Jagielski         librdf_new_node_from_literal(m_pWorld.get(),
1101*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> ("0"), NULL, 0),
1102*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1103*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> p1(
1104*b1cdbd2cSJim Jagielski         librdf_new_node_from_literal(m_pWorld.get(),
1105*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> ("1"), NULL, 0),
1106*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1107*b1cdbd2cSJim Jagielski     if (!pWriteBaseURI || !pRelativeURI || !p0 || !p1) {
1108*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1109*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1110*b1cdbd2cSJim Jagielski             "librdf_new_uri or librdf_new_node_from_literal failed"), *this);
1111*b1cdbd2cSJim Jagielski     }
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski     // make URIs relative to base URI
1114*b1cdbd2cSJim Jagielski     if (librdf_serializer_set_feature(pSerializer.get(),
1115*b1cdbd2cSJim Jagielski         pRelativeURI.get(), p1.get()))
1116*b1cdbd2cSJim Jagielski     {
1117*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1118*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1119*b1cdbd2cSJim Jagielski             "librdf_serializer_set_feature relativeURIs failed"), *this);
1120*b1cdbd2cSJim Jagielski     }
1121*b1cdbd2cSJim Jagielski     // but do not write the base URI to the file!
1122*b1cdbd2cSJim Jagielski     if (librdf_serializer_set_feature(pSerializer.get(),
1123*b1cdbd2cSJim Jagielski         pWriteBaseURI.get(), p0.get()))
1124*b1cdbd2cSJim Jagielski     {
1125*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1126*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1127*b1cdbd2cSJim Jagielski             "librdf_serializer_set_feature writeBaseURI failed"), *this);
1128*b1cdbd2cSJim Jagielski     }
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski     size_t length;
1131*b1cdbd2cSJim Jagielski     const boost::shared_ptr<unsigned char> pBuf(
1132*b1cdbd2cSJim Jagielski         librdf_serializer_serialize_stream_to_counted_string(
1133*b1cdbd2cSJim Jagielski             pSerializer.get(), pBaseURI.get(), pStream.get(), &length), free);
1134*b1cdbd2cSJim Jagielski     if (!pBuf) {
1135*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1136*b1cdbd2cSJim Jagielski             "librdf_Repository::exportGraph: "
1137*b1cdbd2cSJim Jagielski             "librdf_serializer_serialize_stream_to_counted_string failed"),
1138*b1cdbd2cSJim Jagielski             *this);
1139*b1cdbd2cSJim Jagielski     }
1140*b1cdbd2cSJim Jagielski     const uno::Sequence<sal_Int8> buf(
1141*b1cdbd2cSJim Jagielski         reinterpret_cast<sal_Int8*>(pBuf.get()), length);
1142*b1cdbd2cSJim Jagielski     // exceptions are propagated
1143*b1cdbd2cSJim Jagielski     i_xOutStream->writeBytes(buf);
1144*b1cdbd2cSJim Jagielski }
1145*b1cdbd2cSJim Jagielski 
1146*b1cdbd2cSJim Jagielski uno::Sequence< uno::Reference< rdf::XURI > > SAL_CALL
getGraphNames()1147*b1cdbd2cSJim Jagielski librdf_Repository::getGraphNames()
1148*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, rdf::RepositoryException)
1149*b1cdbd2cSJim Jagielski {
1150*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1151*b1cdbd2cSJim Jagielski     ::comphelper::SequenceAsVector< uno::Reference<rdf::XURI> > ret;
1152*b1cdbd2cSJim Jagielski     std::transform(m_NamedGraphs.begin(), m_NamedGraphs.end(),
1153*b1cdbd2cSJim Jagielski         std::back_inserter(ret),
1154*b1cdbd2cSJim Jagielski         boost::bind(&rdf::XNamedGraph::getName,
1155*b1cdbd2cSJim Jagielski             boost::bind(&NamedGraphMap_t::value_type::second, _1)));
1156*b1cdbd2cSJim Jagielski     return ret.getAsConstList();
1157*b1cdbd2cSJim Jagielski }
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski uno::Reference< rdf::XNamedGraph > SAL_CALL
getGraph(const uno::Reference<rdf::XURI> & i_xGraphName)1160*b1cdbd2cSJim Jagielski librdf_Repository::getGraph(const uno::Reference< rdf::XURI > & i_xGraphName)
1161*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1162*b1cdbd2cSJim Jagielski     rdf::RepositoryException)
1163*b1cdbd2cSJim Jagielski {
1164*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1165*b1cdbd2cSJim Jagielski     if (!i_xGraphName.is()) {
1166*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1167*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::getGraph: "
1168*b1cdbd2cSJim Jagielski                 "URI is null"), *this, 0);
1169*b1cdbd2cSJim Jagielski     }
1170*b1cdbd2cSJim Jagielski     const NamedGraphMap_t::iterator iter(
1171*b1cdbd2cSJim Jagielski         m_NamedGraphs.find(i_xGraphName->getStringValue()) );
1172*b1cdbd2cSJim Jagielski     if (iter != m_NamedGraphs.end()) {
1173*b1cdbd2cSJim Jagielski         return uno::Reference<rdf::XNamedGraph>(iter->second.get());
1174*b1cdbd2cSJim Jagielski     } else {
1175*b1cdbd2cSJim Jagielski         return 0;
1176*b1cdbd2cSJim Jagielski     }
1177*b1cdbd2cSJim Jagielski }
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski uno::Reference< rdf::XNamedGraph > SAL_CALL
createGraph(const uno::Reference<rdf::XURI> & i_xGraphName)1180*b1cdbd2cSJim Jagielski librdf_Repository::createGraph(const uno::Reference< rdf::XURI > & i_xGraphName)
1181*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1182*b1cdbd2cSJim Jagielski     container::ElementExistException, rdf::RepositoryException)
1183*b1cdbd2cSJim Jagielski {
1184*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1185*b1cdbd2cSJim Jagielski     if (!i_xGraphName.is()) {
1186*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1187*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::createGraph: "
1188*b1cdbd2cSJim Jagielski                 "URI is null"), *this, 0);
1189*b1cdbd2cSJim Jagielski     }
1190*b1cdbd2cSJim Jagielski     if (i_xGraphName->getStringValue().matchAsciiL(s_nsOOo, sizeof(s_nsOOo)-1))
1191*b1cdbd2cSJim Jagielski     {
1192*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1193*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::createGraph: "
1194*b1cdbd2cSJim Jagielski                 "URI is reserved"), *this, 0);
1195*b1cdbd2cSJim Jagielski     }
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski     // NB: librdf does not have a concept of graphs as such;
1198*b1cdbd2cSJim Jagielski     //     a librdf named graph exists iff the model contains a statement with
1199*b1cdbd2cSJim Jagielski     //     the graph name as context
1200*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
1201*b1cdbd2cSJim Jagielski     if (m_NamedGraphs.find(contextU) != m_NamedGraphs.end()) {
1202*b1cdbd2cSJim Jagielski         throw container::ElementExistException(
1203*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::createGraph: "
1204*b1cdbd2cSJim Jagielski             "graph with given URI exists"), *this);
1205*b1cdbd2cSJim Jagielski     }
1206*b1cdbd2cSJim Jagielski     m_NamedGraphs.insert(std::make_pair(contextU,
1207*b1cdbd2cSJim Jagielski         new librdf_NamedGraph(this, i_xGraphName)));
1208*b1cdbd2cSJim Jagielski     return uno::Reference<rdf::XNamedGraph>(
1209*b1cdbd2cSJim Jagielski         m_NamedGraphs.find(contextU)->second.get());
1210*b1cdbd2cSJim Jagielski }
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski void SAL_CALL
destroyGraph(const uno::Reference<rdf::XURI> & i_xGraphName)1213*b1cdbd2cSJim Jagielski librdf_Repository::destroyGraph(
1214*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XURI > & i_xGraphName)
1215*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1216*b1cdbd2cSJim Jagielski     container::NoSuchElementException, rdf::RepositoryException)
1217*b1cdbd2cSJim Jagielski {
1218*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1219*b1cdbd2cSJim Jagielski     const NamedGraphMap_t::iterator iter( clearGraph(i_xGraphName) );
1220*b1cdbd2cSJim Jagielski     m_NamedGraphs.erase(iter);
1221*b1cdbd2cSJim Jagielski }
1222*b1cdbd2cSJim Jagielski 
isMetadatableWithoutMetadata(uno::Reference<uno::XInterface> const & i_xNode)1223*b1cdbd2cSJim Jagielski static bool isMetadatableWithoutMetadata(
1224*b1cdbd2cSJim Jagielski     uno::Reference<uno::XInterface> const & i_xNode)
1225*b1cdbd2cSJim Jagielski {
1226*b1cdbd2cSJim Jagielski     const uno::Reference<rdf::XMetadatable> xMeta( i_xNode, uno::UNO_QUERY );
1227*b1cdbd2cSJim Jagielski     return (xMeta.is() && !xMeta->getMetadataReference().Second.getLength());
1228*b1cdbd2cSJim Jagielski }
1229*b1cdbd2cSJim Jagielski 
1230*b1cdbd2cSJim Jagielski uno::Reference< container::XEnumeration > SAL_CALL
getStatements(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject)1231*b1cdbd2cSJim Jagielski librdf_Repository::getStatements(
1232*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
1233*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
1234*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject)
1235*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, rdf::RepositoryException)
1236*b1cdbd2cSJim Jagielski {
1237*b1cdbd2cSJim Jagielski     if (isMetadatableWithoutMetadata(i_xSubject)   ||
1238*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xPredicate) ||
1239*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xObject))
1240*b1cdbd2cSJim Jagielski     {
1241*b1cdbd2cSJim Jagielski         return new librdf_GraphResult(this, m_aMutex,
1242*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<librdf_stream>(),
1243*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<librdf_node>());
1244*b1cdbd2cSJim Jagielski     }
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1247*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_statement> pStatement(
1248*b1cdbd2cSJim Jagielski         m_TypeConverter.mkStatement(m_pWorld.get(),
1249*b1cdbd2cSJim Jagielski             i_xSubject, i_xPredicate, i_xObject),
1250*b1cdbd2cSJim Jagielski         safe_librdf_free_statement);
1251*b1cdbd2cSJim Jagielski     OSL_ENSURE(pStatement, "mkStatement failed");
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
1254*b1cdbd2cSJim Jagielski         librdf_model_find_statements(m_pModel.get(), pStatement.get()),
1255*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
1256*b1cdbd2cSJim Jagielski     if (!pStream) {
1257*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1258*b1cdbd2cSJim Jagielski             "librdf_Repository::getStatements: "
1259*b1cdbd2cSJim Jagielski             "librdf_model_find_statements failed"), *this);
1260*b1cdbd2cSJim Jagielski     }
1261*b1cdbd2cSJim Jagielski 
1262*b1cdbd2cSJim Jagielski     return new librdf_GraphResult(this, m_aMutex, pStream,
1263*b1cdbd2cSJim Jagielski         ::boost::shared_ptr<librdf_node>());
1264*b1cdbd2cSJim Jagielski }
1265*b1cdbd2cSJim Jagielski 
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski uno::Reference< rdf::XQuerySelectResult > SAL_CALL
querySelect(const::rtl::OUString & i_rQuery)1268*b1cdbd2cSJim Jagielski librdf_Repository::querySelect(const ::rtl::OUString & i_rQuery)
1269*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, rdf::QueryException, rdf::RepositoryException)
1270*b1cdbd2cSJim Jagielski {
1271*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1272*b1cdbd2cSJim Jagielski     const ::rtl::OString query(
1273*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(i_rQuery, RTL_TEXTENCODING_UTF8) );
1274*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_query> pQuery(
1275*b1cdbd2cSJim Jagielski         librdf_new_query(m_pWorld.get(), s_sparql, NULL,
1276*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (query.getStr()), NULL),
1277*b1cdbd2cSJim Jagielski         safe_librdf_free_query);
1278*b1cdbd2cSJim Jagielski     if (!pQuery) {
1279*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1280*b1cdbd2cSJim Jagielski             "librdf_Repository::querySelect: "
1281*b1cdbd2cSJim Jagielski             "librdf_new_query failed"), *this);
1282*b1cdbd2cSJim Jagielski     }
1283*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_query_results> pResults(
1284*b1cdbd2cSJim Jagielski         librdf_model_query_execute(m_pModel.get(), pQuery.get()),
1285*b1cdbd2cSJim Jagielski         safe_librdf_free_query_results);
1286*b1cdbd2cSJim Jagielski     if (!pResults || !librdf_query_results_is_bindings(pResults.get())) {
1287*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1288*b1cdbd2cSJim Jagielski             "librdf_Repository::querySelect: "
1289*b1cdbd2cSJim Jagielski             "query result is null or not bindings"), *this);
1290*b1cdbd2cSJim Jagielski     }
1291*b1cdbd2cSJim Jagielski 
1292*b1cdbd2cSJim Jagielski     const int count( librdf_query_results_get_bindings_count(pResults.get()) );
1293*b1cdbd2cSJim Jagielski     if (count >= 0) {
1294*b1cdbd2cSJim Jagielski         uno::Sequence< ::rtl::OUString > names(count);
1295*b1cdbd2cSJim Jagielski         for (int i = 0; i < count; ++i) {
1296*b1cdbd2cSJim Jagielski             const char* name( librdf_query_results_get_binding_name(
1297*b1cdbd2cSJim Jagielski                 pResults.get(), i) );
1298*b1cdbd2cSJim Jagielski             if (!name) {
1299*b1cdbd2cSJim Jagielski                 throw rdf::QueryException(::rtl::OUString::createFromAscii(
1300*b1cdbd2cSJim Jagielski                     "librdf_Repository::querySelect: "
1301*b1cdbd2cSJim Jagielski                     "binding is null"), *this);
1302*b1cdbd2cSJim Jagielski             }
1303*b1cdbd2cSJim Jagielski 
1304*b1cdbd2cSJim Jagielski             names[i] = ::rtl::OUString::createFromAscii(name);
1305*b1cdbd2cSJim Jagielski         }
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski         return new librdf_QuerySelectResult(this, m_aMutex,
1308*b1cdbd2cSJim Jagielski             pQuery, pResults, names);
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski     } else {
1311*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1312*b1cdbd2cSJim Jagielski             "librdf_Repository::querySelect: "
1313*b1cdbd2cSJim Jagielski             "librdf_query_results_get_bindings_count failed"), *this);
1314*b1cdbd2cSJim Jagielski     }
1315*b1cdbd2cSJim Jagielski }
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski uno::Reference< container::XEnumeration > SAL_CALL
queryConstruct(const::rtl::OUString & i_rQuery)1318*b1cdbd2cSJim Jagielski librdf_Repository::queryConstruct(const ::rtl::OUString & i_rQuery)
1319*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, rdf::QueryException, rdf::RepositoryException)
1320*b1cdbd2cSJim Jagielski {
1321*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1322*b1cdbd2cSJim Jagielski     const ::rtl::OString query(
1323*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(i_rQuery, RTL_TEXTENCODING_UTF8) );
1324*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_query> pQuery(
1325*b1cdbd2cSJim Jagielski         librdf_new_query(m_pWorld.get(), s_sparql, NULL,
1326*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (query.getStr()), NULL),
1327*b1cdbd2cSJim Jagielski         safe_librdf_free_query);
1328*b1cdbd2cSJim Jagielski     if (!pQuery) {
1329*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1330*b1cdbd2cSJim Jagielski             "librdf_Repository::queryConstruct: "
1331*b1cdbd2cSJim Jagielski             "librdf_new_query failed"), *this);
1332*b1cdbd2cSJim Jagielski     }
1333*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_query_results> pResults(
1334*b1cdbd2cSJim Jagielski         librdf_model_query_execute(m_pModel.get(), pQuery.get()),
1335*b1cdbd2cSJim Jagielski         safe_librdf_free_query_results);
1336*b1cdbd2cSJim Jagielski     if (!pResults || !librdf_query_results_is_graph(pResults.get())) {
1337*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1338*b1cdbd2cSJim Jagielski             "librdf_Repository::queryConstruct: "
1339*b1cdbd2cSJim Jagielski             "query result is null or not graph"), *this);
1340*b1cdbd2cSJim Jagielski     }
1341*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
1342*b1cdbd2cSJim Jagielski         librdf_query_results_as_stream(pResults.get()),
1343*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
1344*b1cdbd2cSJim Jagielski     if (!pStream) {
1345*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1346*b1cdbd2cSJim Jagielski             "librdf_Repository::queryConstruct: "
1347*b1cdbd2cSJim Jagielski             "librdf_query_results_as_stream failed"), *this);
1348*b1cdbd2cSJim Jagielski     }
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski     return new librdf_GraphResult(this, m_aMutex, pStream,
1351*b1cdbd2cSJim Jagielski                                   ::boost::shared_ptr<librdf_node>(), pQuery);
1352*b1cdbd2cSJim Jagielski }
1353*b1cdbd2cSJim Jagielski 
1354*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL
queryAsk(const::rtl::OUString & i_rQuery)1355*b1cdbd2cSJim Jagielski librdf_Repository::queryAsk(const ::rtl::OUString & i_rQuery)
1356*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, rdf::QueryException, rdf::RepositoryException)
1357*b1cdbd2cSJim Jagielski {
1358*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1359*b1cdbd2cSJim Jagielski 
1360*b1cdbd2cSJim Jagielski     const ::rtl::OString query(
1361*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(i_rQuery, RTL_TEXTENCODING_UTF8) );
1362*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_query> pQuery(
1363*b1cdbd2cSJim Jagielski         librdf_new_query(m_pWorld.get(), s_sparql, NULL,
1364*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (query.getStr()), NULL),
1365*b1cdbd2cSJim Jagielski         safe_librdf_free_query);
1366*b1cdbd2cSJim Jagielski     if (!pQuery) {
1367*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1368*b1cdbd2cSJim Jagielski             "librdf_Repository::queryAsk: "
1369*b1cdbd2cSJim Jagielski             "librdf_new_query failed"), *this);
1370*b1cdbd2cSJim Jagielski     }
1371*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_query_results> pResults(
1372*b1cdbd2cSJim Jagielski         librdf_model_query_execute(m_pModel.get(), pQuery.get()),
1373*b1cdbd2cSJim Jagielski         safe_librdf_free_query_results);
1374*b1cdbd2cSJim Jagielski     if (!pResults || !librdf_query_results_is_boolean(pResults.get())) {
1375*b1cdbd2cSJim Jagielski         throw rdf::QueryException(::rtl::OUString::createFromAscii(
1376*b1cdbd2cSJim Jagielski             "librdf_Repository::queryAsk: "
1377*b1cdbd2cSJim Jagielski             "query result is null or not boolean"), *this);
1378*b1cdbd2cSJim Jagielski     }
1379*b1cdbd2cSJim Jagielski     return librdf_query_results_get_boolean(pResults.get())
1380*b1cdbd2cSJim Jagielski         ? sal_True : sal_False;
1381*b1cdbd2cSJim Jagielski }
1382*b1cdbd2cSJim Jagielski 
1383*b1cdbd2cSJim Jagielski // ::com::sun::star::rdf::XDocumentRepository:
setStatementRDFa(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Sequence<uno::Reference<rdf::XURI>> & i_rPredicates,const uno::Reference<rdf::XMetadatable> & i_xObject,const::rtl::OUString & i_rRDFaContent,const uno::Reference<rdf::XURI> & i_xRDFaDatatype)1384*b1cdbd2cSJim Jagielski void SAL_CALL librdf_Repository::setStatementRDFa(
1385*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
1386*b1cdbd2cSJim Jagielski     const uno::Sequence< uno::Reference< rdf::XURI > > & i_rPredicates,
1387*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XMetadatable > & i_xObject,
1388*b1cdbd2cSJim Jagielski     const ::rtl::OUString & i_rRDFaContent,
1389*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xRDFaDatatype)
1390*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1391*b1cdbd2cSJim Jagielski     rdf::RepositoryException)
1392*b1cdbd2cSJim Jagielski {
1393*b1cdbd2cSJim Jagielski     static const ::rtl::OUString s_cell(
1394*b1cdbd2cSJim Jagielski         ::rtl::OUString::createFromAscii("com.sun.star.table.Cell"));
1395*b1cdbd2cSJim Jagielski     static const ::rtl::OUString s_cellprops( // for writer
1396*b1cdbd2cSJim Jagielski         ::rtl::OUString::createFromAscii("com.sun.star.text.CellProperties"));
1397*b1cdbd2cSJim Jagielski     static const ::rtl::OUString s_paragraph(
1398*b1cdbd2cSJim Jagielski         ::rtl::OUString::createFromAscii("com.sun.star.text.Paragraph"));
1399*b1cdbd2cSJim Jagielski     static const ::rtl::OUString s_bookmark(
1400*b1cdbd2cSJim Jagielski         ::rtl::OUString::createFromAscii("com.sun.star.text.Bookmark"));
1401*b1cdbd2cSJim Jagielski     static const ::rtl::OUString s_meta( ::rtl::OUString::createFromAscii(
1402*b1cdbd2cSJim Jagielski         "com.sun.star.text.InContentMetadata"));
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski     if (!i_xSubject.is()) {
1405*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1406*b1cdbd2cSJim Jagielski             "librdf_Repository::setStatementRDFa: Subject is null"), *this, 0);
1407*b1cdbd2cSJim Jagielski     }
1408*b1cdbd2cSJim Jagielski     if (!i_rPredicates.getLength()) {
1409*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1410*b1cdbd2cSJim Jagielski             "librdf_Repository::setStatementRDFa: no Predicates"),
1411*b1cdbd2cSJim Jagielski             *this, 1);
1412*b1cdbd2cSJim Jagielski     }
1413*b1cdbd2cSJim Jagielski     for (sal_Int32 i = 0; i < i_rPredicates.getLength(); ++i) {
1414*b1cdbd2cSJim Jagielski         if (!i_rPredicates[i].is()) {
1415*b1cdbd2cSJim Jagielski             throw lang::IllegalArgumentException(
1416*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii(
1417*b1cdbd2cSJim Jagielski                     "librdf_Repository::setStatementRDFa: Predicate is null"),
1418*b1cdbd2cSJim Jagielski                 *this, 1);
1419*b1cdbd2cSJim Jagielski         }
1420*b1cdbd2cSJim Jagielski     }
1421*b1cdbd2cSJim Jagielski     if (!i_xObject.is()) {
1422*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1423*b1cdbd2cSJim Jagielski             "librdf_Repository::setStatementRDFa: Object is null"), *this, 2);
1424*b1cdbd2cSJim Jagielski     }
1425*b1cdbd2cSJim Jagielski     const uno::Reference<lang::XServiceInfo> xService(i_xObject,
1426*b1cdbd2cSJim Jagielski         uno::UNO_QUERY_THROW);
1427*b1cdbd2cSJim Jagielski     uno::Reference<text::XTextRange> xTextRange;
1428*b1cdbd2cSJim Jagielski     if (xService->supportsService(s_cell) ||
1429*b1cdbd2cSJim Jagielski         xService->supportsService(s_cellprops) ||
1430*b1cdbd2cSJim Jagielski         xService->supportsService(s_paragraph))
1431*b1cdbd2cSJim Jagielski     {
1432*b1cdbd2cSJim Jagielski         xTextRange.set(i_xObject, uno::UNO_QUERY_THROW);
1433*b1cdbd2cSJim Jagielski     }
1434*b1cdbd2cSJim Jagielski     else if (xService->supportsService(s_bookmark) ||
1435*b1cdbd2cSJim Jagielski              xService->supportsService(s_meta))
1436*b1cdbd2cSJim Jagielski     {
1437*b1cdbd2cSJim Jagielski         const uno::Reference<text::XTextContent> xTextContent(i_xObject,
1438*b1cdbd2cSJim Jagielski             uno::UNO_QUERY_THROW);
1439*b1cdbd2cSJim Jagielski         xTextRange = xTextContent->getAnchor();
1440*b1cdbd2cSJim Jagielski     }
1441*b1cdbd2cSJim Jagielski     if (!xTextRange.is()) {
1442*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1443*b1cdbd2cSJim Jagielski             "librdf_Repository::setStatementRDFa: "
1444*b1cdbd2cSJim Jagielski             "Object does not support RDFa"), *this, 2);
1445*b1cdbd2cSJim Jagielski     }
1446*b1cdbd2cSJim Jagielski     // ensure that the metadatable has an XML ID
1447*b1cdbd2cSJim Jagielski     i_xObject->ensureMetadataReference();
1448*b1cdbd2cSJim Jagielski     const beans::StringPair mdref( i_xObject->getMetadataReference() );
1449*b1cdbd2cSJim Jagielski     if (mdref.First.equalsAscii("") || mdref.Second.equalsAscii("")) {
1450*b1cdbd2cSJim Jagielski         throw uno::RuntimeException( ::rtl::OUString::createFromAscii(
1451*b1cdbd2cSJim Jagielski                 "librdf_Repository::setStatementRDFa: "
1452*b1cdbd2cSJim Jagielski                 "ensureMetadataReference did not"), *this);
1453*b1cdbd2cSJim Jagielski     }
1454*b1cdbd2cSJim Jagielski     ::rtl::OUString const sXmlId(mdref.First +
1455*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("#") + mdref.Second);
1456*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XURI> xXmlId;
1457*b1cdbd2cSJim Jagielski     try {
1458*b1cdbd2cSJim Jagielski         xXmlId.set( rdf::URI::create(m_xContext,
1459*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii(s_nsOOo) + sXmlId),
1460*b1cdbd2cSJim Jagielski             uno::UNO_QUERY_THROW);
1461*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException & iae) {
1462*b1cdbd2cSJim Jagielski         throw lang::WrappedTargetRuntimeException(
1463*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
1464*b1cdbd2cSJim Jagielski                 "librdf_Repository::setStatementRDFa: "
1465*b1cdbd2cSJim Jagielski                 "cannot create URI for XML ID"), *this, uno::makeAny(iae));
1466*b1cdbd2cSJim Jagielski     }
1467*b1cdbd2cSJim Jagielski 
1468*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1469*b1cdbd2cSJim Jagielski     ::rtl::OUString const content( (i_rRDFaContent.getLength() == 0)
1470*b1cdbd2cSJim Jagielski             ? xTextRange->getString()
1471*b1cdbd2cSJim Jagielski             : i_rRDFaContent );
1472*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XNode> xContent;
1473*b1cdbd2cSJim Jagielski     try {
1474*b1cdbd2cSJim Jagielski         if (i_xRDFaDatatype.is()) {
1475*b1cdbd2cSJim Jagielski             xContent.set(rdf::Literal::createWithType(m_xContext,
1476*b1cdbd2cSJim Jagielski                     content, i_xRDFaDatatype),
1477*b1cdbd2cSJim Jagielski                 uno::UNO_QUERY_THROW);
1478*b1cdbd2cSJim Jagielski         } else {
1479*b1cdbd2cSJim Jagielski             xContent.set(rdf::Literal::create(m_xContext, content),
1480*b1cdbd2cSJim Jagielski                 uno::UNO_QUERY_THROW);
1481*b1cdbd2cSJim Jagielski         }
1482*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException & iae) {
1483*b1cdbd2cSJim Jagielski         throw lang::WrappedTargetRuntimeException(
1484*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
1485*b1cdbd2cSJim Jagielski                 "librdf_Repository::setStatementRDFa: "
1486*b1cdbd2cSJim Jagielski                 "cannot create literal"), *this, uno::makeAny(iae));
1487*b1cdbd2cSJim Jagielski     }
1488*b1cdbd2cSJim Jagielski     removeStatementRDFa(i_xObject);
1489*b1cdbd2cSJim Jagielski     if (i_rRDFaContent.getLength() == 0) {
1490*b1cdbd2cSJim Jagielski         m_RDFaXHTMLContentSet.erase(sXmlId);
1491*b1cdbd2cSJim Jagielski     } else {
1492*b1cdbd2cSJim Jagielski         m_RDFaXHTMLContentSet.insert(sXmlId);
1493*b1cdbd2cSJim Jagielski     }
1494*b1cdbd2cSJim Jagielski     ::std::for_each(::comphelper::stl_begin(i_rPredicates),
1495*b1cdbd2cSJim Jagielski         ::comphelper::stl_end(i_rPredicates),
1496*b1cdbd2cSJim Jagielski         ::boost::bind( &librdf_Repository::addStatementGraph,
1497*b1cdbd2cSJim Jagielski             this, i_xSubject, _1, xContent, xXmlId, true));
1498*b1cdbd2cSJim Jagielski }
1499*b1cdbd2cSJim Jagielski 
removeStatementRDFa(const uno::Reference<rdf::XMetadatable> & i_xElement)1500*b1cdbd2cSJim Jagielski void SAL_CALL librdf_Repository::removeStatementRDFa(
1501*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XMetadatable > & i_xElement)
1502*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1503*b1cdbd2cSJim Jagielski     rdf::RepositoryException)
1504*b1cdbd2cSJim Jagielski {
1505*b1cdbd2cSJim Jagielski     if (!i_xElement.is()) {
1506*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1507*b1cdbd2cSJim Jagielski             "librdf_Repository::removeStatementRDFa: Element is null"),
1508*b1cdbd2cSJim Jagielski             *this, 0);
1509*b1cdbd2cSJim Jagielski     }
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski     const beans::StringPair mdref( i_xElement->getMetadataReference() );
1512*b1cdbd2cSJim Jagielski     if (mdref.First.equalsAscii("") || mdref.Second.equalsAscii("")) {
1513*b1cdbd2cSJim Jagielski         return; // nothing to do...
1514*b1cdbd2cSJim Jagielski     }
1515*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XURI> xXmlId;
1516*b1cdbd2cSJim Jagielski     try {
1517*b1cdbd2cSJim Jagielski         xXmlId.set( rdf::URI::create(m_xContext,
1518*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii(s_nsOOo)
1519*b1cdbd2cSJim Jagielski                 + mdref.First + ::rtl::OUString::createFromAscii("#")
1520*b1cdbd2cSJim Jagielski                 + mdref.Second),
1521*b1cdbd2cSJim Jagielski             uno::UNO_QUERY_THROW);
1522*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException & iae) {
1523*b1cdbd2cSJim Jagielski         throw lang::WrappedTargetRuntimeException(
1524*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
1525*b1cdbd2cSJim Jagielski                 "librdf_Repository::removeStatementRDFa: "
1526*b1cdbd2cSJim Jagielski                 "cannot create URI for XML ID"), *this, uno::makeAny(iae));
1527*b1cdbd2cSJim Jagielski     }
1528*b1cdbd2cSJim Jagielski     // clearGraph does locking, not needed here
1529*b1cdbd2cSJim Jagielski     clearGraph(xXmlId, true);
1530*b1cdbd2cSJim Jagielski }
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski beans::Pair< uno::Sequence<rdf::Statement>, sal_Bool > SAL_CALL
getStatementRDFa(const uno::Reference<rdf::XMetadatable> & i_xElement)1533*b1cdbd2cSJim Jagielski librdf_Repository::getStatementRDFa(
1534*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XMetadatable > & i_xElement)
1535*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, lang::IllegalArgumentException,
1536*b1cdbd2cSJim Jagielski     rdf::RepositoryException)
1537*b1cdbd2cSJim Jagielski {
1538*b1cdbd2cSJim Jagielski     if (!i_xElement.is()) {
1539*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1540*b1cdbd2cSJim Jagielski             "librdf_Repository::getStatementRDFa: Element is null"), *this, 0);
1541*b1cdbd2cSJim Jagielski     }
1542*b1cdbd2cSJim Jagielski     const beans::StringPair mdref( i_xElement->getMetadataReference() );
1543*b1cdbd2cSJim Jagielski     if (mdref.First.equalsAscii("") || mdref.Second.equalsAscii("")) {
1544*b1cdbd2cSJim Jagielski         return beans::Pair< uno::Sequence<rdf::Statement>, sal_Bool >();
1545*b1cdbd2cSJim Jagielski     }
1546*b1cdbd2cSJim Jagielski     ::rtl::OUString const sXmlId(mdref.First +
1547*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("#") + mdref.Second);
1548*b1cdbd2cSJim Jagielski     uno::Reference<rdf::XURI> xXmlId;
1549*b1cdbd2cSJim Jagielski     try {
1550*b1cdbd2cSJim Jagielski         xXmlId.set( rdf::URI::create(m_xContext,
1551*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii(s_nsOOo) + sXmlId),
1552*b1cdbd2cSJim Jagielski             uno::UNO_QUERY_THROW);
1553*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException & iae) {
1554*b1cdbd2cSJim Jagielski         throw lang::WrappedTargetRuntimeException(
1555*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
1556*b1cdbd2cSJim Jagielski                 "librdf_Repository::getStatementRDFa: "
1557*b1cdbd2cSJim Jagielski                 "cannot create URI for XML ID"), *this, uno::makeAny(iae));
1558*b1cdbd2cSJim Jagielski     }
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1561*b1cdbd2cSJim Jagielski     ::comphelper::SequenceAsVector< rdf::Statement > ret;
1562*b1cdbd2cSJim Jagielski     const uno::Reference<container::XEnumeration> xIter(
1563*b1cdbd2cSJim Jagielski         getStatementsGraph(0, 0, 0, xXmlId, true) );
1564*b1cdbd2cSJim Jagielski     OSL_ENSURE(xIter.is(), "getStatementRDFa: no result?");
1565*b1cdbd2cSJim Jagielski     if (!xIter.is()) throw uno::RuntimeException();
1566*b1cdbd2cSJim Jagielski     while (xIter->hasMoreElements()) {
1567*b1cdbd2cSJim Jagielski         rdf::Statement stmt;
1568*b1cdbd2cSJim Jagielski         if (!(xIter->nextElement() >>= stmt)) {
1569*b1cdbd2cSJim Jagielski             OSL_ENSURE(false, "getStatementRDFa: result of wrong type?");
1570*b1cdbd2cSJim Jagielski         } else {
1571*b1cdbd2cSJim Jagielski             ret.push_back(stmt);
1572*b1cdbd2cSJim Jagielski         }
1573*b1cdbd2cSJim Jagielski     }
1574*b1cdbd2cSJim Jagielski     return beans::Pair< uno::Sequence<rdf::Statement>, sal_Bool >(
1575*b1cdbd2cSJim Jagielski             ret.getAsConstList(), 0 != m_RDFaXHTMLContentSet.count(sXmlId));
1576*b1cdbd2cSJim Jagielski }
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski extern "C"
rdfa_context_stream_map_handler(librdf_stream * i_pStream,void *,librdf_statement * i_pStatement)1579*b1cdbd2cSJim Jagielski librdf_statement *rdfa_context_stream_map_handler(
1580*b1cdbd2cSJim Jagielski     librdf_stream *i_pStream, void *, librdf_statement *i_pStatement)
1581*b1cdbd2cSJim Jagielski {
1582*b1cdbd2cSJim Jagielski     OSL_ENSURE(i_pStream, "rdfa_context_stream_map_handler: stream null");
1583*b1cdbd2cSJim Jagielski     if (i_pStream) {
1584*b1cdbd2cSJim Jagielski         librdf_node *pCtxt( static_cast<librdf_node *>
1585*b1cdbd2cSJim Jagielski             (librdf_stream_get_context(i_pStream)) );
1586*b1cdbd2cSJim Jagielski         OSL_ENSURE(pCtxt, "rdfa_context_stream_map_handler: context null");
1587*b1cdbd2cSJim Jagielski         if (pCtxt && isInternalContext(pCtxt)) {
1588*b1cdbd2cSJim Jagielski             return i_pStatement;
1589*b1cdbd2cSJim Jagielski         }
1590*b1cdbd2cSJim Jagielski     }
1591*b1cdbd2cSJim Jagielski     return 0;
1592*b1cdbd2cSJim Jagielski };
1593*b1cdbd2cSJim Jagielski 
1594*b1cdbd2cSJim Jagielski uno::Reference< container::XEnumeration > SAL_CALL
getStatementsRDFa(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject)1595*b1cdbd2cSJim Jagielski librdf_Repository::getStatementsRDFa(
1596*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
1597*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
1598*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject)
1599*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, rdf::RepositoryException)
1600*b1cdbd2cSJim Jagielski {
1601*b1cdbd2cSJim Jagielski     if (isMetadatableWithoutMetadata(i_xSubject)   ||
1602*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xPredicate) ||
1603*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xObject))
1604*b1cdbd2cSJim Jagielski     {
1605*b1cdbd2cSJim Jagielski         return new librdf_GraphResult(this, m_aMutex,
1606*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<librdf_stream>(),
1607*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<librdf_node>());
1608*b1cdbd2cSJim Jagielski     }
1609*b1cdbd2cSJim Jagielski 
1610*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1611*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_statement> pStatement(
1612*b1cdbd2cSJim Jagielski         m_TypeConverter.mkStatement(m_pWorld.get(),
1613*b1cdbd2cSJim Jagielski             i_xSubject, i_xPredicate, i_xObject),
1614*b1cdbd2cSJim Jagielski         safe_librdf_free_statement);
1615*b1cdbd2cSJim Jagielski     OSL_ENSURE(pStatement, "mkStatement failed");
1616*b1cdbd2cSJim Jagielski 
1617*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
1618*b1cdbd2cSJim Jagielski         librdf_model_find_statements(m_pModel.get(), pStatement.get()),
1619*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
1620*b1cdbd2cSJim Jagielski     if (!pStream) {
1621*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1622*b1cdbd2cSJim Jagielski             "librdf_Repository::getStatementsRDFa: "
1623*b1cdbd2cSJim Jagielski             "librdf_model_find_statements failed"), *this);
1624*b1cdbd2cSJim Jagielski     }
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski     if (librdf_stream_add_map(pStream.get(), rdfa_context_stream_map_handler,
1627*b1cdbd2cSJim Jagielski                 0, 0)) {
1628*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1629*b1cdbd2cSJim Jagielski             "librdf_Repository::getStatementsRDFa: "
1630*b1cdbd2cSJim Jagielski             "librdf_stream_add_map failed"), *this);
1631*b1cdbd2cSJim Jagielski     }
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski     return new librdf_GraphResult(this, m_aMutex, pStream,
1634*b1cdbd2cSJim Jagielski                                   ::boost::shared_ptr<librdf_node>());
1635*b1cdbd2cSJim Jagielski }
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski // ::com::sun::star::lang::XInitialization:
initialize(const uno::Sequence<::com::sun::star::uno::Any> & i_rArguments)1638*b1cdbd2cSJim Jagielski void SAL_CALL librdf_Repository::initialize(
1639*b1cdbd2cSJim Jagielski     const uno::Sequence< ::com::sun::star::uno::Any > & i_rArguments)
1640*b1cdbd2cSJim Jagielski throw (uno::RuntimeException, uno::Exception)
1641*b1cdbd2cSJim Jagielski {
1642*b1cdbd2cSJim Jagielski     (void) i_rArguments;
1643*b1cdbd2cSJim Jagielski 
1644*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1645*b1cdbd2cSJim Jagielski 
1646*b1cdbd2cSJim Jagielski //    m_pWorld.reset(m_TypeConverter.createWorld(), safe_librdf_free_world);
1647*b1cdbd2cSJim Jagielski     m_pStorage.reset(m_TypeConverter.createStorage(m_pWorld.get()),
1648*b1cdbd2cSJim Jagielski         safe_librdf_free_storage);
1649*b1cdbd2cSJim Jagielski     m_pModel.reset(m_TypeConverter.createModel(
1650*b1cdbd2cSJim Jagielski         m_pWorld.get(), m_pStorage.get()), safe_librdf_free_model);
1651*b1cdbd2cSJim Jagielski }
1652*b1cdbd2cSJim Jagielski 
clearGraph(const uno::Reference<rdf::XURI> & i_xGraphName,bool i_Internal)1653*b1cdbd2cSJim Jagielski const NamedGraphMap_t::iterator SAL_CALL librdf_Repository::clearGraph(
1654*b1cdbd2cSJim Jagielski         const uno::Reference< rdf::XURI > & i_xGraphName, bool i_Internal)
1655*b1cdbd2cSJim Jagielski //    throw (uno::RuntimeException, container::NoSuchElementException,
1656*b1cdbd2cSJim Jagielski //        rdf::RepositoryException)
1657*b1cdbd2cSJim Jagielski {
1658*b1cdbd2cSJim Jagielski     if (!i_xGraphName.is()) {
1659*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(
1660*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::clearGraph: "
1661*b1cdbd2cSJim Jagielski                 "URI is null"), *this, 0);
1662*b1cdbd2cSJim Jagielski     }
1663*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1664*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
1665*b1cdbd2cSJim Jagielski     const NamedGraphMap_t::iterator iter( m_NamedGraphs.find(contextU) );
1666*b1cdbd2cSJim Jagielski     if (!i_Internal && iter == m_NamedGraphs.end()) {
1667*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException(
1668*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::clearGraph: "
1669*b1cdbd2cSJim Jagielski             "no graph with given URI exists"), *this);
1670*b1cdbd2cSJim Jagielski     }
1671*b1cdbd2cSJim Jagielski     const ::rtl::OString context(
1672*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(contextU, RTL_TEXTENCODING_UTF8) );
1673*b1cdbd2cSJim Jagielski 
1674*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pContext(
1675*b1cdbd2cSJim Jagielski         librdf_new_node_from_uri_string(m_pWorld.get(),
1676*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (context.getStr())),
1677*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1678*b1cdbd2cSJim Jagielski     if (!pContext) {
1679*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1680*b1cdbd2cSJim Jagielski             "librdf_Repository::clearGraph: "
1681*b1cdbd2cSJim Jagielski             "librdf_new_node_from_uri_string failed"), *this);
1682*b1cdbd2cSJim Jagielski     }
1683*b1cdbd2cSJim Jagielski     if (librdf_model_context_remove_statements(m_pModel.get(), pContext.get()))
1684*b1cdbd2cSJim Jagielski     {
1685*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1686*b1cdbd2cSJim Jagielski             "librdf_Repository::clearGraph: "
1687*b1cdbd2cSJim Jagielski             "librdf_model_context_remove_statements failed"), *this);
1688*b1cdbd2cSJim Jagielski     }
1689*b1cdbd2cSJim Jagielski     return iter;
1690*b1cdbd2cSJim Jagielski }
1691*b1cdbd2cSJim Jagielski 
addStatementGraph(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject,const uno::Reference<rdf::XURI> & i_xGraphName,bool i_Internal)1692*b1cdbd2cSJim Jagielski void SAL_CALL librdf_Repository::addStatementGraph(
1693*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
1694*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
1695*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject,
1696*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xGraphName,
1697*b1cdbd2cSJim Jagielski     bool i_Internal)
1698*b1cdbd2cSJim Jagielski //throw (uno::RuntimeException, lang::IllegalArgumentException,
1699*b1cdbd2cSJim Jagielski //    container::NoSuchElementException, rdf::RepositoryException)
1700*b1cdbd2cSJim Jagielski {
1701*b1cdbd2cSJim Jagielski     if (!i_xSubject.is()) {
1702*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1703*b1cdbd2cSJim Jagielski             "librdf_Repository::addStatement: Subject is null"), *this, 0);
1704*b1cdbd2cSJim Jagielski     }
1705*b1cdbd2cSJim Jagielski     if (!i_xPredicate.is()) {
1706*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1707*b1cdbd2cSJim Jagielski             "librdf_Repository::addStatement: Predicate is null"),
1708*b1cdbd2cSJim Jagielski             *this, 1);
1709*b1cdbd2cSJim Jagielski     }
1710*b1cdbd2cSJim Jagielski     if (!i_xObject.is()) {
1711*b1cdbd2cSJim Jagielski         throw lang::IllegalArgumentException(::rtl::OUString::createFromAscii(
1712*b1cdbd2cSJim Jagielski             "librdf_Repository::addStatement: Object is null"), *this, 2);
1713*b1cdbd2cSJim Jagielski     }
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1716*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
1717*b1cdbd2cSJim Jagielski     if (!i_Internal && (m_NamedGraphs.find(contextU) == m_NamedGraphs.end())) {
1718*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException(
1719*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii("librdf_Repository::addStatement: "
1720*b1cdbd2cSJim Jagielski             "no graph with given URI exists"), *this);
1721*b1cdbd2cSJim Jagielski     }
1722*b1cdbd2cSJim Jagielski     const ::rtl::OString context(
1723*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(contextU, RTL_TEXTENCODING_UTF8) );
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pContext(
1726*b1cdbd2cSJim Jagielski         librdf_new_node_from_uri_string(m_pWorld.get(),
1727*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (context.getStr())),
1728*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1729*b1cdbd2cSJim Jagielski     if (!pContext) {
1730*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1731*b1cdbd2cSJim Jagielski             "librdf_Repository::addStatement: "
1732*b1cdbd2cSJim Jagielski             "librdf_new_node_from_uri_string failed"), *this);
1733*b1cdbd2cSJim Jagielski     }
1734*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_statement> pStatement(
1735*b1cdbd2cSJim Jagielski         m_TypeConverter.mkStatement(m_pWorld.get(),
1736*b1cdbd2cSJim Jagielski             i_xSubject, i_xPredicate, i_xObject),
1737*b1cdbd2cSJim Jagielski         safe_librdf_free_statement);
1738*b1cdbd2cSJim Jagielski     OSL_ENSURE(pStatement, "mkStatement failed");
1739*b1cdbd2cSJim Jagielski 
1740*b1cdbd2cSJim Jagielski     // Test for duplicate statement
1741*b1cdbd2cSJim Jagielski     // librdf_model_add_statement disallows duplicates while
1742*b1cdbd2cSJim Jagielski     // librdf_model_context_add_statement allows duplicates
1743*b1cdbd2cSJim Jagielski     {
1744*b1cdbd2cSJim Jagielski         const boost::shared_ptr<librdf_stream> pStream(
1745*b1cdbd2cSJim Jagielski             librdf_model_find_statements_in_context(m_pModel.get(),
1746*b1cdbd2cSJim Jagielski                 pStatement.get(), pContext.get()),
1747*b1cdbd2cSJim Jagielski             safe_librdf_free_stream);
1748*b1cdbd2cSJim Jagielski         if (pStream && !librdf_stream_end(pStream.get()))
1749*b1cdbd2cSJim Jagielski             return;
1750*b1cdbd2cSJim Jagielski     }
1751*b1cdbd2cSJim Jagielski 
1752*b1cdbd2cSJim Jagielski     if (librdf_model_context_add_statement(m_pModel.get(),
1753*b1cdbd2cSJim Jagielski             pContext.get(), pStatement.get())) {
1754*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1755*b1cdbd2cSJim Jagielski             "librdf_Repository::addStatement: "
1756*b1cdbd2cSJim Jagielski             "librdf_model_context_add_statement failed"), *this);
1757*b1cdbd2cSJim Jagielski     }
1758*b1cdbd2cSJim Jagielski }
1759*b1cdbd2cSJim Jagielski 
removeStatementsGraph(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject,const uno::Reference<rdf::XURI> & i_xGraphName)1760*b1cdbd2cSJim Jagielski void SAL_CALL librdf_Repository::removeStatementsGraph(
1761*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
1762*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
1763*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject,
1764*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xGraphName)
1765*b1cdbd2cSJim Jagielski //throw (uno::RuntimeException, lang::IllegalArgumentException,
1766*b1cdbd2cSJim Jagielski //    container::NoSuchElementException, rdf::RepositoryException)
1767*b1cdbd2cSJim Jagielski {
1768*b1cdbd2cSJim Jagielski     if (isMetadatableWithoutMetadata(i_xSubject)   ||
1769*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xPredicate) ||
1770*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xObject))
1771*b1cdbd2cSJim Jagielski     {
1772*b1cdbd2cSJim Jagielski         return;
1773*b1cdbd2cSJim Jagielski     }
1774*b1cdbd2cSJim Jagielski 
1775*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1776*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
1777*b1cdbd2cSJim Jagielski     if (m_NamedGraphs.find(contextU) == m_NamedGraphs.end()) {
1778*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException(
1779*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
1780*b1cdbd2cSJim Jagielski                 "librdf_Repository::removeStatements: "
1781*b1cdbd2cSJim Jagielski                 "no graph with given URI exists"), *this);
1782*b1cdbd2cSJim Jagielski     }
1783*b1cdbd2cSJim Jagielski     const ::rtl::OString context(
1784*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(contextU, RTL_TEXTENCODING_UTF8) );
1785*b1cdbd2cSJim Jagielski 
1786*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pContext(
1787*b1cdbd2cSJim Jagielski         librdf_new_node_from_uri_string(m_pWorld.get(),
1788*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (context.getStr())),
1789*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1790*b1cdbd2cSJim Jagielski     if (!pContext) {
1791*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1792*b1cdbd2cSJim Jagielski             "librdf_Repository::removeStatements: "
1793*b1cdbd2cSJim Jagielski             "librdf_new_node_from_uri_string failed"), *this);
1794*b1cdbd2cSJim Jagielski     }
1795*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_statement> pStatement(
1796*b1cdbd2cSJim Jagielski         m_TypeConverter.mkStatement(m_pWorld.get(),
1797*b1cdbd2cSJim Jagielski             i_xSubject, i_xPredicate, i_xObject),
1798*b1cdbd2cSJim Jagielski         safe_librdf_free_statement);
1799*b1cdbd2cSJim Jagielski     OSL_ENSURE(pStatement, "mkStatement failed");
1800*b1cdbd2cSJim Jagielski 
1801*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
1802*b1cdbd2cSJim Jagielski         librdf_model_find_statements_in_context(m_pModel.get(),
1803*b1cdbd2cSJim Jagielski             pStatement.get(), pContext.get()),
1804*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
1805*b1cdbd2cSJim Jagielski     if (!pStream) {
1806*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1807*b1cdbd2cSJim Jagielski             "librdf_Repository::removeStatements: "
1808*b1cdbd2cSJim Jagielski             "librdf_model_find_statements_in_context failed"), *this);
1809*b1cdbd2cSJim Jagielski     }
1810*b1cdbd2cSJim Jagielski 
1811*b1cdbd2cSJim Jagielski     if (!librdf_stream_end(pStream.get())) {
1812*b1cdbd2cSJim Jagielski         do {
1813*b1cdbd2cSJim Jagielski             librdf_statement *pStmt( librdf_stream_get_object(pStream.get()) );
1814*b1cdbd2cSJim Jagielski             if (!pStmt) {
1815*b1cdbd2cSJim Jagielski                 throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1816*b1cdbd2cSJim Jagielski                     "librdf_Repository::removeStatements: "
1817*b1cdbd2cSJim Jagielski                     "librdf_stream_get_object failed"), *this);
1818*b1cdbd2cSJim Jagielski             }
1819*b1cdbd2cSJim Jagielski             if (librdf_model_context_remove_statement(m_pModel.get(),
1820*b1cdbd2cSJim Jagielski                     pContext.get(), pStmt)) {
1821*b1cdbd2cSJim Jagielski                 throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1822*b1cdbd2cSJim Jagielski                     "librdf_Repository::removeStatements: "
1823*b1cdbd2cSJim Jagielski                     "librdf_model_context_remove_statement failed"), *this);
1824*b1cdbd2cSJim Jagielski             }
1825*b1cdbd2cSJim Jagielski         } while (!librdf_stream_next(pStream.get()));
1826*b1cdbd2cSJim Jagielski     }
1827*b1cdbd2cSJim Jagielski }
1828*b1cdbd2cSJim Jagielski 
1829*b1cdbd2cSJim Jagielski uno::Reference< container::XEnumeration > SAL_CALL
getStatementsGraph(const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject,const uno::Reference<rdf::XURI> & i_xGraphName,bool i_Internal)1830*b1cdbd2cSJim Jagielski librdf_Repository::getStatementsGraph(
1831*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
1832*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
1833*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject,
1834*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xGraphName,
1835*b1cdbd2cSJim Jagielski     bool i_Internal)
1836*b1cdbd2cSJim Jagielski //throw (uno::RuntimeException, lang::IllegalArgumentException,
1837*b1cdbd2cSJim Jagielski //    container::NoSuchElementException, rdf::RepositoryException)
1838*b1cdbd2cSJim Jagielski {
1839*b1cdbd2cSJim Jagielski     // N.B.: if any of subject, predicate, object is an XMetadatable, and
1840*b1cdbd2cSJim Jagielski     // has no metadata reference, then there cannot be any node in the graph
1841*b1cdbd2cSJim Jagielski     // representing it; in order to prevent side effect
1842*b1cdbd2cSJim Jagielski     // (ensureMetadataReference), check for this condition and return
1843*b1cdbd2cSJim Jagielski     if (isMetadatableWithoutMetadata(i_xSubject)   ||
1844*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xPredicate) ||
1845*b1cdbd2cSJim Jagielski         isMetadatableWithoutMetadata(i_xObject))
1846*b1cdbd2cSJim Jagielski     {
1847*b1cdbd2cSJim Jagielski         return new librdf_GraphResult(this, m_aMutex,
1848*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<librdf_stream>(),
1849*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<librdf_node>());
1850*b1cdbd2cSJim Jagielski     }
1851*b1cdbd2cSJim Jagielski 
1852*b1cdbd2cSJim Jagielski     ::osl::MutexGuard g(m_aMutex);
1853*b1cdbd2cSJim Jagielski     const ::rtl::OUString contextU( i_xGraphName->getStringValue() );
1854*b1cdbd2cSJim Jagielski     if (!i_Internal && (m_NamedGraphs.find(contextU) == m_NamedGraphs.end())) {
1855*b1cdbd2cSJim Jagielski         throw container::NoSuchElementException(
1856*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
1857*b1cdbd2cSJim Jagielski                 "librdf_Repository::getStatements: "
1858*b1cdbd2cSJim Jagielski                 "no graph with given URI exists"), *this);
1859*b1cdbd2cSJim Jagielski     }
1860*b1cdbd2cSJim Jagielski     const ::rtl::OString context(
1861*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(contextU, RTL_TEXTENCODING_UTF8) );
1862*b1cdbd2cSJim Jagielski 
1863*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_node> pContext(
1864*b1cdbd2cSJim Jagielski         librdf_new_node_from_uri_string(m_pWorld.get(),
1865*b1cdbd2cSJim Jagielski             reinterpret_cast<const unsigned char*> (context.getStr())),
1866*b1cdbd2cSJim Jagielski         safe_librdf_free_node);
1867*b1cdbd2cSJim Jagielski     if (!pContext) {
1868*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1869*b1cdbd2cSJim Jagielski             "librdf_Repository::getStatements: "
1870*b1cdbd2cSJim Jagielski             "librdf_new_node_from_uri_string failed"), *this);
1871*b1cdbd2cSJim Jagielski     }
1872*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_statement> pStatement(
1873*b1cdbd2cSJim Jagielski         m_TypeConverter.mkStatement(m_pWorld.get(),
1874*b1cdbd2cSJim Jagielski             i_xSubject, i_xPredicate, i_xObject),
1875*b1cdbd2cSJim Jagielski         safe_librdf_free_statement);
1876*b1cdbd2cSJim Jagielski     OSL_ENSURE(pStatement, "mkStatement failed");
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski     const boost::shared_ptr<librdf_stream> pStream(
1879*b1cdbd2cSJim Jagielski         librdf_model_find_statements_in_context(m_pModel.get(),
1880*b1cdbd2cSJim Jagielski             pStatement.get(), pContext.get()),
1881*b1cdbd2cSJim Jagielski         safe_librdf_free_stream);
1882*b1cdbd2cSJim Jagielski     if (!pStream) {
1883*b1cdbd2cSJim Jagielski         throw rdf::RepositoryException(::rtl::OUString::createFromAscii(
1884*b1cdbd2cSJim Jagielski             "librdf_Repository::getStatements: "
1885*b1cdbd2cSJim Jagielski             "librdf_model_find_statements_in_context failed"), *this);
1886*b1cdbd2cSJim Jagielski     }
1887*b1cdbd2cSJim Jagielski 
1888*b1cdbd2cSJim Jagielski     // librdf_model_find_statements_in_context is buggy and does not put
1889*b1cdbd2cSJim Jagielski     // the context into result statements; pass it to librdf_GraphResult here
1890*b1cdbd2cSJim Jagielski     return new librdf_GraphResult(this, m_aMutex, pStream, pContext);
1891*b1cdbd2cSJim Jagielski }
1892*b1cdbd2cSJim Jagielski 
createWorld() const1893*b1cdbd2cSJim Jagielski librdf_world *librdf_TypeConverter::createWorld() const
1894*b1cdbd2cSJim Jagielski {
1895*b1cdbd2cSJim Jagielski     // create and initialize world
1896*b1cdbd2cSJim Jagielski     librdf_world *pWorld( librdf_new_world() );
1897*b1cdbd2cSJim Jagielski     if (!pWorld) {
1898*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1899*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::createWorld: librdf_new_world failed"),
1900*b1cdbd2cSJim Jagielski             m_rRep);
1901*b1cdbd2cSJim Jagielski     }
1902*b1cdbd2cSJim Jagielski     //FIXME logger, digest, features?
1903*b1cdbd2cSJim Jagielski     xsltSecurityPrefsPtr origprefs = xsltGetDefaultSecurityPrefs();
1904*b1cdbd2cSJim Jagielski     librdf_world_open(pWorld);
1905*b1cdbd2cSJim Jagielski     xsltSecurityPrefsPtr newprefs = xsltGetDefaultSecurityPrefs();
1906*b1cdbd2cSJim Jagielski     if (newprefs != origprefs) {
1907*b1cdbd2cSJim Jagielski         // #i110523# restore libxslt global configuration
1908*b1cdbd2cSJim Jagielski         // (gratuitously overwritten by raptor_init_parser_grddl_common)
1909*b1cdbd2cSJim Jagielski         // (this is the only reason unordf is linked against libxslt)
1910*b1cdbd2cSJim Jagielski         xsltSetDefaultSecurityPrefs(origprefs);
1911*b1cdbd2cSJim Jagielski     }
1912*b1cdbd2cSJim Jagielski     return pWorld;
1913*b1cdbd2cSJim Jagielski }
1914*b1cdbd2cSJim Jagielski 
1915*b1cdbd2cSJim Jagielski librdf_storage *
createStorage(librdf_world * i_pWorld) const1916*b1cdbd2cSJim Jagielski librdf_TypeConverter::createStorage(librdf_world *i_pWorld) const
1917*b1cdbd2cSJim Jagielski {
1918*b1cdbd2cSJim Jagielski     librdf_storage *pStorage(
1919*b1cdbd2cSJim Jagielski //        librdf_new_storage(i_pWorld, "memory", NULL, "contexts='yes'") );
1920*b1cdbd2cSJim Jagielski         librdf_new_storage(i_pWorld, "hashes", NULL,
1921*b1cdbd2cSJim Jagielski             "contexts='yes',hash-type='memory'") );
1922*b1cdbd2cSJim Jagielski     if (!pStorage) {
1923*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1924*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::createStorage: librdf_new_storage failed"),
1925*b1cdbd2cSJim Jagielski             m_rRep);
1926*b1cdbd2cSJim Jagielski     }
1927*b1cdbd2cSJim Jagielski     return pStorage;
1928*b1cdbd2cSJim Jagielski }
1929*b1cdbd2cSJim Jagielski 
createModel(librdf_world * i_pWorld,librdf_storage * i_pStorage) const1930*b1cdbd2cSJim Jagielski librdf_model *librdf_TypeConverter::createModel(
1931*b1cdbd2cSJim Jagielski     librdf_world *i_pWorld, librdf_storage * i_pStorage) const
1932*b1cdbd2cSJim Jagielski {
1933*b1cdbd2cSJim Jagielski     librdf_model *pRepository( librdf_new_model(i_pWorld, i_pStorage, NULL) );
1934*b1cdbd2cSJim Jagielski     if (!pRepository) {
1935*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1936*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::createModel: librdf_new_model failed"),
1937*b1cdbd2cSJim Jagielski             m_rRep);
1938*b1cdbd2cSJim Jagielski     }
1939*b1cdbd2cSJim Jagielski     //FIXME
1940*b1cdbd2cSJim Jagielski #if 0
1941*b1cdbd2cSJim Jagielski     {
1942*b1cdbd2cSJim Jagielski         librdf_uri * ctxt = librdf_new_uri(i_pWorld, reinterpret_cast<const unsigned char *>(LIBRDF_MODEL_FEATURE_CONTEXTS));
1943*b1cdbd2cSJim Jagielski         librdf_node * contexts = librdf_model_get_feature(repository, ctxt);
1944*b1cdbd2cSJim Jagielski         if (!contexts)
1945*b1cdbd2cSJim Jagielski             throw;
1946*b1cdbd2cSJim Jagielski         std::cout << "value of contexts feature: ";
1947*b1cdbd2cSJim Jagielski         prtNode(contexts);
1948*b1cdbd2cSJim Jagielski         std::cout << std::endl;
1949*b1cdbd2cSJim Jagielski         // librdf_model_set_feature(repository, LIBRDF_FEATURE_CONTEXTS, ...);
1950*b1cdbd2cSJim Jagielski         safe_librdf_free_node(contexts);
1951*b1cdbd2cSJim Jagielski         safe_librdf_free_uri(ctxt);
1952*b1cdbd2cSJim Jagielski     }
1953*b1cdbd2cSJim Jagielski #endif
1954*b1cdbd2cSJim Jagielski     return pRepository;
1955*b1cdbd2cSJim Jagielski }
1956*b1cdbd2cSJim Jagielski 
1957*b1cdbd2cSJim Jagielski // this does NOT create a node, only URI
mkURI(librdf_world * i_pWorld,const uno::Reference<rdf::XURI> & i_xURI) const1958*b1cdbd2cSJim Jagielski librdf_uri* librdf_TypeConverter::mkURI( librdf_world* i_pWorld,
1959*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xURI) const
1960*b1cdbd2cSJim Jagielski {
1961*b1cdbd2cSJim Jagielski     const ::rtl::OString uri(
1962*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(i_xURI->getStringValue(),
1963*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_UTF8) );
1964*b1cdbd2cSJim Jagielski     librdf_uri *pURI( librdf_new_uri(i_pWorld,
1965*b1cdbd2cSJim Jagielski         reinterpret_cast<const unsigned char *>(uri.getStr())));
1966*b1cdbd2cSJim Jagielski     if (!pURI) {
1967*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1968*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::mkURI: librdf_new_uri failed"), 0);
1969*b1cdbd2cSJim Jagielski     }
1970*b1cdbd2cSJim Jagielski     return pURI;
1971*b1cdbd2cSJim Jagielski }
1972*b1cdbd2cSJim Jagielski 
1973*b1cdbd2cSJim Jagielski // create blank or URI node
mkResource(librdf_world * i_pWorld,const uno::Reference<rdf::XResource> & i_xResource) const1974*b1cdbd2cSJim Jagielski librdf_node* librdf_TypeConverter::mkResource( librdf_world* i_pWorld,
1975*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xResource) const
1976*b1cdbd2cSJim Jagielski {
1977*b1cdbd2cSJim Jagielski     if (!i_xResource.is()) return 0;
1978*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XBlankNode > xBlankNode(i_xResource, uno::UNO_QUERY);
1979*b1cdbd2cSJim Jagielski     if (xBlankNode.is()) {
1980*b1cdbd2cSJim Jagielski         const ::rtl::OString label(
1981*b1cdbd2cSJim Jagielski             ::rtl::OUStringToOString(xBlankNode->getStringValue(),
1982*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_UTF8) );
1983*b1cdbd2cSJim Jagielski         librdf_node *pNode(
1984*b1cdbd2cSJim Jagielski             librdf_new_node_from_blank_identifier(i_pWorld,
1985*b1cdbd2cSJim Jagielski                 reinterpret_cast<const unsigned char*> (label.getStr())));
1986*b1cdbd2cSJim Jagielski         if (!pNode) {
1987*b1cdbd2cSJim Jagielski             throw uno::RuntimeException(::rtl::OUString::createFromAscii(
1988*b1cdbd2cSJim Jagielski                 "librdf_TypeConverter::mkResource: "
1989*b1cdbd2cSJim Jagielski                 "librdf_new_node_from_blank_identifier failed"), 0);
1990*b1cdbd2cSJim Jagielski         }
1991*b1cdbd2cSJim Jagielski         return pNode;
1992*b1cdbd2cSJim Jagielski     } else { // assumption: everything else is URI
1993*b1cdbd2cSJim Jagielski         const ::rtl::OString uri(
1994*b1cdbd2cSJim Jagielski             ::rtl::OUStringToOString(i_xResource->getStringValue(),
1995*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_UTF8) );
1996*b1cdbd2cSJim Jagielski         librdf_node *pNode(
1997*b1cdbd2cSJim Jagielski             librdf_new_node_from_uri_string(i_pWorld,
1998*b1cdbd2cSJim Jagielski                 reinterpret_cast<const unsigned char*> (uri.getStr())));
1999*b1cdbd2cSJim Jagielski         if (!pNode) {
2000*b1cdbd2cSJim Jagielski             throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2001*b1cdbd2cSJim Jagielski                 "librdf_TypeConverter::mkResource: "
2002*b1cdbd2cSJim Jagielski                 "librdf_new_node_from_uri_string failed"), 0);
2003*b1cdbd2cSJim Jagielski         }
2004*b1cdbd2cSJim Jagielski         return pNode;
2005*b1cdbd2cSJim Jagielski     }
2006*b1cdbd2cSJim Jagielski }
2007*b1cdbd2cSJim Jagielski 
2008*b1cdbd2cSJim Jagielski // create blank or URI or literal node
mkNode(librdf_world * i_pWorld,const uno::Reference<rdf::XNode> & i_xNode) const2009*b1cdbd2cSJim Jagielski librdf_node* librdf_TypeConverter::mkNode( librdf_world* i_pWorld,
2010*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xNode) const
2011*b1cdbd2cSJim Jagielski {
2012*b1cdbd2cSJim Jagielski     if (!i_xNode.is()) return 0;
2013*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XResource > xResource(i_xNode, uno::UNO_QUERY);
2014*b1cdbd2cSJim Jagielski     if (xResource.is()) {
2015*b1cdbd2cSJim Jagielski         return mkResource(i_pWorld, xResource);
2016*b1cdbd2cSJim Jagielski     }
2017*b1cdbd2cSJim Jagielski     uno::Reference< rdf::XLiteral> xLiteral(i_xNode, uno::UNO_QUERY);
2018*b1cdbd2cSJim Jagielski     OSL_ENSURE(xLiteral.is(),
2019*b1cdbd2cSJim Jagielski         "mkNode: someone invented a new rdf.XNode and did not tell me");
2020*b1cdbd2cSJim Jagielski     if (!xLiteral.is()) return 0;
2021*b1cdbd2cSJim Jagielski     const ::rtl::OString val(
2022*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(xLiteral->getValue(),
2023*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_UTF8) );
2024*b1cdbd2cSJim Jagielski     const ::rtl::OString lang(
2025*b1cdbd2cSJim Jagielski         ::rtl::OUStringToOString(xLiteral->getLanguage(),
2026*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_UTF8) );
2027*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > xType(xLiteral->getDatatype());
2028*b1cdbd2cSJim Jagielski     librdf_node * ret(0);
2029*b1cdbd2cSJim Jagielski     if (lang.getLength() == 0) {
2030*b1cdbd2cSJim Jagielski         if (!xType.is()) {
2031*b1cdbd2cSJim Jagielski             ret = librdf_new_node_from_literal(i_pWorld,
2032*b1cdbd2cSJim Jagielski                 reinterpret_cast<const unsigned char*> (val.getStr()),
2033*b1cdbd2cSJim Jagielski                 NULL, 0);
2034*b1cdbd2cSJim Jagielski         } else {
2035*b1cdbd2cSJim Jagielski             const boost::shared_ptr<librdf_uri> pDatatype(
2036*b1cdbd2cSJim Jagielski                 mkURI(i_pWorld, xType), safe_librdf_free_uri);
2037*b1cdbd2cSJim Jagielski             ret = librdf_new_node_from_typed_literal(i_pWorld,
2038*b1cdbd2cSJim Jagielski                 reinterpret_cast<const unsigned char*> (val.getStr()),
2039*b1cdbd2cSJim Jagielski                 NULL, pDatatype.get());
2040*b1cdbd2cSJim Jagielski         }
2041*b1cdbd2cSJim Jagielski     } else {
2042*b1cdbd2cSJim Jagielski         if (!xType.is()) {
2043*b1cdbd2cSJim Jagielski             ret = librdf_new_node_from_literal(i_pWorld,
2044*b1cdbd2cSJim Jagielski                 reinterpret_cast<const unsigned char*> (val.getStr()),
2045*b1cdbd2cSJim Jagielski                 (lang.getStr()), 0);
2046*b1cdbd2cSJim Jagielski 
2047*b1cdbd2cSJim Jagielski         } else {
2048*b1cdbd2cSJim Jagielski             OSL_ENSURE(false, "mkNode: invalid literal");
2049*b1cdbd2cSJim Jagielski             return 0;
2050*b1cdbd2cSJim Jagielski         }
2051*b1cdbd2cSJim Jagielski     }
2052*b1cdbd2cSJim Jagielski     if (!ret) {
2053*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2054*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::mkNode: "
2055*b1cdbd2cSJim Jagielski             "librdf_new_node_from_literal failed"), 0);
2056*b1cdbd2cSJim Jagielski     }
2057*b1cdbd2cSJim Jagielski     return ret;
2058*b1cdbd2cSJim Jagielski }
2059*b1cdbd2cSJim Jagielski 
mkStatement(librdf_world * i_pWorld,const uno::Reference<rdf::XResource> & i_xSubject,const uno::Reference<rdf::XURI> & i_xPredicate,const uno::Reference<rdf::XNode> & i_xObject) const2060*b1cdbd2cSJim Jagielski librdf_statement* librdf_TypeConverter::mkStatement( librdf_world* i_pWorld,
2061*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XResource > & i_xSubject,
2062*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XURI > & i_xPredicate,
2063*b1cdbd2cSJim Jagielski     const uno::Reference< rdf::XNode > & i_xObject) const
2064*b1cdbd2cSJim Jagielski {
2065*b1cdbd2cSJim Jagielski     librdf_node* pSubject( mkResource(i_pWorld, i_xSubject) );
2066*b1cdbd2cSJim Jagielski     librdf_node* pPredicate(0);
2067*b1cdbd2cSJim Jagielski     librdf_node* pObject(0);
2068*b1cdbd2cSJim Jagielski     try {
2069*b1cdbd2cSJim Jagielski         const uno::Reference<rdf::XResource> xPredicate(i_xPredicate,
2070*b1cdbd2cSJim Jagielski             uno::UNO_QUERY);
2071*b1cdbd2cSJim Jagielski         pPredicate = mkResource(i_pWorld, xPredicate);
2072*b1cdbd2cSJim Jagielski         try {
2073*b1cdbd2cSJim Jagielski             pObject = mkNode(i_pWorld, i_xObject);
2074*b1cdbd2cSJim Jagielski         } catch (...) {
2075*b1cdbd2cSJim Jagielski             safe_librdf_free_node(pPredicate);
2076*b1cdbd2cSJim Jagielski             throw;
2077*b1cdbd2cSJim Jagielski         }
2078*b1cdbd2cSJim Jagielski     } catch (...) {
2079*b1cdbd2cSJim Jagielski         safe_librdf_free_node(pSubject);
2080*b1cdbd2cSJim Jagielski         throw;
2081*b1cdbd2cSJim Jagielski     }
2082*b1cdbd2cSJim Jagielski     // NB: this takes ownership of the nodes! (which is really ugly)
2083*b1cdbd2cSJim Jagielski     librdf_statement* pStatement( librdf_new_statement_from_nodes(i_pWorld,
2084*b1cdbd2cSJim Jagielski         pSubject, pPredicate, pObject) );
2085*b1cdbd2cSJim Jagielski     if (!pStatement) {
2086*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2087*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::mkStatement: "
2088*b1cdbd2cSJim Jagielski             "librdf_new_statement_from_nodes failed"), 0);
2089*b1cdbd2cSJim Jagielski     }
2090*b1cdbd2cSJim Jagielski     return pStatement;
2091*b1cdbd2cSJim Jagielski }
2092*b1cdbd2cSJim Jagielski 
2093*b1cdbd2cSJim Jagielski uno::Reference<rdf::XURI>
convertToXURI(librdf_uri * i_pURI) const2094*b1cdbd2cSJim Jagielski librdf_TypeConverter::convertToXURI(librdf_uri* i_pURI) const
2095*b1cdbd2cSJim Jagielski {
2096*b1cdbd2cSJim Jagielski     if (!i_pURI) return 0;
2097*b1cdbd2cSJim Jagielski     const unsigned char* uri( librdf_uri_as_string(i_pURI) );
2098*b1cdbd2cSJim Jagielski     if (!uri) {
2099*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2100*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::convertToXURI: "
2101*b1cdbd2cSJim Jagielski             "librdf_uri_as_string failed"), m_rRep);
2102*b1cdbd2cSJim Jagielski     }
2103*b1cdbd2cSJim Jagielski     ::rtl::OUString uriU( ::rtl::OStringToOUString(
2104*b1cdbd2cSJim Jagielski         ::rtl::OString(reinterpret_cast<const sal_Char*>(uri)),
2105*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_UTF8) );
2106*b1cdbd2cSJim Jagielski     try {
2107*b1cdbd2cSJim Jagielski         return rdf::URI::create(m_xContext, uriU);
2108*b1cdbd2cSJim Jagielski     } catch (lang::IllegalArgumentException & iae) {
2109*b1cdbd2cSJim Jagielski         throw lang::WrappedTargetRuntimeException(
2110*b1cdbd2cSJim Jagielski             ::rtl::OUString::createFromAscii(
2111*b1cdbd2cSJim Jagielski                 "librdf_TypeConverter::convertToXURI: "
2112*b1cdbd2cSJim Jagielski                 "illegal uri"), m_rRep, uno::makeAny(iae));
2113*b1cdbd2cSJim Jagielski     }
2114*b1cdbd2cSJim Jagielski }
2115*b1cdbd2cSJim Jagielski 
2116*b1cdbd2cSJim Jagielski uno::Reference<rdf::XURI>
convertToXURI(librdf_node * i_pNode) const2117*b1cdbd2cSJim Jagielski librdf_TypeConverter::convertToXURI(librdf_node* i_pNode) const
2118*b1cdbd2cSJim Jagielski {
2119*b1cdbd2cSJim Jagielski     if (!i_pNode) return 0;
2120*b1cdbd2cSJim Jagielski     if (librdf_node_is_resource(i_pNode)) {
2121*b1cdbd2cSJim Jagielski         librdf_uri* pURI( librdf_node_get_uri(i_pNode) );
2122*b1cdbd2cSJim Jagielski         if (!pURI) {
2123*b1cdbd2cSJim Jagielski             throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2124*b1cdbd2cSJim Jagielski                 "librdf_TypeConverter::convertToXURI: "
2125*b1cdbd2cSJim Jagielski                 "resource has no uri"), m_rRep);
2126*b1cdbd2cSJim Jagielski         }
2127*b1cdbd2cSJim Jagielski         return convertToXURI(pURI);
2128*b1cdbd2cSJim Jagielski     } else {
2129*b1cdbd2cSJim Jagielski         OSL_ENSURE(false, "convertToXURI: unknown librdf_node");
2130*b1cdbd2cSJim Jagielski         return 0;
2131*b1cdbd2cSJim Jagielski     }
2132*b1cdbd2cSJim Jagielski }
2133*b1cdbd2cSJim Jagielski 
2134*b1cdbd2cSJim Jagielski uno::Reference<rdf::XResource>
convertToXResource(librdf_node * i_pNode) const2135*b1cdbd2cSJim Jagielski librdf_TypeConverter::convertToXResource(librdf_node* i_pNode) const
2136*b1cdbd2cSJim Jagielski {
2137*b1cdbd2cSJim Jagielski     if (!i_pNode) return 0;
2138*b1cdbd2cSJim Jagielski     if (librdf_node_is_blank(i_pNode)) {
2139*b1cdbd2cSJim Jagielski         const unsigned char* label( librdf_node_get_blank_identifier(i_pNode) );
2140*b1cdbd2cSJim Jagielski         if (!label) {
2141*b1cdbd2cSJim Jagielski             throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2142*b1cdbd2cSJim Jagielski                 "librdf_TypeConverter::convertToXResource: "
2143*b1cdbd2cSJim Jagielski                 "blank node has no label"), m_rRep);
2144*b1cdbd2cSJim Jagielski         }
2145*b1cdbd2cSJim Jagielski         ::rtl::OUString labelU( ::rtl::OStringToOUString(
2146*b1cdbd2cSJim Jagielski             ::rtl::OString(reinterpret_cast<const sal_Char*>(label)),
2147*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_UTF8) );
2148*b1cdbd2cSJim Jagielski         try {
2149*b1cdbd2cSJim Jagielski             return uno::Reference<rdf::XResource>(
2150*b1cdbd2cSJim Jagielski                 rdf::BlankNode::create(m_xContext, labelU), uno::UNO_QUERY);
2151*b1cdbd2cSJim Jagielski         } catch (lang::IllegalArgumentException & iae) {
2152*b1cdbd2cSJim Jagielski             throw lang::WrappedTargetRuntimeException(
2153*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii(
2154*b1cdbd2cSJim Jagielski                     "librdf_TypeConverter::convertToXResource: "
2155*b1cdbd2cSJim Jagielski                     "illegal blank node label"), m_rRep, uno::makeAny(iae));
2156*b1cdbd2cSJim Jagielski         }
2157*b1cdbd2cSJim Jagielski     } else {
2158*b1cdbd2cSJim Jagielski         return uno::Reference<rdf::XResource>(convertToXURI(i_pNode),
2159*b1cdbd2cSJim Jagielski             uno::UNO_QUERY);
2160*b1cdbd2cSJim Jagielski     }
2161*b1cdbd2cSJim Jagielski }
2162*b1cdbd2cSJim Jagielski 
2163*b1cdbd2cSJim Jagielski uno::Reference<rdf::XNode>
convertToXNode(librdf_node * i_pNode) const2164*b1cdbd2cSJim Jagielski librdf_TypeConverter::convertToXNode(librdf_node* i_pNode) const
2165*b1cdbd2cSJim Jagielski {
2166*b1cdbd2cSJim Jagielski     if (!i_pNode) return 0;
2167*b1cdbd2cSJim Jagielski     if (!librdf_node_is_literal(i_pNode)) {
2168*b1cdbd2cSJim Jagielski         return uno::Reference<rdf::XNode>(convertToXResource(i_pNode),
2169*b1cdbd2cSJim Jagielski             uno::UNO_QUERY);
2170*b1cdbd2cSJim Jagielski     }
2171*b1cdbd2cSJim Jagielski     const unsigned char* value( librdf_node_get_literal_value(i_pNode) );
2172*b1cdbd2cSJim Jagielski     if (!value) {
2173*b1cdbd2cSJim Jagielski         throw uno::RuntimeException(::rtl::OUString::createFromAscii(
2174*b1cdbd2cSJim Jagielski             "librdf_TypeConverter::convertToXNode: "
2175*b1cdbd2cSJim Jagielski             "literal has no value"), m_rRep);
2176*b1cdbd2cSJim Jagielski     }
2177*b1cdbd2cSJim Jagielski     const char * lang( librdf_node_get_literal_value_language(i_pNode) );
2178*b1cdbd2cSJim Jagielski     librdf_uri* pType(
2179*b1cdbd2cSJim Jagielski         librdf_node_get_literal_value_datatype_uri(i_pNode) );
2180*b1cdbd2cSJim Jagielski     OSL_ENSURE(!lang || !pType, "convertToXNode: invalid literal");
2181*b1cdbd2cSJim Jagielski     const ::rtl::OUString valueU( ::rtl::OStringToOUString(
2182*b1cdbd2cSJim Jagielski         ::rtl::OString(reinterpret_cast<const sal_Char*>(value)),
2183*b1cdbd2cSJim Jagielski         RTL_TEXTENCODING_UTF8) );
2184*b1cdbd2cSJim Jagielski     if (lang) {
2185*b1cdbd2cSJim Jagielski         const ::rtl::OUString langU( ::rtl::OStringToOUString(
2186*b1cdbd2cSJim Jagielski             ::rtl::OString(reinterpret_cast<const sal_Char*>(lang)),
2187*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_UTF8) );
2188*b1cdbd2cSJim Jagielski         return uno::Reference<rdf::XNode>(
2189*b1cdbd2cSJim Jagielski             rdf::Literal::createWithLanguage(m_xContext, valueU, langU),
2190*b1cdbd2cSJim Jagielski             uno::UNO_QUERY);
2191*b1cdbd2cSJim Jagielski     } else if (pType) {
2192*b1cdbd2cSJim Jagielski         uno::Reference<rdf::XURI> xType(convertToXURI(pType));
2193*b1cdbd2cSJim Jagielski         OSL_ENSURE(xType.is(), "convertToXNode: null uri");
2194*b1cdbd2cSJim Jagielski         return uno::Reference<rdf::XNode>(
2195*b1cdbd2cSJim Jagielski             rdf::Literal::createWithType(m_xContext, valueU, xType),
2196*b1cdbd2cSJim Jagielski             uno::UNO_QUERY);
2197*b1cdbd2cSJim Jagielski     } else {
2198*b1cdbd2cSJim Jagielski         return uno::Reference<rdf::XNode>(
2199*b1cdbd2cSJim Jagielski             rdf::Literal::create(m_xContext, valueU),
2200*b1cdbd2cSJim Jagielski             uno::UNO_QUERY);
2201*b1cdbd2cSJim Jagielski     }
2202*b1cdbd2cSJim Jagielski }
2203*b1cdbd2cSJim Jagielski 
2204*b1cdbd2cSJim Jagielski rdf::Statement
convertToStatement(librdf_statement * i_pStmt,librdf_node * i_pContext) const2205*b1cdbd2cSJim Jagielski librdf_TypeConverter::convertToStatement(librdf_statement* i_pStmt,
2206*b1cdbd2cSJim Jagielski     librdf_node* i_pContext) const
2207*b1cdbd2cSJim Jagielski {
2208*b1cdbd2cSJim Jagielski     if (!i_pStmt) {
2209*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
2210*b1cdbd2cSJim Jagielski     }
2211*b1cdbd2cSJim Jagielski     return rdf::Statement(
2212*b1cdbd2cSJim Jagielski         convertToXResource(librdf_statement_get_subject(i_pStmt)),
2213*b1cdbd2cSJim Jagielski         convertToXURI(librdf_statement_get_predicate(i_pStmt)),
2214*b1cdbd2cSJim Jagielski         convertToXNode(librdf_statement_get_object(i_pStmt)),
2215*b1cdbd2cSJim Jagielski         convertToXURI(i_pContext));
2216*b1cdbd2cSJim Jagielski }
2217*b1cdbd2cSJim Jagielski 
2218*b1cdbd2cSJim Jagielski } // closing anonymous implementation namespace
2219*b1cdbd2cSJim Jagielski 
2220*b1cdbd2cSJim Jagielski 
2221*b1cdbd2cSJim Jagielski 
2222*b1cdbd2cSJim Jagielski // component helper namespace
2223*b1cdbd2cSJim Jagielski namespace comp_librdf_Repository {
2224*b1cdbd2cSJim Jagielski 
_getImplementationName()2225*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL _getImplementationName() {
2226*b1cdbd2cSJim Jagielski     return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
2227*b1cdbd2cSJim Jagielski         "librdf_Repository"));
2228*b1cdbd2cSJim Jagielski }
2229*b1cdbd2cSJim Jagielski 
_getSupportedServiceNames()2230*b1cdbd2cSJim Jagielski uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames()
2231*b1cdbd2cSJim Jagielski {
2232*b1cdbd2cSJim Jagielski     uno::Sequence< ::rtl::OUString > s(1);
2233*b1cdbd2cSJim Jagielski     s[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
2234*b1cdbd2cSJim Jagielski         "com.sun.star.rdf.Repository"));
2235*b1cdbd2cSJim Jagielski     return s;
2236*b1cdbd2cSJim Jagielski }
2237*b1cdbd2cSJim Jagielski 
_create(const uno::Reference<uno::XComponentContext> & context)2238*b1cdbd2cSJim Jagielski uno::Reference< uno::XInterface > SAL_CALL _create(
2239*b1cdbd2cSJim Jagielski     const uno::Reference< uno::XComponentContext > & context)
2240*b1cdbd2cSJim Jagielski         SAL_THROW((uno::Exception))
2241*b1cdbd2cSJim Jagielski {
2242*b1cdbd2cSJim Jagielski     return static_cast< ::cppu::OWeakObject * >(new librdf_Repository(context));
2243*b1cdbd2cSJim Jagielski }
2244*b1cdbd2cSJim Jagielski 
2245*b1cdbd2cSJim Jagielski } // closing component helper namespace
2246*b1cdbd2cSJim Jagielski 
2247