blob: 24d172725402622c40b39d5339d078e85dc9b3e8 [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 mod._fwk;
import java.io.PrintWriter;
import lib.Status;
import lib.StatusException;
import lib.TestCase;
import lib.TestEnvironment;
import lib.TestParameters;
import util.utils;
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 :
* <ul>
* <li><code>com::sun::star::task::XJobExecutor</code></li>
* </ul><p>
* The following files are needed for testcase creation :
* <ul>
* <li> <code>qadevlibs/JobExecutor.jar</code> :
* this is java component <code>test.Job</code> which
* should be registered before or during this testcase
* creation. This component must implement
* <code>com.sun.star.task.XJob</code> interface and count
* <code>execute</code> method calls. It also should
* implement <code>container.XNamed</code> interface and
* <code>getName</code> method must return string with number
* of calls.</li>
* <ul> <p>
*
* Also <b>important prerequicity</b>: if Job and Event is not yet
* added to configuration or <code>test.Job</code> component is
* not yet registered, the SOffice <b>must be destroyed</b> during
* testcase initialization. <p>
*
* @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 :
* <ol>
* <li> Implementation <code>test.Job</code> must be registered in
* SOffice registry. </li>
* <li> Configuration in package <code>org.OpenOffice.Office.Jobs</code>
* must be updated. <code>TestJob</code> must be registered for
* service <code>test.Job</code> and event for this job named
* <code>TextEvent</code> must be registered. </li>
* </ol>. <p>
*
* First these two conditions are checked. If job and event are not
* registered they are inserted into configuration and commited.
* After what SOffice must be destroyed for proper initialization
* of <code>JobExecutor</code> after startup. <p>
*
* Then if the implementation was not registered before it is
* registered in soffice <code>applicat.rbd</code> file (registering
* the component in currently running Java environment has no effect
* for <code>JobExecutor</code> in some reasons). <p>
*
* Note: SOffice is started again while the next
* <code>(XMultiServiceFactory)SOLink.getMSF()</code> call.
*/
protected void initialize(TestParameters Param, PrintWriter log) {
boolean serviceRegistered = false;
boolean configured = false;
try {
Object obj = ((XMultiServiceFactory)Param.getMSF()).createInstance("test.Job");
serviceRegistered = obj != null;
} catch(com.sun.star.uno.Exception e) {}
log.println("Service test.Job is "
+ (serviceRegistered ? "already" : "not yet") + " registered.");
if (! serviceRegistered){
String message = "You have to register 'test.Job' before office is stared.\n";
message += "Please run '$OFFICEPATH/program/pkgchk $DOCPTH/qadevlibs/JobExecutor.jar'";
throw new StatusException(message, new Exception());
}
XNameAccess jobs = null;
XNameAccess events = null;
try {
Object obj = ((XMultiServiceFactory)Param.getMSF()).createInstance
("com.sun.star.configuration.ConfigurationProvider");
XMultiServiceFactory xConfigMSF = (XMultiServiceFactory)
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 = (XHierarchicalNameAccess)
UnoRuntime.queryInterface(XHierarchicalNameAccess.class, oRootCfg);
obj = xHNA.getByHierarchicalName("Jobs");
jobs = (XNameAccess) UnoRuntime.queryInterface
(XNameAccess.class, obj);
obj = xHNA.getByHierarchicalName("Events");
events = (XNameAccess) UnoRuntime.queryInterface
(XNameAccess.class, obj);
} catch (Exception e) {
throw new StatusException("Couldn't get configuration", e);
}
configured = jobs.hasByName("TestJob") && events.hasByName("TestEvent");
log.println("Test job and event is "
+ (configured ? "already" : "not yet") + " configured.");
if (!configured) {
try {
log.println("Adding configuration to Jobs ...");
XSingleServiceFactory jobsFac = (XSingleServiceFactory)
UnoRuntime.queryInterface(XSingleServiceFactory.class, jobs);
Object oNewJob = jobsFac.createInstance();
XNameReplace xNewJobNR = (XNameReplace)
UnoRuntime.queryInterface(XNameReplace.class, oNewJob);
xNewJobNR.replaceByName("Service", "test.Job");
XNameContainer xJobsNC = (XNameContainer)
UnoRuntime.queryInterface(XNameContainer.class, jobs);
xJobsNC.insertByName("TestJob", oNewJob);
log.println("Adding configuration to Events ...");
XSingleServiceFactory eventsFac = (XSingleServiceFactory)
UnoRuntime.queryInterface(XSingleServiceFactory.class, events);
Object oNewEvent = eventsFac.createInstance();
XNameAccess xNewEventNA = (XNameAccess)
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 = (XNameContainer)
UnoRuntime.queryInterface(XNameContainer.class, events);
xEventsNC.insertByName("TestEvent", oNewEvent);
XChangesBatch xCB = (XChangesBatch)
UnoRuntime.queryInterface(XChangesBatch.class, oRootCfg);
xCB.commitChanges();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {}
} catch (com.sun.star.uno.Exception e) {
e.printStackTrace(log);
throw new StatusException("Couldn't change config", e);
}
}
}
/**
* Creating a Testenvironment for the interfaces to be tested.
*
* Service <code>com.sun.star.comp.framework.JobExecutor</code>
* is created.
*/
protected TestEnvironment createTestEnvironment(TestParameters Param, PrintWriter log) {
XInterface oObj = null;
Object job = null;
try {
oObj = (XInterface)((XMultiServiceFactory)Param.getMSF()).createInstance(
"com.sun.star.comp.framework.JobExecutor");
job = (XInterface)((XMultiServiceFactory)Param.getMSF()).createInstance("test.Job");
} catch(com.sun.star.uno.Exception e) {
e.printStackTrace(log);
throw new StatusException(
Status.failed("Couldn't create instance"));
}
xNamed = (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
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 toString().getBytes();
}
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();
}
}
public static final String __serviceName = "test.Job";
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();
}
}