blob: d6a2d3f8d8a6792cef642c9813dec623f763ece7 [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.
*
*************************************************************/
package complex.sfx2;
// import complexlib.ComplexTestCase;
import com.sun.star.beans.Pair;
import com.sun.star.rdf.Literal;
import com.sun.star.rdf.XLiteral;
import com.sun.star.rdf.XNamedGraph;
import com.sun.star.rdf.BlankNode;
import com.sun.star.rdf.XQuerySelectResult;
import com.sun.star.rdf.XNode;
import com.sun.star.rdf.XDocumentRepository;
import com.sun.star.rdf.XMetadatable;
import com.sun.star.rdf.Statement;
import com.sun.star.rdf.FileFormat;
import com.sun.star.rdf.URIs;
import com.sun.star.rdf.URI;
import com.sun.star.rdf.XDocumentMetadataAccess;
import com.sun.star.rdf.XRepositorySupplier;
import com.sun.star.rdf.XRepository;
import com.sun.star.rdf.XBlankNode;
import com.sun.star.rdf.XURI;
import helper.StreamSimulator;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.lang.WrappedTargetRuntimeException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.StringPair;
import com.sun.star.container.XEnumerationAccess;
import com.sun.star.container.XEnumeration;
import com.sun.star.io.XInputStream;
import com.sun.star.util.XCloseable;
import com.sun.star.frame.XStorable;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextRange;
import com.sun.star.text.XText;
import complex.sfx2.tools.TestDocument;
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 static org.junit.Assert.*;
/**
* 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...
*
* @author mst
*/
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;
XURI baz;
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 XURI odf_Element;
static XBlankNode blank1;
static XBlankNode blank2;
static XBlankNode blank3;
static XBlankNode blank4;
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;
// public String[] getTestMethodNames ()
// {
// return new String[] { "check", "checkRDFa" };
// }
/**
* The test parameters
*/
private static TestParameters param = null;
@Before public void before()
{
try {
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);
baz = URI.create(xContext, "uri:baz");
assertNotNull("baz", baz);
blank1 = BlankNode.create(xContext, "_:1");
assertNotNull("blank1", blank1);
blank2 = BlankNode.create(xContext, "_:2");
assertNotNull("blank2", blank2);
blank3 = BlankNode.create(xContext, "_:3");
assertNotNull("blank3", blank3);
blank4 = BlankNode.create(xContext, "_:4");
assertNotNull("blank4", blank4);
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);
odf_Element = URI.createKnown(xContext, URIs.ODF_ELEMENT);
assertNotNull("odf_Element", odf_Element);
} catch (Exception e) {
report(e);
}
}
@After public void after()
{
xRep = null;
xRS = null;
xDMA = null;
}
@Test public void check()
{
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 = (XURI) 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.";
XTextRange xTR = new TestRange(content);
XMetadatable xM = (XMetadatable) xTR;
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);
XURI uri;
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 baseURL = new PropertyValue();
baseURL.Name = "DocumentBaseURL";
baseURL.Value = tempDir + "TMP.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((XURI) 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((XURI) 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((XURI) xDocMDAccess);
Statement[] metadataStmts4 = getMetadataFileStmts((XURI) 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((XURI) xDMA2);
Statement[] metadataStmts5 = getMetadataFileStmts((XURI) 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");
} catch (Exception e) {
report(e);
} finally {
close(xComp);
close(xComp2);
}
}
@Test public void checkRDFa()
{
XComponent xComp = null;
try {
final String file = TestDocument.getUrl("TESTRDFA.odt");
xComp = loadRDFa(file);
if (xComp != null)
{
final String sNewFile = tempDir + "TESTRDFA.odt";
storeRDFa(xComp, sNewFile);
close(xComp);
xComp = loadRDFa(sNewFile);
}
} finally {
close(xComp);
}
}
private void storeRDFa(XComponent xComp, String file)
{
try {
System.out.println("Storing test document...");
XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xComp);
xStor.storeToURL(file, new PropertyValue[0]);
System.out.println("...done");
} catch (Exception e) {
report(e);
}
}
private XComponent loadRDFa(String file)
{
XComponent xComp = null;
try {
System.out.println("Loading test document...");
PropertyValue[] loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "Hidden";
loadProps[0].Value = true;
xComp = util.DesktopTools.loadDoc(xMSF, file, loadProps);
XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp);
assertTrue("xRS null", null != xRepoSupplier);
XDocumentRepository xDocRepository = UnoRuntime.queryInterface(XDocumentRepository.class, xRepoSupplier.getRDFRepository());
assertTrue("xRep null", null != xDocRepository);
XTextDocument xTextDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp);
XText xText = xTextDoc.getText();
XEnumerationAccess xEA = UnoRuntime.queryInterface(XEnumerationAccess.class, xText);
XEnumeration xEnum = xEA.createEnumeration();
System.out.println("...done");
System.out.println("Checking RDFa in loaded test document...");
XMetadatable xPara;
Pair<Statement[], Boolean> result;
Statement x_FooBarLit1 = new Statement(foo, bar, mkLit("1"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 1",
!result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit1
}));
Statement x_FooBarLit2 = new Statement(foo, bar, mkLit("2"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 2",
!result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit2
}));
Statement x_BlankBarLit3 =
new Statement(blank1, bar, mkLit("3"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 3",
!result.Second &&
eq(result.First, new Statement[] {
x_BlankBarLit3
}));
XBlankNode b3 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject);
Statement x_BlankBarLit4 =
new Statement(blank2, bar, mkLit("4"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 4",
!result.Second &&
eq(result.First, new Statement[] {
x_BlankBarLit4
}));
XBlankNode b4 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject);
Statement x_BlankBarLit5 =
new Statement(blank1, bar, mkLit("5"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 5",
!result.Second &&
eq(result.First, new Statement[] {
x_BlankBarLit5
}));
XBlankNode b5 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject);
assertTrue("RDFa: 3 != 4",
!b3.getStringValue().equals(b4.getStringValue()));
assertTrue("RDFa: 3 == 5",
b3.getStringValue().equals(b5.getStringValue()));
Statement x_FooBarLit6 = new Statement(foo, bar, mkLit("6"), null);
Statement x_FooBazLit6 = new Statement(foo, baz, mkLit("6"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 6",
!result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit6, x_FooBazLit6
}));
Statement x_FooBarLit7 = new Statement(foo, bar, mkLit("7"), null);
Statement x_FooBazLit7 = new Statement(foo, baz, mkLit("7"), null);
Statement x_FooFooLit7 = new Statement(foo, foo, mkLit("7"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 7",
!result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit7, x_FooBazLit7, x_FooFooLit7
}));
XNode lit = mkLit("a fooish bar");
XNode lit_type= mkLit("a fooish bar", bar);
Statement x_FooBarLit = new Statement(foo, bar, lit, null);
Statement x_FooBarLittype = new Statement(foo, bar, lit_type, null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 8",
result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit
}));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 9",
result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit
}));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 10",
result.Second &&
eq(result.First, new Statement[] {
x_FooBarLittype
}));
Statement x_FooBarLit11
= new Statement(foo, bar, mkLit("11", bar), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 11",
!result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit11
}));
XURI xFile = URI.createNS(xContext, file, "/" + contentPath);
Statement x_FileBarLit12 =
new Statement(xFile, bar, mkLit("12"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 12",
!result.Second &&
eq(result.First, new Statement[] {
x_FileBarLit12
}));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 13",
result.Second &&
eq(result.First, new Statement[] {
x_FooBarLit
}));
Statement x_FooLabelLit14 =
new Statement(foo, rdfs_label, mkLit("14"), null);
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 14",
result.Second &&
eq(result.First, new Statement[] {
/* x_FooLabelLit14 */ x_FooBarLit
}));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 15", eq(result.First, new Statement[] { } ));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 16", eq(result.First, new Statement[] { } ));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 17", eq(result.First, new Statement[] { } ));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 18", eq(result.First, new Statement[] { } ));
xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 19", eq(result.First, new Statement[] { } ));
xPara = UnoRuntime.queryInterface(
XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 20", eq(result.First, new Statement[] { } ));
xPara = UnoRuntime.queryInterface(
XMetadatable.class, xEnum.nextElement());
result = xDocRepository.getStatementRDFa(xPara);
assertTrue("RDFa: 21", eq(result.First, new Statement[] { } ));
System.out.println("...done");
} catch (Exception e) {
report(e);
close(xComp);
}
return xComp;
}
// utilities -------------------------------------------------------------
public void report2(Exception e)
{
if (e instanceof WrappedTargetException)
{
System.out.println("Cause:");
Exception cause = (Exception)
(((WrappedTargetException)e).TargetException);
System.out.println(cause.toString());
report2(cause);
} else if (e instanceof WrappedTargetRuntimeException) {
System.out.println("Cause:");
Exception cause = (Exception)
(((WrappedTargetRuntimeException)e).TargetException);
System.out.println(cause.toString());
report2(cause);
}
}
public void report(Exception e) {
System.out.println("Exception occurred:");
e.printStackTrace(System.out);
report2(e);
fail();
}
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 class Statement implements XStatement
{
XResource m_Subject;
XResource m_Predicate;
XNode m_Object;
XURI m_Graph;
Statement(XResource i_Subject, XResource i_Predicate, XNode i_Object,
XURI i_Graph)
{
m_Subject = i_Subject;
m_Predicate = i_Predicate;
m_Object = i_Object;
m_Graph = i_Graph;
}
public XResource getSubject() { return m_Subject; }
public XResource getPredicate() { return m_Predicate; }
public XNode getObject() { return m_Object; }
public XURI getGraph() { return m_Graph; }
}
*/
static Statement[] toSeq(XEnumeration i_Enum) throws Exception
{
java.util.Collection c = new java.util.Vector();
while (i_Enum.hasMoreElements()) {
Statement s = (Statement) i_Enum.nextElement();
//System.out.println("toSeq: " + s.getSubject().getStringValue() + " " + s.getPredicate().getStringValue() + " " + s.getObject().getStringValue() + ".");
c.add(s);
}
// return (Statement[]) c.toArray();
// 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 c = new java.util.Vector();
while (i_Enum.hasMoreElements()) {
XNode[] s = (XNode[]) i_Enum.nextElement();
c.add(s);
}
// return (XNode[][]) c.toArray();
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;
}
static class BindingComp implements java.util.Comparator
{
public int compare(Object i_Left, Object i_Right)
{
XNode[] left = (XNode[]) i_Left;
XNode[] right = (XNode[]) i_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;
}
}
static class StmtComp implements java.util.Comparator
{
public int compare(Object i_Left, Object i_Right)
{
int eq;
Statement left = (Statement) i_Left;
Statement right = (Statement) i_Right;
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;
}
public 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 = (Statement[])
java.util.Arrays.asList(i_Expected).toArray();
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 = (XEnumeration) 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));
}
static String mkNamespace(String i_prefix, String i_namespace)
{
return "PREFIX " + i_prefix + ": <" + i_namespace + ">\n";
}
static String mkNss()
{
String namespaces = mkNamespace("rdf",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#");
namespaces += mkNamespace("pkg",
"http://docs.oasis-open.org/opendocument/meta/package/common#");
namespaces += mkNamespace("odf",
"http://docs.oasis-open.org/opendocument/meta/package/odf#");
return namespaces;
}
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()
{
final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
return xMSF1;
}
// 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();
}