/* * 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 mod._fwk; import java.io.PrintWriter; import lib.StatusException; import lib.TestCase; import lib.TestEnvironment; import lib.TestParameters; import com.sun.star.beans.NamedValue; import com.sun.star.beans.PropertyValue; import com.sun.star.container.XHierarchicalNameAccess; import com.sun.star.container.XNameAccess; import com.sun.star.container.XNameContainer; import com.sun.star.container.XNameReplace; import com.sun.star.container.XNamed; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.lang.XTypeProvider; import com.sun.star.task.XJob; import com.sun.star.uno.Type; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XInterface; import com.sun.star.util.XChangesBatch; import com.sun.star.uno.AnyConverter; /** * Test for object that implements the following interfaces : *
com::sun::star::task::XJobExecutor
* The following files are needed for testcase creation : *
qadevlibs/JobExecutor.jar
:
* this is java component test.Job
which
* should be registered before or during this testcase
* creation. This component must implement
* com.sun.star.task.XJob
interface and count
* execute
method calls. It also should
* implement container.XNamed
interface and
* getName
method must return string with number
* of calls.
*
* Also important prerequicity: if Job and Event is not yet
* added to configuration or test.Job
component is
* not yet registered, the SOffice must be destroyed during
* testcase initialization.
* * @see com.sun.star.task.XJobExecutor * @see ifc.task._XJobExecutor */ public class JobExecutor extends TestCase { static Job job = new Job(); XNamed xNamed = null; Object oRootCfg = null; /** * For testcase initializing : *
test.Job
must be registered in
* SOffice registry. org.OpenOffice.Office.Jobs
* must be updated. TestJob
must be registered for
* service test.Job
and event for this job named
* TextEvent
must be registered.
*
* First these two conditions are checked. If job and event are not
* registered they are inserted into configuration and committed.
* After what SOffice must be destroyed for proper initialization
* of JobExecutor
after startup.
*
* Then if the implementation was not registered before it is
* registered in soffice applicat.rbd
file (registering
* the component in currently running Java environment has no effect
* for JobExecutor
in some reasons).
*
* Note: SOffice is started again while the next
* (XMultiServiceFactory)SOLink.getMSF()
call.
*/
@Override
protected void initialize(TestParameters Param, PrintWriter log) throws Exception {
boolean configured = false;
try {
Param.getMSF().createInstance("test.Job");
} catch(com.sun.star.uno.Exception e) {
log.println("Service test.Job is not yet registered.");
String message = "You have to register 'test.Job' before office is started.\n";
message += "Please run '$OFFICEPATH/program/pkgchk $DOCPTH/qadevlibs/JobExecutor.jar'";
throw new StatusException(message, e);
}
XNameAccess jobs = null;
XNameAccess events = null;
Object obj = Param.getMSF().createInstance
("com.sun.star.configuration.ConfigurationProvider");
XMultiServiceFactory xConfigMSF = UnoRuntime.queryInterface(XMultiServiceFactory.class, obj);
PropertyValue[] args = new PropertyValue[1];
args[0] = new PropertyValue();
args[0].Name = "nodepath";
args[0].Value = "org.openoffice.Office.Jobs";
oRootCfg = xConfigMSF.createInstanceWithArguments(
"com.sun.star.configuration.ConfigurationUpdateAccess", args);
XHierarchicalNameAccess xHNA = UnoRuntime.queryInterface(XHierarchicalNameAccess.class, oRootCfg);
obj = xHNA.getByHierarchicalName("Jobs");
jobs = UnoRuntime.queryInterface
(XNameAccess.class, obj);
obj = xHNA.getByHierarchicalName("Events");
events = UnoRuntime.queryInterface
(XNameAccess.class, obj);
configured = jobs.hasByName("TestJob") && events.hasByName("TestEvent");
log.println("Test job and event is "
+ (configured ? "already" : "not yet") + " configured.");
if (!configured) {
log.println("Adding configuration to Jobs ...");
XSingleServiceFactory jobsFac = UnoRuntime.queryInterface(XSingleServiceFactory.class, jobs);
Object oNewJob = jobsFac.createInstance();
XNameReplace xNewJobNR = UnoRuntime.queryInterface(XNameReplace.class, oNewJob);
xNewJobNR.replaceByName("Service", "test.Job");
XNameContainer xJobsNC = UnoRuntime.queryInterface(XNameContainer.class, jobs);
xJobsNC.insertByName("TestJob", oNewJob);
log.println("Adding configuration to Events ...");
XSingleServiceFactory eventsFac = UnoRuntime.queryInterface(XSingleServiceFactory.class, events);
Object oNewEvent = eventsFac.createInstance();
XNameAccess xNewEventNA = UnoRuntime.queryInterface(XNameAccess.class, oNewEvent);
Object oJobList = xNewEventNA.getByName("JobList");
XSingleServiceFactory jobListFac = (XSingleServiceFactory)
AnyConverter.toObject(new Type(XSingleServiceFactory.class),
oJobList);
XNameContainer jobListNC = (XNameContainer)
AnyConverter.toObject(new Type(XNameContainer.class),
oJobList);
log.println("\tAdding TimeStamps to Events ...");
Object oNewJobTimeStamps = jobListFac.createInstance();
jobListNC.insertByName("TestJob", oNewJobTimeStamps);
XNameContainer xEventsNC = UnoRuntime.queryInterface(XNameContainer.class, events);
xEventsNC.insertByName("TestEvent", oNewEvent);
XChangesBatch xCB = UnoRuntime.queryInterface(XChangesBatch.class, oRootCfg);
xCB.commitChanges();
util.utils.waitForEventIdle(Param.getMSF());
}
}
/**
* Creating a TestEnvironment for the interfaces to be tested.
*
* Service com.sun.star.comp.framework.JobExecutor
* is created.
*/
@Override
protected TestEnvironment createTestEnvironment(TestParameters Param, PrintWriter log) throws Exception {
XInterface oObj = (XInterface)Param.getMSF().createInstance(
"com.sun.star.comp.framework.JobExecutor");
Object job = Param.getMSF().createInstance("test.Job");
xNamed = UnoRuntime.queryInterface(XNamed.class, job);
log.println("Count = " + xNamed.getName());
TestEnvironment tEnv = new TestEnvironment( oObj );
tEnv.addObjRelation("CallCounter", xNamed);
return tEnv;
} // finish method getTestEnvironment
@Override
protected void cleanup( TestParameters Param, PrintWriter log) {
}
}
/**
* Currently not used.
*/
class Job implements
XServiceInfo, XSingleServiceFactory {
private static class Impl implements XServiceInfo, XTypeProvider, XJob, XNamed {
int callCount = 0;
public byte[] getImplementationId() {
return new byte[0];
}
public Type[] getTypes() {
Class> interfaces[] = getClass().getInterfaces();
Type types[] = new Type[interfaces.length];
for(int i = 0; i < interfaces.length; ++ i)
types[i] = new Type(interfaces[i]);
return types;
}
public Object execute(NamedValue[] param) {
callCount++;
return null;
}
public String getName() {
return String.valueOf(callCount);
}
public void setName(String n) {}
public boolean supportsService(String name) {
return __serviceName.equals(name);
}
public String[] getSupportedServiceNames() {
return new String[] {__serviceName};
}
public String getImplementationName() {
return getClass().getName();
}
}
private static final String __serviceName = "test.Job";
private static Impl impl = new Impl();
public Object createInstanceWithArguments(Object[] args) {
return impl;
}
public Object createInstance() {
return createInstanceWithArguments(null);
}
public boolean supportsService(String name) {
return __serviceName.equals(name);
}
public String[] getSupportedServiceNames() {
return new String[] {__serviceName};
}
public String getImplementationName() {
return getClass().getName();
}
}