blob: 237639423c63f3fc3e2ddb78b0c1d1fc65ae03ed [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "CNodes.hxx"
#include <cppuhelper/implbase3.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/lang/IllegalArgumentException.hpp>
/// anonymous implementation namespace
namespace {
namespace css = ::com::sun::star;
class CURI:
public ::cppu::WeakImplHelper3<
css::lang::XServiceInfo,
css::lang::XInitialization,
css::rdf::XURI>
{
public:
explicit CURI(css::uno::Reference< css::uno::XComponentContext > const & context);
virtual ~CURI() {}
// ::com::sun::star::lang::XServiceInfo:
virtual ::rtl::OUString SAL_CALL getImplementationName() throw (css::uno::RuntimeException);
virtual ::sal_Bool SAL_CALL supportsService(const ::rtl::OUString & ServiceName) throw (css::uno::RuntimeException);
virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw (css::uno::RuntimeException);
// ::com::sun::star::lang::XInitialization:
virtual void SAL_CALL initialize(const css::uno::Sequence< ::com::sun::star::uno::Any > & aArguments) throw (css::uno::RuntimeException, css::uno::Exception);
// ::com::sun::star::rdf::XNode:
virtual ::rtl::OUString SAL_CALL getStringValue() throw (css::uno::RuntimeException);
// ::com::sun::star::rdf::XURI:
virtual ::rtl::OUString SAL_CALL getLocalName() throw (css::uno::RuntimeException);
virtual ::rtl::OUString SAL_CALL getNamespace() throw (css::uno::RuntimeException);
private:
CURI(const CURI &); // not defined
CURI& operator=(const CURI &); // not defined
/// handle css.rdf.URIs
void SAL_CALL initFromConstant(const sal_Int16 i_Constant);
css::uno::Reference< css::uno::XComponentContext > m_xContext;
::rtl::OUString m_Namespace;
::rtl::OUString m_LocalName;
};
CURI::CURI(css::uno::Reference< css::uno::XComponentContext > const & context) :
m_xContext(context), m_Namespace(), m_LocalName()
{}
// com.sun.star.uno.XServiceInfo:
::rtl::OUString SAL_CALL CURI::getImplementationName() throw (css::uno::RuntimeException)
{
return comp_CURI::_getImplementationName();
}
::sal_Bool SAL_CALL CURI::supportsService(::rtl::OUString const & serviceName) throw (css::uno::RuntimeException)
{
css::uno::Sequence< ::rtl::OUString > serviceNames = comp_CURI::_getSupportedServiceNames();
for (::sal_Int32 i = 0; i < serviceNames.getLength(); ++i) {
if (serviceNames[i] == serviceName)
return sal_True;
}
return sal_False;
}
css::uno::Sequence< ::rtl::OUString > SAL_CALL CURI::getSupportedServiceNames() throw (css::uno::RuntimeException)
{
return comp_CURI::_getSupportedServiceNames();
}
const char s_nsXS [] = "http://www.w3.org/2001/XMLSchema#";
const char s_nsXSD [] = "http://www.w3.org/2001/XMLSchema-datatypes#";
const char s_nsRDF [] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
const char s_nsRDFs [] = "http://www.w3.org/2000/01/rdf-schema#";
const char s_nsOWL [] = "http://www.w3.org/2002/07/owl#";
const char s_nsPkg [] =
"http://docs.oasis-open.org/ns/office/1.2/meta/pkg#";
const char s_nsODF [] =
"http://docs.oasis-open.org/ns/office/1.2/meta/odf#";
void SAL_CALL CURI::initFromConstant(const sal_Int16 i_Constant)
{
const char *ns(0);
const char *ln(0);
switch (i_Constant)
{
case css::rdf::URIs::XSD_NCNAME:
ns = s_nsXSD;
ln = "NCName";
break;
case css::rdf::URIs::XSD_STRING:
ns = s_nsXSD;
ln = "string";
break;
case css::rdf::URIs::XSD_NORMALIZEDSTRING:
ns = s_nsXSD;
ln = "normalizedString";
break;
case css::rdf::URIs::XSD_BOOLEAN:
ns = s_nsXSD;
ln = "boolean";
break;
case css::rdf::URIs::XSD_DECIMAL:
ns = s_nsXSD;
ln = "decimal";
break;
case css::rdf::URIs::XSD_FLOAT:
ns = s_nsXSD;
ln = "float";
break;
case css::rdf::URIs::XSD_DOUBLE:
ns = s_nsXSD;
ln = "double";
break;
case css::rdf::URIs::XSD_INTEGER:
ns = s_nsXSD;
ln = "integer";
break;
case css::rdf::URIs::XSD_NONNEGATIVEINTEGER:
ns = s_nsXSD;
ln = "nonNegativeInteger";
break;
case css::rdf::URIs::XSD_POSITIVEINTEGER:
ns = s_nsXSD;
ln = "positiveInteger";
break;
case css::rdf::URIs::XSD_NONPOSITIVEINTEGER:
ns = s_nsXSD;
ln = "nonPositiveInteger";
break;
case css::rdf::URIs::XSD_NEGATIVEINTEGER:
ns = s_nsXSD;
ln = "negativeInteger";
break;
case css::rdf::URIs::XSD_LONG:
ns = s_nsXSD;
ln = "long";
break;
case css::rdf::URIs::XSD_INT:
ns = s_nsXSD;
ln = "int";
break;
case css::rdf::URIs::XSD_SHORT:
ns = s_nsXSD;
ln = "short";
break;
case css::rdf::URIs::XSD_BYTE:
ns = s_nsXSD;
ln = "byte";
break;
case css::rdf::URIs::XSD_UNSIGNEDLONG:
ns = s_nsXSD;
ln = "unsignedLong";
break;
case css::rdf::URIs::XSD_UNSIGNEDINT:
ns = s_nsXSD;
ln = "unsignedInt";
break;
case css::rdf::URIs::XSD_UNSIGNEDSHORT:
ns = s_nsXSD;
ln = "unsignedShort";
break;
case css::rdf::URIs::XSD_UNSIGNEDBYTE:
ns = s_nsXSD;
ln = "unsignedByte";
break;
case css::rdf::URIs::XSD_HEXBINARY:
ns = s_nsXSD;
ln = "hexBinary";
break;
case css::rdf::URIs::XSD_BASE64BINARY:
ns = s_nsXSD;
ln = "base64Binary";
break;
case css::rdf::URIs::XSD_DATETIME:
ns = s_nsXSD;
ln = "dateTime";
break;
case css::rdf::URIs::XSD_TIME:
ns = s_nsXSD;
ln = "time";
break;
case css::rdf::URIs::XSD_DATE:
ns = s_nsXSD;
ln = "date";
break;
case css::rdf::URIs::XSD_GYEARMONTH:
ns = s_nsXSD;
ln = "gYearMonth";
break;
case css::rdf::URIs::XSD_GYEAR:
ns = s_nsXSD;
ln = "gYear";
break;
case css::rdf::URIs::XSD_GMONTHDAY:
ns = s_nsXSD;
ln = "gMonthDay";
break;
case css::rdf::URIs::XSD_GDAY:
ns = s_nsXSD;
ln = "gDay";
break;
case css::rdf::URIs::XSD_GMONTH:
ns = s_nsXSD;
ln = "gMonth";
break;
case css::rdf::URIs::XSD_ANYURI:
ns = s_nsXSD;
ln = "anyURI";
break;
case css::rdf::URIs::XSD_TOKEN:
ns = s_nsXSD;
ln = "token";
break;
case css::rdf::URIs::XSD_LANGUAGE:
ns = s_nsXSD;
ln = "language";
break;
case css::rdf::URIs::XSD_NMTOKEN:
ns = s_nsXSD;
ln = "NMTOKEN";
break;
case css::rdf::URIs::XSD_NAME:
ns = s_nsXSD;
ln = "Name";
break;
case css::rdf::URIs::XSD_DURATION:
ns = s_nsXSD;
ln = "duration";
break;
case css::rdf::URIs::XSD_QNAME:
ns = s_nsXSD;
ln = "QName";
break;
case css::rdf::URIs::XSD_NOTATION:
ns = s_nsXSD;
ln = "NOTATION";
break;
case css::rdf::URIs::XSD_NMTOKENS:
ns = s_nsXSD;
ln = "NMTOKENS";
break;
case css::rdf::URIs::XSD_ID:
ns = s_nsXSD;
ln = "ID";
break;
case css::rdf::URIs::XSD_IDREF:
ns = s_nsXSD;
ln = "IDREF";
break;
case css::rdf::URIs::XSD_IDREFS:
ns = s_nsXSD;
ln = "IDREFS";
break;
case css::rdf::URIs::XSD_ENTITY:
ns = s_nsXSD;
ln = "ENTITY";
break;
case css::rdf::URIs::XSD_ENTITIES:
ns = s_nsXSD;
ln = "ENTITIES";
break;
case css::rdf::URIs::RDF_TYPE:
ns = s_nsRDF;
ln = "type";
break;
case css::rdf::URIs::RDF_SUBJECT:
ns = s_nsRDF;
ln = "subject";
break;
case css::rdf::URIs::RDF_PREDICATE:
ns = s_nsRDF;
ln = "predicate";
break;
case css::rdf::URIs::RDF_OBJECT:
ns = s_nsRDF;
ln = "object";
break;
case css::rdf::URIs::RDF_PROPERTY:
ns = s_nsRDF;
ln = "Property";
break;
case css::rdf::URIs::RDF_STATEMENT:
ns = s_nsRDF;
ln = "Statement";
break;
case css::rdf::URIs::RDF_VALUE:
ns = s_nsRDF;
ln = "value";
break;
case css::rdf::URIs::RDF_FIRST:
ns = s_nsRDF;
ln = "first";
break;
case css::rdf::URIs::RDF_REST:
ns = s_nsRDF;
ln = "rest";
break;
case css::rdf::URIs::RDF_NIL:
ns = s_nsRDF;
ln = "nil";
break;
case css::rdf::URIs::RDF_XMLLITERAL:
ns = s_nsRDF;
ln = "XMLLiteral";
break;
case css::rdf::URIs::RDF_ALT:
ns = s_nsRDF;
ln = "Alt";
break;
case css::rdf::URIs::RDF_BAG:
ns = s_nsRDF;
ln = "Bag";
break;
case css::rdf::URIs::RDF_LIST:
ns = s_nsRDF;
ln = "List";
break;
case css::rdf::URIs::RDF_SEQ:
ns = s_nsRDF;
ln = "Seq";
break;
case css::rdf::URIs::RDF_1:
ns = s_nsRDF;
ln = "_1";
break;
case css::rdf::URIs::RDFS_COMMENT:
ns = s_nsRDFs;
ln = "comment";
break;
case css::rdf::URIs::RDFS_LABEL:
ns = s_nsRDFs;
ln = "label";
break;
case css::rdf::URIs::RDFS_DOMAIN:
ns = s_nsRDFs;
ln = "domain";
break;
case css::rdf::URIs::RDFS_RANGE:
ns = s_nsRDFs;
ln = "range";
break;
case css::rdf::URIs::RDFS_SUBCLASSOF:
ns = s_nsRDFs;
ln = "subClassOf";
break;
case css::rdf::URIs::RDFS_LITERAL:
ns = s_nsRDFs;
ln = "Literal";
break;
case css::rdf::URIs::OWL_CLASS:
ns = s_nsOWL;
ln = "Class";
break;
case css::rdf::URIs::OWL_OBJECTPROPERTY:
ns = s_nsOWL;
ln = "ObjectProperty";
break;
case css::rdf::URIs::OWL_DATATYPEPROPERTY:
ns = s_nsOWL;
ln = "DatatypeProperty";
break;
case css::rdf::URIs::OWL_FUNCTIONALPROPERTY:
ns = s_nsOWL;
ln = "FunctionalProperty";
break;
case css::rdf::URIs::OWL_THING:
ns = s_nsOWL;
ln = "Thing";
break;
case css::rdf::URIs::OWL_NOTHING:
ns = s_nsOWL;
ln = "Nothing";
break;
case css::rdf::URIs::OWL_INDIVIDUAL:
ns = s_nsOWL;
ln = "Individual";
break;
case css::rdf::URIs::OWL_EQUIVALENTCLASS:
ns = s_nsOWL;
ln = "equivalentClass";
break;
case css::rdf::URIs::OWL_EQUIVALENTPROPERTY:
ns = s_nsOWL;
ln = "equivalentProperty";
break;
case css::rdf::URIs::OWL_SAMEAS:
ns = s_nsOWL;
ln = "sameAs";
break;
case css::rdf::URIs::OWL_DIFFERENTFROM:
ns = s_nsOWL;
ln = "differentFrom";
break;
case css::rdf::URIs::OWL_ALLDIFFERENT:
ns = s_nsOWL;
ln = "AllDifferent";
break;
case css::rdf::URIs::OWL_DISTINCTMEMBERS:
ns = s_nsOWL;
ln = "distinctMembers";
break;
case css::rdf::URIs::OWL_INVERSEOF:
ns = s_nsOWL;
ln = "inverseOf";
break;
case css::rdf::URIs::OWL_TRANSITIVEPROPERTY:
ns = s_nsOWL;
ln = "TransitiveProperty";
break;
case css::rdf::URIs::OWL_SYMMETRICPROPERTY:
ns = s_nsOWL;
ln = "SymmetricProperty";
break;
case css::rdf::URIs::OWL_INVERSEFUNCTIONALPROPERTY:
ns = s_nsOWL;
ln = "InverseFunctionalProperty";
break;
case css::rdf::URIs::OWL_RESTRICTION:
ns = s_nsOWL;
ln = "Restriction";
break;
case css::rdf::URIs::OWL_ONPROPERTY:
ns = s_nsOWL;
ln = "onProperty";
break;
case css::rdf::URIs::OWL_ALLVALUESFROM:
ns = s_nsOWL;
ln = "allValuesFrom";
break;
case css::rdf::URIs::OWL_SOMEVALUESFROM:
ns = s_nsOWL;
ln = "someValuesFrom";
break;
case css::rdf::URIs::OWL_MINCARDINALITY:
ns = s_nsOWL;
ln = "minCardinality";
break;
case css::rdf::URIs::OWL_MAXCARDINALITY:
ns = s_nsOWL;
ln = "maxCardinality";
break;
case css::rdf::URIs::OWL_CARDINALITY:
ns = s_nsOWL;
ln = "cardinality";
break;
case css::rdf::URIs::OWL_ONTOLOGY:
ns = s_nsOWL;
ln = "Ontology";
break;
case css::rdf::URIs::OWL_IMPORTS:
ns = s_nsOWL;
ln = "imports";
break;
case css::rdf::URIs::OWL_VERSIONINFO:
ns = s_nsOWL;
ln = "versionInfo";
break;
case css::rdf::URIs::OWL_PRIORVERSION:
ns = s_nsOWL;
ln = "priorVersion";
break;
case css::rdf::URIs::OWL_BACKWARDCOMPATIBLEWITH:
ns = s_nsOWL;
ln = "backwardCompatibleWith";
break;
case css::rdf::URIs::OWL_INCOMPATIBLEWITH:
ns = s_nsOWL;
ln = "incompatibleWith";
break;
case css::rdf::URIs::OWL_DEPRECATEDCLASS:
ns = s_nsOWL;
ln = "DeprecatedClass";
break;
case css::rdf::URIs::OWL_DEPRECATEDPROPERTY:
ns = s_nsOWL;
ln = "DeprecatedProperty";
break;
case css::rdf::URIs::OWL_ANNOTATIONPROPERTY:
ns = s_nsOWL;
ln = "AnnotationProperty";
break;
case css::rdf::URIs::OWL_ONTOLOGYPROPERTY:
ns = s_nsOWL;
ln = "OntologyProperty";
break;
case css::rdf::URIs::OWL_ONEOF:
ns = s_nsOWL;
ln = "oneOf";
break;
case css::rdf::URIs::OWL_DATARANGE:
ns = s_nsOWL;
ln = "dataRange";
break;
case css::rdf::URIs::OWL_DISJOINTWITH:
ns = s_nsOWL;
ln = "disjointWith";
break;
case css::rdf::URIs::OWL_UNIONOF:
ns = s_nsOWL;
ln = "unionOf";
break;
case css::rdf::URIs::OWL_COMPLEMENTOF:
ns = s_nsOWL;
ln = "complementOf";
break;
case css::rdf::URIs::OWL_INTERSECTIONOF:
ns = s_nsOWL;
ln = "intersectionOf";
break;
case css::rdf::URIs::OWL_HASVALUE:
ns = s_nsOWL;
ln = "hasValue";
break;
case css::rdf::URIs::PKG_HASPART:
ns = s_nsPkg;
ln = "hasPart";
break;
/* REMOVED
case css::rdf::URIs::PKG_IDREF:
ns = s_nsPkg;
ln = "idref";
break;
case css::rdf::URIs::PKG_PATH:
ns = s_nsPkg;
ln = "path";
break;
*/
case css::rdf::URIs::PKG_MIMETYPE:
ns = s_nsPkg;
ln = "mimeType";
break;
case css::rdf::URIs::PKG_PACKAGE:
ns = s_nsPkg;
ln = "Package";
break;
case css::rdf::URIs::PKG_ELEMENT:
ns = s_nsPkg;
ln = "Element";
break;
case css::rdf::URIs::PKG_FILE:
ns = s_nsPkg;
ln = "File";
break;
case css::rdf::URIs::PKG_METADATAFILE:
ns = s_nsPkg;
ln = "MetadataFile";
break;
case css::rdf::URIs::PKG_DOCUMENT:
ns = s_nsPkg;
ln = "Document";
break;
case css::rdf::URIs::ODF_PREFIX:
ns = s_nsODF;
ln = "prefix";
break;
case css::rdf::URIs::ODF_SUFFIX:
ns = s_nsODF;
ln = "suffix";
break;
case css::rdf::URIs::ODF_ELEMENT:
ns = s_nsODF;
ln = "Element";
break;
case css::rdf::URIs::ODF_CONTENTFILE:
ns = s_nsODF;
ln = "ContentFile";
break;
case css::rdf::URIs::ODF_STYLESFILE:
ns = s_nsODF;
ln = "StylesFile";
break;
/* REMOVED
case css::rdf::URIs::ODF_METADATAFILE:
ns = s_nsODF;
ln = "MetadataFile";
break;
*/
default:
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"invalid URIs constant argument"), *this, 0);
}
m_Namespace = ::rtl::OUString::createFromAscii(ns).intern();
m_LocalName = ::rtl::OUString::createFromAscii(ln).intern();
return;
}
// ::com::sun::star::lang::XInitialization:
void SAL_CALL CURI::initialize(const css::uno::Sequence< ::com::sun::star::uno::Any > & aArguments) throw (css::uno::RuntimeException, css::uno::Exception)
{
sal_Int32 len = aArguments.getLength();
if ((len < 1) || (len > 2)) {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"must give 1 or 2 argument(s)"), *this, 2);
}
sal_Int16 arg(0);
::rtl::OUString arg0;
::rtl::OUString arg1;
if ((aArguments[0] >>= arg)) {
// integer argument: constant from rdf::URIs
if (len != 1) {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"must give 1 int argument"), *this, 1);
}
initFromConstant(arg);
return;
}
if (!(aArguments[0] >>= arg0)) {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"argument must be string or short"), *this, 0);
}
if (len > 1) {
if (!(aArguments[1] >>= arg1)) {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"argument must be string"), *this, 1);
}
// just append the parameters and then split them again; seems simplest
arg0 = arg0 + arg1;
arg1 = ::rtl::OUString();
}
// split parameter
sal_Int32 idx;
if ( ((idx = arg0.indexOf ('#')) >= 0)
|| ((idx = arg0.lastIndexOf('/')) >= 0)
|| ((idx = arg0.lastIndexOf(':')) >= 0))
{
if (idx < arg0.getLength() - 1) {
arg1 = arg0.copy(idx+1);
arg0 = arg0.copy(0, idx+1);
}
} else {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"argument not splittable: no separator [#/:]"), *this, 0);
}
//FIXME: what is legal?
if (arg0.getLength() > 0) {
m_Namespace = arg0;
} else {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"argument is not valid namespace"), *this, 0);
}
//FIXME: what is legal?
if (true) {
m_LocalName = arg1;
} else {
throw css::lang::IllegalArgumentException(
::rtl::OUString::createFromAscii("CURI::initialize: "
"argument is not valid local name"), *this, 1);
}
}
// ::com::sun::star::rdf::XNode:
::rtl::OUString SAL_CALL CURI::getStringValue() throw (css::uno::RuntimeException)
{
return m_Namespace + m_LocalName;
}
// ::com::sun::star::rdf::XURI:
::rtl::OUString SAL_CALL CURI::getNamespace() throw (css::uno::RuntimeException)
{
return m_Namespace;
}
::rtl::OUString SAL_CALL CURI::getLocalName() throw (css::uno::RuntimeException)
{
return m_LocalName;
}
} // closing anonymous implementation namespace
// component helper namespace
namespace comp_CURI {
::rtl::OUString SAL_CALL _getImplementationName() {
return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
"CURI"));
}
css::uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames()
{
css::uno::Sequence< ::rtl::OUString > s(1);
s[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.rdf.URI"));
return s;
}
css::uno::Reference< css::uno::XInterface > SAL_CALL _create(
const css::uno::Reference< css::uno::XComponentContext > & context)
SAL_THROW((css::uno::Exception))
{
return static_cast< ::cppu::OWeakObject * >(new CURI(context));
}
} // closing component helper namespace