blob: 55d7b31052c7cc2989f3ec4c5858638b391ac7b6 [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 complex.sfx2.tools.TestDocument;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.Locale;
import com.sun.star.lang.EventObject;
import com.sun.star.util.Date;
import com.sun.star.util.DateTime;
import com.sun.star.util.Time;
import com.sun.star.util.Duration;
import com.sun.star.util.XModifyListener;
import com.sun.star.util.XModifyBroadcaster;
import com.sun.star.beans.XPropertyContainer;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.NamedValue;
import com.sun.star.beans.PropertyAttribute;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.beans.IllegalTypeException;
import com.sun.star.document.XDocumentProperties;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openoffice.test.OfficeConnection;
import static org.junit.Assert.*;
/**
* Test case for the service com.sun.star.document.DocumentProperties.
* Currently, this service is implemented in
* sfx2/source/doc/SfxDocumentMetaData.cxx.
*
* @author mst
*/
public class DocumentProperties
{
@After public void cleanup() {
// nothing to do
}
// for testing modifications
class Listener implements XModifyListener {
private boolean m_Called;
Listener() {
m_Called = false;
}
public boolean reset() {
boolean oldCalled = m_Called;
m_Called = false;
return oldCalled;
}
public void modified(EventObject e) {
m_Called = true;
}
public void disposing(EventObject e) {
}
}
@Test public void check() {
try {
XMultiServiceFactory xMSF = getMSF();
assertNotNull("could not create MultiServiceFactory.", xMSF);
XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xMSF);
Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext");
XComponentContext xContext = UnoRuntime.queryInterface(XComponentContext.class, defaultCtx);
assertNotNull("could not get component context.", xContext);
// TODO: Path to temp
String temp = util.utils.getOfficeTemp/*Dir*/(xMSF);
System.out.println("tempdir: " + temp);
PropertyValue[] noArgs = { };
PropertyValue mimetype = new PropertyValue();
mimetype.Name = "MediaType";
mimetype.Value = "application/vnd.oasis.opendocument.text";
PropertyValue[] mimeArgs = { mimetype };
// new Any("application/vnd.oasis.opendocument.text")) };
PropertyValue cfile = new PropertyValue();
cfile.Name = "URL";
cfile.Value = temp + "EMPTY.odt";
PropertyValue[] mimeEmptyArgs = { mimetype, cfile };
System.out.println("Creating service DocumentProperties...");
Object oDP =
// xMSF.createInstanceWithContext(
// "com.sun.star.document.DocumentProperties", xContext);
xMSF.createInstance("com.sun.star.document.DocumentProperties");
XDocumentProperties xDP = UnoRuntime.queryInterface(XDocumentProperties.class, oDP);
System.out.println("...done");
System.out.println("Checking initialize ...");
XDocumentProperties xDP2 = UnoRuntime.queryInterface(XDocumentProperties.class, xMSF.createInstance("com.sun.star.document.DocumentProperties"));
XInitialization xInit = UnoRuntime.queryInterface(XInitialization.class, xDP2);
xInit.initialize(new Object[] { });
System.out.println("...done");
System.out.println("Checking storing default-initialized meta data ...");
// xDP2.storeToMedium(temp + "EMPTY.odt", mimeArgs);
xDP2.storeToMedium("", mimeEmptyArgs);
System.out.println("...done");
System.out.println("Checking loading default-initialized meta data ...");
// xDP2.loadFromMedium(temp + "EMPTY.odt", noArgs);
xDP2.loadFromMedium("", mimeEmptyArgs);
assertTrue ("Author", "".equals(xDP2.getAuthor()));
System.out.println("...done");
System.out.println("(Not) Checking preservation of custom meta data ...");
xDP2.loadFromMedium(TestDocument.getUrl("CUSTOM.odt"),
noArgs);
assertTrue ("Author", "".equals(xDP2.getAuthor()));
xDP2.storeToMedium(temp + "CUSTOM.odt", mimeArgs);
//FIXME: now what? comparing for binary equality seems useless
// we could unzip the written file and grep for the custom stuff
// but would that work on windows...
System.out.println("...done");
System.out.println("Checking loading from test document...");
String file = TestDocument.getUrl("TEST.odt");
xDP.loadFromMedium(file, noArgs);
/* XInputStream xStream =
new StreamSimulator("./testdocuments/TEST.odt", true, param);
Object oSF =
xMSF.createInstance("com.sun.star.embed.StorageFactory");
XSingleServiceFactory xSF = (XSingleServiceFactory)
UnoRuntime.queryInterface(XSingleServiceFactory.class, oSF);
Object oStor = xSF.createInstanceWithArguments(
new Object[] { xStream });
XStorage xStor = (XStorage) UnoRuntime.queryInterface(
XStorage.class, oStor);
xDP.loadFromStorage(xStor);*/
System.out.println("...done");
System.out.println("Checking meta-data import...");
assertTrue("Author", "Karl-Heinz Mustermann".equals(xDP.getAuthor()));
assertTrue("Generator",
"StarOffice/8$Solaris_x86 OpenOffice.org_project/680m232$Build-9227"
.equals(xDP.getGenerator()));
assertTrue("CreationDate", 2007 == xDP.getCreationDate().Year);
assertTrue("Title", "Urgent Memo".equals(xDP.getTitle()));
assertTrue("Subject", "Wichtige Mitteilung".equals(xDP.getSubject()));
assertTrue("Description",
"Modern internal company memorandum in full-blocked style"
.equals(xDP.getDescription()));
// assertTrue("Language", "".equals(xDP.getLanguage()));
assertTrue("ModifiedBy",
"Karl-Heinz Mustermann".equals(xDP.getModifiedBy()));
assertTrue("ModificationDate", 10 == xDP.getModificationDate().Month);
assertTrue("PrintedBy",
"Karl-Heinz Mustermann".equals(xDP.getPrintedBy()));
assertTrue("PrintDate", 29 == xDP.getPrintDate().Day);
assertTrue("TemplateName",
"Modern Memo".equals(xDP.getTemplateName()));
assertTrue("TemplateURL",
xDP.getTemplateURL().endsWith("memmodern.ott"));
assertTrue("TemplateDate", 17 == xDP.getTemplateDate().Hours);
assertTrue("AutoloadURL", "../TEST.odt".equals(xDP.getAutoloadURL()));
assertTrue("AutoloadSecs", 0 == xDP.getAutoloadSecs());
assertTrue("DefaultTarget", "_blank".equals(xDP.getDefaultTarget()));
assertTrue("EditingCycles", 3 == xDP.getEditingCycles());
assertTrue("EditingDuration", 320 == xDP.getEditingDuration());
String[] kws = xDP.getKeywords();
assertTrue("Keywords", fromArray(kws).containsAll(
fromArray(new Object[] { "Asien", "Memo", "Reis" })));
NamedValue[] ds = xDP.getDocumentStatistics();
/* for (int i = 0; i < ds.length; ++i) {
System.out.println("nv: " + ds[i].Name + " " + ds[i].Value);
}
NamedValue nv1 = new NamedValue("WordCount", new Integer(23));
NamedValue nv2 = new NamedValue("WordCount", new Integer(23));
System.out.println("eq: " + nv1.equals(nv2)); // grrr, this is false...
*/
assertTrue("DocumentStatistics:WordCount", containsNV(ds,
new NamedValue("WordCount", new Integer(23))));
assertTrue("DocumentStatistics:PageCount", containsNV(ds,
new NamedValue("PageCount", new Integer(1))));
XPropertyContainer udpc = xDP.getUserDefinedProperties();
XPropertySet udps = UnoRuntime.queryInterface( XPropertySet.class, udpc );
assertTrue("UserDefined 1", "Dies ist ein wichtiger Hinweis"
.equals(udps.getPropertyValue("Hinweis")));
assertTrue("UserDefined 2", ("Kann Spuren von N"
+ new String(new byte[] { (byte) 0xc3, (byte) 0xbc }, "UTF-8")
+ "ssen enthalten")
.equals(udps.getPropertyValue("Warnung")));
System.out.println("...done");
System.out.println("Checking meta-data updates...");
String str;
DateTime dt = new DateTime();
Locale l = new Locale();
int i;
str = "me";
xDP.setAuthor(str);
assertTrue("setAuthor", str.equals(xDP.getAuthor()));
str = "the computa";
xDP.setGenerator(str);
assertTrue("setGenerator", str.equals(xDP.getGenerator()));
dt.Year = 2038;
dt.Month = 1;
dt.Day = 1;
xDP.setCreationDate(dt);
assertTrue("setCreationDate", dt.Year == xDP.getCreationDate().Year);
str = "El t'itulo";
xDP.setTitle(str);
assertTrue("setTitle", str.equals(xDP.getTitle()));
str = "Ein verkommenes Subjekt";
xDP.setSubject(str);
assertTrue("setSubject", str.equals(xDP.getSubject()));
str = "Este descripci'on no es importante";
xDP.setDescription(str);
assertTrue("setDescription", str.equals(xDP.getDescription()));
l.Language = "en";
l.Country = "GB";
xDP.setLanguage(l);
Locale l2 = xDP.getLanguage();
assertTrue("setLanguage Lang", l.Language.equals(l2.Language));
assertTrue("setLanguage Cty", l.Country.equals(l2.Country));
str = "myself";
xDP.setModifiedBy(str);
assertTrue("setModifiedBy", str.equals(xDP.getModifiedBy()));
dt.Year = 2042;
xDP.setModificationDate(dt);
assertTrue("setModificationDate",
dt.Year == xDP.getModificationDate().Year);
str = "i didnt do it";
xDP.setPrintedBy(str);
assertTrue("setPrintedBy", str.equals(xDP.getPrintedBy()));
dt.Year = 2024;
xDP.setPrintDate(dt);
assertTrue("setPrintDate", dt.Year == xDP.getPrintDate().Year);
str = "blah";
xDP.setTemplateName(str);
assertTrue("setTemplateName", str.equals(xDP.getTemplateName()));
str = "gopher://some-hole-in-the-ground/";
xDP.setTemplateURL(str);
assertTrue("setTemplateURL", str.equals(xDP.getTemplateURL()));
dt.Year = 2043;
xDP.setTemplateDate(dt);
assertTrue("setTemplateDate", dt.Year == xDP.getTemplateDate().Year);
str = "http://nowhere/";
xDP.setAutoloadURL(str);
assertTrue("setAutoloadURL", str.equals(xDP.getAutoloadURL()));
i = 3661; // this might not work (due to conversion via double...)
xDP.setAutoloadSecs(i);
// System.out.println("set: " + i + " get: " + xDP.getAutoloadSecs());
assertTrue("setAutoloadSecs", i == xDP.getAutoloadSecs());
str = "_blank";
xDP.setDefaultTarget(str);
assertTrue("setDefaultTarget", str.equals(xDP.getDefaultTarget()));
i = 42;
xDP.setEditingCycles((short) i);
assertTrue("setEditingCycles", i == xDP.getEditingCycles());
i = 84;
xDP.setEditingDuration(i);
assertTrue("setEditingDuration", i == xDP.getEditingDuration());
str = "";
String[] kws2 = new String[] {
"keywordly", "keywordlike", "keywordalicious" };
xDP.setKeywords(kws2);
kws = xDP.getKeywords();
assertTrue("setKeywords", fromArray(kws).containsAll(fromArray(kws2)));
NamedValue[] ds2 = new NamedValue[] {
new NamedValue("SyllableCount", new Integer(9)),
new NamedValue("FrameCount", new Integer(2)),
new NamedValue("SentenceCount", new Integer(7)) };
xDP.setDocumentStatistics(ds2);
ds = xDP.getDocumentStatistics();
assertTrue("setDocumentStatistics:SyllableCount", containsNV(ds,
new NamedValue("SyllableCount", new Integer(9))));
assertTrue("setDocumentStatistics:FrameCount", containsNV(ds,
new NamedValue("FrameCount", new Integer(2))));
assertTrue("setDocumentStatistics:SentenceCount", containsNV(ds,
new NamedValue("SentenceCount", new Integer(7))));
System.out.println("...done");
System.out.println("Checking user-defined meta-data updates...");
// actually, this tests the PropertyBag service
// but maybe the DocumentProperties service will be implemented
// differently some day...
boolean b = true;
double d = 3.1415;
// note that Time is only supported for backward compatibilty!
Time t = new Time();
t.Hours = 1;
t.Minutes = 16;
Date date = new Date();
date.Year = 2071;
date.Month = 2;
date.Day = 3;
dt.Year = 2065;
Duration dur = new Duration();
dur.Negative = true;
dur.Years = 1001;
dur.Months = 999;
dur.Days = 888;
dur.Hours = 777;
dur.Minutes = 666;
dur.Seconds = 555;
dur.MilliSeconds = 444;
udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, b);
udpc.addProperty("FrobDuration", PropertyAttribute.REMOVEABLE, dur);
udpc.addProperty("FrobDuration2", PropertyAttribute.REMOVEABLE, t);
udpc.addProperty("FrobEndDate", PropertyAttribute.REMOVEABLE, date);
udpc.addProperty("FrobStartTime", PropertyAttribute.REMOVEABLE, dt);
udpc.addProperty("Pi", PropertyAttribute.REMOVEABLE, new Double(d));
udpc.addProperty("Foo", PropertyAttribute.REMOVEABLE, "bar");
udpc.addProperty("Removed", PropertyAttribute.REMOVEABLE, "bar");
// #i94175#: empty property name is valid ODF 1.1
udpc.addProperty("", PropertyAttribute.REMOVEABLE, "eeeeek");
try {
udpc.removeProperty("Info 1");
udpc.removeProperty("Removed");
} catch (UnknownPropertyException e) {
fail("removeProperty failed");
}
try {
udpc.addProperty("Forbidden", PropertyAttribute.REMOVEABLE,
new String[] { "foo", "bar" });
fail("inserting value of non-supported type did not fail");
} catch (IllegalTypeException e) {
// ignore
}
assertTrue("UserDefined bool", new Boolean(b).equals(
udps.getPropertyValue("Frobnicate")));
assertTrue("UserDefined duration", eqDuration(dur, (Duration)
udps.getPropertyValue("FrobDuration")));
assertTrue("UserDefined time", eqTime(t, (Time)
udps.getPropertyValue("FrobDuration2")));
assertTrue("UserDefined date", eqDate(date, (Date)
udps.getPropertyValue("FrobEndDate")));
assertTrue("UserDefined datetime", eqDateTime(dt, (DateTime)
udps.getPropertyValue("FrobStartTime")));
assertTrue("UserDefined float", new Double(d).equals(
udps.getPropertyValue("Pi")));
assertTrue("UserDefined string", "bar".equals(
udps.getPropertyValue("Foo")));
assertTrue("UserDefined empty name", "eeeeek".equals(
udps.getPropertyValue("")));
try {
udps.getPropertyValue("Removed");
fail("UserDefined remove didn't");
} catch (UnknownPropertyException e) {
// ok
}
System.out.println("...done");
System.out.println("Checking storing meta-data to file...");
xDP.storeToMedium(temp + "TEST.odt", mimeArgs);
System.out.println("...done");
System.out.println("Checking loading meta-data from stored file...");
xDP.loadFromMedium(temp + "TEST.odt", noArgs);
System.out.println("...done");
System.out.println("Checking user-defined meta-data from stored file...");
udpc = xDP.getUserDefinedProperties();
udps = UnoRuntime.queryInterface( XPropertySet.class, udpc );
assertTrue("UserDefined bool", new Boolean(b).equals(
udps.getPropertyValue("Frobnicate")));
assertTrue("UserDefined duration", eqDuration(dur, (Duration)
udps.getPropertyValue("FrobDuration")));
// this is now a Duration!
Duration t_dur = new Duration(false, (short)0, (short)0, (short)0,
t.Hours, t.Minutes, t.Seconds,
(short)(10 * t.HundredthSeconds));
assertTrue("UserDefined time", eqDuration(t_dur, (Duration)
udps.getPropertyValue("FrobDuration2")));
assertTrue("UserDefined date", eqDate(date, (Date)
udps.getPropertyValue("FrobEndDate")));
assertTrue("UserDefined datetime", eqDateTime(dt, (DateTime)
udps.getPropertyValue("FrobStartTime")));
assertTrue("UserDefined float", new Double(d).equals(
udps.getPropertyValue("Pi")));
assertTrue("UserDefined string", "bar".equals(
udps.getPropertyValue("Foo")));
try {
udps.getPropertyValue("Removed");
fail("UserDefined remove didn't");
} catch (UnknownPropertyException e) {
// ok
}
System.out.println("...done");
System.out.println("Checking notification listener interface...");
Listener listener = new Listener();
XModifyBroadcaster xMB = UnoRuntime.queryInterface( XModifyBroadcaster.class, xDP );
xMB.addModifyListener(listener);
xDP.setAuthor("not me");
assertTrue("Listener Author", listener.reset());
udpc.addProperty("Listener", PropertyAttribute.REMOVEABLE, "foo");
assertTrue("Listener UserDefined Add", listener.reset());
udps.setPropertyValue("Listener", "bar");
assertTrue("Listener UserDefined Set", listener.reset());
udpc.removeProperty("Listener");
assertTrue("Listener UserDefined Remove", listener.reset());
xMB.removeModifyListener(listener);
udpc.addProperty("Listener2", PropertyAttribute.REMOVEABLE, "foo");
assertTrue("Removed Listener UserDefined Add", !listener.reset());
System.out.println("...done");
} catch (Exception e) {
report(e);
}
}
// grrr...
boolean eqDateTime(DateTime a, DateTime b) {
return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day
&& a.Hours == b.Hours && a.Minutes == b.Minutes
&& a.Seconds == b.Seconds
&& a.HundredthSeconds == b.HundredthSeconds;
}
boolean eqDate(Date a, Date b) {
return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day;
}
boolean eqTime(Time a, Time b) {
return a.Hours == b.Hours && a.Minutes == b.Minutes
&& a.Seconds == b.Seconds
&& a.HundredthSeconds == b.HundredthSeconds;
}
boolean eqDuration(Duration a, Duration b) {
return a.Years == b.Years && a.Months == b.Months && a.Days == b.Days
&& a.Hours == b.Hours && a.Minutes == b.Minutes
&& a.Seconds == b.Seconds
&& a.MilliSeconds == b.MilliSeconds
&& a.Negative == b.Negative;
}
java.util.Collection fromArray(Object[] os) {
java.util.Collection ret = new java.util.HashSet();
for (int i = 0; i < os.length; ++i) {
ret.add(os[i]);
}
return ret;
}
// bah, structs do not have proper equals(), and uno.Type is not comparable
public static boolean containsNV (NamedValue[] nvs, NamedValue nv) {
for (int i = 0; i < nvs.length; ++i) {
if (nvs[i].Name.equals(nv.Name) && nvs[i].Value.equals(nv.Value)) {
return true;
}
}
return false;
}
public void report(Exception e) {
System.out.println("Exception occurred:");
e.printStackTrace();
fail();
}
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: " + DocumentProperties.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: " + DocumentProperties.class.getName() );
System.out.println( "------------------------------------------------------------" );
connection.tearDown();
}
private static final OfficeConnection connection = new OfficeConnection();
}