From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- sw/source/core/doc/rdfhelper.cxx | 264 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 sw/source/core/doc/rdfhelper.cxx (limited to 'sw/source/core/doc/rdfhelper.cxx') diff --git a/sw/source/core/doc/rdfhelper.cxx b/sw/source/core/doc/rdfhelper.cxx new file mode 100644 index 000000000..651a899ff --- /dev/null +++ b/sw/source/core/doc/rdfhelper.cxx @@ -0,0 +1,264 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +using namespace com::sun::star; + +css::uno::Sequence> SwRDFHelper::getGraphNames( + const css::uno::Reference& xDocumentMetadataAccess, + const css::uno::Reference& xType) +{ + try + { + return xDocumentMetadataAccess->getMetadataGraphsWithType(xType); + } + catch (const uno::RuntimeException&) + { + return uno::Sequence>(); + } +} + +css::uno::Sequence> +SwRDFHelper::getGraphNames(const css::uno::Reference& xModel, + const OUString& rType) +{ + try + { + uno::Reference xComponentContext( + comphelper::getProcessComponentContext()); + // rdf::URI::create may fail with type: com.sun.star.uno.DeploymentException + // message: component context fails to supply service com.sun.star.rdf.URI of type com.sun.star.rdf.XURI + // context: cppu::ComponentContext + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(xModel, + uno::UNO_QUERY); + return getGraphNames(xDocumentMetadataAccess, xType); + } + catch (const ::css::uno::Exception&) + { + return uno::Sequence>(); + } +} + +std::map +SwRDFHelper::getStatements(const css::uno::Reference& xModel, + const uno::Sequence>& rGraphNames, + const css::uno::Reference& xSubject) +{ + std::map aRet; + if (!rGraphNames.hasElements()) + return aRet; + + uno::Reference xDocumentMetadataAccess(xModel, uno::UNO_QUERY); + const uno::Reference& xRepo = xDocumentMetadataAccess->getRDFRepository(); + for (const uno::Reference& xGraphName : rGraphNames) + { + uno::Reference xGraph = xRepo->getGraph(xGraphName); + if (!xGraph.is()) + continue; + + uno::Reference xStatements = xGraph->getStatements( + xSubject, uno::Reference(), uno::Reference()); + while (xStatements->hasMoreElements()) + { + const rdf::Statement aStatement = xStatements->nextElement().get(); + aRet[aStatement.Predicate->getStringValue()] = aStatement.Object->getStringValue(); + } + } + + return aRet; +} + +std::map +SwRDFHelper::getStatements(const css::uno::Reference& xModel, + const OUString& rType, + const css::uno::Reference& xSubject) +{ + return getStatements(xModel, getGraphNames(xModel, rType), xSubject); +} + +void SwRDFHelper::addStatement(const css::uno::Reference& xModel, + const OUString& rType, const OUString& rPath, + const css::uno::Reference& xSubject, + const OUString& rKey, const OUString& rValue) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(xModel, uno::UNO_QUERY); + const uno::Sequence< uno::Reference > aGraphNames = getGraphNames(xDocumentMetadataAccess, xType); + uno::Reference xGraphName; + if (aGraphNames.hasElements()) + xGraphName = aGraphNames[0]; + else + { + uno::Sequence< uno::Reference > xTypes = { xType }; + xGraphName = xDocumentMetadataAccess->addMetadataFile(rPath, xTypes); + } + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName); + uno::Reference xKey = rdf::URI::create(xComponentContext, rKey); + uno::Reference xValue = rdf::Literal::create(xComponentContext, rValue); + xGraph->addStatement(xSubject, xKey, xValue); +} + +bool SwRDFHelper::hasMetadataGraph(const css::uno::Reference& xModel, const OUString& rType) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(xModel, uno::UNO_QUERY); + return getGraphNames(xDocumentMetadataAccess, xType).hasElements(); +} + +void SwRDFHelper::removeStatement(const css::uno::Reference& xModel, + const OUString& rType, + const css::uno::Reference& xSubject, + const OUString& rKey, const OUString& rValue) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(xModel, uno::UNO_QUERY); + const uno::Sequence< uno::Reference > aGraphNames = getGraphNames(xDocumentMetadataAccess, xType); + if (!aGraphNames.hasElements()) + return; + + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(aGraphNames[0]); + uno::Reference xKey = rdf::URI::create(xComponentContext, rKey); + uno::Reference xValue = rdf::Literal::create(xComponentContext, rValue); + xGraph->removeStatements(xSubject, xKey, xValue); +} + +void SwRDFHelper::clearStatements(const css::uno::Reference& xModel, + const OUString& rType, + const css::uno::Reference& xSubject) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(xModel, uno::UNO_QUERY); + const uno::Sequence< uno::Reference > aGraphNames = getGraphNames(xDocumentMetadataAccess, xType); + if (!aGraphNames.hasElements()) + return; + + for (const uno::Reference& xGraphName : aGraphNames) + { + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName); + uno::Reference xStatements = xGraph->getStatements(xSubject, uno::Reference(), uno::Reference()); + while (xStatements->hasMoreElements()) + { + rdf::Statement aStatement = xStatements->nextElement().get(); + uno::Reference xKey = rdf::URI::create(xComponentContext, aStatement.Predicate->getStringValue()); + uno::Reference xValue = rdf::Literal::create(xComponentContext, aStatement.Object->getStringValue()); + xGraph->removeStatements(xSubject, xKey, xValue); + } + } +} + +void SwRDFHelper::cloneStatements(const css::uno::Reference& xSrcModel, + const css::uno::Reference& xDstModel, + const OUString& rType, + const css::uno::Reference& xSrcSubject, + const css::uno::Reference& xDstSubject) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(xSrcModel, uno::UNO_QUERY); + const uno::Sequence< uno::Reference > aGraphNames = getGraphNames(xDocumentMetadataAccess, xType); + if (!aGraphNames.hasElements()) + return; + + for (const uno::Reference& xGraphName : aGraphNames) + { + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName); + uno::Reference xStatements = xGraph->getStatements(xSrcSubject, uno::Reference(), uno::Reference()); + while (xStatements->hasMoreElements()) + { + const rdf::Statement aStatement = xStatements->nextElement().get(); + + const OUString sKey = aStatement.Predicate->getStringValue(); + const OUString sValue = aStatement.Object->getStringValue(); + addStatement(xDstModel, rType, xGraphName->getLocalName(), xDstSubject, sKey, sValue); + } + } +} + +std::map SwRDFHelper::getTextNodeStatements(const OUString& rType, SwTextNode& rTextNode) +{ + uno::Reference xTextNode(SwXParagraph::CreateXParagraph(rTextNode.GetDoc(), &rTextNode), uno::UNO_QUERY); + return getStatements(rTextNode.GetDoc().GetDocShell()->GetBaseModel(), rType, xTextNode); +} + +void SwRDFHelper::addTextNodeStatement(const OUString& rType, const OUString& rPath, SwTextNode& rTextNode, const OUString& rKey, const OUString& rValue) +{ + uno::Reference xSubject(SwXParagraph::CreateXParagraph(rTextNode.GetDoc(), &rTextNode), uno::UNO_QUERY); + addStatement(rTextNode.GetDoc().GetDocShell()->GetBaseModel(), rType, rPath, xSubject, rKey, rValue); +} + +void SwRDFHelper::removeTextNodeStatement(const OUString& rType, SwTextNode& rTextNode, const OUString& rKey, const OUString& rValue) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(rTextNode.GetDoc().GetDocShell()->GetBaseModel(), uno::UNO_QUERY); + const uno::Sequence< uno::Reference > aGraphNames = getGraphNames(xDocumentMetadataAccess, xType); + if (!aGraphNames.hasElements()) + return; + + uno::Reference xGraphName = aGraphNames[0]; + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName); + uno::Reference xSubject(SwXParagraph::CreateXParagraph(rTextNode.GetDoc(), &rTextNode), uno::UNO_QUERY); + uno::Reference xKey = rdf::URI::create(xComponentContext, rKey); + uno::Reference xValue = rdf::Literal::create(xComponentContext, rValue); + xGraph->removeStatements(xSubject, xKey, xValue); +} + +void SwRDFHelper::updateTextNodeStatement(const OUString& rType, const OUString& rPath, SwTextNode& rTextNode, const OUString& rKey, const OUString& rOldValue, const OUString& rNewValue) +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, rType); + uno::Reference xDocumentMetadataAccess(rTextNode.GetDoc().GetDocShell()->GetBaseModel(), uno::UNO_QUERY); + const uno::Sequence< uno::Reference > aGraphNames = getGraphNames(xDocumentMetadataAccess, xType); + uno::Reference xGraphName; + if (aGraphNames.hasElements()) + { + xGraphName = aGraphNames[0]; + } + else + { + uno::Sequence< uno::Reference > xTypes = { xType }; + xGraphName = xDocumentMetadataAccess->addMetadataFile(rPath, xTypes); + } + + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName); + uno::Reference xSubject(SwXParagraph::CreateXParagraph(rTextNode.GetDoc(), &rTextNode), uno::UNO_QUERY); + uno::Reference xKey = rdf::URI::create(xComponentContext, rKey); + + if (aGraphNames.hasElements()) + { + // Remove the old value. + uno::Reference xOldValue = rdf::Literal::create(xComponentContext, rOldValue); + xGraph->removeStatements(xSubject, xKey, xOldValue); + } + + // Now add it with new value. + uno::Reference xNewValue = rdf::Literal::create(xComponentContext, rNewValue); + xGraph->addStatement(xSubject, xKey, xNewValue); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3