diff --git a/archivingmanager/src/main/java/org/tango/archiving/server/manager/ArchivingManager.java b/archivingmanager/src/main/java/org/tango/archiving/server/manager/ArchivingManager.java index e4eb8e763cfbd1b843537e1397f846fe309118ef..56dda4290c19eae4b57a5926c707c6358d31e91c 100644 --- a/archivingmanager/src/main/java/org/tango/archiving/server/manager/ArchivingManager.java +++ b/archivingmanager/src/main/java/org/tango/archiving/server/manager/ArchivingManager.java @@ -1,17 +1,8 @@ package org.tango.archiving.server.manager; import fr.esrf.Tango.DevFailed; -import fr.soleil.archiving.common.api.ConnectionFactory; -import fr.soleil.archiving.common.api.exception.ArchivingException; import fr.soleil.archiving.hdbtdb.api.ConfigConst; -import fr.soleil.archiving.hdbtdb.api.manager.ArchivingManagerApiRefFactory; -import fr.soleil.archiving.hdbtdb.api.manager.IArchivingManagerApiRef; -import fr.soleil.archiving.hdbtdb.api.tools.ArchivingMessConfig; -import fr.soleil.archiving.hdbtdb.api.tools.mode.Mode; -import fr.soleil.database.connection.AbstractDataBaseConnector; import fr.soleil.database.connection.DataBaseParameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.tango.DeviceState; import org.tango.server.ServerManager; import org.tango.server.annotation.Attribute; @@ -23,6 +14,7 @@ import org.tango.server.annotation.State; import org.tango.server.annotation.Status; import java.util.Arrays; +import java.util.Objects; import java.util.ResourceBundle; /** @@ -86,10 +78,11 @@ import java.util.ResourceBundle; @Device public class ArchivingManager { + public static final boolean IS_HDB_TIMESERIES = System.getProperty("fr.soleil.tango.archiving.hdb.timeseries") != null + && Objects.equals(System.getProperty("fr.soleil.tango.archiving.hdb.timeseries"), "true"); + public static final boolean IS_TDB_TIMESERIES = System.getProperty("fr.soleil.tango.archiving.tdb.timeseries") != null + && Objects.equals(System.getProperty("fr.soleil.tango.archiving.tdb.timeseries"), "true"); private static String VERSION; - private Logger logger = LoggerFactory.getLogger(ArchivingManager.class); - private IArchivingManagerApiRef hdbManager; - private IArchivingManagerApiRef tdbManager; /** * Computer identifier on wich is settled the database DB. The identifier * can be the computer name or its IP address. <br> @@ -153,6 +146,8 @@ public class ArchivingManager { private DeviceState state; @Status private String status; + private IArchivingAccess databaseAccessHDB; + private IArchivingAccess databaseAccessTDB; public static void main(final String[] args) { VERSION = ResourceBundle.getBundle("application").getString("project.version"); @@ -172,6 +167,34 @@ public class ArchivingManager { this.state = state; } + @Init(lazyLoading = true) + public void init() { + connect(); + } + + private void connect() { + StringBuilder statusBuilder = new StringBuilder(); + try { + connectHdb(); + statusBuilder.append("- HDB Archivers: ") + .append(Arrays.toString(databaseAccessHDB.getMExportedArchiverList())) + .append("\n"); + } catch (Throwable e) { + statusBuilder.append("- HDB is not available").append("\n"); + } + try { + connectTdb(); + statusBuilder.append("- TDB Archivers: ") + .append(Arrays.toString(databaseAccessTDB.getMExportedArchiverList())) + .append("\n"); + } catch (Throwable e) { + e.printStackTrace(); + statusBuilder.append("- TDB is not available").append("\n"); + } + state = DeviceState.ON; + status = statusBuilder.toString(); + } + private void connectHdb() throws DevFailed { final DataBaseParameters params = new DataBaseParameters(); @@ -187,12 +210,12 @@ public class ArchivingManager { params.setName(hdbName); if (!hdbSchema.isEmpty()) params.setSchema(hdbSchema); - try { - final AbstractDataBaseConnector hdbConnector = ConnectionFactory.connect(params); - hdbManager = ArchivingManagerApiRefFactory.getInstance(true, hdbConnector); - hdbManager.archivingConfigure(); - } catch (ArchivingException e) { - throw e.toTangoException(); + if (!IS_HDB_TIMESERIES) { + databaseAccessHDB = new HDBTDBAccess(); + databaseAccessHDB.connect(params, true); + } else { + databaseAccessHDB = new TimeseriesAccess(); + databaseAccessHDB.connect(params, true); } } @@ -209,42 +232,15 @@ public class ArchivingManager { params.setName(tdbName); if (!tdbSchema.isEmpty()) params.setSchema(tdbSchema); - try { - final AbstractDataBaseConnector connector = ConnectionFactory.connect(params); - tdbManager = ArchivingManagerApiRefFactory.getInstance(false, connector); - tdbManager.archivingConfigure(); - } catch (ArchivingException e) { - throw e.toTangoException(); + if (!IS_TDB_TIMESERIES) { + databaseAccessTDB = new HDBTDBAccess(); + databaseAccessTDB.connect(params, false); + } else { + databaseAccessTDB = new TimeseriesAccess(); + databaseAccessTDB.connect(params, false); } } - private void connect() { - StringBuilder statusBuilder = new StringBuilder(); - try { - connectHdb(); - statusBuilder.append("- HDB Archivers: ") - .append(Arrays.toString(hdbManager.getMExportedArchiverList())) - .append("\n"); - } catch (Throwable e) { - statusBuilder.append("- HDB is not available").append("\n"); - } - try { - connectTdb(); - statusBuilder.append("- TDB Archivers: ") - .append(Arrays.toString(tdbManager.getMExportedArchiverList())) - .append("\n"); - } catch (Throwable e) { - statusBuilder.append("- TDB is not available").append("\n"); - } - state = DeviceState.ON; - status = statusBuilder.toString(); - } - - @Init(lazyLoading = true) - public void init() { - connect(); - } - public String getStatus() { return status; } @@ -254,16 +250,38 @@ public class ArchivingManager { } /** - * Execute command "ArchivingStartHdb" on device. Start an historical - * archiving for the specified attributes, and following the specified mode. + * Execute command "ArchivingStopHdb" on device. Stops the historical + * archiving for the given attributes. * - * @param argin Archiving arguments... <BR> + * @param argin The attribute list. + */ + @Command(name = "ArchivingStopHdb", inTypeDesc = "The attribute list") + public void archivingStopHdb(final String[] argin) throws DevFailed { + databaseAccessHDB.archivingStop(argin); + } + + /** + * Execute command "ArchivingStopTdb" on device. Stops the temporary + * archiving for the given attributes. + * + * @param argin The attribute list. + */ + @Command(name = "ArchivingStopTdb") + public void archivingStopTdb(final String[] argin) throws DevFailed { + databaseAccessTDB.archivingStop(argin); + } + + /** + * Execute command "ArchivingModifHdb" on device. Change the mode of an + * historical archiving. + * + * @param argin The configuration to switch to... <br> * <blockquote> * <ul> * <li><strong>The first part :</strong> * <ul> * <li><var>argin</var>[0]<b> =</b> the load balancing type of the archiving<br> - * "1", if all the attribute are archived together in the same HdbArchiver device, <br> + * "1", if all the attribute are archived together in the same TdbArchiver device, <br> * "0" otherwise. * <li><var>argin</var>[1]<b> =</b> the number of attributes to archive<br> * <li><var>argin</var>[2] to <var>argin</var> [2 + <var>argin</var>[1] - 1] = the name of each attribute @@ -314,28 +332,13 @@ public class ArchivingManager { * </blockquote> * @see fr.soleil.archiving.hdbtdb.api.tools.ArchivingMessConfig */ - @Command(name = "ArchivingStartHdb") - public void archivingStartHdb(final String[] argin) throws DevFailed { - logger.info("Entering archiving_start_hdb()"); - if (hdbManager == null) { - connectHdb(); - } - if (hdbManager != null) { - try { - final ArchivingMessConfig archivingMessConfig = ArchivingMessConfig - .creationWithoutFullInformation(argin); - hdbManager.archivingStart(archivingMessConfig); - } catch (ArchivingException e) { - e.printStackTrace(); - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - } - logger.info("Exiting archiving_start_hdb()"); + @Command(name = "ArchivingModifHdb") + public void archivingModifHdb(final String[] argin) throws DevFailed { + databaseAccessHDB.archivingModif(argin); } /** - * Execute command "ArchivingStartTdb" on device. Start an temporary + * Execute command "ArchivingStartHdb" on device. Start an historical * archiving for the specified attributes, and following the specified mode. * * @param argin Archiving arguments... <BR> @@ -390,79 +393,21 @@ public class ArchivingManager { * <li><strong>If the Mode is composed of an <i>External Mode</i></strong><br> * <var>argin</var>[<var>index</var>+ 1] = <code>MODE_E</code><br> * <var>index</var> = <var>index</var> + 1<br> - * <li><strong>The Temporary (<i>Intermediate Archiving</i>) archiving specific informations </strong><br> - * <var>argin</var>[<var>index</var>+ 1] = <code>TDB_SPEC</code><br> - * <var>argin</var>[<var>index</var>+ 2] = the <i>export frequency </i>(ms)<br> - * <var>argin</var>[<var>index</var>+ 3] = the <i>keeping window duration </i>in (ms)<br> - * <var>index</var> = <var>index</var> + 3<br> * </ul> * </ul> * </blockquote> * @see fr.soleil.archiving.hdbtdb.api.tools.ArchivingMessConfig */ - @Command(name = "ArchivingStartTdb") - public void archivingStartTdb(final String[] argin) throws DevFailed { - logger.info("Entering archiving_start_tdb()"); - if (tdbManager == null) { - connectTdb(); - } - final ArchivingMessConfig archivingMessConfig = ArchivingMessConfig - .creationWithoutFullInformation(argin); - try { - tdbManager.archivingStart(archivingMessConfig); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - logger.info("Exiting archiving_start_tdb()"); - } - - /** - * Execute command "ArchivingStopHdb" on device. Stops the historical - * archiving for the given attributes. - * - * @param argin The attribute list. - */ - @Command(name = "ArchivingStopHdb", inTypeDesc = "The attribute list") - public void archivingStopHdb(final String[] argin) throws DevFailed { - logger.info("Entering archiving_stop_hdb()"); - if (hdbManager == null) { - connectHdb(); - } - try { - hdbManager.archivingStopConf(argin); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - } - - /** - * Execute command "ArchivingStopTdb" on device. Stops the temporary - * archiving for the given attributes. - * - * @param argin The attribute list. - */ - @Command(name = "ArchivingStopTdb") - public void archivingStopTdb(final String[] argin) throws DevFailed { - logger.info("Entering archiving_stop_tdb()"); - if (tdbManager == null) { - connectTdb(); - } - try { - tdbManager.archivingStopConf(argin); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - logger.info("Exiting archiving_stop_tdb()"); + @Command(name = "ArchivingStartHdb") + public void archivingStartHdb(final String[] argin) throws DevFailed { + databaseAccessHDB.archivingStart(argin); } /** - * Execute command "ArchivingModifHdb" on device. Change the mode of an - * historical archiving. + * Execute command "ArchivingModifTdb" on device. Change the mode of a + * temporary archiving. * - * @param argin The configuration to switch to... <br> + * @param argin The configuration to switch to...... <br> * <blockquote> * <ul> * <li><strong>The first part :</strong> @@ -514,40 +459,32 @@ public class ArchivingManager { * <li><strong>If the Mode is composed of an <i>External Mode</i></strong><br> * <var>argin</var>[<var>index</var>+ 1] = <code>MODE_E</code><br> * <var>index</var> = <var>index</var> + 1<br> + * <li><strong>The Temporary (<i>Intermediate Archiving</i>) archiving specific informations </strong><br> + * <var>argin</var>[<var>index</var>+ 1] = <code>TDB_SPEC</code><br> + * <var>argin</var>[<var>index</var>+ 2] = the <i>export frequency </i>(ms)<br> + * <var>argin</var>[<var>index</var>+ 3] = the <i>keeping window duration </i>in (ms)<br> + * <var>index</var> = <var>index</var> + 3<br> * </ul> * </ul> * </blockquote> * @see fr.soleil.archiving.hdbtdb.api.tools.ArchivingMessConfig */ - @Command(name = "ArchivingModifHdb") - public void archivingModifHdb(final String[] argin) throws DevFailed { - logger.info("Entering archiving_modif_hdb()"); - if (hdbManager == null) { - connectHdb(); - } - final ArchivingMessConfig archivingMessConfig = ArchivingMessConfig - .creationWithoutFullInformation(argin); - try { - hdbManager.archivingStopConf(archivingMessConfig.getAttributeList()); - archivingStartHdb(argin); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - logger.info("Exiting archiving_modif_hdb()"); + @Command(name = "ArchivingModifTdb") + public void archivingModifTdb(final String[] argin) throws DevFailed { + databaseAccessTDB.archivingModif(argin); } /** - * Execute command "ArchivingModifTdb" on device. Change the mode of a - * temporary archiving. + * Execute command "ArchivingStartTdb" on device. Start an temporary + * archiving for the specified attributes, and following the specified mode. * - * @param argin The configuration to switch to...... <br> + * @param argin Archiving arguments... <BR> * <blockquote> * <ul> * <li><strong>The first part :</strong> * <ul> * <li><var>argin</var>[0]<b> =</b> the load balancing type of the archiving<br> - * "1", if all the attribute are archived together in the same TdbArchiver device, <br> + * "1", if all the attribute are archived together in the same HdbArchiver device, <br> * "0" otherwise. * <li><var>argin</var>[1]<b> =</b> the number of attributes to archive<br> * <li><var>argin</var>[2] to <var>argin</var> [2 + <var>argin</var>[1] - 1] = the name of each attribute @@ -603,22 +540,9 @@ public class ArchivingManager { * </blockquote> * @see fr.soleil.archiving.hdbtdb.api.tools.ArchivingMessConfig */ - @Command(name = "ArchivingModifTdb") - public void archivingModifTdb(final String[] argin) throws DevFailed { - logger.info("Entering archiving_modif_tdb()"); - if (tdbManager == null) { - connectTdb(); - } - final ArchivingMessConfig archivingMessConfig = ArchivingMessConfig - .creationWithoutFullInformation(argin); - try { - tdbManager.archivingStopConf(archivingMessConfig.getAttributeList()); - archivingStartTdb(argin); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - logger.info("Exiting archiving_modif_tdb()"); + @Command(name = "ArchivingStartTdb") + public void archivingStartTdb(final String[] argin) throws DevFailed { + databaseAccessTDB.archivingStart(argin); } /** @@ -634,29 +558,7 @@ public class ArchivingManager { */ @Command(name = "IsArchivedHdb") public short[] isArchivedHdb(final String[] argin) throws DevFailed { - logger.info("Entering is_archived_hdb()"); - if (hdbManager == null) { - connectHdb(); - } - short[] argout = new short[argin.length]; - - boolean result = false; - for (int i = 0; i < argin.length; i++) { - try { - result = hdbManager.isArchived(argin[i]); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - if (result) { - argout[i] = 1; - } else { - argout[i] = 0; - } - } - - logger.info("Exiting is_archived_hdb()"); - return argout; + return databaseAccessHDB.isArchived(argin); } /** @@ -672,27 +574,7 @@ public class ArchivingManager { */ @Command(name = "IsArchivedTdb") public short[] isArchivedTdb(final String[] argin) throws DevFailed { - logger.info("Entering is_archived_tdb()"); - short[] argout = new short[argin.length]; - if (tdbManager == null) { - connectTdb(); - } - boolean result = false; - for (int i = 0; i < argin.length; i++) { - try { - result = tdbManager.isArchived(argin[i]); - } catch (final ArchivingException e) { - logger.warn(e.toString(), e); - throw e.toTangoException(); - } - if (result) { - argout[i] = 1; - } else { - argout[i] = 0; - } - } - logger.info("Exiting is_archived_tdb()"); - return argout; + return databaseAccessTDB.isArchived(argin); } /** @@ -746,20 +628,7 @@ public class ArchivingManager { */ @Command(name = "GetArchivingModeHdb") public String[] getArchivingModeHdb(final String argin) throws DevFailed { - logger.info("Entering get_archiving_mode_hdb()"); - if (hdbManager == null) { - connectHdb(); - } - String[] argout; - try { - final Mode mode = hdbManager.getArchivingMode(argin); - argout = mode.toArray(); - } catch (final ArchivingException e) { - logger.error(e.getMessage()); - throw e.toTangoException(); - } - logger.info("Exiting get_archiving_mode_hdb()"); - return argout; + return databaseAccessHDB.getArchivingMode(argin); } /** @@ -818,21 +687,7 @@ public class ArchivingManager { */ @Command(name = "GetArchivingModeTdb") public String[] getArchivingModeTdb(final String argin) throws DevFailed { - logger.info("Entering get_archiving_mode_tdb()"); - String[] argout; - if (tdbManager == null) { - connectTdb(); - } - try { - final Mode mode = tdbManager.getArchivingMode(argin); - argout = mode.toArray(); - } catch (final ArchivingException e) { - logger.error(e.getMessage()); - throw e.toTangoException(); - } - - logger.info("Exiting get_archiving_mode_tdb()"); - return argout; + return databaseAccessTDB.getArchivingMode(argin); } /** @@ -844,21 +699,7 @@ public class ArchivingManager { */ @Command(name = "GetStatusHdb") public String[] getStatusHdb(final String[] argin) throws DevFailed { - logger.info("Entering get_status_hdb()"); - if (hdbManager == null) { - connectHdb(); - } - String[] argout = new String[argin.length]; - - for (int i = 0; i < argin.length; i++) { - try { - argout[i] = hdbManager.getStatus(argin[i]); - } catch (final ArchivingException e) { - throw e.toTangoException(); - } - } - logger.info("Exiting get_status_hdb()"); - return argout; + return databaseAccessHDB.getStatus(argin); } /** @@ -870,20 +711,7 @@ public class ArchivingManager { */ @Command(name = "GetStatusTdb") public String[] getStatusTdb(final String[] argin) throws DevFailed { - logger.info("Entering get_status_tdb()"); - String[] argout = new String[argin.length]; - if (tdbManager == null) { - connectTdb(); - } - for (int i = 0; i < argin.length; i++) { - try { - argout[i] = tdbManager.getStatus(argin[i]); - } catch (final ArchivingException e) { - throw e.toTangoException(); - } - } - logger.info("Exiting get_status_tdb()"); - return argout; + return databaseAccessTDB.getStatus(argin); } public void setHdbHost(String hdbHost) { diff --git a/archivingmanager/src/main/java/org/tango/archiving/server/manager/HDBTDBAccess.java b/archivingmanager/src/main/java/org/tango/archiving/server/manager/HDBTDBAccess.java new file mode 100644 index 0000000000000000000000000000000000000000..693d3d49fc1810012cf3f256c20187771e996c73 --- /dev/null +++ b/archivingmanager/src/main/java/org/tango/archiving/server/manager/HDBTDBAccess.java @@ -0,0 +1,144 @@ +package org.tango.archiving.server.manager; + +import fr.esrf.Tango.DevFailed; +import fr.soleil.archiving.common.api.ConnectionFactory; +import fr.soleil.archiving.common.api.exception.ArchivingException; +import fr.soleil.archiving.hdbtdb.api.manager.ArchivingManagerApiRefFactory; +import fr.soleil.archiving.hdbtdb.api.manager.IArchivingManagerApiRef; +import fr.soleil.archiving.hdbtdb.api.tools.ArchivingMessConfig; +import fr.soleil.archiving.hdbtdb.api.tools.mode.Mode; +import fr.soleil.database.connection.AbstractDataBaseConnector; +import fr.soleil.database.connection.DataBaseParameters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tango.server.annotation.Command; + +public class HDBTDBAccess implements IArchivingAccess{ + + private final Logger logger = LoggerFactory.getLogger(HDBTDBAccess.class); + private IArchivingManagerApiRef hdbManager; + + @Override + public void connect(final DataBaseParameters params, boolean isHistoric) throws DevFailed { + try { + logger.info("connecting to {}", params); + final AbstractDataBaseConnector connector = ConnectionFactory.connect(params); + hdbManager = ArchivingManagerApiRefFactory.getInstance(isHistoric, connector); + hdbManager.archivingConfigure(); + } catch (ArchivingException e) { + logger.error("cannot connect to DB",e); + throw e.toTangoException(); + } + } + + + @Override + public void archivingStop(final String[] argin) throws DevFailed { + logger.info("Entering archiving_stop_hdb()"); + try { + hdbManager.archivingStopConf(argin); + } catch (final ArchivingException e) { + logger.warn(e.toString(), e); + throw e.toTangoException(); + } + } + + + + @Override + public void archivingModif(final String[] argin) throws DevFailed { + logger.info("Entering archiving_modif_hdb()"); + final ArchivingMessConfig archivingMessConfig = ArchivingMessConfig + .creationWithoutFullInformation(argin); + try { + hdbManager.archivingStopConf(archivingMessConfig.getAttributeList()); + archivingStart(argin); + } catch (final ArchivingException e) { + logger.warn(e.toString(), e); + throw e.toTangoException(); + } + logger.info("Exiting archiving_modif_hdb()"); + } + + + + @Override + public void archivingStart(final String[] argin) throws DevFailed { + logger.info("Entering archiving_start_hdb()"); + try { + final ArchivingMessConfig archivingMessConfig = ArchivingMessConfig + .creationWithoutFullInformation(argin); + hdbManager.archivingStart(archivingMessConfig); + } catch (ArchivingException e) { + e.printStackTrace(); + logger.warn(e.toString(), e); + throw e.toTangoException(); + } + logger.info("Exiting archiving_start_hdb()"); + } + + + @Override + public short[] isArchived(final String[] argin) throws DevFailed { + logger.info("Entering is_archived_hdb()"); + short[] argout = new short[argin.length]; + + boolean result = false; + for (int i = 0; i < argin.length; i++) { + try { + result = hdbManager.isArchived(argin[i]); + } catch (final ArchivingException e) { + logger.warn(e.toString(), e); + throw e.toTangoException(); + } + if (result) { + argout[i] = 1; + } else { + argout[i] = 0; + } + } + + logger.info("Exiting is_archived_hdb()"); + return argout; + } + + + + + @Override + public String[] getArchivingMode(final String argin) throws DevFailed { + logger.info("Entering get_archiving_mode_hdb()"); + String[] argout; + try { + final Mode mode = hdbManager.getArchivingMode(argin); + argout = mode.toArray(); + } catch (final ArchivingException e) { + logger.error(e.getMessage()); + throw e.toTangoException(); + } + logger.info("Exiting get_archiving_mode_hdb()"); + return argout; + } + + @Override + public String[] getStatus(final String[] argin) throws DevFailed { + logger.info("Entering get_status_hdb()"); + String[] argout = new String[argin.length]; + + for (int i = 0; i < argin.length; i++) { + try { + argout[i] = hdbManager.getStatus(argin[i]); + } catch (final ArchivingException e) { + throw e.toTangoException(); + } + } + logger.info("Exiting get_status_hdb()"); + return argout; + } + + @Override + public String[] getMExportedArchiverList() { + return hdbManager.getMExportedArchiverList(); + } +} + diff --git a/archivingmanager/src/main/java/org/tango/archiving/server/manager/IArchivingAccess.java b/archivingmanager/src/main/java/org/tango/archiving/server/manager/IArchivingAccess.java new file mode 100644 index 0000000000000000000000000000000000000000..3b42bdd1c816a6b2b0e3095f1f2c5557bb703f98 --- /dev/null +++ b/archivingmanager/src/main/java/org/tango/archiving/server/manager/IArchivingAccess.java @@ -0,0 +1,31 @@ +package org.tango.archiving.server.manager; + +import fr.esrf.Tango.DevFailed; +import fr.soleil.database.connection.DataBaseParameters; + +public interface IArchivingAccess { + + + void connect(final DataBaseParameters params, boolean isHistoric) throws DevFailed; + + + void archivingStop(final String[] argin) throws DevFailed; + + void archivingModif(final String[] argin) throws DevFailed; + + + void archivingStart(final String[] argin) throws DevFailed; + + + short[] isArchived(final String[] argin) throws DevFailed; + + + String[] getArchivingMode(final String argin) throws DevFailed; + + + String[] getStatus(final String[] argin) throws DevFailed; + + String[] getMExportedArchiverList(); + +} + diff --git a/archivingmanager/src/main/java/org/tango/archiving/server/manager/TimeseriesAccess.java b/archivingmanager/src/main/java/org/tango/archiving/server/manager/TimeseriesAccess.java new file mode 100644 index 0000000000000000000000000000000000000000..b00f7d9b30b597b435f24dfa03a222a67ffdf220 --- /dev/null +++ b/archivingmanager/src/main/java/org/tango/archiving/server/manager/TimeseriesAccess.java @@ -0,0 +1,131 @@ +package org.tango.archiving.server.manager; + +import com.zaxxer.hikari.HikariConfig; +import fr.esrf.Tango.DevFailed; +import fr.soleil.database.connection.DataBaseParameters; +import fr.soleil.tango.archiving.TangoArchivingConfigService; +import fr.soleil.tango.archiving.TangoArchivingServicesBuilder; +import fr.soleil.tango.archiving.TangoArchivingSystemConfigurationBuilder; +import fr.soleil.tango.archiving.TangoArchivingSystemConfigurationService; +import fr.soleil.tango.archiving.infra.tango.ArchivingConfigs; +import fr.soleil.tango.archiving.infra.tango.TangoArchiverProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tango.utils.DevFailedUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.OptionalInt; + +public class TimeseriesAccess implements IArchivingAccess { + + private final static String IS_DEDICATED = "IsDedicated"; + private final static String RESERVED_ATTRIBUTES = "ReservedAttributes"; + private final static String STOP_ARCHIVE_CONF = "StopArchiveConf"; + private final static String TRIGGER_ARCHIVE_CONF = "TriggerArchiveConf"; + private final static String SCALAR_CHARGE = "scalarCharge"; + private final static String SPECTRUM_CHARGE = "spectrumCharge"; + private final static String IMAGE_CHARGE = "imageCharge"; + private final static String INSERTION_RATE = "insertionRate"; + protected TangoArchivingConfigService configService; + private Logger logger = LoggerFactory.getLogger(TimeseriesAccess.class); + private TangoArchivingSystemConfigurationService service; + + @Override + public void connect(final DataBaseParameters params, final boolean isHistoric) throws DevFailed { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:postgresql://" + params.getHost() + ":5432/" + params.getName()); + config.setUsername(params.getUser()); + config.setPassword(params.getPassword()); + config.setPoolName("timescale-pool"); + TangoArchiverProperties properties = new TangoArchiverProperties(); + if (isHistoric) { + properties.setArchiverClassName("HdbArchiver"); + } else { + properties.setArchiverClassName("TdbArchiver"); + } + properties.setIsDedicatedProperty(IS_DEDICATED); + properties.setReservedAttributesProperty(RESERVED_ATTRIBUTES); + properties.setImageLoadAttributeName(IMAGE_CHARGE); + properties.setSpectrumLoadAttributeName(SPECTRUM_CHARGE); + properties.setScalarLoadAttributeName(SCALAR_CHARGE); + properties.setStartArchivingCommandName(TRIGGER_ARCHIVE_CONF); + properties.setInsertionRateAttributeName(INSERTION_RATE); + properties.setStopArchivingCommandName(STOP_ARCHIVE_CONF); + logger.debug("connecting to {}", ToStringBuilder.reflectionToString(config)); + service = new TangoArchivingSystemConfigurationBuilder().build(config, properties); + service.updateArchiversList(); + configService = new TangoArchivingServicesBuilder().buildConfigFetcher(config); + } + + @Override + public void archivingStop(final String[] argin) throws DevFailed { + logger.info("stopping archiving of {}", Arrays.toString(argin)); + final Map<String, List<String>> result = service.stopArchiving(argin); + logger.info("stopping result is {}", result); + } + + @Override + public void archivingModif(final String[] argin) throws DevFailed { + archivingStop(argin); + archivingStart(argin); + } + + @Override + public void archivingStart(final String[] argin) throws DevFailed { + logger.info("starting archiving of {}", Arrays.toString(argin)); + final Map<String, ArchivingConfigs> result = service.startArchiving(new ArchivingConfigs(argin, false)); + logger.info("starting result is {}", result); + } + + @Override + public short[] isArchived(final String[] argin) throws DevFailed { + short[] result = new short[argin.length]; + for (int i = 0; i < result.length; i++) { + if (configService.isArchived(argin[i])) + result[i] = 1; + else + result[i] = 0; + } + return result; + } + + @Override + public String[] getArchivingMode(final String argin) throws DevFailed { + OptionalInt id = configService.getAttributeID(argin); + if (!id.isPresent()) { + throw DevFailedUtils.newDevFailed("no id found for " + argin); + } + return toStringArray(configService.getCurrentInsertionModes(id.getAsInt())); + } + + private String[] toStringArray(Object toConvert) { + List<String> array = new ArrayList<>(); + Arrays.stream(toConvert.getClass().getDeclaredFields()) + .forEach(f -> { + try { + f.setAccessible(true); + Object value = f.get(toConvert); + if (value != null) { + array.add(f.getName() + ": " + f.get(toConvert)); + } + } catch (IllegalAccessException e) { + array.add(f.getName() + ": error"); + } + }); + return array.toArray(new String[0]); + } + + @Override + public String[] getStatus(final String[] argin) throws DevFailed { + throw DevFailedUtils.newDevFailed("not supported function"); + } + + @Override + public String[] getMExportedArchiverList() { + return service.getArchivers().toArray(new String[0]); + } +}