1
0
Fork 0
libreoffice/unoxml/source/rdf/CURI.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

805 lines
21 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <cppuhelper/implbase.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/rdf/XURI.hpp>
#include <com/sun/star/rdf/URIs.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
/// anonymous implementation namespace
namespace {
class CURI:
public ::cppu::WeakImplHelper<
css::lang::XServiceInfo,
css::lang::XInitialization,
css::rdf::XURI>
{
public:
explicit CURI();
// css::lang::XServiceInfo:
virtual OUString SAL_CALL getImplementationName() override;
virtual sal_Bool SAL_CALL supportsService(const OUString & ServiceName) override;
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
// css::lang::XInitialization:
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > & aArguments) override;
// css::rdf::XNode:
virtual OUString SAL_CALL getStringValue() override;
// css::rdf::XURI:
virtual OUString SAL_CALL getLocalName() override;
virtual OUString SAL_CALL getNamespace() override;
private:
CURI(CURI const&) = delete;
CURI& operator=(CURI const&) = delete;
/// handle css.rdf.URIs
void initFromConstant(const sal_Int16 i_Constant);
OUString m_Namespace;
OUString m_LocalName;
};
CURI::CURI()
{}
// com.sun.star.uno.XServiceInfo:
OUString SAL_CALL CURI::getImplementationName()
{
return u"CURI"_ustr;
}
sal_Bool SAL_CALL CURI::supportsService(OUString const & serviceName)
{
return cppu::supportsService(this, serviceName);
}
css::uno::Sequence< OUString > SAL_CALL CURI::getSupportedServiceNames()
{
return { u"com.sun.star.rdf.URI"_ustr };
}
constexpr OUString s_nsXSD = u"http://www.w3.org/2001/XMLSchema-datatypes#"_ustr;
constexpr OUString s_nsRDF = u"http://www.w3.org/1999/02/22-rdf-syntax-ns#"_ustr;
constexpr OUString s_nsRDFs = u"http://www.w3.org/2000/01/rdf-schema#"_ustr;
constexpr OUString s_nsOWL = u"http://www.w3.org/2002/07/owl#"_ustr;
constexpr OUString s_nsPkg = u"http://docs.oasis-open.org/ns/office/1.2/meta/pkg#"_ustr;
constexpr OUString s_nsODF = u"http://docs.oasis-open.org/ns/office/1.2/meta/odf#"_ustr;
constexpr OUString s_nsLO_EXT =
u"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0odf#"_ustr;
void CURI::initFromConstant(const sal_Int16 i_Constant)
{
OUString ns;
OUString ln;
switch (i_Constant)
{
case css::rdf::URIs::XSD_NCNAME:
ns = s_nsXSD;
ln = u"NCName"_ustr;
break;
case css::rdf::URIs::XSD_STRING:
ns = s_nsXSD;
ln = u"string"_ustr;
break;
case css::rdf::URIs::XSD_NORMALIZEDSTRING:
ns = s_nsXSD;
ln = u"normalizedString"_ustr;
break;
case css::rdf::URIs::XSD_BOOLEAN:
ns = s_nsXSD;
ln = u"boolean"_ustr;
break;
case css::rdf::URIs::XSD_DECIMAL:
ns = s_nsXSD;
ln = u"decimal"_ustr;
break;
case css::rdf::URIs::XSD_FLOAT:
ns = s_nsXSD;
ln = u"float"_ustr;
break;
case css::rdf::URIs::XSD_DOUBLE:
ns = s_nsXSD;
ln = u"double"_ustr;
break;
case css::rdf::URIs::XSD_INTEGER:
ns = s_nsXSD;
ln = u"integer"_ustr;
break;
case css::rdf::URIs::XSD_NONNEGATIVEINTEGER:
ns = s_nsXSD;
ln = u"nonNegativeInteger"_ustr;
break;
case css::rdf::URIs::XSD_POSITIVEINTEGER:
ns = s_nsXSD;
ln = u"positiveInteger"_ustr;
break;
case css::rdf::URIs::XSD_NONPOSITIVEINTEGER:
ns = s_nsXSD;
ln = u"nonPositiveInteger"_ustr;
break;
case css::rdf::URIs::XSD_NEGATIVEINTEGER:
ns = s_nsXSD;
ln = u"negativeInteger"_ustr;
break;
case css::rdf::URIs::XSD_LONG:
ns = s_nsXSD;
ln = u"long"_ustr;
break;
case css::rdf::URIs::XSD_INT:
ns = s_nsXSD;
ln = u"int"_ustr;
break;
case css::rdf::URIs::XSD_SHORT:
ns = s_nsXSD;
ln = u"short"_ustr;
break;
case css::rdf::URIs::XSD_BYTE:
ns = s_nsXSD;
ln = u"byte"_ustr;
break;
case css::rdf::URIs::XSD_UNSIGNEDLONG:
ns = s_nsXSD;
ln = u"unsignedLong"_ustr;
break;
case css::rdf::URIs::XSD_UNSIGNEDINT:
ns = s_nsXSD;
ln = u"unsignedInt"_ustr;
break;
case css::rdf::URIs::XSD_UNSIGNEDSHORT:
ns = s_nsXSD;
ln = u"unsignedShort"_ustr;
break;
case css::rdf::URIs::XSD_UNSIGNEDBYTE:
ns = s_nsXSD;
ln = u"unsignedByte"_ustr;
break;
case css::rdf::URIs::XSD_HEXBINARY:
ns = s_nsXSD;
ln = u"hexBinary"_ustr;
break;
case css::rdf::URIs::XSD_BASE64BINARY:
ns = s_nsXSD;
ln = u"base64Binary"_ustr;
break;
case css::rdf::URIs::XSD_DATETIME:
ns = s_nsXSD;
ln = u"dateTime"_ustr;
break;
case css::rdf::URIs::XSD_TIME:
ns = s_nsXSD;
ln = u"time"_ustr;
break;
case css::rdf::URIs::XSD_DATE:
ns = s_nsXSD;
ln = u"date"_ustr;
break;
case css::rdf::URIs::XSD_GYEARMONTH:
ns = s_nsXSD;
ln = u"gYearMonth"_ustr;
break;
case css::rdf::URIs::XSD_GYEAR:
ns = s_nsXSD;
ln = u"gYear"_ustr;
break;
case css::rdf::URIs::XSD_GMONTHDAY:
ns = s_nsXSD;
ln = u"gMonthDay"_ustr;
break;
case css::rdf::URIs::XSD_GDAY:
ns = s_nsXSD;
ln = u"gDay"_ustr;
break;
case css::rdf::URIs::XSD_GMONTH:
ns = s_nsXSD;
ln = u"gMonth"_ustr;
break;
case css::rdf::URIs::XSD_ANYURI:
ns = s_nsXSD;
ln = u"anyURI"_ustr;
break;
case css::rdf::URIs::XSD_TOKEN:
ns = s_nsXSD;
ln = u"token"_ustr;
break;
case css::rdf::URIs::XSD_LANGUAGE:
ns = s_nsXSD;
ln = u"language"_ustr;
break;
case css::rdf::URIs::XSD_NMTOKEN:
ns = s_nsXSD;
ln = u"NMTOKEN"_ustr;
break;
case css::rdf::URIs::XSD_NAME:
ns = s_nsXSD;
ln = u"Name"_ustr;
break;
case css::rdf::URIs::XSD_DURATION:
ns = s_nsXSD;
ln = u"duration"_ustr;
break;
case css::rdf::URIs::XSD_QNAME:
ns = s_nsXSD;
ln = u"QName"_ustr;
break;
case css::rdf::URIs::XSD_NOTATION:
ns = s_nsXSD;
ln = u"NOTATION"_ustr;
break;
case css::rdf::URIs::XSD_NMTOKENS:
ns = s_nsXSD;
ln = u"NMTOKENS"_ustr;
break;
case css::rdf::URIs::XSD_ID:
ns = s_nsXSD;
ln = u"ID"_ustr;
break;
case css::rdf::URIs::XSD_IDREF:
ns = s_nsXSD;
ln = u"IDREF"_ustr;
break;
case css::rdf::URIs::XSD_IDREFS:
ns = s_nsXSD;
ln = u"IDREFS"_ustr;
break;
case css::rdf::URIs::XSD_ENTITY:
ns = s_nsXSD;
ln = u"ENTITY"_ustr;
break;
case css::rdf::URIs::XSD_ENTITIES:
ns = s_nsXSD;
ln = u"ENTITIES"_ustr;
break;
case css::rdf::URIs::RDF_TYPE:
ns = s_nsRDF;
ln = u"type"_ustr;
break;
case css::rdf::URIs::RDF_SUBJECT:
ns = s_nsRDF;
ln = u"subject"_ustr;
break;
case css::rdf::URIs::RDF_PREDICATE:
ns = s_nsRDF;
ln = u"predicate"_ustr;
break;
case css::rdf::URIs::RDF_OBJECT:
ns = s_nsRDF;
ln = u"object"_ustr;
break;
case css::rdf::URIs::RDF_PROPERTY:
ns = s_nsRDF;
ln = u"Property"_ustr;
break;
case css::rdf::URIs::RDF_STATEMENT:
ns = s_nsRDF;
ln = u"Statement"_ustr;
break;
case css::rdf::URIs::RDF_VALUE:
ns = s_nsRDF;
ln = u"value"_ustr;
break;
case css::rdf::URIs::RDF_FIRST:
ns = s_nsRDF;
ln = u"first"_ustr;
break;
case css::rdf::URIs::RDF_REST:
ns = s_nsRDF;
ln = u"rest"_ustr;
break;
case css::rdf::URIs::RDF_NIL:
ns = s_nsRDF;
ln = u"nil"_ustr;
break;
case css::rdf::URIs::RDF_XMLLITERAL:
ns = s_nsRDF;
ln = u"XMLLiteral"_ustr;
break;
case css::rdf::URIs::RDF_ALT:
ns = s_nsRDF;
ln = u"Alt"_ustr;
break;
case css::rdf::URIs::RDF_BAG:
ns = s_nsRDF;
ln = u"Bag"_ustr;
break;
case css::rdf::URIs::RDF_LIST:
ns = s_nsRDF;
ln = u"List"_ustr;
break;
case css::rdf::URIs::RDF_SEQ:
ns = s_nsRDF;
ln = u"Seq"_ustr;
break;
case css::rdf::URIs::RDF_1:
ns = s_nsRDF;
ln = u"_1"_ustr;
break;
case css::rdf::URIs::RDFS_COMMENT:
ns = s_nsRDFs;
ln = u"comment"_ustr;
break;
case css::rdf::URIs::RDFS_LABEL:
ns = s_nsRDFs;
ln = u"label"_ustr;
break;
case css::rdf::URIs::RDFS_DOMAIN:
ns = s_nsRDFs;
ln = u"domain"_ustr;
break;
case css::rdf::URIs::RDFS_RANGE:
ns = s_nsRDFs;
ln = u"range"_ustr;
break;
case css::rdf::URIs::RDFS_SUBCLASSOF:
ns = s_nsRDFs;
ln = u"subClassOf"_ustr;
break;
case css::rdf::URIs::RDFS_LITERAL:
ns = s_nsRDFs;
ln = u"Literal"_ustr;
break;
case css::rdf::URIs::OWL_CLASS:
ns = s_nsOWL;
ln = u"Class"_ustr;
break;
case css::rdf::URIs::OWL_OBJECTPROPERTY:
ns = s_nsOWL;
ln = u"ObjectProperty"_ustr;
break;
case css::rdf::URIs::OWL_DATATYPEPROPERTY:
ns = s_nsOWL;
ln = u"DatatypeProperty"_ustr;
break;
case css::rdf::URIs::OWL_FUNCTIONALPROPERTY:
ns = s_nsOWL;
ln = u"FunctionalProperty"_ustr;
break;
case css::rdf::URIs::OWL_THING:
ns = s_nsOWL;
ln = u"Thing"_ustr;
break;
case css::rdf::URIs::OWL_NOTHING:
ns = s_nsOWL;
ln = u"Nothing"_ustr;
break;
case css::rdf::URIs::OWL_INDIVIDUAL:
ns = s_nsOWL;
ln = u"Individual"_ustr;
break;
case css::rdf::URIs::OWL_EQUIVALENTCLASS:
ns = s_nsOWL;
ln = u"equivalentClass"_ustr;
break;
case css::rdf::URIs::OWL_EQUIVALENTPROPERTY:
ns = s_nsOWL;
ln = u"equivalentProperty"_ustr;
break;
case css::rdf::URIs::OWL_SAMEAS:
ns = s_nsOWL;
ln = u"sameAs"_ustr;
break;
case css::rdf::URIs::OWL_DIFFERENTFROM:
ns = s_nsOWL;
ln = u"differentFrom"_ustr;
break;
case css::rdf::URIs::OWL_ALLDIFFERENT:
ns = s_nsOWL;
ln = u"AllDifferent"_ustr;
break;
case css::rdf::URIs::OWL_DISTINCTMEMBERS:
ns = s_nsOWL;
ln = u"distinctMembers"_ustr;
break;
case css::rdf::URIs::OWL_INVERSEOF:
ns = s_nsOWL;
ln = u"inverseOf"_ustr;
break;
case css::rdf::URIs::OWL_TRANSITIVEPROPERTY:
ns = s_nsOWL;
ln = u"TransitiveProperty"_ustr;
break;
case css::rdf::URIs::OWL_SYMMETRICPROPERTY:
ns = s_nsOWL;
ln = u"SymmetricProperty"_ustr;
break;
case css::rdf::URIs::OWL_INVERSEFUNCTIONALPROPERTY:
ns = s_nsOWL;
ln = u"InverseFunctionalProperty"_ustr;
break;
case css::rdf::URIs::OWL_RESTRICTION:
ns = s_nsOWL;
ln = u"Restriction"_ustr;
break;
case css::rdf::URIs::OWL_ONPROPERTY:
ns = s_nsOWL;
ln = u"onProperty"_ustr;
break;
case css::rdf::URIs::OWL_ALLVALUESFROM:
ns = s_nsOWL;
ln = u"allValuesFrom"_ustr;
break;
case css::rdf::URIs::OWL_SOMEVALUESFROM:
ns = s_nsOWL;
ln = u"someValuesFrom"_ustr;
break;
case css::rdf::URIs::OWL_MINCARDINALITY:
ns = s_nsOWL;
ln = u"minCardinality"_ustr;
break;
case css::rdf::URIs::OWL_MAXCARDINALITY:
ns = s_nsOWL;
ln = u"maxCardinality"_ustr;
break;
case css::rdf::URIs::OWL_CARDINALITY:
ns = s_nsOWL;
ln = u"cardinality"_ustr;
break;
case css::rdf::URIs::OWL_ONTOLOGY:
ns = s_nsOWL;
ln = u"Ontology"_ustr;
break;
case css::rdf::URIs::OWL_IMPORTS:
ns = s_nsOWL;
ln = u"imports"_ustr;
break;
case css::rdf::URIs::OWL_VERSIONINFO:
ns = s_nsOWL;
ln = u"versionInfo"_ustr;
break;
case css::rdf::URIs::OWL_PRIORVERSION:
ns = s_nsOWL;
ln = u"priorVersion"_ustr;
break;
case css::rdf::URIs::OWL_BACKWARDCOMPATIBLEWITH:
ns = s_nsOWL;
ln = u"backwardCompatibleWith"_ustr;
break;
case css::rdf::URIs::OWL_INCOMPATIBLEWITH:
ns = s_nsOWL;
ln = u"incompatibleWith"_ustr;
break;
case css::rdf::URIs::OWL_DEPRECATEDCLASS:
ns = s_nsOWL;
ln = u"DeprecatedClass"_ustr;
break;
case css::rdf::URIs::OWL_DEPRECATEDPROPERTY:
ns = s_nsOWL;
ln = u"DeprecatedProperty"_ustr;
break;
case css::rdf::URIs::OWL_ANNOTATIONPROPERTY:
ns = s_nsOWL;
ln = u"AnnotationProperty"_ustr;
break;
case css::rdf::URIs::OWL_ONTOLOGYPROPERTY:
ns = s_nsOWL;
ln = u"OntologyProperty"_ustr;
break;
case css::rdf::URIs::OWL_ONEOF:
ns = s_nsOWL;
ln = u"oneOf"_ustr;
break;
case css::rdf::URIs::OWL_DATARANGE:
ns = s_nsOWL;
ln = u"dataRange"_ustr;
break;
case css::rdf::URIs::OWL_DISJOINTWITH:
ns = s_nsOWL;
ln = u"disjointWith"_ustr;
break;
case css::rdf::URIs::OWL_UNIONOF:
ns = s_nsOWL;
ln = u"unionOf"_ustr;
break;
case css::rdf::URIs::OWL_COMPLEMENTOF:
ns = s_nsOWL;
ln = u"complementOf"_ustr;
break;
case css::rdf::URIs::OWL_INTERSECTIONOF:
ns = s_nsOWL;
ln = u"intersectionOf"_ustr;
break;
case css::rdf::URIs::OWL_HASVALUE:
ns = s_nsOWL;
ln = u"hasValue"_ustr;
break;
case css::rdf::URIs::PKG_HASPART:
ns = s_nsPkg;
ln = u"hasPart"_ustr;
break;
case css::rdf::URIs::PKG_MIMETYPE:
ns = s_nsPkg;
ln = u"mimeType"_ustr;
break;
case css::rdf::URIs::PKG_PACKAGE:
ns = s_nsPkg;
ln = u"Package"_ustr;
break;
case css::rdf::URIs::PKG_ELEMENT:
ns = s_nsPkg;
ln = u"Element"_ustr;
break;
case css::rdf::URIs::PKG_FILE:
ns = s_nsPkg;
ln = u"File"_ustr;
break;
case css::rdf::URIs::PKG_METADATAFILE:
ns = s_nsPkg;
ln = u"MetadataFile"_ustr;
break;
case css::rdf::URIs::PKG_DOCUMENT:
ns = s_nsPkg;
ln = u"Document"_ustr;
break;
case css::rdf::URIs::ODF_PREFIX:
ns = s_nsODF;
ln = u"prefix"_ustr;
break;
case css::rdf::URIs::ODF_SUFFIX:
ns = s_nsODF;
ln = u"suffix"_ustr;
break;
case css::rdf::URIs::ODF_ELEMENT:
ns = s_nsODF;
ln = u"Element"_ustr;
break;
case css::rdf::URIs::ODF_CONTENTFILE:
ns = s_nsODF;
ln = u"ContentFile"_ustr;
break;
case css::rdf::URIs::ODF_STYLESFILE:
ns = s_nsODF;
ln = u"StylesFile"_ustr;
break;
case css::rdf::URIs::LO_EXT_SHADING:
ns = s_nsLO_EXT;
ln = u"shading"_ustr;
break;
default:
throw css::lang::IllegalArgumentException(
u"CURI::initialize: invalid URIs constant argument"_ustr, *this, 0);
}
m_Namespace = ns;
m_LocalName = ln;
}
// css::lang::XInitialization:
void SAL_CALL CURI::initialize(const css::uno::Sequence< css::uno::Any > & aArguments)
{
sal_Int32 len = aArguments.getLength();
if ((len < 1) || (len > 2)) {
throw css::lang::IllegalArgumentException(
u"CURI::initialize: must give 1 or 2 argument(s)"_ustr, *this, 2);
}
sal_Int16 arg(0);
OUString arg0;
OUString arg1;
if (aArguments[0] >>= arg) {
// integer argument: constant from rdf::URIs
if (len != 1) {
throw css::lang::IllegalArgumentException(
u"CURI::initialize: must give 1 int argument"_ustr, *this, 1);
}
initFromConstant(arg);
return;
}
if (!(aArguments[0] >>= arg0)) {
throw css::lang::IllegalArgumentException(
u"CURI::initialize: argument must be string or short"_ustr, *this, 0);
}
if (len > 1) {
if (!(aArguments[1] >>= arg1)) {
throw css::lang::IllegalArgumentException(
u"CURI::initialize: argument must be string"_ustr, *this, 1);
}
// just append the parameters and then split them again; seems simplest
arg0 = arg0 + arg1;
arg1.clear();
}
// split parameter
sal_Int32 idx = arg0.indexOf('#');
if (idx < 0)
idx = arg0.lastIndexOf('/');
if (idx < 0)
idx = arg0.lastIndexOf(':');
if (idx < 0)
{
throw css::lang::IllegalArgumentException(
u"CURI::initialize: argument not splittable: no separator [#/:]"_ustr, *this, 0);
}
if (idx < arg0.getLength() - 1) {
arg1 = arg0.copy(idx+1);
arg0 = arg0.copy(0, idx+1);
}
//FIXME: what is legal?
if (arg0.isEmpty()) {
throw css::lang::IllegalArgumentException(
u"CURI::initialize: argument is not valid namespace"_ustr, *this, 0);
}
m_Namespace = arg0;
//FIXME: what is legal?
if ((false)) {
throw css::lang::IllegalArgumentException(
u"CURI::initialize: argument is not valid local name"_ustr, *this, 1);
}
m_LocalName = arg1;
}
// css::rdf::XNode:
OUString SAL_CALL CURI::getStringValue()
{
return m_Namespace + m_LocalName;
}
// css::rdf::XURI:
OUString SAL_CALL CURI::getNamespace()
{
return m_Namespace;
}
OUString SAL_CALL CURI::getLocalName()
{
return m_LocalName;
}
} // closing anonymous implementation namespace
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
unoxml_CURI_get_implementation(
css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const&)
{
return cppu::acquire(new CURI());
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */