/**************************************************************
*
* 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 ifc.registry;
import lib.MultiMethodTest;
import lib.Status;
import lib.StatusException;
import util.RegistryTools;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.registry.InvalidRegistryException;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.registry.XSimpleRegistry;
/**
* Testing com.sun.star.registry.XSimpleRegistry
* interface methods :
*
getURL()
open()
isValid()
close()
destroy()
getRootKey()
isReadOnly()
mergeKey()
* This test needs the following object relations : *
'NR'
optional (of type String
):
* if this object relation isn't null than the testing component
* doesn't support some methods of the interface
* (open(), close(), destroy()
)'XSimpleRegistry.open'
(of type String
):
* The full system path to the registry file which is opened and modified.
* 'XSimpleRegistry.destroy'
(of type String
):
* The full system path to the registry fiel which is destroyed.
* 'XSimpleRegistry.merge'
(of type String
):
* The full system path to the registry file which is merged with the
* registry tested.
*
* @see com.sun.star.registry.XSimpleRegistry
*/
public class _XSimpleRegistry extends MultiMethodTest {
public XSimpleRegistry oObj = null;
protected String nr = null;
protected boolean configuration = false;
protected String openF = null;
protected String destroyF = null;
protected String mergeF = null;
/**
* Retrieves object relations.
* @throws StatusException If one of required relations not found.
*/
protected void before() {
if (tEnv.getObjRelation("configuration") != null) {
configuration = true;
}
nr = (String) tEnv.getObjRelation("NR");
openF = (String) tEnv.getObjRelation("XSimpleRegistry.open");
if (openF == null) {
throw new StatusException(Status.failed(
"Relation 'XSimpleRegistry.open' not found"));
}
destroyF = (String) tEnv.getObjRelation("XSimpleRegistry.destroy");
if (destroyF == null) {
throw new StatusException(Status.failed(
"Relation 'XSimpleRegistry.destroy' not found"));
}
mergeF = (String) tEnv.getObjRelation("XSimpleRegistry.merge");
if (mergeF == null) {
throw new StatusException(Status.failed(
"Relation 'XSimpleRegistry.merge' not found"));
}
}
/**
* If the method is supported opens the registry key with the URL
* from 'XSimpleRegistry.open'
relation, then closes it.
*
* Has OK status if the method isn't supported by the component
* (the object relation 'NR'
isn't null) or no exceptions were
* thrown during open/close operations.
*/
public void _open() {
if (nr != null) {
log.println("'open()' isn't supported by '" + nr + "'");
tRes.tested("open()", true);
return;
}
log.println("Trying to open registry :" + openF);
try {
oObj.open(openF, false, true);
oObj.close();
} catch (InvalidRegistryException e) {
e.printStackTrace(log);
tRes.tested("open()", false);
return;
}
tRes.tested("open()", true);
}
/**
* Test opens the registry key with the URL from
* 'XSimpleRegistry.open'
relation not only for read,
* calls the method, checks returned value and closes the registry.
* * Has OK status if returned value is false and no exceptions were * thrown.
*/
public void _isReadOnly() {
boolean result = false;
try {
openReg(oObj, openF, false, true);
result = !oObj.isReadOnly();
closeReg(oObj);
} catch (InvalidRegistryException e) {
e.printStackTrace(log);
result = false;
}
tRes.tested("isReadOnly()", result);
}
/**
* Test opens the registry key with the URL from
* 'XSimpleRegistry.open'
relation, calls the method,
* checks returned value and closes the registry key.
* * Has OK status if returned value isn't null and no exceptions were * thrown.
*/
public void _getRootKey() {
boolean result = false;
try {
openReg(oObj, openF, false, true);
XRegistryKey rootKey = oObj.getRootKey();
result = rootKey != null;
closeReg(oObj);
} catch (InvalidRegistryException e) {
e.printStackTrace(log);
result = false;
}
tRes.tested("getRootKey()", result);
}
/**
* Merges the current registry with the registry from URL got from
* 'XSimpleRegistry.merge'
relation under 'MergeKey' key.
* Then the keys of these two registries retrieved :
*
*
* Has OK status if the method isn't supported by the component
* (the object relation 'NR'
isn't null)
* or
* if it's supported and after successfull merging the keys mentioned
* above are recursively equal.
*/
public void _mergeKey() {
if (configuration) {
log.println(
"You can't merge into this registry. It's just a wrapper for a configuration node, which has a fixed structure which can not be modified");
tRes.tested("mergeKey()", true);
return;
}
if (nr != null) {
log.println("'mergeKey()' isn't supported by '" + nr + "'");
tRes.tested("mergeKey()", true);
return;
}
openReg(oObj, openF, false, true);
try {
RegistryTools.printRegistryInfo(oObj.getRootKey(), log);
oObj.mergeKey("MergeKey", mergeF);
RegistryTools.printRegistryInfo(oObj.getRootKey(), log);
} catch (com.sun.star.registry.MergeConflictException e) {
e.printStackTrace(log);
tRes.tested("mergeKey()", false);
return;
} catch (com.sun.star.registry.InvalidRegistryException e) {
e.printStackTrace(log);
tRes.tested("mergeKey()", false);
return;
}
boolean isEqual = false;
XSimpleRegistry reg = null;
try {
reg = RegistryTools.createRegistryService((XMultiServiceFactory) tParam.getMSF());
} catch (com.sun.star.uno.Exception e) {
log.print("Can't create registry service: ");
e.printStackTrace(log);
tRes.tested("mergeKey()", false);
return;
}
openReg(reg, mergeF, false, true);
try {
XRegistryKey key = oObj.getRootKey().openKey("MergeKey");
XRegistryKey mergeKey = reg.getRootKey();
isEqual = RegistryTools.compareKeyTrees(key, mergeKey);
} catch (com.sun.star.registry.InvalidRegistryException e) {
log.print("Can't get root key: ");
e.printStackTrace(log);
tRes.tested("mergeKey()", false);
return;
}
closeReg(reg);
closeReg(oObj);
tRes.tested("mergeKey()", isEqual);
}
/**
* Test opens the registry key with the URL from
* 'XSimpleRegistry.open'
relation, calls the method,
* checks returned value and closes the registry key.
* * Has OK status if returned value isn't null and if length of the * returned string is greater than 0.
*/
public void _getURL() {
openReg(oObj, openF, false, true);
String url = oObj.getURL();
closeReg(oObj);
log.println("Getting URL: " + url+";");
tRes.tested("getURL()", (url != null));
}
/**
* Test checks value returned by the object relation 'NR'
,
* opens the registry key with the URL from
* XSimpleRegistry.open'
relation, calls the method
* and checks the validity of the registry key.
*
* Has OK status if the registry key isn't valid after the method
* call, or if the method isn't supported by the component (the object
* relation 'NR'
isn't null).
*/
public void _close() {
if (nr != null) {
log.println("'close()' isn't supported by '" + nr + "'");
tRes.tested("close()", true);
return;
}
try {
oObj.open(openF, false, true);
oObj.close();
} catch (com.sun.star.registry.InvalidRegistryException e) {
e.printStackTrace(log);
tRes.tested("close()", false);
return;
}
tRes.tested("close()", !oObj.isValid());
}
/**
* Test checks value returned by the object relation 'NR'
,
* opens the registry key with the URL from
* 'XSimpleRegistry.destroy'
relation, calls the method
* and checks the validity of the registry key.
*
* Has OK status if the registry key isn't valid after the method
* call, or if the method isn't supported by the component (the object
* relation 'NR'
isn't null).
*/
public void _destroy() {
if (configuration) {
log.println(
"This registry is a wrapper for a configuration access. It can not be destroyed.");
tRes.tested("destroy()", true);
return;
}
if (nr != null) {
log.println("'destroy()' isn't supported by '" + nr + "'");
tRes.tested("destroy()", true);
return;
}
try {
oObj.open(destroyF, false, true);
oObj.destroy();
} catch (com.sun.star.registry.InvalidRegistryException e) {
e.printStackTrace(log);
tRes.tested("destroy()", false);
return;
}
tRes.tested("destroy()", !oObj.isValid());
}
/**
* Test opens the registry key with the URL from
* 'XSimpleRegistry.open'
relation, calls the method,
* checks returned value and closes the registry key.
* Has OK status if returned value is true.
*/
public void _isValid() {
boolean valid = true;
openReg(oObj, openF, false, true);
valid = oObj.isValid();
closeReg(oObj);
tRes.tested("isValid()", valid);
}
/**
* Method calls close()
of the interface
* com.sun.star.registry.XRegistryKey
.
* @param reg interface com.sun.star.registry.XRegistryKey
* @param url specifies the complete URL to access the data source
* @param arg1 specifies if the data source should be opened for read only
* @param arg2 specifies if the data source should be created if it does not
* already exist
*/
public void openReg(XSimpleRegistry reg, String url, boolean arg1,
boolean arg2) {
if (nr == null) {
try {
reg.open(url, arg1, arg2);
} catch (com.sun.star.registry.InvalidRegistryException e) {
log.print("Couldn't open registry:");
e.printStackTrace(log);
}
}
}
/**
* Method calls close()
of the interface
* com.sun.star.registry.XRegistryKey
.
* @param reg com.sun.star.registry.XRegistryKey
*/
public void closeReg(XSimpleRegistry reg) {
if (nr == null) {
try {
reg.close();
} catch (com.sun.star.registry.InvalidRegistryException e) {
log.print("Couldn't close registry:");
e.printStackTrace(log);
}
}
}
}