
org.tango.client.database.cache.NoCacheDatabase Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JTangoCommons Show documentation
Show all versions of JTangoCommons Show documentation
Common classes for tango java API
The newest version!
package org.tango.client.database.cache;
import fr.esrf.Tango.DevFailed;
import fr.esrf.Tango.DevVarLongStringArray;
import fr.esrf.TangoApi.DbDatum;
import fr.esrf.TangoApi.DeviceData;
import org.apache.commons.lang3.ArrayUtils;
import org.tango.TangoHostManager;
import org.tango.client.database.DeviceExportInfo;
import org.tango.client.database.DeviceImportInfo;
import org.tango.utils.CaseInsensitiveMap;
import java.util.*;
public final class NoCacheDatabase implements ICachableDatabase {
private final fr.esrf.TangoApi.Database database;
/**
* Ctr
*
* @param host
* host name of the tango db
* @param port
* port number of the tango db
* @throws DevFailed
*/
public NoCacheDatabase(final String host, final String port) throws DevFailed {
database = new fr.esrf.TangoApi.Database(host, port);
// force check access control
database.isCommandAllowed("database", "DbImportDevice");
}
/**
* Export a tango device into the tango db (execute DbExportDevice on DB
* device)
*
* @param info
* export info {@link DeviceExportInfo}
* @throws DevFailed
*/
@Override
public void exportDevice(final DeviceExportInfo info) throws DevFailed {
final String[] array = info.toStringArray();
final DeviceData argin = new DeviceData();
argin.insert(array);
database.command_inout("DbExportDevice", argin);
}
/**
* Get the list of instance for an executable.(execute DbGetInstanceNameList
* on DB device)
*
* @param dsExecName
* The executable name
* @return the list of instance
* @throws DevFailed
*/
@Override
public String[] getInstanceNameList(final String dsExecName) throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(dsExecName);
final DeviceData argout = database.command_inout("DbGetInstanceNameList", argin);
return argout.extractStringArray();
}
/**
* Import a tango device from the tango db (execute DbImportDevice on DB
* device)
*
* @param toBeImported
* the device to import
* @return {@link DeviceImportInfo}
* @throws DevFailed
*/
@Override
public DeviceImportInfo importDevice(final String toBeImported) throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(toBeImported);
final DeviceData argout = database.command_inout("DbImportDevice", argin);
final DevVarLongStringArray info = argout.extractLongStringArray();
return new DeviceImportInfo(info);
}
/**
* Export a server into the tango db (execute DbUnExportServer on DB device)
*
* @param serverName
* The server name
* @throws DevFailed
*/
@Override
public void unexportServer(final String serverName) throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(serverName);
database.command_inout("DbUnExportServer", argin);
}
/**
* Get the list of device for a server and a class (execute DbGetDeviceList
* on DB device)
*
* @param serverName
* The server name
* @param className
* The class name
* @return
* @throws DevFailed
*/
@Override
public String[] getDeviceList(final String serverName, final String className) throws DevFailed {
final DeviceData send = new DeviceData();
send.insert(new String[] { serverName, className });
final DeviceData received = database.command_inout("DbGetDeviceList", send);
return received.extractStringArray();
}
/**
* Get some properties value for a device. (execute DbGetDevicePropertyList
* on DB device)
*
* @param name
* The device name
* @param propertyNames
* The list of properties to retrieve. Empty if all
* @return
* @throws DevFailed
*/
@Override
public Map getDeviceProperties(final String name, final String... propertyNames) throws DevFailed {
Map map;
if (propertyNames.length == 0) {
map = getProperties(PropertyType.Device, name);
} else {
map = getProperty(PropertyType.Device, name, propertyNames);
}
return map;
}
/**
* Set values of device properties. (execute DbPutDeviceProperty on DB
* device)
*
* @param deviceName
* The device name
* @param properties
* The properties names and their values
* @throws DevFailed
*/
@Override
public void setDeviceProperties(final String deviceName, final Map properties) throws DevFailed {
final List args = getArray(properties, deviceName);
final DeviceData argin = new DeviceData();
argin.insert(args.toArray(new String[args.size()]));
database.command_inout("DbPutDeviceProperty", argin);
}
/**
* Get a class properties. (execute DbGetClassPropertyList on DB device)
*
* @param name
* The class name
* @param propertyNames
* The properties names
* @return
* @throws DevFailed
*/
@Override
public Map getClassProperties(final String name, final String... propertyNames) throws DevFailed {
Map map;
if (propertyNames.length == 0) {
map = getProperties(PropertyType.Class, name);
} else {
map = getProperty(PropertyType.Class, name, propertyNames);
}
return map;
}
/**
* Set a tango class properties. (execute DbPutClassProperty on DB device)
*
* @param name
* The class name
* @param properties
* The properties names and values.
* @throws DevFailed
*/
@Override
public void setClassProperties(final String name, final Map properties) throws DevFailed {
final List args = getArray(properties, name);
final DeviceData argin = new DeviceData();
argin.insert(args.toArray(new String[args.size()]));
database.command_inout("DbPutClassProperty", argin);
}
/**
* Get an attribute properties. (execute DbGetDeviceAttributeProperty2 on DB
* device)
*
* @param deviceName
* The device name
* @param attributeName
* The attribute name
* @return
* @throws DevFailed
*/
@Override
public Map getAttributeProperties(final String deviceName, final String attributeName)
throws DevFailed {
Map map;
final DeviceData argin = new DeviceData();
final List args = new ArrayList();
args.add(deviceName);
args.add(attributeName);
// value is an array
argin.insert(args.toArray(new String[args.size()]));
final DeviceData argout = database.command_inout("DbGetDeviceAttributeProperty2", argin);
final String[] result = argout.extractStringArray();
map = extractArgout(result, 4);
return map;
}
/**
* Set some attribute properties. (execute DbPutDeviceAttributeProperty2 on
* DB device)
*
* @param deviceName
* The device name
* @param attributeName
* The attribute name
* @param properties
* The properties names and values.
* @throws DevFailed
*/
@Override
public void setAttributeProperties(final String deviceName, final String attributeName,
final Map properties) throws DevFailed {
final DeviceData argin = new DeviceData();
final List args = new ArrayList();
args.add(deviceName);
args.add(Integer.toString(1)); // attribute number
args.add(attributeName);
args.add(Integer.toString(properties.size())); // property number
for (final Map.Entry entry : properties.entrySet()) {
args.add(entry.getKey());
final String[] propValues = entry.getValue();
args.add(Integer.toString(propValues.length));
for (final String propValue : propValues) {
args.add(propValue);
}
}
argin.insert(args.toArray(new String[args.size()]));
database.command_inout("DbPutDeviceAttributeProperty2", argin);
}
private Map getProperties(final PropertyType type, final String devOrClass) throws DevFailed {
Map map;
final DeviceData argin = new DeviceData();
if (type.equals(PropertyType.Class)) {
argin.insert(devOrClass);
} else {
argin.insert(new String[] { devOrClass, "*" });
}
final DeviceData argout = database.command_inout("DbGet" + type + "PropertyList", argin);
final List properties = new ArrayList(Arrays.asList(argout.extractStringArray()));
// remove defaut properties and device name that is returned!
properties.remove("logging_level");
properties.remove("logging_target");
properties.remove("poll_old_factor");
properties.remove("poll_ring_depth");
properties.remove(devOrClass);
if (properties.size() > 0) {
map = getProperty(type, devOrClass, properties.toArray(new String[properties.size()]));
} else {
map = new HashMap();
}
return map;
}
private Map getProperty(final PropertyType type, final String devOrClass,
final String... propNames) throws DevFailed {
// Format input parameters as string array
final String[] array = ArrayUtils.add(propNames, 0, devOrClass);
// Read Database
final DeviceData argin = new DeviceData();
argin.insert(array);
final DeviceData argout = database.command_inout("DbGet" + type + "Property", argin);
final String[] result = argout.extractStringArray();
// {deviceName,nbProps,propName1,propSize1,values1,...propNameN,propSizeN,valuesN}
// System.out.println("result " + Arrays.toString(result));
// System.out.println(result.length);
return extractArgout(result, 2);
}
/**
* Return a map of properties with name as key and value as entry
*
* @param result
* Array {propName, propSize, values...,propNameN, propSizeN,
* valuesN}
* @param startingPoint
* @return
*/
private Map extractArgout(final String[] result, final int startingPoint) {
final Map map = new CaseInsensitiveMap();
if (result.length > 4) {
// System.out.println(result[0]);// device name
// System.out.println(Integer.valueOf(result[1]));// prop size
// System.out.println(result[2]);// prop name
int i = startingPoint;
int nextSize = Integer.valueOf(result[i + 1]);
while (i < result.length) {
// System.out.println("i " + i);
if (nextSize > 0) {
final String name = result[i].toLowerCase(Locale.ENGLISH);
final String[] propValues = Arrays.copyOfRange(result, i + 2, nextSize + i + 2);
map.put(name, propValues);
// System.out.println("name " + name);
// System.out.println("prop1 " + Arrays.toString(propValues));
}
final int idxNextPropSize;
if (nextSize == 0) {
// System.out.println("zero");
idxNextPropSize = i + 4;
i = i + 3;
} else {
idxNextPropSize = nextSize + i + 3;
i = nextSize + i + 2;
}
// System.out.println("idxNextPropSize " + idxNextPropSize);
if (idxNextPropSize >= result.length) {
break;
}
// System.out.println("idxNextPropSize value " +
// result[idxNextPropSize]);
nextSize = Integer.valueOf(result[idxNextPropSize]);
// System.out.println("nextSize " + nextSize);
}
}
return map;
}
@Override
public void deleteDeviceProperty(final String deviceName, final String propertyName) throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(new String[] { deviceName, propertyName });
database.command_inout("DbDeleteDeviceProperty", argin);
}
@Override
public void deleteAttributeProperties(final String deviceName, final String... attributeNames) throws DevFailed {
final DeviceData argin = new DeviceData();
if (attributeNames == null || attributeNames.length == 0) {
// delete all properties of the device
argin.insert(new String[] { deviceName, "*" });
} else {
argin.insert(ArrayUtils.add(attributeNames, 0, deviceName));
}
database.command_inout("DbDeleteAllDeviceAttributeProperty", argin);
}
@Override
public void deleteDevicePipeProperties(final String deviceName, final String... pipeNames) throws DevFailed {
final DeviceData argin = new DeviceData();
if (pipeNames == null || pipeNames.length == 0) {
// delete all properties of the device
argin.insert(new String[] { deviceName, "*" });
} else {
argin.insert(ArrayUtils.add(pipeNames, 0, deviceName));
}
database.command_inout("DbDeleteAllDevicePipeProperty", argin);
}
@Override
public void loadCache(final String serverName, final String hostName) throws DevFailed {
}
@Override
public void clearCache() {
}
@Override
public String getVersion() {
return "no cache";
}
@Override
public boolean isCacheAvailable() {
return false;
}
@Override
public String getAccessDeviceName() throws DevFailed {
String access = "";
final DbDatum prop = database.get_property("CtrlSystem", "Services");
if (prop != null) {
final String[] r = prop.extractStringArray();
if (r != null) {
for (final String string : r) {
// get device name
if (string.startsWith("AccessControl")) {
access = string.substring(string.indexOf(':') + 1);
}
}
}
}
return access;
}
@Override
public String[] getPossibleTangoHosts() throws DevFailed {
String[] tangoHosts = null;
try {
final DeviceData deviceData = database.command_inout("DbGetCSDbServerList");
tangoHosts = deviceData.extractStringArray();
} catch (final DevFailed e) {
// this is an old database server
final String desc = e.errors[0].desc.toLowerCase();
if (desc.startsWith("command ") && desc.endsWith("not found")) {
tangoHosts = new String[] { TangoHostManager.getFirstFullTangoHost() };
} else {
throw e;
}
}
return tangoHosts;
}
@Override
public String getFreeProperty(final String name, final String propertyName) throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(new String[] { name, propertyName });
final DeviceData deviceData = database.command_inout("DbGetProperty", argin);
String result = "";
if (deviceData.extractStringArray().length > 4) {
result = deviceData.extractStringArray()[4];
}
return result;
}
@Override
public Map getDevicePipeProperties(final String deviceName, final String pipeName)
throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(new String[] { deviceName, pipeName });
final DeviceData argout = database.command_inout("DbGetDevicePipeProperty", argin);
final String[] result = argout.extractStringArray();
return extractArgout(result, 4);
}
@Override
public void setDevicePipeProperties(final String deviceName, final String pipeName,
final Map properties) throws DevFailed {
// argin desc: Str[0] = Device name,Str[1] = Pipe number,Str[2] = Pipe name
final List args = getArray(properties, deviceName, "1", pipeName);
final DeviceData argin = new DeviceData();
final String[] array = args.toArray(new String[args.size()]);
argin.insert(array);
database.command_inout("DbPutDevicePipeProperty", argin);
}
@Override
public Map getClassPipeProperties(final String className, final String pipeName) throws DevFailed {
final DeviceData argin = new DeviceData();
argin.insert(new String[] { className, pipeName });
final DeviceData argout = database.command_inout("DbGetClassPipeProperty", argin);
final String[] result = argout.extractStringArray();
return extractArgout(result, 2);
}
@Override
public void setClassPipeProperties(final String className, final String pipeName,
final Map properties) throws DevFailed {
final List args = getArray(properties, className);
final DeviceData argin = new DeviceData();
argin.insert(args.toArray(new String[args.size()]));
database.command_inout("DbPutClassPipeProperty", argin);
}
private List getArray(final Map properties, final String... start) {
final List args = new ArrayList();
for (int i = 0; i < start.length; i++) {
args.add(start[i]);
}
args.add(Integer.toString(properties.size()));
for (final Map.Entry entry : properties.entrySet()) {
args.add(entry.getKey());
final String[] propValues = entry.getValue();
args.add(Integer.toString(propValues.length));
for (final String propValue : propValues) {
args.add(propValue);
}
}
return args;
}
private enum PropertyType {
Class, Device;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy