sfx2/JunitTest_sfx2_complex.mk | 2 sfx2/qa/complex/sfx2/DocumentMetadataAccess.java | 934 ----------------------- unoxml/qa/unit/data/CUSTOM.odt |binary unoxml/qa/unit/data/TEST.odt |binary unoxml/qa/unit/rdftest.cxx | 619 +++++++++++++++ 5 files changed, 613 insertions(+), 942 deletions(-)
New commits: commit 3624a60fff9570815d64ceb03cccc01a01f892ab Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Sep 19 13:36:21 2024 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Sat Sep 21 09:44:05 2024 +0200 sfx2: move rdf java test to CppUnittest Change-Id: Id66b752fdcf23546416b3b7f99e2f61756c3a76d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173664 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Tested-by: Jenkins diff --git a/sfx2/JunitTest_sfx2_complex.mk b/sfx2/JunitTest_sfx2_complex.mk index ac9cb60a42ea..504d37e75e6f 100644 --- a/sfx2/JunitTest_sfx2_complex.mk +++ b/sfx2/JunitTest_sfx2_complex.mk @@ -31,7 +31,6 @@ $(eval $(call gb_JunitTest_use_jars,sfx2_complex,\ )) $(eval $(call gb_JunitTest_add_sourcefiles,sfx2_complex,\ - sfx2/qa/complex/sfx2/DocumentMetadataAccess \ sfx2/qa/complex/sfx2/DocumentProperties \ sfx2/qa/complex/sfx2/GlobalEventBroadcaster \ sfx2/qa/complex/sfx2/UndoManager \ @@ -50,7 +49,6 @@ $(eval $(call gb_JunitTest_add_sourcefiles,sfx2_complex,\ $(eval $(call gb_JunitTest_add_classes,sfx2_complex,\ complex.sfx2.DocumentProperties \ - complex.sfx2.DocumentMetadataAccess \ complex.sfx2.DocumentEvents \ complex.sfx2.UndoManager \ )) diff --git a/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java deleted file mode 100644 index 2604b9562b67..000000000000 --- a/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java +++ /dev/null @@ -1,934 +0,0 @@ -/* - * 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 . - */ - -package complex.sfx2; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import helper.StreamSimulator; - -import lib.TestParameters; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.openoffice.test.OfficeConnection; - -import com.sun.star.beans.Pair; -import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.StringPair; -import com.sun.star.beans.XPropertySet; -import com.sun.star.container.XEnumeration; -import com.sun.star.container.XEnumerationAccess; -import com.sun.star.frame.XStorable; -import com.sun.star.io.XInputStream; -import com.sun.star.lang.IllegalArgumentException; -import com.sun.star.lang.XComponent; -import com.sun.star.lang.XMultiServiceFactory; -import com.sun.star.lang.XServiceInfo; -import com.sun.star.rdf.BlankNode; -import com.sun.star.rdf.FileFormat; -import com.sun.star.rdf.Literal; -import com.sun.star.rdf.Statement; -import com.sun.star.rdf.URI; -import com.sun.star.rdf.URIs; -import com.sun.star.rdf.XBlankNode; -import com.sun.star.rdf.XDocumentMetadataAccess; -import com.sun.star.rdf.XDocumentRepository; -import com.sun.star.rdf.XLiteral; -import com.sun.star.rdf.XMetadatable; -import com.sun.star.rdf.XNamedGraph; -import com.sun.star.rdf.XNode; -import com.sun.star.rdf.XQuerySelectResult; -import com.sun.star.rdf.XRepository; -import com.sun.star.rdf.XRepositorySupplier; -import com.sun.star.rdf.XURI; -import com.sun.star.text.XText; -import com.sun.star.text.XTextDocument; -import com.sun.star.text.XTextRange; -import com.sun.star.uno.UnoRuntime; -import com.sun.star.uno.XComponentContext; -import com.sun.star.util.XCloseable; -import complex.sfx2.tools.TestDocument; - -/** - * Test case for interface com.sun.star.rdf.XDocumentMetadataAccess - * Currently, this service is implemented in - * sfx2/source/doc/DocumentMetadataAccess.cxx - * - * Actually, this is not a service, so we need to create a document and - * go from there... - * - */ -public class DocumentMetadataAccess -{ - XMultiServiceFactory xMSF; - XComponentContext xContext; - String tempDir; - - String nsRDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - String nsRDFS = "http://www.w3.org/2000/01/rdf-schema#"; - String nsPkg="http://docs.oasis-open.org/opendocument/meta/package/common#"; - String nsODF ="http://docs.oasis-open.org/opendocument/meta/package/odf#"; - - XURI foo; - XURI bar; - - static XURI rdf_type; - static XURI rdfs_label; - static XURI pkg_Document; - static XURI pkg_hasPart; - static XURI pkg_MetadataFile; - static XURI odf_ContentFile; - static XURI odf_StylesFile; - static String manifestPath = "manifest.rdf"; - static String contentPath = "content.xml"; - static String stylesPath = "styles.xml"; - static String fooPath = "foo.rdf"; - static String fooBarPath = "meta/foo/bar.rdf"; - - XRepository xRep; - XRepositorySupplier xRS; - XDocumentMetadataAccess xDMA; - - /** - * The test parameters - */ - private static TestParameters param = null; - - @Before public void before() throws Exception - { - xMSF = getMSF(); - param = new TestParameters(); - param.put("ServiceFactory", xMSF); // important for param.getMSF() - - assertNotNull("could not create MultiServiceFactory.", xMSF); - XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xMSF); - Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext"); - xContext = UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); - assertNotNull("could not get component context.", xContext); - - tempDir = util.utils.getOfficeTemp/*Dir*/(xMSF); - System.out.println("tempdir: " + tempDir); - - foo = URI.create(xContext, "uri:foo"); - assertNotNull("foo", foo); - bar = URI.create(xContext, "uri:bar"); - assertNotNull("bar", bar); - - rdf_type = URI.createKnown(xContext, URIs.RDF_TYPE); - assertNotNull("rdf_type", rdf_type); - rdfs_label = URI.createKnown(xContext, URIs.RDFS_LABEL); - assertNotNull("rdfs_label", rdfs_label); - pkg_Document = URI.createKnown(xContext, URIs.PKG_DOCUMENT); - assertNotNull("pkg_Document", pkg_Document); - pkg_hasPart = URI.createKnown(xContext, URIs.PKG_HASPART); - assertNotNull("pkg_hasPart", pkg_hasPart); - pkg_MetadataFile = URI.createKnown(xContext, URIs.PKG_METADATAFILE); - assertNotNull("pkg_MetadataFile", pkg_MetadataFile); - odf_ContentFile = URI.createKnown(xContext, URIs.ODF_CONTENTFILE); - assertNotNull("odf_ContentFile", odf_ContentFile); - odf_StylesFile = URI.createKnown(xContext, URIs.ODF_STYLESFILE); - assertNotNull("odf_StylesFile", odf_StylesFile); - } - - @After public void after() - { - xRep = null; - xRS = null; - xDMA = null; - } - - @Test public void check() throws Exception - { - XComponent xComp = null; - XComponent xComp2 = null; - try { - XEnumeration xStmtsEnum; - XNamedGraph xManifest; - - System.out.println("Creating document with Repository..."); - - // we cannot create a XDMA directly, we must create - // a document and get it from there :( - // create document - PropertyValue[] loadProps = new PropertyValue[1]; - loadProps[0] = new PropertyValue(); - loadProps[0].Name = "Hidden"; - loadProps[0].Value = true; - xComp = util.DesktopTools.openNewDoc(xMSF, "swriter", loadProps); - XTextDocument xText = UnoRuntime.queryInterface(XTextDocument.class, xComp); - - XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assertNotNull("xRS null", xRepoSupplier); - XDocumentMetadataAccess xDocMDAccess = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRepoSupplier); - assertNotNull("xDMA null", xDocMDAccess); - xRep = xRepoSupplier.getRDFRepository(); - assertNotNull("xRep null", xRep); - - System.out.println("...done"); - - System.out.println("Checking that new repository is initialized..."); - - XURI xBaseURI = xDocMDAccess; - String baseURI = xBaseURI.getStringValue(); - assertNotNull("new: baseURI", xBaseURI ); - assertTrue("new: baseURI", !xBaseURI.getStringValue().equals("")); - - assertTrue("new: # graphs", 1 == xRep.getGraphNames().length); - XURI manifest = URI.createNS(xContext, xBaseURI.getStringValue(), - manifestPath); - xManifest = xRep.getGraph(manifest); - assertTrue("new: manifest graph", null != xManifest); - - Statement[] manifestStmts = getManifestStmts(xBaseURI); - xStmtsEnum = xRep.getStatements(null, null, null); - assertTrue("new: manifest graph", eq(xStmtsEnum, manifestStmts)); - - System.out.println("...done"); - - System.out.println("Checking some invalid args..."); - - String content = "behold, for I am the content."; - new TestRange(content); - - try { - xDocMDAccess.getElementByURI(null); - fail("getElementByURI: null allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.getMetadataGraphsWithType(null); - fail("getMetadataGraphsWithType: null URI allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("", new XURI[0]); - fail("addMetadataFile: empty filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("/foo", new XURI[0]); - fail("addMetadataFile: absolute filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("fo\"o", new XURI[0]); - fail("addMetadataFile: invalid filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("../foo", new XURI[0]); - fail("addMetadataFile: filename with .. allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("foo/../../bar", new XURI[0]); - fail("addMetadataFile: filename with nest .. allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("foo/././bar", new XURI[0]); - fail("addMetadataFile: filename with nest . allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("content.xml", new XURI[0]); - fail("addMetadataFile: content.xml allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("styles.xml", new XURI[0]); - fail("addMetadataFile: styles.xml allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("meta.xml", new XURI[0]); - fail("addMetadataFile: meta.xml allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addMetadataFile("settings.xml", new XURI[0]); - fail("addMetadataFile: settings.xml allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, null, "foo", - foo, new XURI[0]); - fail("importMetadataFile: null stream allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - - final String sEmptyRDF = TestDocument.getUrl("empty.rdf"); - try { - XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", - foo, new XURI[0]); - fail("importMetadataFile: empty filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - XInputStream xFooIn = - new StreamSimulator(sEmptyRDF, true, param); - xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", - foo, new XURI[0]); - fail("importMetadataFile: meta.xml filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - XInputStream xFooIn = - new StreamSimulator(sEmptyRDF, true, param); - xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, - xFooIn, "foo", null, new XURI[0]); - fail("importMetadataFile: null base URI allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - XInputStream xFooIn = - new StreamSimulator(sEmptyRDF, true, param); - xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, - xFooIn, "foo", rdf_type, new XURI[0]); - fail("importMetadataFile: non-absolute base URI allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.removeMetadataFile(null); - fail("removeMetadataFile: null URI allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addContentOrStylesFile(""); - fail("addContentOrStylesFile: empty filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addContentOrStylesFile("/content.xml"); - fail("addContentOrStylesFile: absolute filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.addContentOrStylesFile("foo.rdf"); - fail("addContentOrStylesFile: invalid filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.removeContentOrStylesFile(""); - fail("removeContentOrStylesFile: empty filename allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.loadMetadataFromStorage(null, foo, null); - fail("loadMetadataFromStorage: null storage allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.storeMetadataToStorage(null/*, base*/); - fail("storeMetadataToStorage: null storage allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.loadMetadataFromMedium(new PropertyValue[0]); - fail("loadMetadataFromMedium: empty medium allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - try { - xDocMDAccess.storeMetadataToMedium(new PropertyValue[0]); - fail("storeMetadataToMedium: empty medium allowed"); - } catch (IllegalArgumentException e) { - // ignore - } - - System.out.println("...done"); - - System.out.println("Checking file addition/removal..."); - - xDocMDAccess.removeContentOrStylesFile(contentPath); - xStmtsEnum = xManifest.getStatements(null, null, null); - assertTrue("removeContentOrStylesFile (content)", - eq(xStmtsEnum, new Statement[] { - manifestStmts[0], manifestStmts[2], manifestStmts[4] - })); - - xDocMDAccess.addContentOrStylesFile(contentPath); - xStmtsEnum = xManifest.getStatements(null, null, null); - assertTrue("addContentOrStylesFile (content)", - eq(xStmtsEnum, manifestStmts)); - - xDocMDAccess.removeContentOrStylesFile(stylesPath); - xStmtsEnum = xManifest.getStatements(null, null, null); - assertTrue("removeContentOrStylesFile (styles)", - eq(xStmtsEnum, new Statement[] { - manifestStmts[0], manifestStmts[1], manifestStmts[3] - })); - - xDocMDAccess.addContentOrStylesFile(stylesPath); - xStmtsEnum = xManifest.getStatements(null, null, null); - assertTrue("addContentOrStylesFile (styles)", - eq(xStmtsEnum, manifestStmts)); - - XURI xFoo = URI.createNS(xContext, xBaseURI.getStringValue(), - fooPath); - Statement xM_BaseHaspartFoo = - new Statement(xBaseURI, pkg_hasPart, xFoo, manifest); - Statement xM_FooTypeMetadata = - new Statement(xFoo, rdf_type, pkg_MetadataFile, manifest); - Statement xM_FooTypeBar = - new Statement(xFoo, rdf_type, bar, manifest); - xDocMDAccess.addMetadataFile(fooPath, new XURI[] { bar }); - xStmtsEnum = xManifest.getStatements(null, null, null); - assertTrue("addMetadataFile", - eq(xStmtsEnum, merge(manifestStmts, new Statement[] { - xM_BaseHaspartFoo, xM_FooTypeMetadata, xM_FooTypeBar - }))); - - XURI[] graphsBar = xDocMDAccess.getMetadataGraphsWithType(bar); - assertTrue("getMetadataGraphsWithType", - graphsBar.length == 1 && eq(graphsBar[0], xFoo)); - - - xDocMDAccess.removeMetadataFile(xFoo); - xStmtsEnum = xManifest.getStatements(null, null, null); - assertTrue("removeMetadataFile", - eq(xStmtsEnum, manifestStmts)); - - System.out.println("...done"); - - System.out.println("Checking mapping..."); - - XEnumerationAccess xTextEnum = UnoRuntime.queryInterface(XEnumerationAccess.class, xText.getText()); - Object o = xTextEnum.createEnumeration().nextElement(); - XMetadatable xMeta1 = UnoRuntime.queryInterface(XMetadatable.class, o); - - XMetadatable xMeta; - xMeta = xDocMDAccess.getElementByURI(xMeta1); - assertTrue("getElementByURI: null", null != xMeta); - String XmlId = xMeta.getMetadataReference().Second; - String XmlId1 = xMeta1.getMetadataReference().Second; - assertTrue("getElementByURI: no xml id", !XmlId.equals("")); - assertTrue("getElementByURI: different xml id", XmlId.equals(XmlId1)); - - System.out.println("...done"); - - System.out.println("Checking storing and loading..."); - - XURI xFoobar = URI.createNS(xContext, xBaseURI.getStringValue(), - fooBarPath); - Statement[] metadataStmts = getMetadataFileStmts(xBaseURI, - fooBarPath); - xDocMDAccess.addMetadataFile(fooBarPath, new XURI[0]); - xStmtsEnum = xRep.getStatements(null, null, null); - assertTrue("addMetadataFile", - eq(xStmtsEnum, merge(manifestStmts, metadataStmts ))); - - Statement xFoobar_FooBarFoo = - new Statement(foo, bar, foo, xFoobar); - xRep.getGraph(xFoobar).addStatement(foo, bar, foo); - xStmtsEnum = xRep.getStatements(null, null, null); - assertTrue("addStatement", - eq(xStmtsEnum, merge(manifestStmts, merge(metadataStmts, - new Statement[] { xFoobar_FooBarFoo })))); - - PropertyValue noMDNoContentFile = new PropertyValue(); - noMDNoContentFile.Name = "URL"; - noMDNoContentFile.Value = TestDocument.getUrl("CUSTOM.odt"); - PropertyValue noMDFile = new PropertyValue(); - noMDFile.Name = "URL"; - noMDFile.Value = TestDocument.getUrl("TEST.odt"); - PropertyValue file = new PropertyValue(); - file.Name = "URL"; - file.Value = tempDir + "TESTDMA.odt"; - PropertyValue mimetype = new PropertyValue(); - mimetype.Name = "MediaType"; - mimetype.Value = "application/vnd.oasis.opendocument.text"; - PropertyValue[] argsEmptyNoContent = { mimetype, noMDNoContentFile}; - PropertyValue[] argsEmpty = { mimetype, noMDFile }; - PropertyValue[] args = { mimetype, file }; - - xStmtsEnum = xRep.getStatements(null, null, null); - XURI[] graphs = xRep.getGraphNames(); - - xDocMDAccess.storeMetadataToMedium(args); - - // this should re-init - xDocMDAccess.loadMetadataFromMedium(argsEmptyNoContent); - xRep = xRepoSupplier.getRDFRepository(); - assertTrue("xRep null", null != xRep); - assertTrue("baseURI still tdoc?", - !baseURI.equals(xDocMDAccess.getStringValue())); - Statement[] manifestStmts2 = getManifestStmts(xDocMDAccess); - xStmtsEnum = xRep.getStatements(null, null, null); - // there is no content or styles file in here, so we have just - // the package stmt - assertTrue("loadMetadataFromMedium (no metadata, no content)", - eq(xStmtsEnum, new Statement[] { manifestStmts2[0] })); - - // this should re-init - xDocMDAccess.loadMetadataFromMedium(argsEmpty); - xRep = xRepoSupplier.getRDFRepository(); - assertTrue("xRep null", null != xRep); - assertTrue("baseURI still tdoc?", - !baseURI.equals(xDocMDAccess.getStringValue())); - Statement[] manifestStmts3 = getManifestStmts(xDocMDAccess); - - xStmtsEnum = xRep.getStatements(null, null, null); - assertTrue("loadMetadataFromMedium (no metadata)", - eq(xStmtsEnum, manifestStmts3)); - - xDocMDAccess.loadMetadataFromMedium(args); - xRep = xRepoSupplier.getRDFRepository(); - assertTrue("xRep null", null != xRep); - Statement[] manifestStmts4 = getManifestStmts(xDocMDAccess); - Statement[] metadataStmts4 = getMetadataFileStmts(xDocMDAccess, - fooBarPath); - - xStmtsEnum = xRep.getStatements(null, null, null); - assertTrue("some graph(s) not reloaded", - graphs.length == xRep.getGraphNames().length); - - XURI xFoobar4 = URI.createNS(xContext, xDocMDAccess.getStringValue(), - fooBarPath); - Statement xFoobar_FooBarFoo4 = - new Statement(foo, bar, foo, xFoobar4); - assertTrue("loadMetadataFromMedium (re-load)", - eq(xStmtsEnum, merge(manifestStmts4, merge(metadataStmts4, - new Statement[] { xFoobar_FooBarFoo4 })))); - - System.out.println("...done"); - - System.out.println("Checking storing and loading via model..."); - - String f = tempDir + "TESTPARA.odt"; - - XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRepoSupplier); - - xStor.storeToURL(f, new PropertyValue[0]); - - xComp2 = util.DesktopTools.loadDoc(xMSF, f, loadProps); - - XDocumentMetadataAccess xDMA2 = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xComp2); - assertTrue("xDMA2 null", null != xDMA2); - - XRepositorySupplier xRS2 = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp2); - assertTrue("xRS2 null", null != xRS2); - - XRepository xRep2 = xRS2.getRDFRepository(); - assertTrue("xRep2 null", null != xRep2); - - Statement[] manifestStmts5 = getManifestStmts(xDMA2); - Statement[] metadataStmts5 = getMetadataFileStmts(xDMA2, - fooBarPath); - XURI xFoobar5 = URI.createNS(xContext, xDMA2.getStringValue(), - fooBarPath); - Statement xFoobar_FooBarFoo5 = - new Statement(foo, bar, foo, xFoobar5); - xStmtsEnum = xRep.getStatements(null, null, null); - XEnumeration xStmtsEnum2 = xRep2.getStatements(null, null, null); - assertTrue("load: repository differs", - eq(xStmtsEnum2, merge(manifestStmts5, merge(metadataStmts5, - new Statement[] { xFoobar_FooBarFoo5 })))); - - System.out.println("...done"); - - } finally { - close(xComp); - close(xComp2); - } - } - -// utilities ------------------------------------------------------------- - - static void close(XComponent i_comp) - { - try { - XCloseable xClos = UnoRuntime.queryInterface(XCloseable.class, i_comp); - if (xClos != null) - { - xClos.close(true); - } - } catch (Exception e) { - } - } - - XLiteral mkLit(String i_content) - { - return Literal.create(xContext, i_content); - } - - XLiteral mkLit(String i_content, XURI i_uri) - { - return Literal.createWithType(xContext, i_content, i_uri); - } - - static Statement[] merge(Statement[] i_A1, Statement[] i_A2) - { - // bah, java sucks... - Statement[] ret = new Statement[i_A1.length + i_A2.length]; - for (int i = 0; i < i_A1.length; ++i) { - ret[i] = i_A1[i]; - } - for (int i = 0; i < i_A2.length; ++i) { - ret[i+i_A1.length] = i_A2[i]; - } - return ret; - } - - public static String toS(XNode n) { - if (null == n) - { - return "< null >"; - } - return n.getStringValue(); - } - - static boolean isBlank(XNode i_node) - { - XBlankNode blank = UnoRuntime.queryInterface(XBlankNode.class, i_node); - return blank != null; - } - - - static Statement[] toSeq(XEnumeration i_Enum) throws Exception - { - java.util.Collection<Statement> c = new java.util.ArrayList<Statement>(); - while (i_Enum.hasMoreElements()) { - Statement s = (Statement) i_Enum.nextElement(); - c.add(s); - } - // java sucks - Object[] arr = c.toArray(); - Statement[] ret = new Statement[arr.length]; - for (int i = 0; i < arr.length; ++i) { - ret[i] = (Statement) arr[i]; - } - return ret; - } - - static XNode[][] toSeqs(XEnumeration i_Enum) throws Exception - { - java.util.Collection<XNode[]> c = new java.util.ArrayList<XNode[]>(); - while (i_Enum.hasMoreElements()) { - XNode[] s = (XNode[]) i_Enum.nextElement(); - c.add(s); - } - Object[] arr = c.toArray(); - XNode[][] ret = new XNode[arr.length][]; - for (int i = 0; i < arr.length; ++i) { - ret[i] = (XNode[]) arr[i]; - } - return ret; - } - - private static class BindingComp implements java.util.Comparator<XNode[]> - { - public int compare(XNode[] left, XNode[] right) - { - if (left.length != right.length) - { - throw new RuntimeException(); - } - for (int i = 0; i < left.length; ++i) { - int eq = (left[i].getStringValue().compareTo( - right[i].getStringValue())); - if (eq != 0) - { - return eq; - } - } - return 0; - } - } - - private static class StmtComp implements java.util.Comparator<Statement> - { - public int compare(Statement left, Statement right) - { - int eq; - if ((eq = cmp(left.Graph, right.Graph )) != 0) return eq; - if ((eq = cmp(left.Subject, right.Subject )) != 0) return eq; - if ((eq = cmp(left.Predicate, right.Predicate)) != 0) return eq; - if ((eq = cmp(left.Object, right.Object )) != 0) return eq; - return 0; - } - - private int cmp(XNode i_Left, XNode i_Right) - { - if (isBlank(i_Left)) { - return isBlank(i_Right) ? 0 : 1; - } else { - if (isBlank(i_Right)) { - return -1; - } else { - return toS(i_Left).compareTo(toS(i_Right)); - } - } - } - } - - static boolean eq(Statement i_Left, Statement i_Right) - { - XURI lG = i_Left.Graph; - XURI rG = i_Right.Graph; - if (!eq(lG, rG)) { - System.out.println("Graphs differ: " + toS(lG) + " != " + toS(rG)); - return false; - } - if (!eq(i_Left.Subject, i_Right.Subject)) { - System.out.println("Subjects differ: " + - i_Left.Subject.getStringValue() + " != " + - i_Right.Subject.getStringValue()); - return false; - } - if (!eq(i_Left.Predicate, i_Right.Predicate)) { - System.out.println("Predicates differ: " + - i_Left.Predicate.getStringValue() + " != " + - i_Right.Predicate.getStringValue()); - return false; - } - if (!eq(i_Left.Object, i_Right.Object)) { - System.out.println("Objects differ: " + - i_Left.Object.getStringValue() + " != " + - i_Right.Object.getStringValue()); - return false; - } - return true; - } - - static boolean eq(Statement[] i_Result, Statement[] i_Expected) - { - if (i_Result.length != i_Expected.length) { - System.out.println("eq: different lengths: " + i_Result.length + " " + - i_Expected.length); - return false; - } - Statement[] expected = i_Expected.clone(); - java.util.Arrays.sort(i_Result, new StmtComp()); - java.util.Arrays.sort(expected, new StmtComp()); - for (int i = 0; i < expected.length; ++i) - { - // This is better for debug! - final Statement a = i_Result[i]; - final Statement b = expected[i]; - final boolean cond = eq(a, b); - if (!cond) return false; - } - return true; - } - - static boolean eq(XEnumeration i_Enum, Statement[] i_Expected) - throws Exception - { - Statement[] current = toSeq(i_Enum); - return eq(current, i_Expected); - } - - static boolean eq(XNode i_Left, XNode i_Right) - { - if (i_Left == null) { - return (i_Right == null); - } else { - return (i_Right != null) && - (i_Left.getStringValue().equals(i_Right.getStringValue()) - // FIXME: hack: blank nodes considered equal - || (isBlank(i_Left) && isBlank(i_Right))); - } - } - - static boolean eq(XQuerySelectResult i_Result, - String[] i_Vars, XNode[][] i_Bindings) throws Exception - { - String[] vars = i_Result.getBindingNames(); - XEnumeration iter = i_Result; - XNode[][] bindings = toSeqs(iter); - if (vars.length != i_Vars.length) { - System.out.println("var lengths differ"); - return false; - } - if (bindings.length != i_Bindings.length) { - System.out.println("binding lengths differ: " + i_Bindings.length + - " vs " + bindings.length ); - return false; - } - java.util.Arrays.sort(bindings, new BindingComp()); - java.util.Arrays.sort(i_Bindings, new BindingComp()); - for (int i = 0; i < i_Bindings.length; ++i) { - if (i_Bindings[i].length != i_Vars.length) { - System.out.println("TEST ERROR!"); - throw new Exception(); - } - if (bindings[i].length != i_Vars.length) { - System.out.println("binding length and var length differ"); - return false; - } - for (int j = 0; j < i_Vars.length; ++j) { - if (!eq(bindings[i][j], i_Bindings[i][j])) { - System.out.println("bindings differ: " + - toS(bindings[i][j]) + " != " + toS(i_Bindings[i][j])); - return false; - } - } - } - for (int i = 0; i < i_Vars.length; ++i) { - if (!vars[i].equals(i_Vars[i])) { - System.out.println("variable names differ: " + - vars[i] + " != " + i_Vars[i]); - return false; - } - } - return true; - } - - static boolean eq(StringPair i_Left, StringPair i_Right) - { - return ((i_Left.First).equals(i_Right.First)) && - ((i_Left.Second).equals(i_Right.Second)); - } - - Statement[] getManifestStmts(XURI xBaseURI) throws Exception - { - XURI xManifest = URI.createNS(xContext, xBaseURI.getStringValue(), - manifestPath); - XURI xContent = URI.createNS(xContext, xBaseURI.getStringValue(), - contentPath); - XURI xStyles = URI.createNS(xContext, xBaseURI.getStringValue(), - stylesPath); - Statement xM_BaseTypeDoc = - new Statement(xBaseURI, rdf_type, pkg_Document, xManifest); - Statement xM_BaseHaspartContent = - new Statement(xBaseURI, pkg_hasPart, xContent, xManifest); - Statement xM_BaseHaspartStyles = - new Statement(xBaseURI, pkg_hasPart, xStyles, xManifest); - Statement xM_ContentTypeContent = - new Statement(xContent, rdf_type, odf_ContentFile, xManifest); - Statement xM_StylesTypeStyles = - new Statement(xStyles, rdf_type, odf_StylesFile, xManifest); - return new Statement[] { - xM_BaseTypeDoc, xM_BaseHaspartContent, xM_BaseHaspartStyles, - xM_ContentTypeContent, xM_StylesTypeStyles - }; - } - - Statement[] getMetadataFileStmts(XURI xBaseURI, String Path) - throws Exception - { - XURI xManifest = URI.createNS(xContext, xBaseURI.getStringValue(), - manifestPath); - XURI xGraph = URI.createNS(xContext, xBaseURI.getStringValue(), Path); - Statement xM_BaseHaspartGraph = - new Statement(xBaseURI, pkg_hasPart, xGraph, xManifest); - Statement xM_GraphTypeMetadata = - new Statement(xGraph, rdf_type, pkg_MetadataFile, xManifest); - return new Statement[] { xM_BaseHaspartGraph, xM_GraphTypeMetadata }; - } - - class TestRange implements XTextRange, XMetadatable, XServiceInfo - { - String m_Stream; - String m_XmlId; - String m_Text; - TestRange(String i_Str) { m_Text = i_Str; } - - public String getStringValue() { return ""; } - public String getNamespace() { return ""; } - public String getLocalName() { return ""; } - - public StringPair getMetadataReference() - { - return new StringPair(m_Stream, m_XmlId); - } - public void setMetadataReference(StringPair i_Ref) - throws IllegalArgumentException - { - m_Stream = i_Ref.First; - m_XmlId = i_Ref.Second; - } - public void ensureMetadataReference() - { - m_Stream = "content.xml"; - m_XmlId = "42"; - } - - public String getImplementationName() { return null; } - public String[] getSupportedServiceNames() { return null; } - public boolean supportsService(String i_Svc) - { - return i_Svc.equals("com.sun.star.text.Paragraph"); - } - - public XText getText() { return null; } - public XTextRange getStart() { return null; } - public XTextRange getEnd() { return null; } - public String getString() { return m_Text; } - public void setString(String i_Str) { m_Text = i_Str; } - } - - - - private XMultiServiceFactory getMSF() - { - return UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); - } - - // setup and close connections - @BeforeClass public static void setUpConnection() throws Exception { - System.out.println( "------------------------------------------------------------" ); - System.out.println( "starting class: " + DocumentMetadataAccess.class.getName() ); - System.out.println( "------------------------------------------------------------" ); - connection.setUp(); - } - - @AfterClass public static void tearDownConnection() - throws InterruptedException, com.sun.star.uno.Exception - { - System.out.println( "------------------------------------------------------------" ); - System.out.println( "finishing class: " + DocumentMetadataAccess.class.getName() ); - System.out.println( "------------------------------------------------------------" ); - connection.tearDown(); - } - - private static final OfficeConnection connection = new OfficeConnection(); - -} - diff --git a/unoxml/qa/unit/data/CUSTOM.odt b/unoxml/qa/unit/data/CUSTOM.odt new file mode 100644 index 000000000000..831a8f451dfd Binary files /dev/null and b/unoxml/qa/unit/data/CUSTOM.odt differ diff --git a/unoxml/qa/unit/data/TEST.odt b/unoxml/qa/unit/data/TEST.odt new file mode 100644 index 000000000000..7c6f0b60f7b0 Binary files /dev/null and b/unoxml/qa/unit/data/TEST.odt differ diff --git a/sfx2/qa/complex/sfx2/testdocuments/empty.rdf b/unoxml/qa/unit/data/empty.rdf similarity index 100% rename from sfx2/qa/complex/sfx2/testdocuments/empty.rdf rename to unoxml/qa/unit/data/empty.rdf diff --git a/unoxml/qa/unit/rdftest.cxx b/unoxml/qa/unit/rdftest.cxx index 706219cb0cd2..198a42bf92a8 100644 --- a/unoxml/qa/unit/rdftest.cxx +++ b/unoxml/qa/unit/rdftest.cxx @@ -15,6 +15,7 @@ #include <com/sun/star/container/ElementExistException.hpp> #include <com/sun/star/rdf/Statement.hpp> +#include <com/sun/star/rdf/URIs.hdl> #include <com/sun/star/rdf/XDocumentMetadataAccess.hpp> #include <com/sun/star/rdf/XDocumentRepository.hpp> #include <com/sun/star/rdf/XRepository.hpp> @@ -623,17 +624,78 @@ CPPUNIT_TEST_FIXTURE(RDFStreamTest, testRDF) } std::vector<rdf::Statement> -sortStatementsByPredicate(const uno::Sequence<rdf::Statement>& rStatements) +getManifestStatements(const uno::Reference<uno::XComponentContext>& rContext, + const uno::Reference<css::rdf::XURI>& rURI) { - std::vector<rdf::Statement> aStatements - = comphelper::sequenceToContainer<std::vector<rdf::Statement>>(rStatements); + uno::Reference<css::rdf::XURI> xManifest + = rdf::URI::createNS(rContext, rURI->getStringValue(), "manifest.rdf"); + uno::Reference<css::rdf::XURI> xContent + = rdf::URI::createNS(rContext, rURI->getStringValue(), "content.xml"); + uno::Reference<css::rdf::XURI> xStyles + = rdf::URI::createNS(rContext, rURI->getStringValue(), "styles.xml"); + + uno::Reference<css::rdf::XURI> xRDFType = rdf::URI::createKnown(rContext, rdf::URIs::RDF_TYPE); + + uno::Reference<css::rdf::XURI> xPkgDoc + = rdf::URI::createKnown(rContext, rdf::URIs::PKG_DOCUMENT); + uno::Reference<css::rdf::XURI> xContentFile + = rdf::URI::createKnown(rContext, rdf::URIs::ODF_CONTENTFILE); + uno::Reference<css::rdf::XURI> xStyleFile + = rdf::URI::createKnown(rContext, rdf::URIs::ODF_STYLESFILE); + uno::Reference<css::rdf::XURI> xPkgHasPart + = rdf::URI::createKnown(rContext, rdf::URIs::PKG_HASPART); + + rdf::Statement aBaseTypeDoc(rURI, xRDFType, xPkgDoc, xManifest); + rdf::Statement aBaseHaspartStyles(rURI, xPkgHasPart, xStyles, xManifest); + rdf::Statement aBaseHaspartContent(rURI, xPkgHasPart, xContent, xManifest); + rdf::Statement aContentTypeContent(xContent, xRDFType, xContentFile, xManifest); + rdf::Statement aStylesTypeStyles(xStyles, xRDFType, xStyleFile, xManifest); + + return { aContentTypeContent, aStylesTypeStyles, aBaseHaspartStyles, aBaseHaspartContent, + aBaseTypeDoc }; +} + +std::vector<rdf::Statement> +getMetadataFileStatements(const uno::Reference<uno::XComponentContext>& rContext, + const uno::Reference<css::rdf::XURI>& rURI, const OUString& rPath) +{ + uno::Reference<css::rdf::XURI> xRDFType = rdf::URI::createKnown(rContext, rdf::URIs::RDF_TYPE); + uno::Reference<css::rdf::XURI> xPkgHasPart + = rdf::URI::createKnown(rContext, rdf::URIs::PKG_HASPART); + uno::Reference<css::rdf::XURI> xPkgMetadata + = rdf::URI::createKnown(rContext, rdf::URIs::PKG_METADATAFILE); + + uno::Reference<css::rdf::XURI> xManifest + = rdf::URI::createNS(rContext, rURI->getStringValue(), "manifest.rdf"); + uno::Reference<css::rdf::XURI> xGraph + = rdf::URI::createNS(rContext, rURI->getStringValue(), rPath); + rdf::Statement aGraphTypeMetadata(xGraph, xRDFType, xPkgMetadata, xManifest); + rdf::Statement aBaseHaspartGraph(rURI, xPkgHasPart, xGraph, xManifest); + + return { aGraphTypeMetadata, aBaseHaspartGraph }; +} + +std::vector<rdf::Statement> sortStatements(const std::vector<rdf::Statement>& rStatements) +{ + std::vector<rdf::Statement> aStatements = rStatements; std::sort(aStatements.begin(), aStatements.end(), [](const rdf::Statement& a, const rdf::Statement& b) { - return a.Predicate->getStringValue() < b.Predicate->getStringValue(); + return (a.Predicate->getStringValue() < b.Predicate->getStringValue() + || (a.Predicate->getStringValue() == b.Predicate->getStringValue() + && a.Object->getStringValue() < b.Object->getStringValue()) + || (a.Predicate->getStringValue() == b.Predicate->getStringValue() + && a.Object->getStringValue() == b.Object->getStringValue() + && a.Subject->getStringValue() < b.Subject->getStringValue())); }); return aStatements; } +std::vector<rdf::Statement> sortStatements(const uno::Sequence<rdf::Statement>& rStatements) +{ + return sortStatements( + comphelper::sequenceToContainer<std::vector<rdf::Statement>>(rStatements)); +} + CPPUNIT_TEST_FIXTURE(RDFStreamTest, testRDFa2) { auto verify = [this](bool bIsExport) { @@ -734,7 +796,7 @@ CPPUNIT_TEST_FIXTURE(RDFStreamTest, testRDFa2) uno::Reference<rdf::XMetadatable> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); ::beans::Pair<uno::Sequence<rdf::Statement>, sal_Bool> xResult = xDocRepo->getStatementRDFa(xPara); - std::vector<rdf::Statement> aStatements = sortStatementsByPredicate(xResult.First); + std::vector<rdf::Statement> aStatements = sortStatements(xResult.First); CPPUNIT_ASSERT_EQUAL(size_t(2), aStatements.size()); uno::Reference<css::rdf::XLiteral> xLit = rdf::Literal::create(xContext, "6"); @@ -750,7 +812,7 @@ CPPUNIT_TEST_FIXTURE(RDFStreamTest, testRDFa2) uno::Reference<rdf::XMetadatable> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); ::beans::Pair<uno::Sequence<rdf::Statement>, sal_Bool> xResult = xDocRepo->getStatementRDFa(xPara); - std::vector<rdf::Statement> aStatements = sortStatementsByPredicate(xResult.First); + std::vector<rdf::Statement> aStatements = sortStatements(xResult.First); CPPUNIT_ASSERT_EQUAL(size_t(3), aStatements.size()); uno::Reference<css::rdf::XLiteral> xLit = rdf::Literal::create(xContext, "7"); @@ -897,6 +959,551 @@ CPPUNIT_TEST_FIXTURE(RDFStreamTest, testTdf123293) uno::Reference<rdf::XDocumentRepository> xDocRepo(xRepo, uno::UNO_QUERY); CPPUNIT_ASSERT(xDocRepo); } + +CPPUNIT_TEST_FIXTURE(RDFStreamTest, testDocumentMetadataAccess) +{ + mxComponent = loadFromDesktop(u"private:factory/swriter"_ustr); + + uno::Reference<rdf::XDocumentMetadataAccess> xDocumentMetadataAccess(mxComponent, + uno::UNO_QUERY); + uno::Reference<rdf::XRepository> xRepo = xDocumentMetadataAccess->getRDFRepository(); + CPPUNIT_ASSERT(xRepo); + + uno::Reference<css::rdf::XURI> xBase(xDocumentMetadataAccess, uno::UNO_QUERY_THROW); + OUString sBaseURI(xBase->getStringValue()); + CPPUNIT_ASSERT(!sBaseURI.isEmpty()); + + CPPUNIT_ASSERT_EQUAL(sal_uInt32(1), xRepo->getGraphNames().size()); + + const uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext(), + css::uno::UNO_SET_THROW); + uno::Reference<css::rdf::XURI> xManifest + = rdf::URI::createNS(xContext, sBaseURI, "manifest.rdf"); + uno::Reference<css::rdf::XURI> xFoo = rdf::URI::create(xContext, "uri:foo"); + uno::Reference<css::rdf::XURI> xBar = rdf::URI::create(xContext, "uri:bar"); + uno::Reference<css::rdf::XURI> xRDFType = rdf::URI::createKnown(xContext, rdf::URIs::RDF_TYPE); + uno::Reference<css::rdf::XURI> xPkgHasPart + = rdf::URI::createKnown(xContext, rdf::URIs::PKG_HASPART); + uno::Reference<css::rdf::XURI> xPkgMetadata + = rdf::URI::createKnown(xContext, rdf::URIs::PKG_METADATAFILE); + + uno::Reference<rdf::XNamedGraph> xGraph = xRepo->getGraph(xManifest); + CPPUNIT_ASSERT(xGraph); + + uno::Reference<container::XEnumeration> xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + + std::vector aStatements = getManifestStatements(xContext, xBase); + + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + try + { + xDocumentMetadataAccess->getElementByURI(nullptr); + CPPUNIT_FAIL("getElementByURI: null allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->getMetadataGraphsWithType(nullptr); + CPPUNIT_FAIL("getMetadataGraphsWithType: null URI allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + css::uno::Sequence<uno::Reference<rdf::XURI>> xURI{}; + try + { + xDocumentMetadataAccess->addMetadataFile("", xURI); + CPPUNIT_FAIL("addMetadataFile: empty filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("/foo", xURI); + CPPUNIT_FAIL("addMetadataFile: absolute filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("/fo\"o", xURI); + CPPUNIT_FAIL("addMetadataFile: invalid filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("../foo", xURI); + CPPUNIT_FAIL("addMetadataFile: filename with .. allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("foo/../../bar", xURI); + CPPUNIT_FAIL("addMetadataFile: filename with nest .. allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("foo/././bar", xURI); + CPPUNIT_FAIL("addMetadataFile: filename with nest . allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("content.xml", xURI); + CPPUNIT_FAIL("addMetadataFile: content.xml allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("styles.xml", xURI); + CPPUNIT_FAIL("addMetadataFile: styles.xml allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("meta.xml", xURI); + CPPUNIT_FAIL("addMetadataFile: meta.xml allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addMetadataFile("settings.xml", xURI); + CPPUNIT_FAIL("addMetadataFile: settings.xml allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->importMetadataFile(rdf::FileFormat::RDF_XML, nullptr, "foo", xFoo, + xURI); + CPPUNIT_FAIL("importMetadataFile: null stream allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + const uno::Reference<com::sun::star::ucb::XSimpleFileAccess> xFileAccess( + xContext->getServiceManager()->createInstanceWithContext( + u"com.sun.star.ucb.SimpleFileAccess"_ustr, xContext), + uno::UNO_QUERY_THROW); + const uno::Reference<io::XInputStream> xInputStream( + xFileAccess->openFileRead(m_directories.getURLFromSrc(u"/unoxml/qa/unit/data/empty.rdf")), + uno::UNO_SET_THROW); + + try + { + xDocumentMetadataAccess->importMetadataFile(rdf::FileFormat::RDF_XML, xInputStream, "", + xFoo, xURI); + CPPUNIT_FAIL("importMetadataFile: empty filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->importMetadataFile(rdf::FileFormat::RDF_XML, xInputStream, + "meta.xml", xFoo, xURI); + CPPUNIT_FAIL("importMetadataFile: meta.xml filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->importMetadataFile(rdf::FileFormat::RDF_XML, xInputStream, "foo", + nullptr, xURI); + CPPUNIT_FAIL("importMetadataFile: null base URI allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->importMetadataFile(rdf::FileFormat::RDF_XML, xInputStream, "foo", + xRDFType, xURI); + CPPUNIT_FAIL("importMetadataFile: non-absolute base URI allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->removeMetadataFile(nullptr); + CPPUNIT_FAIL("removeMetadataFile: null URI allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addContentOrStylesFile(""); + CPPUNIT_FAIL("addContentOrStylesFile: empty filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addContentOrStylesFile("/content.xml"); + CPPUNIT_FAIL("addContentOrStylesFile: absolute filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->addContentOrStylesFile("foo.rdf"); + CPPUNIT_FAIL("addContentOrStylesFile: invalid filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->removeContentOrStylesFile(""); + CPPUNIT_FAIL("removeContentOrStylesFile: empty filename allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->loadMetadataFromStorage(nullptr, xFoo, nullptr); + CPPUNIT_FAIL("loadMetadataFromStorage: null storage allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->storeMetadataToStorage(nullptr); + CPPUNIT_FAIL("storeMetadataToStorage: null storage allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + uno::Sequence<beans::PropertyValue> aProperty{}; + try + { + xDocumentMetadataAccess->loadMetadataFromMedium(aProperty); + CPPUNIT_FAIL("loadMetadataFromMedium: empty medium allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + try + { + xDocumentMetadataAccess->storeMetadataToMedium(aProperty); + CPPUNIT_FAIL("storeMetadataToMedium: empty medium allowed"); + } + catch (css::lang::IllegalArgumentException&) + { + } + + xDocumentMetadataAccess->removeContentOrStylesFile("content.xml"); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + // removeContentOrStylesFile (content) + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + xDocumentMetadataAccess->addContentOrStylesFile("content.xml"); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + // addContentOrStylesFile (content) + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + xDocumentMetadataAccess->removeContentOrStylesFile("styles.xml"); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + // removeContentOrStylesFile (styles) + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + xDocumentMetadataAccess->addContentOrStylesFile("styles.xml"); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + // addContentOrStylesFile (styles) + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + uno::Reference<css::rdf::XURI> xFooPath = rdf::URI::createNS(xContext, sBaseURI, "foo.rdf"); + rdf::Statement aBaseHaspartFoo(xBase, xPkgHasPart, xFooPath, xManifest); + rdf::Statement aFooTypeMetadata(xFooPath, xRDFType, xPkgMetadata, xManifest); + rdf::Statement aFooTypeBar(xFooPath, xRDFType, xBar, xManifest); + + css::uno::Sequence<uno::Reference<rdf::XURI>> xURI2{ xBar }; + xDocumentMetadataAccess->addMetadataFile("foo.rdf", xURI2); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + // addMetadataFile + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aFooTypeBar, xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aFooTypeMetadata, xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aBaseHaspartFoo, xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + // getMetadataGraphsWithType + css::uno::Sequence<uno::Reference<rdf::XURI>> xGraphBar + = xDocumentMetadataAccess->getMetadataGraphsWithType(xBar); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(1), xGraphBar.size()); + CPPUNIT_ASSERT_EQUAL(xFooPath->getStringValue(), xGraphBar[0]->getStringValue()); + + // removeMetadataFile + xDocumentMetadataAccess->removeMetadataFile(xFooPath); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<text::XTextRange> xTextRange(xParaEnum->nextElement(), uno::UNO_QUERY); + + uno::Reference<rdf::XMetadatable> xMeta1(xTextRange, uno::UNO_QUERY); + + uno::Reference<rdf::XMetadatable> xMeta = xDocumentMetadataAccess->getElementByURI(xMeta1); + CPPUNIT_ASSERT(xMeta); + OUString sXmlID(xMeta->getMetadataReference().Second); + OUString sXmlID1(xMeta1->getMetadataReference().Second); + CPPUNIT_ASSERT(!sXmlID.isEmpty()); + CPPUNIT_ASSERT_EQUAL(sXmlID, sXmlID1); + + OUString sFooBarPath(u"meta/foo/bar.rdf"_ustr); + + uno::Reference<css::rdf::XURI> xFooBar = rdf::URI::createNS(xContext, sBaseURI, sFooBarPath); + xDocumentMetadataAccess->addMetadataFile(sFooBarPath, xURI); + + std::vector aMFStatements = getMetadataFileStatements(xContext, xBase, sFooBarPath); + + // addMetadataFile + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + xRepo->getGraph(xFooBar)->addStatement(xFoo, xBar, xFoo); + + rdf::Statement aFoobar_FooBarFoo(xFoo, xBar, xFoo, xFooBar); + // addStatement + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aFoobar_FooBarFoo, xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[1], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + uno::Sequence<beans::PropertyValue> aArgsEmptyNoContent{ + comphelper::makePropertyValue(u"MediaType"_ustr, + u"application/vnd.oasis.opendocument.text"_ustr), + comphelper::makePropertyValue(u"URL"_ustr, createFileURL(u"CUSTOM.odt")) + }; + + uno::Sequence<beans::PropertyValue> aArgsEmpty{ + comphelper::makePropertyValue(u"MediaType"_ustr, + u"application/vnd.oasis.opendocument.text"_ustr), + comphelper::makePropertyValue(u"URL"_ustr, createFileURL(u"TEST.odt")) + }; + + uno::Sequence<beans::PropertyValue> aArgs{ + comphelper::makePropertyValue(u"MediaType"_ustr, + u"application/vnd.oasis.opendocument.text"_ustr), + comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()), + }; + + css::uno::Sequence<uno::Reference<rdf::XURI>> xGraphNames = xRepo->getGraphNames(); + + xDocumentMetadataAccess->storeMetadataToMedium(aArgs); + + // this should re-init + xDocumentMetadataAccess->loadMetadataFromMedium(aArgsEmptyNoContent); + xRepo = xDocumentMetadataAccess->getRDFRepository(); + CPPUNIT_ASSERT(xRepo); + + CPPUNIT_ASSERT(!sBaseURI.equals(xDocumentMetadataAccess->getStringValue())); + + // loadMetadataFromMedium (no metadata, no content) + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + aStatements = getManifestStatements(xContext, xDocumentMetadataAccess); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], xEnum->nextElement().get<rdf::Statement>()); + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + + // this should re-init + xDocumentMetadataAccess->loadMetadataFromMedium(aArgsEmpty); + xRepo = xDocumentMetadataAccess->getRDFRepository(); + CPPUNIT_ASSERT(xRepo); + + CPPUNIT_ASSERT(!sBaseURI.equals(xDocumentMetadataAccess->getStringValue())); + + // loadMetadataFromMedium (no metadata) + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + aStatements = getManifestStatements(xContext, xDocumentMetadataAccess); + + std::vector<rdf::Statement> aVector; + while (xEnum->hasMoreElements()) + aVector.push_back(xEnum->nextElement().get<rdf::Statement>()); + // After saving and reloading, statements have different order + aVector = sortStatements(aVector); + + CPPUNIT_ASSERT_EQUAL(size_t(5), aVector.size()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], aVector[0]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], aVector[1]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], aVector[2]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], aVector[3]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], aVector[4]); + + xDocumentMetadataAccess->loadMetadataFromMedium(aArgs); + xRepo = xDocumentMetadataAccess->getRDFRepository(); + CPPUNIT_ASSERT(xRepo); + + CPPUNIT_ASSERT(!sBaseURI.equals(xDocumentMetadataAccess->getStringValue())); + + CPPUNIT_ASSERT_EQUAL(xGraphNames.size(), xRepo->getGraphNames().size()); + + // loadMetadataFromMedium (re-load) + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + + aStatements = getManifestStatements(xContext, xDocumentMetadataAccess); + aMFStatements = getMetadataFileStatements(xContext, xDocumentMetadataAccess, sFooBarPath); + + aVector.clear(); + while (xEnum->hasMoreElements()) + aVector.push_back(xEnum->nextElement().get<rdf::Statement>()); + // After saving and reloading, statements have different order + aVector = sortStatements(aVector); + + xFooBar = rdf::URI::createNS(xContext, xDocumentMetadataAccess->getStringValue(), sFooBarPath); + aFoobar_FooBarFoo = rdf::Statement(xFoo, xBar, xFoo, xFooBar); + + CPPUNIT_ASSERT_EQUAL(size_t(8), aVector.size()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], aVector[0]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[1], aVector[1]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], aVector[2]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], aVector[3]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], aVector[4]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], aVector[5]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[0], aVector[6]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aFoobar_FooBarFoo, aVector[7]); + + saveAndReload(u"writer8"_ustr); + + xDocumentMetadataAccess.set(mxComponent, uno::UNO_QUERY); + xRepo = xDocumentMetadataAccess->getRDFRepository(); + CPPUNIT_ASSERT(xRepo); + + xEnum = xRepo->getStatements(nullptr, nullptr, nullptr); + + aStatements = getManifestStatements(xContext, xDocumentMetadataAccess); + aMFStatements = getMetadataFileStatements(xContext, xDocumentMetadataAccess, sFooBarPath); + + aVector.clear(); + while (xEnum->hasMoreElements()) + aVector.push_back(xEnum->nextElement().get<rdf::Statement>()); + // After saving and reloading, statements have different order + aVector = sortStatements(aVector); + + xFooBar = rdf::URI::createNS(xContext, xDocumentMetadataAccess->getStringValue(), sFooBarPath); + aFoobar_FooBarFoo = rdf::Statement(xFoo, xBar, xFoo, xFooBar); + + CPPUNIT_ASSERT_EQUAL(size_t(8), aVector.size()); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[3], aVector[0]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[1], aVector[1]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[2], aVector[2]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[0], aVector[3]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[1], aVector[4]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aStatements[4], aVector[5]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aMFStatements[0], aVector[6]); + CPPUNIT_ASSERT_STATEMENT_EQUAL(aFoobar_FooBarFoo, aVector[7]); +} } CPPUNIT_PLUGIN_IMPLEMENT();