From 61ba9ceaf90766c7b4bcdb9d4c84adb0bbb1bde5 Mon Sep 17 00:00:00 2001 From: georgweiss Date: Mon, 11 Sep 2023 16:18:07 +0200 Subject: [PATCH 1/3] Refactoring of save&restore modules for the sake of simplification --- app/save-and-restore/app/pom.xml | 32 ++- .../applications/saveandrestore/Messages.java | 26 ++- .../SaveAndRestoreClientException.java | 0 .../datamigration/git/FileUtilities.java | 77 +------ .../filehandler/csv/CSVImporter.java | 2 +- .../service}/SaveAndRestoreClient.java | 16 +- .../service}/SaveAndRestoreJerseyClient.java | 25 +-- .../ui/SaveAndRestoreService.java | 7 +- .../saveandrestore/ui}/Threshold.java | 9 +- .../saveandrestore/ui}/Utilities.java | 72 +----- .../saveandrestore/ui}/VDisconnectedData.java | 2 +- .../saveandrestore/ui}/VNoData.java | 9 +- .../saveandrestore/ui}/VTypePair.java | 3 +- .../BaseSnapshotTableViewController.java | 2 +- .../CompareSnapshotsTableViewController.java | 5 +- .../ui/snapshot/SaveAndRestorePV.java | 4 +- .../ui/snapshot/SelectionTableColumn.java | 22 +- .../ui/snapshot/SnapshotController.java | 4 +- .../snapshot/SnapshotTableViewController.java | 13 +- .../ui/snapshot/TableEntry.java | 13 +- .../ui/snapshot/VDeltaCellEditor.java | 8 +- .../ui/snapshot/VTypeCellEditor.java | 24 +- .../saveandrestore/messages.properties | 11 + .../save_and_restore_preferences.properties | 9 + .../saveandrestore/SafeMultiplyTest.java | 3 +- .../saveandrestore/ui}/UtilitiesTest.java | 64 +----- app/save-and-restore/common/pom.xml | 101 --------- app/save-and-restore/pom.xml | 2 - app/save-and-restore/service/pom.xml | 137 ------------ .../saveandrestore/script/RestoreReport.java | 111 ---------- .../script/SaveAndRestoreScriptUtil.java | 209 ------------------ .../saveandrestore/service/Messages.java | 48 ---- .../resources/client_preferences.properties | 30 --- .../service/messages.properties | 19 -- 34 files changed, 146 insertions(+), 973 deletions(-) rename app/save-and-restore/{service => app}/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClientException.java (100%) rename app/save-and-restore/{service/src/main/java/org/phoebus/applications/saveandrestore => app/src/main/java/org/phoebus/applications/saveandrestore/service}/SaveAndRestoreClient.java (92%) rename app/save-and-restore/{service/src/main/java/org/phoebus/applications/saveandrestore/impl => app/src/main/java/org/phoebus/applications/saveandrestore/service}/SaveAndRestoreJerseyClient.java (95%) rename app/save-and-restore/{common/src/main/java/org/phoebus/applications/saveandrestore/common => app/src/main/java/org/phoebus/applications/saveandrestore/ui}/Threshold.java (97%) rename app/save-and-restore/{common/src/main/java/org/phoebus/applications/saveandrestore/common => app/src/main/java/org/phoebus/applications/saveandrestore/ui}/Utilities.java (96%) rename app/save-and-restore/{common/src/main/java/org/phoebus/applications/saveandrestore/common => app/src/main/java/org/phoebus/applications/saveandrestore/ui}/VDisconnectedData.java (96%) rename app/save-and-restore/{common/src/main/java/org/phoebus/applications/saveandrestore/common => app/src/main/java/org/phoebus/applications/saveandrestore/ui}/VNoData.java (88%) rename app/save-and-restore/{common/src/main/java/org/phoebus/applications/saveandrestore/common => app/src/main/java/org/phoebus/applications/saveandrestore/ui}/VTypePair.java (93%) rename app/save-and-restore/{common/src/test/java/org/phoebus/applications/saceandrestore/common => app/src/test/java/org/phoebus/applications/saveandrestore/ui}/UtilitiesTest.java (96%) delete mode 100644 app/save-and-restore/common/pom.xml delete mode 100644 app/save-and-restore/service/pom.xml delete mode 100644 app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/RestoreReport.java delete mode 100644 app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/SaveAndRestoreScriptUtil.java delete mode 100644 app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/service/Messages.java delete mode 100644 app/save-and-restore/service/src/main/resources/client_preferences.properties delete mode 100644 app/save-and-restore/service/src/main/resources/org/phoebus/applications/saveandrestore/service/messages.properties diff --git a/app/save-and-restore/app/pom.xml b/app/save-and-restore/app/pom.xml index 8a93e97e92..f76dbdac62 100644 --- a/app/save-and-restore/app/pom.xml +++ b/app/save-and-restore/app/pom.xml @@ -22,19 +22,33 @@ 4.7.3-SNAPSHOT - org.phoebus - save-and-restore-common - 4.7.3-SNAPSHOT + org.eclipse.jgit + org.eclipse.jgit + 5.0.3.201809091024-r + + - org.phoebus - save-and-restore-service - 4.7.3-SNAPSHOT + com.sun.jersey + jersey-core + 1.19 - org.eclipse.jgit - org.eclipse.jgit - 5.0.3.201809091024-r + com.sun.jersey + jersey-client + 1.19 + + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson.version} + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/Messages.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/Messages.java index cccda8321e..00bd9b1c52 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/Messages.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/Messages.java @@ -30,6 +30,7 @@ public class Messages { public static String closeConfigurationWarning; public static String closeCompositeSnapshotWarning; public static String closeTabPrompt; + public static String compositeSnapshotConsistencyCheckFailed; public static String contextMenuAddTagWithComment; public static String contextMenuCreateSnapshot; public static String contextMenuCompareSnapshots; @@ -47,15 +48,21 @@ public class Messages { public static String contextMenuTagAsGolden; public static String contextMenuTagsWithComment; public static String contextMenuOpenCompositeSnapshotForRestore; + public static String copyOrMoveNotAllowedBody; public static String copyOrMoveNotAllowedHeader; public static String copyUniqueIdToClipboard; + + public static String createNewTagDialogHeader; + public static String createNewTagDialogTitle; + public static String createCompositeSnapshotFailed; + public static String createConfigurationFailed; + public static String createNodeFailed; public static String currentPVValue; public static String currentReadbackValue; public static String currentSetpointValue; - public static String createNewTagDialogHeader; - public static String createNewTagDialogTitle; public static String deleteFilter; + public static String deleteFilterFailed; public static String duplicatePVNamesAdditionalItems; public static String duplicatePVNamesCheckFailed; @@ -110,12 +117,15 @@ public class Messages { public static String saveFilter; public static String saveFilterConfirmOverwrite; + public static String saveFilterFailed; public static String saveSnapshotErrorContent; + public static String saveSnapshotFailed; public static String saveTagButtonLabel; public static String search; public static String searchEntryToolTip; public static String searchErrorBody; + public static String searchFailed; public static String searchNoResultsTitle; public static String searchNoResult; @@ -126,6 +136,7 @@ public class Messages { public static String storedReadbackValue; public static String storedValues; public static String tableColumnDeltaValue; + public static String tagAddFailed; public static String tagNameLabel; public static String tagCommentLabel; public static String tagRemoveConfirmationTitle; @@ -145,13 +156,16 @@ public class Messages { public static String toolTipMultiplierSpinner; public static String unnamedSnapshot; - static - { + public static String updateCompositeSnapshotFailed; + public static String updateConfigurationFailed; + + public static String updateNodeFailed; + + static { NLS.initializeMessages(Messages.class); } - private Messages() - { + private Messages() { // Prevent instantiation } diff --git a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClientException.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClientException.java similarity index 100% rename from app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClientException.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClientException.java diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/datamigration/git/FileUtilities.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/datamigration/git/FileUtilities.java index 2fd771e010..b229e46fc1 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/datamigration/git/FileUtilities.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/datamigration/git/FileUtilities.java @@ -19,50 +19,12 @@ */ package org.phoebus.applications.saveandrestore.datamigration.git; -import org.epics.util.array.ArrayBoolean; -import org.epics.util.array.ArrayByte; -import org.epics.util.array.ArrayDouble; -import org.epics.util.array.ArrayFloat; -import org.epics.util.array.ArrayInteger; -import org.epics.util.array.ArrayLong; -import org.epics.util.array.ArrayShort; -import org.epics.util.array.CollectionNumbers; -import org.epics.util.array.ListBoolean; -import org.epics.util.array.ListByte; -import org.epics.util.array.ListDouble; -import org.epics.util.array.ListFloat; -import org.epics.util.array.ListInteger; -import org.epics.util.array.ListLong; -import org.epics.util.array.ListShort; +import org.epics.util.array.*; import org.epics.util.stats.Range; -import org.epics.vtype.Alarm; -import org.epics.vtype.AlarmSeverity; -import org.epics.vtype.AlarmStatus; -import org.epics.vtype.Display; -import org.epics.vtype.EnumDisplay; -import org.epics.vtype.Time; -import org.epics.vtype.VBoolean; -import org.epics.vtype.VBooleanArray; -import org.epics.vtype.VByte; -import org.epics.vtype.VByteArray; -import org.epics.vtype.VDouble; -import org.epics.vtype.VDoubleArray; -import org.epics.vtype.VEnum; -import org.epics.vtype.VEnumArray; -import org.epics.vtype.VFloat; -import org.epics.vtype.VFloatArray; -import org.epics.vtype.VInt; -import org.epics.vtype.VIntArray; -import org.epics.vtype.VLong; -import org.epics.vtype.VLongArray; -import org.epics.vtype.VShort; -import org.epics.vtype.VShortArray; -import org.epics.vtype.VString; -import org.epics.vtype.VStringArray; -import org.epics.vtype.VType; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; +import org.epics.vtype.*; import org.phoebus.applications.saveandrestore.model.ConfigPv; import org.phoebus.applications.saveandrestore.model.SnapshotItem; +import org.phoebus.applications.saveandrestore.ui.VDisconnectedData; import java.io.BufferedReader; import java.io.IOException; @@ -74,13 +36,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.regex.Pattern; +import java.util.*; /** @@ -108,22 +64,14 @@ public final class FileUtilities { public static final String H_VALUE = "VALUE"; public static final String H_READ_ONLY = "READ_ONLY"; // the complete snapshot file header - public static final String SNAPSHOT_FILE_HEADER = H_PV_NAME + "," + H_SELECTED + "," + H_TIMESTAMP + "," + H_STATUS - + "," + H_SEVERITY + "," + H_VALUE_TYPE + "," + H_VALUE + "," + H_READBACK + "," + H_READBACK_VALUE + "," - + H_DELTA + "," + H_READ_ONLY; - public static final String SAVE_SET_HEADER = H_PV_NAME + "," + H_READBACK + "," + H_DELTA + "," + H_READ_ONLY; // delimiter of array values private static final String ARRAY_SPLITTER = "\\;"; // delimiter of enum value and enum constants private static final String ENUM_VALUE_SPLITTER = "\\~"; - // proposed length of snapshot file data line entry (pv name only) - private static final int SNP_ENTRY_LENGTH = 700; - // proposed length of configuration data line entry (pv name only) - private static final int BSD_ENTRY_LENGTH = 250; + // the format used to store the timestamp of when the snapshot was taken private static final ThreadLocal TIMESTAMP_FORMATTER = ThreadLocal .withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")); - private static final Pattern LINE_BREAK_PATTERN = Pattern.compile("\\n"); /** * Private constructor to prevent instantiation of this class. @@ -158,7 +106,7 @@ public static SnapshotContent readFromSnapshot(InputStream stream) throws IOExce } else if (header == null) { header = line.split("\\,"); for (int i = 0; i < header.length; i++) { - headerMap.put(header[i].toUpperCase(Locale.UK), Integer.valueOf(i)); + headerMap.put(header[i].toUpperCase(Locale.UK), i); } } else { if (headerMap.isEmpty()) { @@ -173,7 +121,6 @@ public static SnapshotContent readFromSnapshot(InputStream stream) throws IOExce Integer idx = headerMap.get(H_PV_NAME); String name = idx == null || idx > length ? null : trim(split[idx]); idx = headerMap.get(H_SELECTED); - String sel = idx == null || idx > length ? null : trim(split[idx]); idx = headerMap.get(H_TIMESTAMP); String timestamp = idx == null || idx > length ? null : trim(split[idx]); idx = headerMap.get(H_STATUS); @@ -191,9 +138,8 @@ public static SnapshotContent readFromSnapshot(InputStream stream) throws IOExce idx = headerMap.get(H_DELTA); //String delta = idx == null || idx > length ? "" : trim(split[idx]); idx = headerMap.get(H_READ_ONLY); - Boolean readOnly = idx == null || idx > length ? Boolean.FALSE : Boolean.valueOf(trim(split[idx])); - VType data = null, readbackData = null; + VType data, readbackData; try { data = piecesToVType(timestamp, status, severity, value, valueType); } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { @@ -256,7 +202,7 @@ private static VType piecesToVType(String timestamp, String status, String sever String[] t = timestamp != null && timestamp.indexOf('.') > 0 ? timestamp.split("\\.") : new String[]{"0", "0"}; Time time = Time.of(Instant.ofEpochSecond(Long.parseLong(t[0]), Integer.parseInt(t[1]))); - AlarmStatus alarmStatus = null; + AlarmStatus alarmStatus; try { alarmStatus = AlarmStatus.valueOf(status); } catch (IllegalArgumentException e) { @@ -271,10 +217,9 @@ private static VType piecesToVType(String timestamp, String status, String sever String[] valueAndLabels = value.split(ENUM_VALUE_SPLITTER); if (valueAndLabels.length > 0) { try { - if(valueAndLabels[0].isEmpty()){ + if (valueAndLabels[0].isEmpty()) { valueAndLabels[0] = ""; - } - else if (valueAndLabels[0].charAt(0) == '[') { + } else if (valueAndLabels[0].charAt(0) == '[') { valueAndLabels[0] = valueAndLabels[0].substring(1, valueAndLabels[0].length() - 1); } if (valueAndLabels.length > 1) { @@ -480,7 +425,7 @@ public static ConfigurationContent readFromConfiguration(InputStream stream) thr throw new IOException(String.format("Invalid content: %s.", line)); } // there are no fields in here that may contain a comma - String name = null, readback = null, delta = null; + String name, readback = null, delta = null; boolean readOnly = false; if (namesIndex > -1) { name = trim(split[namesIndex]); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/filehandler/csv/CSVImporter.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/filehandler/csv/CSVImporter.java index 6c9f732988..e0deddca59 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/filehandler/csv/CSVImporter.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/filehandler/csv/CSVImporter.java @@ -72,7 +72,6 @@ import org.epics.vtype.VType; import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; import org.phoebus.applications.saveandrestore.datamigration.git.FileUtilities; import org.phoebus.applications.saveandrestore.model.ConfigPv; import org.phoebus.applications.saveandrestore.model.Node; @@ -81,6 +80,7 @@ import org.phoebus.applications.saveandrestore.model.SnapshotData; import org.phoebus.applications.saveandrestore.model.SnapshotItem; import org.phoebus.applications.saveandrestore.ui.SaveAndRestoreService; +import org.phoebus.applications.saveandrestore.ui.VDisconnectedData; import org.phoebus.applications.saveandrestore.ui.configuration.ConfigurationFromSelectionController; import org.phoebus.framework.nls.NLS; diff --git a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClient.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreClient.java similarity index 92% rename from app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClient.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreClient.java index a0af67e87a..85b2a29eec 100644 --- a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/SaveAndRestoreClient.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreClient.java @@ -16,18 +16,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore; - -import org.phoebus.applications.saveandrestore.model.CompositeSnapshot; -import org.phoebus.applications.saveandrestore.model.CompositeSnapshotData; -import org.phoebus.applications.saveandrestore.model.Configuration; -import org.phoebus.applications.saveandrestore.model.ConfigurationData; -import org.phoebus.applications.saveandrestore.model.Node; -import org.phoebus.applications.saveandrestore.model.Snapshot; -import org.phoebus.applications.saveandrestore.model.SnapshotData; -import org.phoebus.applications.saveandrestore.model.SnapshotItem; -import org.phoebus.applications.saveandrestore.model.Tag; -import org.phoebus.applications.saveandrestore.model.TagData; +package org.phoebus.applications.saveandrestore.service; + +import org.phoebus.applications.saveandrestore.SaveAndRestoreClientException; +import org.phoebus.applications.saveandrestore.model.*; import org.phoebus.applications.saveandrestore.model.search.Filter; import org.phoebus.applications.saveandrestore.model.search.SearchResult; diff --git a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/impl/SaveAndRestoreJerseyClient.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreJerseyClient.java similarity index 95% rename from app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/impl/SaveAndRestoreJerseyClient.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreJerseyClient.java index 3bd563c1ad..c6f2f7c9c0 100644 --- a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/impl/SaveAndRestoreJerseyClient.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreJerseyClient.java @@ -16,35 +16,20 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.impl; +package org.phoebus.applications.saveandrestore.service; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientHandlerException; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.GenericType; -import com.sun.jersey.api.client.UniformInterfaceException; -import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.api.client.*; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; -import org.phoebus.applications.saveandrestore.SaveAndRestoreClient; +import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreClientException; -import org.phoebus.applications.saveandrestore.model.CompositeSnapshot; -import org.phoebus.applications.saveandrestore.model.CompositeSnapshotData; -import org.phoebus.applications.saveandrestore.model.Configuration; -import org.phoebus.applications.saveandrestore.model.ConfigurationData; -import org.phoebus.applications.saveandrestore.model.Node; -import org.phoebus.applications.saveandrestore.model.Snapshot; -import org.phoebus.applications.saveandrestore.model.SnapshotData; -import org.phoebus.applications.saveandrestore.model.SnapshotItem; -import org.phoebus.applications.saveandrestore.model.Tag; -import org.phoebus.applications.saveandrestore.model.TagData; +import org.phoebus.applications.saveandrestore.model.*; import org.phoebus.applications.saveandrestore.model.search.Filter; import org.phoebus.applications.saveandrestore.model.search.SearchResult; -import org.phoebus.applications.saveandrestore.service.Messages; import org.phoebus.framework.preferences.PreferencesReader; import javax.ws.rs.core.MultivaluedMap; @@ -53,7 +38,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -public class SaveAndRestoreJerseyClient implements SaveAndRestoreClient { +public class SaveAndRestoreJerseyClient implements org.phoebus.applications.saveandrestore.service.SaveAndRestoreClient { private final Client client; private static final String CONTENT_TYPE_JSON = "application/json; charset=UTF-8"; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java index 9182676aa3..e8af0617bf 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java @@ -18,10 +18,7 @@ package org.phoebus.applications.saveandrestore.ui; -import org.phoebus.applications.saveandrestore.SaveAndRestoreClient; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; -import org.phoebus.applications.saveandrestore.common.VNoData; -import org.phoebus.applications.saveandrestore.impl.SaveAndRestoreJerseyClient; + import org.phoebus.applications.saveandrestore.model.CompositeSnapshot; import org.phoebus.applications.saveandrestore.model.Configuration; import org.phoebus.applications.saveandrestore.model.ConfigurationData; @@ -34,6 +31,8 @@ import org.phoebus.applications.saveandrestore.model.TagData; import org.phoebus.applications.saveandrestore.model.search.Filter; import org.phoebus.applications.saveandrestore.model.search.SearchResult; +import org.phoebus.applications.saveandrestore.service.SaveAndRestoreClient; +import org.phoebus.applications.saveandrestore.service.SaveAndRestoreJerseyClient; import javax.ws.rs.core.MultivaluedMap; import java.util.ArrayList; diff --git a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/Threshold.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Threshold.java similarity index 97% rename from app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/Threshold.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Threshold.java index 7f17966782..7ddebca5f6 100644 --- a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/Threshold.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Threshold.java @@ -15,18 +15,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.common; +package org.phoebus.applications.saveandrestore.ui; +import javax.script.*; import java.io.Serializable; import java.util.logging.Level; import java.util.logging.Logger; -import javax.script.Bindings; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import javax.script.SimpleBindings; - /** * * Threshold represents threshold values for a pv. It provides two values, one for positive threshold and diff --git a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/Utilities.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java similarity index 96% rename from app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/Utilities.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java index 3e9a0dc8d0..a14d0799e5 100644 --- a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/Utilities.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java @@ -15,77 +15,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.common; +package org.phoebus.applications.saveandrestore.ui; -import org.epics.util.array.ArrayBoolean; -import org.epics.util.array.ArrayByte; -import org.epics.util.array.ArrayDouble; -import org.epics.util.array.ArrayFloat; -import org.epics.util.array.ArrayInteger; -import org.epics.util.array.ArrayLong; -import org.epics.util.array.ArrayShort; -import org.epics.util.array.ArrayUByte; -import org.epics.util.array.ArrayUInteger; -import org.epics.util.array.ArrayULong; -import org.epics.util.array.ArrayUShort; -import org.epics.util.array.ListBoolean; -import org.epics.util.array.ListLong; -import org.epics.util.array.ListNumber; -import org.epics.util.array.ListUInteger; -import org.epics.util.array.ListULong; -import org.epics.util.number.UByte; -import org.epics.util.number.UInteger; -import org.epics.util.number.ULong; -import org.epics.util.number.UShort; -import org.epics.util.number.UnsignedConversions; +import org.epics.util.array.*; +import org.epics.util.number.*; import org.epics.util.text.NumberFormats; -import org.epics.vtype.Alarm; -import org.epics.vtype.AlarmSeverity; -import org.epics.vtype.AlarmStatus; -import org.epics.vtype.Array; -import org.epics.vtype.Display; -import org.epics.vtype.EnumDisplay; -import org.epics.vtype.SimpleValueFormat; -import org.epics.vtype.Time; -import org.epics.vtype.VBoolean; -import org.epics.vtype.VBooleanArray; -import org.epics.vtype.VByte; -import org.epics.vtype.VByteArray; -import org.epics.vtype.VDouble; -import org.epics.vtype.VDoubleArray; -import org.epics.vtype.VEnum; -import org.epics.vtype.VEnumArray; -import org.epics.vtype.VFloat; -import org.epics.vtype.VFloatArray; -import org.epics.vtype.VInt; -import org.epics.vtype.VIntArray; -import org.epics.vtype.VLong; -import org.epics.vtype.VLongArray; -import org.epics.vtype.VNumber; -import org.epics.vtype.VNumberArray; -import org.epics.vtype.VShort; -import org.epics.vtype.VShortArray; -import org.epics.vtype.VString; -import org.epics.vtype.VStringArray; -import org.epics.vtype.VType; -import org.epics.vtype.VUByte; -import org.epics.vtype.VUByteArray; -import org.epics.vtype.VUInt; -import org.epics.vtype.VUIntArray; -import org.epics.vtype.VULong; -import org.epics.vtype.VULongArray; -import org.epics.vtype.VUShort; -import org.epics.vtype.VUShortArray; -import org.epics.vtype.ValueFormat; +import org.epics.vtype.*; import org.phoebus.core.vtypes.VTypeHelper; import java.math.BigInteger; import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -99,7 +39,7 @@ public final class Utilities { /** - * VTypeComparison is the result of comparison of two {@link org.epics.vtype.VType} values. The {@link #string} field + * VTypeComparison is the result of comparison of two {@link VType} values. The {@link #string} field * provides the textual representation of the comparison and the {@link #valuesEqual} provides information whether * the values are equal (0), the first value is greater than second (1), or the first value is less than second * (-1). This only applies to scalar values. In case of array values the comparison can only result in 0 or 1. diff --git a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VDisconnectedData.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VDisconnectedData.java similarity index 96% rename from app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VDisconnectedData.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VDisconnectedData.java index c1e248dcee..73a15ee278 100644 --- a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VDisconnectedData.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VDisconnectedData.java @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.common; +package org.phoebus.applications.saveandrestore.ui; import org.epics.vtype.VType; diff --git a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VNoData.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VNoData.java similarity index 88% rename from app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VNoData.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VNoData.java index fc5c12a3a9..9ea6640c87 100644 --- a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VNoData.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VNoData.java @@ -15,16 +15,15 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.common; - -import java.io.Serializable; - +package org.phoebus.applications.saveandrestore.ui; import org.epics.vtype.VType; +import java.io.Serializable; + /** * - * VNoData represents a {@link org.epics.vtype.VType} without any known value, while not being disconnected. + * VNoData represents a {@link VType} without any known value, while not being disconnected. * * @author Jaka Bobnar * diff --git a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VTypePair.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VTypePair.java similarity index 93% rename from app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VTypePair.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VTypePair.java index ad916b45ea..a94c234206 100644 --- a/app/save-and-restore/common/src/main/java/org/phoebus/applications/saveandrestore/common/VTypePair.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/VTypePair.java @@ -15,10 +15,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.common; +package org.phoebus.applications.saveandrestore.ui; import org.epics.vtype.VType; -import org.phoebus.applications.saveandrestore.common.Threshold; import java.util.Optional; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java index 2433705706..d362a367ad 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java @@ -33,8 +33,8 @@ import org.epics.vtype.VType; import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication; -import org.phoebus.applications.saveandrestore.common.VTypePair; import org.phoebus.applications.saveandrestore.model.Snapshot; +import org.phoebus.applications.saveandrestore.ui.VTypePair; import org.phoebus.core.types.TimeStampedProcessVariable; import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/CompareSnapshotsTableViewController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/CompareSnapshotsTableViewController.java index af637ab5f3..e94276dcae 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/CompareSnapshotsTableViewController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/CompareSnapshotsTableViewController.java @@ -23,10 +23,9 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.TableColumn; -import org.epics.vtype.VType; -import org.phoebus.applications.saveandrestore.common.Utilities; -import org.phoebus.applications.saveandrestore.common.VTypePair; import org.phoebus.applications.saveandrestore.model.Snapshot; +import org.phoebus.applications.saveandrestore.ui.Utilities; +import org.phoebus.applications.saveandrestore.ui.VTypePair; import java.util.List; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java index 6f2fddd53a..450247cac7 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java @@ -20,8 +20,8 @@ package org.phoebus.applications.saveandrestore.ui.snapshot; import org.epics.vtype.VType; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; -import org.phoebus.applications.saveandrestore.common.VNoData; +import org.phoebus.applications.saveandrestore.ui.VDisconnectedData; +import org.phoebus.applications.saveandrestore.ui.VNoData; import org.phoebus.pv.PV; import org.phoebus.pv.PVPool; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SelectionTableColumn.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SelectionTableColumn.java index 68599c3666..f95292d334 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SelectionTableColumn.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SelectionTableColumn.java @@ -19,13 +19,11 @@ package org.phoebus.applications.saveandrestore.ui.snapshot; + import javafx.scene.control.*; import javafx.scene.control.cell.CheckBoxTableCell; import javafx.scene.input.MouseButton; -import org.phoebus.applications.saveandrestore.common.VNoData; - -import java.util.logging.Level; -import java.util.logging.Logger; +import org.phoebus.applications.saveandrestore.ui.VNoData; /** * SelectionTableColumn is the table column for the first column in the table, which displays @@ -33,27 +31,25 @@ * * @author Jaka Bobnar */ -public class SelectionTableColumn extends TooltipTableColumn{ +public class SelectionTableColumn extends TooltipTableColumn { private final CheckBox selectAllCheckBox = new CheckBox(); - private static final Logger logger = Logger.getLogger(SelectionTableColumn.class.getName()); - /** * Needed by fxml */ @SuppressWarnings("unused") - public SelectionTableColumn(){ + public SelectionTableColumn() { } @Override - public void setTooltip(String tooltip){ + public void setTooltip(String tooltip) { selectAllCheckBox.setTooltip(new Tooltip(tooltip)); } @Override - public String getTooltip(){ + public String getTooltip() { return selectAllCheckBox.getTooltip().textProperty().get(); } @@ -62,7 +58,7 @@ public SelectionTableColumn(TableView tableView) { configure(tableView); } - public void configure(TableView tableView){ + public void configure(TableView tableView) { //for those entries, which have a read-only property, disable the checkbox setCellFactory(column -> { TableCell cell = new CheckBoxTableCell<>(null, null); @@ -74,8 +70,6 @@ public void configure(TableView tableView){ setEditable(true); setSortable(false); selectAllCheckBox.setSelected(true); - //selectAllCheckBox.setOnAction(e -> tableView.getItems().stream().filter(te -> !te.readOnlyProperty().get()) - // .forEach(te -> te.selectedProperty().setValue(selectAllCheckBox.isSelected()))); setGraphic(selectAllCheckBox); MenuItem inverseMI = new MenuItem("Inverse Selection"); inverseMI.setOnAction(e -> tableView.getItems().stream().filter(te -> !te.readOnlyProperty().get()) @@ -94,7 +88,7 @@ private void updateCheckboxState(TableCell cell) { TableEntry item = (TableEntry) row.getItem(); if (item != null) { cell.setEditable(!item.readOnlyProperty().get()); - item.selectedProperty().set(!item.selectedProperty().get() /*!item.valueProperty().get().value.equals(VNoData.INSTANCE)*/); + item.selectedProperty().set(!item.selectedProperty().get()); cell.setDisable(item.valueProperty().get().value.equals(VNoData.INSTANCE)); if (item.valueProperty().get().value.equals(VNoData.INSTANCE)) { item.selectedProperty().set(false); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotController.java index b1239e1e4a..65c1d4d4cd 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotController.java @@ -28,10 +28,10 @@ import javafx.scene.layout.VBox; import org.epics.vtype.*; import org.phoebus.applications.saveandrestore.Messages; -import org.phoebus.applications.saveandrestore.common.VNoData; import org.phoebus.applications.saveandrestore.model.*; import org.phoebus.applications.saveandrestore.model.event.SaveAndRestoreEventReceiver; import org.phoebus.applications.saveandrestore.ui.SaveAndRestoreService; +import org.phoebus.applications.saveandrestore.ui.VNoData; import org.phoebus.framework.jobs.JobManager; import org.phoebus.ui.dialog.DialogHelper; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; @@ -104,7 +104,7 @@ public void initialize() { * Loads data from a configuration {@link Node} in order to populate the * view with PV items and prepare it to take a snapshot. * - * @param configurationNode A {@link Node} of type {@link NodeType#CONFIGURATION} + * @param configurationNode A {@link Node} of type {@link org.phoebus.applications.saveandrestore.model.NodeType#CONFIGURATION} */ public void newSnapshot(Node configurationNode) { this.configurationNode = configurationNode; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java index 2ac4e03f17..e84dcfb842 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java @@ -32,12 +32,11 @@ import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.Preferences; import org.phoebus.applications.saveandrestore.SafeMultiply; -import org.phoebus.applications.saveandrestore.common.*; import org.phoebus.applications.saveandrestore.model.*; +import org.phoebus.applications.saveandrestore.ui.*; import org.phoebus.framework.jobs.JobManager; import org.phoebus.util.time.TimestampFormats; -import java.security.AccessController; import java.text.SimpleDateFormat; import java.time.Instant; import java.util.*; @@ -120,7 +119,6 @@ public void initialize() { })); - hideEqualItems.addListener((ob, o, n) -> { }); @@ -187,7 +185,7 @@ public void takeSnapshot(Consumer consumer) { * configured through a preference setting. * * @param completion Callback receiving a list of {@link SnapshotItem}s where values for PVs that could - * not be read are set to {@link VDisconnectedData#INSTANCE}. + * not be read are set to {@link org.phoebus.applications.saveandrestore.ui.VDisconnectedData#INSTANCE}. */ private void readAll(Consumer> completion) { ExecutorService executorService = Executors.newFixedThreadPool(10); @@ -429,7 +427,7 @@ public void addSnapshot(Snapshot snapshot) { VType updatedValue = e.getRowValue().readOnlyProperty().get() ? e.getOldValue() : e.getNewValue(); ObjectProperty value = e.getRowValue().valueProperty(); value.setValue(new VTypePair(value.get().base, updatedValue, value.get().threshold)); - snapshotController.updateLoadedSnapshot( e.getRowValue(), updatedValue); + snapshotController.updateLoadedSnapshot(e.getRowValue(), updatedValue); for (int i = 1; i < snapshots.size(); i++) { ObjectProperty compareValue = e.getRowValue().compareValueProperty(i); compareValue.setValue(new VTypePair(updatedValue, compareValue.get().value, compareValue.get().threshold)); @@ -442,14 +440,13 @@ public void addSnapshot(Snapshot snapshot) { baseSnapshotDeltaColumn.getStyleClass().add("snapshot-table-left-aligned"); baseSnapshotColumn.getColumns().addAll(baseSnapshotValueColumn, baseSnapshotDeltaColumn, new DividerTableColumn()); - } - else{ + } else { compareColumn.getColumns().clear(); } compareColumn.getColumns().add(0, baseSnapshotColumn); - for(int s = 1; s < snapshots.size(); s++) { + for (int s = 1; s < snapshots.size(); s++) { Node snapshotNode = snapshots.get(s).getSnapshotNode(); String snapshotName = snapshotNode.getName(); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/TableEntry.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/TableEntry.java index d42cc4978b..2d9f4fec67 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/TableEntry.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/TableEntry.java @@ -10,11 +10,12 @@ */ package org.phoebus.applications.saveandrestore.ui.snapshot; + import javafx.beans.property.*; +import org.epics.pva.data.nt.PVAAlarm; import org.epics.vtype.*; -import org.phoebus.applications.saveandrestore.common.*; import org.phoebus.applications.saveandrestore.model.ConfigPv; -import org.phoebus.applications.saveandrestore.ui.SingleListenerBooleanProperty; +import org.phoebus.applications.saveandrestore.ui.*; import java.time.Instant; import java.util.ArrayList; @@ -36,7 +37,7 @@ public class TableEntry { private final StringProperty pvName = new SimpleStringProperty(this, "pvName"); private final ObjectProperty timestamp = new SimpleObjectProperty<>(this, "timestamp"); private final StringProperty liveStatus = new SimpleStringProperty(this, "liveStatus", "---"); - private final StringProperty storedStatus = new SimpleStringProperty(this, "storedStatus", AlarmStatus.UNDEFINED.name()); + private final StringProperty storedStatus = new SimpleStringProperty(this, "storedStatus", PVAAlarm.AlarmStatus.UNDEFINED.name()); private final StringProperty liveSeverity = new SimpleStringProperty(this, "liveSeverity", "---"); private final StringProperty storedSeverity = new SimpleStringProperty(this, "storedSeverity", AlarmSeverity.UNDEFINED.toString()); /** @@ -196,7 +197,7 @@ public ObjectProperty storedReadbackProperty() { } @SuppressWarnings("unused") - public StringProperty storedStatusProperty(){ + public StringProperty storedStatusProperty() { return storedStatus; } @@ -219,7 +220,7 @@ public void setTimestamp(Instant timestamp) { this.timestamp.set(timestamp); } - public ObjectProperty storedSnapshotValue(){ + public ObjectProperty storedSnapshotValue() { return storedSnapshotValue; } @@ -309,7 +310,7 @@ public void setSnapshotValue(VType snapshotValue, int index) { /** * Set the stored readback value for the primary snapshot of for the snapshots compared to the primary one. * - * @param val the value to set + * @param val the value to set */ public void setStoredReadbackValue(VType val, int index) { if (val == null) { diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VDeltaCellEditor.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VDeltaCellEditor.java index 04645155ee..4084d9d7a1 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VDeltaCellEditor.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VDeltaCellEditor.java @@ -22,10 +22,10 @@ import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import org.phoebus.applications.saveandrestore.common.Utilities; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; -import org.phoebus.applications.saveandrestore.common.VNoData; -import org.phoebus.applications.saveandrestore.common.VTypePair; +import org.phoebus.applications.saveandrestore.ui.Utilities; +import org.phoebus.applications.saveandrestore.ui.VDisconnectedData; +import org.phoebus.applications.saveandrestore.ui.VNoData; +import org.phoebus.applications.saveandrestore.ui.VTypePair; import java.util.Formatter; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VTypeCellEditor.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VTypeCellEditor.java index 8e5a302ba9..98362e4001 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VTypeCellEditor.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/VTypeCellEditor.java @@ -24,27 +24,17 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.util.StringConverter; -import org.epics.vtype.Alarm; -import org.epics.vtype.EnumDisplay; -import org.epics.vtype.Time; -import org.epics.vtype.VEnum; -import org.epics.vtype.VNumber; -import org.epics.vtype.VNumberArray; -import org.epics.vtype.VType; -import org.phoebus.applications.saveandrestore.common.Utilities; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; -import org.phoebus.applications.saveandrestore.common.VNoData; -import org.phoebus.applications.saveandrestore.common.VTypePair; -import org.phoebus.applications.saveandrestore.ui.MultitypeTableCell; +import org.epics.vtype.*; +import org.phoebus.applications.saveandrestore.ui.*; import java.util.ArrayList; import java.util.List; /** - * VTypeCellEditor is an editor type for {@link org.epics.vtype.VType} or {@link VTypePair}, which allows editing the + * VTypeCellEditor is an editor type for {@link org.epics.vtype.VType} or {@link org.phoebus.applications.saveandrestore.ui.VTypePair}, which allows editing the * value as a string. * - * @param {@link org.epics.vtype.VType} or {@link VTypePair} + * @param {@link org.epics.vtype.VType} or {@link org.phoebus.applications.saveandrestore.ui.VTypePair} * @author Jaka Bobnar */ public class VTypeCellEditor extends MultitypeTableCell { @@ -196,9 +186,9 @@ public void updateItem(T item, boolean empty) { } TableRow tableRow = getTableRow(); // If this is a TableEntry row and read-only it should not be editable. - if(tableRow != null){ - if(tableRow.getItem() != null && tableRow.getItem() instanceof TableEntry){ - TableEntry tableEntry = (TableEntry)tableRow.getItem(); + if (tableRow != null) { + if (tableRow.getItem() != null && tableRow.getItem() instanceof TableEntry) { + TableEntry tableEntry = (TableEntry) tableRow.getItem(); setEditable(tableEntry.readOnlyProperty().not().get()); } } diff --git a/app/save-and-restore/app/src/main/resources/org/phoebus/applications/saveandrestore/messages.properties b/app/save-and-restore/app/src/main/resources/org/phoebus/applications/saveandrestore/messages.properties index 697c1aeb57..0ea562eeff 100644 --- a/app/save-and-restore/app/src/main/resources/org/phoebus/applications/saveandrestore/messages.properties +++ b/app/save-and-restore/app/src/main/resources/org/phoebus/applications/saveandrestore/messages.properties @@ -10,6 +10,7 @@ closeConfigurationWarning=Configuration modified, but not saved. Do you wish to closeCompositeSnapshotWarning=Composite snapshot modified, but not saved. Do you wish to continue? closeTabPrompt=Close tab? comment=Comment +compositeSnapshotConsistencyCheckFailed=Failed to check consistency for composite snapshot copy=Copy createdDate=Created createLogEntry=Create Log Entry @@ -38,6 +39,8 @@ copyOrMoveNotAllowedBody=Selection cannot be moved/copied to the specified targe copyOrMoveNotAllowedHeader=Cannot move or copy selection. copyUniqueIdToClipboard=Copy unique id to clipboard createdBy=Created By +createCompositeSnapshotFailed=Failed to create composite snapshot +createConfigurationFailed=Failed to create configuration createNewTagDialogHeader=Add tag to selected snapshot(s) createNewTagDialogTitle=Add Tag createNodeFailed=Failed to create new node @@ -46,6 +49,7 @@ currentReadbackValue=Current Readback PV Value currentSetpointValue=Current Setpoint Value cut=Cut deleteFilter=Delete Filter +deleteFilterFailed=Failed to delete filter description=Description descriptionHint=Specify non-empty description duplicatePVNamesAdditionalItems={0} additional PV names @@ -146,9 +150,11 @@ saveFilterConfirmOverwrite=Filter named "{0}" already exists. Overwrite? saveSnapshot=Save saveSnapshotAndCreateLogEntry=Save And Log saveSnapshotErrorContent=Unable to save snapshot +saveSnapshotFailed=Failed to save snapshot saveTagButtonLabel=Save search=Search searchEntryToolTip=Double-click to select the node in the tree view +searchFailed=Search failed searchFieldToolTip=Type search query and press Enter to invoke search searchErrorBody=Search failed searchNoResultsTitle=Search Done @@ -191,6 +197,8 @@ tableColumnStoredReadback=Stored Readback tableColumnStoredSetpoint=Stored Setpoint tableColumnValue=Value tableColumnTime=Time +tagAddFailed=Failed to add tag +tagDeleteFailed=Failed to delete tag tagNameLabel=Tag name tagCommentLabel=Comment tagRemoveConfirmationTitle=Remove Tag @@ -221,6 +229,9 @@ toolTipConfigurationExists=Configuration name already exists in the folder! toolTipConfigurationExistsOption=Choose it with Browse if you want to add PVs in existing configuration. toolTipMultiplierSpinner=This field only takes number. unnamedSnapshot= +updateConfigurationFailed=Failed to update configuration +updateCompositeSnapshotFailed=Failed to update composite snapshot +updateNodeFailed=Failed to update node diff --git a/app/save-and-restore/app/src/main/resources/save_and_restore_preferences.properties b/app/save-and-restore/app/src/main/resources/save_and_restore_preferences.properties index 33d0160ced..1f933c89aa 100644 --- a/app/save-and-restore/app/src/main/resources/save_and_restore_preferences.properties +++ b/app/save-and-restore/app/src/main/resources/save_and_restore_preferences.properties @@ -16,3 +16,12 @@ default_search_query=tags=golden # If declared add a date automatically in the name of the snapshot "Take Snapshot" #default_snapshot_name_date_format=yyyy-MM-dd HH:mm:ss + +# The URL to the save-and-restore service +jmasar.service.url=http://localhost:8080/save-restore + +# Read timeout (in ms) used by the Jersey client +httpClient.readTimeout=1000 + +# Connect timeout in (ms) used by the Jersey client +httpClient.connectTimeout=1000 \ No newline at end of file diff --git a/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/SafeMultiplyTest.java b/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/SafeMultiplyTest.java index d8691da496..1b2b6a2eef 100644 --- a/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/SafeMultiplyTest.java +++ b/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/SafeMultiplyTest.java @@ -64,7 +64,8 @@ import org.epics.vtype.VUShortArray; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.phoebus.applications.saveandrestore.common.Utilities; +import org.phoebus.applications.saveandrestore.ui.Utilities; + import java.math.BigInteger; import java.time.Instant; diff --git a/app/save-and-restore/common/src/test/java/org/phoebus/applications/saceandrestore/common/UtilitiesTest.java b/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java similarity index 96% rename from app/save-and-restore/common/src/test/java/org/phoebus/applications/saceandrestore/common/UtilitiesTest.java rename to app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java index d1a60584f0..5df126e743 100644 --- a/app/save-and-restore/common/src/test/java/org/phoebus/applications/saceandrestore/common/UtilitiesTest.java +++ b/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java @@ -16,71 +16,17 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saceandrestore.common; - -import org.epics.util.array.ArrayBoolean; -import org.epics.util.array.ArrayByte; -import org.epics.util.array.ArrayDouble; -import org.epics.util.array.ArrayFloat; -import org.epics.util.array.ArrayInteger; -import org.epics.util.array.ArrayLong; -import org.epics.util.array.ArrayShort; -import org.epics.util.array.ArrayUByte; -import org.epics.util.array.ArrayUInteger; -import org.epics.util.array.ArrayULong; -import org.epics.util.array.ArrayUShort; -import org.epics.util.array.ListBoolean; -import org.epics.util.array.ListLong; -import org.epics.vtype.Alarm; -import org.epics.vtype.AlarmSeverity; -import org.epics.vtype.AlarmStatus; -import org.epics.vtype.Display; -import org.epics.vtype.EnumDisplay; -import org.epics.vtype.Time; -import org.epics.vtype.VBoolean; -import org.epics.vtype.VBooleanArray; -import org.epics.vtype.VByte; -import org.epics.vtype.VByteArray; -import org.epics.vtype.VDouble; -import org.epics.vtype.VDoubleArray; -import org.epics.vtype.VEnum; -import org.epics.vtype.VEnumArray; -import org.epics.vtype.VFloat; -import org.epics.vtype.VFloatArray; -import org.epics.vtype.VInt; -import org.epics.vtype.VIntArray; -import org.epics.vtype.VLong; -import org.epics.vtype.VLongArray; -import org.epics.vtype.VShort; -import org.epics.vtype.VShortArray; -import org.epics.vtype.VString; -import org.epics.vtype.VStringArray; -import org.epics.vtype.VType; -import org.epics.vtype.VUByte; -import org.epics.vtype.VUByteArray; -import org.epics.vtype.VUInt; -import org.epics.vtype.VUIntArray; -import org.epics.vtype.VULong; -import org.epics.vtype.VULongArray; -import org.epics.vtype.VUShort; -import org.epics.vtype.VUShortArray; +package org.phoebus.applications.saveandrestore.ui; + +import org.epics.util.array.*; +import org.epics.vtype.*; import org.junit.jupiter.api.Test; -import org.phoebus.applications.saveandrestore.common.Threshold; -import org.phoebus.applications.saveandrestore.common.Utilities; -import org.phoebus.applications.saveandrestore.common.VDisconnectedData; import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.*; public class UtilitiesTest { diff --git a/app/save-and-restore/common/pom.xml b/app/save-and-restore/common/pom.xml deleted file mode 100644 index 031a67dbb3..0000000000 --- a/app/save-and-restore/common/pom.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - 4.0.0 - - - org.phoebus - app-save-and-restore - 4.7.3-SNAPSHOT - - - save-and-restore-common - - - - - org.phoebus - save-and-restore-model - 4.7.3-SNAPSHOT - - - - org.phoebus - core-vtype - 4.7.3-SNAPSHOT - - - - org.epics - vtype - ${vtype.version} - - - - org.epics - vtype-json - ${vtype.version} - - - - org.epics - vtype-gson - ${vtype.version} - - - - - - org.junit.jupiter - junit-jupiter - ${junit.version} - test - - - - org.mockito - mockito-core - ${mockito.version} - test - - - - - - - - org.jacoco - jacoco-maven-plugin - 0.8.5 - - - default-prepare-agent - - prepare-agent - - - - default-report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.0.1 - - - - attach-javadocs - - jar - - - - - - - diff --git a/app/save-and-restore/pom.xml b/app/save-and-restore/pom.xml index 3ae0f378f2..dc466fb703 100644 --- a/app/save-and-restore/pom.xml +++ b/app/save-and-restore/pom.xml @@ -10,8 +10,6 @@ model app - service - common logging diff --git a/app/save-and-restore/service/pom.xml b/app/save-and-restore/service/pom.xml deleted file mode 100644 index 3fe15bd6e8..0000000000 --- a/app/save-and-restore/service/pom.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - 4.0.0 - - - org.phoebus - app-save-and-restore - 4.7.3-SNAPSHOT - - - save-and-restore-service - - - - - org.phoebus - save-and-restore-model - 4.7.3-SNAPSHOT - - - - org.phoebus - save-and-restore-common - 4.7.3-SNAPSHOT - - - - org.phoebus - core-pv - 4.7.3-SNAPSHOT - - - - org.epics - vtype - ${vtype.version} - - - - org.epics - vtype-json - ${vtype.version} - - - - org.epics - vtype-gson - ${vtype.version} - - - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson.version} - - - - com.sun.jersey - jersey-core - 1.19 - - - com.sun.jersey - jersey-client - 1.19 - - - - - - org.junit.jupiter - junit-jupiter - ${junit.version} - test - - - - org.mockito - mockito-core - ${mockito.version} - test - - - - - - - - org.jacoco - jacoco-maven-plugin - 0.8.5 - - - default-prepare-agent - - prepare-agent - - - - default-report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.0.1 - - - - attach-javadocs - - jar - - - - - - - diff --git a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/RestoreReport.java b/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/RestoreReport.java deleted file mode 100644 index 46c54be015..0000000000 --- a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/RestoreReport.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2020 European Spallation Source ERIC. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -package org.phoebus.applications.saveandrestore.script; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * A wrapper for various items describing the outcome of a restore operation. - */ -public class RestoreReport { - - /** - * Unique id of a snaphsot - */ - private String snapshotId; - /** - * "Path" if a snapshot, e.g. /folder1/folder2/saveset1/snapshot1 - */ - private String snapshotPath; - /** - * Date when the snapshot was restored - */ - private Date restoreDate; - /** - * Map of PV names and the values to which they were restored. - */ - private Map restoredPVs; - /** - * List of PVs that failed to restore. May be empty. - */ - private List nonRestoredPVs; - /** - * List of PVs that were restored in case one or several write operations fail and if rollback was requested, - * see {@link org.phoebus.applications.saveandrestore.script.SaveAndRestoreScriptUtil}. May be null. - */ - private Map rolledBackPVs; - - public RestoreReport(Date restoreDate, String snapshotId, String snapshotPath) { - this.restoreDate = restoreDate; - this.snapshotId = snapshotId; - this.snapshotPath = snapshotPath; - } - - public void setRolledBackPVs(Map rolledBackPVs) { - this.rolledBackPVs = rolledBackPVs; - } - - public void setRestoreDate(Date restoreDate) { - this.restoreDate = restoreDate; - } - - public Map getRestoredPVs() { - return restoredPVs; - } - - public void setRestoredPVs(Map restoredPVs) { - this.restoredPVs = restoredPVs; - } - - public List getNonRestoredPVs() { - return nonRestoredPVs; - } - - public void setNonRestoredPVs(List nonRestoredPVs) { - this.nonRestoredPVs = nonRestoredPVs; - } - - @Override - public String toString() { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("SnapshotData id: ").append(snapshotId).append(System.lineSeparator()); - stringBuilder.append("SnapshotData path: ").append(snapshotPath).append(System.lineSeparator()); - stringBuilder.append("Restore date: ").append(restoreDate).append(System.lineSeparator()); - stringBuilder.append("Restored PVs: ").append(System.lineSeparator()); - restoredPVs.entrySet().stream().forEach(entry -> { - stringBuilder.append(entry.getKey()).append(" : ").append(entry.getValue()).append(System.lineSeparator()); - }); - if (!nonRestoredPVs.isEmpty()) { - stringBuilder.append("Non-restored PVs:").append(System.lineSeparator()); - nonRestoredPVs.stream().forEach(pvName -> { - stringBuilder.append(pvName).append(System.lineSeparator()); - }); - } - if (rolledBackPVs != null && !rolledBackPVs.isEmpty()) { - stringBuilder.append("Rolled-back PVs:").append(System.lineSeparator()); - rolledBackPVs.entrySet().stream().forEach(entry -> { - stringBuilder.append(entry.getKey()).append(" : ").append(entry.getValue()).append(System.lineSeparator()); - }); - } - - return stringBuilder.toString(); - } -} diff --git a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/SaveAndRestoreScriptUtil.java b/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/SaveAndRestoreScriptUtil.java deleted file mode 100644 index c20668a2a5..0000000000 --- a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/script/SaveAndRestoreScriptUtil.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) 2020 European Spallation Source ERIC. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -package org.phoebus.applications.saveandrestore.script; - -import org.epics.vtype.VType; -import org.phoebus.applications.saveandrestore.SaveAndRestoreClient; -import org.phoebus.applications.saveandrestore.common.Utilities; -import org.phoebus.applications.saveandrestore.impl.SaveAndRestoreJerseyClient; -import org.phoebus.applications.saveandrestore.model.Node; -import org.phoebus.applications.saveandrestore.model.SnapshotItem; -import org.phoebus.pv.PV; -import org.phoebus.pv.PVPool; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Collectors; - -@SuppressWarnings("unused") -public class SaveAndRestoreScriptUtil { - - private static SaveAndRestoreClient saveAndRestoreClient; - private static final Logger logger = Logger.getLogger(SaveAndRestoreScriptUtil.class.getName()); - - /** - * Useful in case a mock client is needed. - * - * @param client The client used to interact with the remote service - */ - public static void setSaveAndRestoreClient(SaveAndRestoreClient client) { - saveAndRestoreClient = client; - } - - /** - * Should be called before a call to the service is invoked. - */ - private static void ensureClientSet() { - if (saveAndRestoreClient == null) { - saveAndRestoreClient = new SaveAndRestoreJerseyClient(); - } - } - - public static List getChildNodes(String nodeId) { - ensureClientSet(); - return saveAndRestoreClient.getChildNodes(nodeId); - } - - public static List getSnapshotItems(String snapshotId) { - ensureClientSet(); - return saveAndRestoreClient.getSnapshotData(snapshotId).getSnapshotItems(); - } - - /** - * Restores PV values from a given snapshot. Before values are written to the PVs, this method will first - * connect to all of the PVs. If any of the PVs fails to connect, an exception is thrown, i.e. the restore - * operation is aborted. - *

- * Once all PVs have been successfully connected, the persisted values in the snapshot are written in an - * synchronous manner, i.e. the call to the write operation on a PV will wait for completion before a write - * operation on the next PV is invoked. - *

- * - * @param snapshotId The unique id of a snapshot, which can be copied to the clipboard in the save-and-restore UI. - * @param connectTimeout The timeout in ms when connecting to the PVs. If not all PVs are connected after - * connectTimeout ms, an exception is thrown. - * @param writeTimeout The timeout i ms to wait for a single write operation to complete. - * @param abortOnFail Determines if write of PV values should be aborted when a write failure occurs, e.g. - * PV is disconnected or read-only. - * @param rollBack Determines if restored PVs should be restored to the original state if a write failure occurs. - * @return A {@link RestoreReport} holding data that can be used to analyze the outcome of the process. - * @throws Exception In either of these following cases: - *
    - *
  • The remote save-and-restore service is unavailable.
  • - *
  • No snapshot identified by the snapshot id exists.
  • - *
  • The snapshot is not associated with any persisted PV values. This is a corner case...
  • - *
  • If any of the PVs fails to connect.
  • - *
- */ - public static RestoreReport restore(String snapshotId, int connectTimeout, int writeTimeout, boolean abortOnFail, boolean rollBack) throws Exception { - ensureClientSet(); - saveAndRestoreClient.getNode(snapshotId); // This will throw an exception if the snapshot does not exist. - List snapshotItems = saveAndRestoreClient.getSnapshotData(snapshotId).getSnapshotItems(); - List restorableItems = - snapshotItems.stream().filter(item -> !item.getConfigPv().isReadOnly()).collect(Collectors.toList()); - if (restorableItems.isEmpty()) { // Should really not happen. - throw new Exception("No restorable PVs found in snapshot id " + snapshotId); - } - - Map savedValues = new HashMap<>(); - Map pvs = new HashMap<>(); - List> latest = new ArrayList<>(); - boolean allConnected = true; - try { - // First connect to all PVs and read values. - for (SnapshotItem item : restorableItems) { - final CompletableFuture done = new CompletableFuture<>(); - latest.add(done); - String pvName = item.getConfigPv().getPvName(); - final org.phoebus.pv.PV pv = PVPool.getPV(pvName); - pvs.put(pvName, pv); - pv.onValueEvent().subscribe(value -> { - if (!PV.isDisconnected(value)) { - savedValues.put(pvName, value); - done.complete(value); - } - }); - } - CompletableFuture.allOf(latest.toArray(new CompletableFuture[latest.size()])) - .get(connectTimeout, TimeUnit.MILLISECONDS); - } catch (Exception e) { - logger.log(Level.WARNING, "Failed to connect and read all PVs", e); - allConnected = false; - } - - // If any of the PVs fails to connect, abort the restore process. - if (!allConnected) { - pvs.forEach((key, value) -> PVPool.releasePV(value)); - throw new Exception("Failed to connect to all PVs within " + connectTimeout + " ms."); - } - String path = saveAndRestoreClient.getFullPath(snapshotId); - RestoreReport restoreReport = new RestoreReport(new Date(), snapshotId, path); - Map restoredPVs = new HashMap<>(); - List nonRestoredPvs = new ArrayList<>(); - List rollBackItems = new ArrayList<>(); - // All connected, now write values - boolean writeFailureDetected = false; - for (SnapshotItem item : restorableItems) { - String pvName = item.getConfigPv().getPvName(); - PV pv = pvs.get(pvName); - try { - Object vType = Utilities.toRawValue(item.getValue()); - Future result = pv.asyncWrite(vType); - result.get(1000, TimeUnit.MILLISECONDS); - restoredPVs.put(pvName, vType); - // A restored PV may be subject to rollback, so add it here - rollBackItems.add(new RollBackItem(pv, savedValues.get(pvName))); - } catch (Exception exception) { - logger.log(Level.WARNING, "Failed to restore/write PV " + pvName); - writeFailureDetected = true; - if (abortOnFail) { - break; - } - } - } - if (writeFailureDetected && rollBack) { - Map rolledBackPVs = rollback(rollBackItems, writeTimeout); - restoreReport.setRolledBackPVs(rolledBackPVs); - } - // Determine the list of PVs that were not restored. - List restorablePVNames = pvs.values().stream().map(PV::getName).collect(Collectors.toList()); - List restoredPVNames = new ArrayList<>(restoredPVs.keySet()); - restorablePVNames.removeAll(restoredPVNames); - restoreReport.setNonRestoredPVs(restorablePVNames); - - restoreReport.setRestoredPVs(restoredPVs); - - pvs.forEach((key, value) -> PVPool.releasePV(value)); - - return restoreReport; - } - - private static Map rollback(List rollBackItems, int writeTimeout) { - Map rolledBackPVs = new HashMap<>(); - rollBackItems.forEach(item -> { - try { - logger.log(Level.INFO, "Rollback of PV " + item.pv.getName() + " to value " + item.value); - Future result = item.pv.asyncWrite(Utilities.toRawValue(item.value)); - result.get(writeTimeout, TimeUnit.MILLISECONDS); - rolledBackPVs.put(item.pv.getName(), item.value); - } catch (Exception exception) { - logger.log(Level.WARNING, "Failed to rollback PV " + item.pv.getName(), exception); - } - }); - return rolledBackPVs; - } - - private static class RollBackItem { - private final VType value; - private final PV pv; - - public RollBackItem(PV pv, VType value) { - this.pv = pv; - this.value = value; - } - } -} diff --git a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/service/Messages.java b/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/service/Messages.java deleted file mode 100644 index 6c93843f82..0000000000 --- a/app/save-and-restore/service/src/main/java/org/phoebus/applications/saveandrestore/service/Messages.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (C) 2019 European Spallation Source ERIC. - *

- * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - *

- * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package org.phoebus.applications.saveandrestore.service; - -import org.phoebus.framework.nls.NLS; - -public class Messages { - - public static String compositeSnapshotConsistencyCheckFailed; - public static String copyOrMoveNotAllowedBody; - public static String createNodeFailed; - public static String createCompositeSnapshotFailed; - public static String createConfigurationFailed; - public static String deleteFilterFailed; - public static String updateConfigurationFailed; - public static String updateCompositeSnapshotFailed; - public static String saveFilterFailed; - public static String searchFailed; - public static String saveSnapshotFailed; - public static String tagAddFailed; - public static String updateNodeFailed; - - static - { - NLS.initializeMessages(Messages.class); - } - - private Messages() - { - // Prevent instantiation - } - -} diff --git a/app/save-and-restore/service/src/main/resources/client_preferences.properties b/app/save-and-restore/service/src/main/resources/client_preferences.properties deleted file mode 100644 index 8e58e2b1b5..0000000000 --- a/app/save-and-restore/service/src/main/resources/client_preferences.properties +++ /dev/null @@ -1,30 +0,0 @@ -# -# Copyright (C) 2020 European Spallation Source ERIC. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# ----------------------------------------------- -# Package org.phoebus.applications.saveandrestore -# ----------------------------------------------- - -# The URL to the save-and-restore service -jmasar.service.url=http://localhost:8080/save-restore - -# Read timeout (in ms) used by the Jersey client -httpClient.readTimeout=1000 - -# Connect timeout in (ms) used by the Jersey client -httpClient.connectTimeout=1000 \ No newline at end of file diff --git a/app/save-and-restore/service/src/main/resources/org/phoebus/applications/saveandrestore/service/messages.properties b/app/save-and-restore/service/src/main/resources/org/phoebus/applications/saveandrestore/service/messages.properties deleted file mode 100644 index 4eef2ff376..0000000000 --- a/app/save-and-restore/service/src/main/resources/org/phoebus/applications/saveandrestore/service/messages.properties +++ /dev/null @@ -1,19 +0,0 @@ -compositeSnapshotConsistencyCheckFailed=Failed to check consistency for composite snapshot -copyOrMoveNotAllowedBody=Selection cannot be moved/copied to the specified target node. -createCompositeSnapshotFailed=Failed to create composite snapshot -createConfigurationFailed=Failed to create configuration -createNodeFailed=Failed to create new node -deleteFilterFailed=Failed to delete filter -saveFilterFailed=Failed to save filter -saveSnapshotFailed=Failed to save snapshot -searchFailed=Search failed -tagAddFailed=Failed to add tag -tagDeleteFailed=Failed to delete tag -updateConfigurationFailed=Failed to update configuration -updateCompositeSnapshotFailed=Failed to update composite snapshot -updateNodeFailed=Failed to update node - - - - - From 6e555ef4098900fec6d0743ac859b31fd51b0318 Mon Sep 17 00:00:00 2001 From: georgweiss Date: Mon, 11 Sep 2023 18:52:49 +0200 Subject: [PATCH 2/3] Renamed package --- .../{service => client}/SaveAndRestoreClient.java | 2 +- .../{service => client}/SaveAndRestoreJerseyClient.java | 4 ++-- .../applications/saveandrestore/ui/SaveAndRestoreService.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/{service => client}/SaveAndRestoreClient.java (99%) rename app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/{service => client}/SaveAndRestoreJerseyClient.java (99%) diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreClient.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreClient.java similarity index 99% rename from app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreClient.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreClient.java index 85b2a29eec..68abf8616b 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreClient.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreClient.java @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.service; +package org.phoebus.applications.saveandrestore.client; import org.phoebus.applications.saveandrestore.SaveAndRestoreClientException; import org.phoebus.applications.saveandrestore.model.*; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreJerseyClient.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java similarity index 99% rename from app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreJerseyClient.java rename to app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java index c6f2f7c9c0..d5e2bbd5ce 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/service/SaveAndRestoreJerseyClient.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -package org.phoebus.applications.saveandrestore.service; +package org.phoebus.applications.saveandrestore.client; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; @@ -38,7 +38,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -public class SaveAndRestoreJerseyClient implements org.phoebus.applications.saveandrestore.service.SaveAndRestoreClient { +public class SaveAndRestoreJerseyClient implements org.phoebus.applications.saveandrestore.client.SaveAndRestoreClient { private final Client client; private static final String CONTENT_TYPE_JSON = "application/json; charset=UTF-8"; diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java index e8af0617bf..f08d792574 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java @@ -31,8 +31,8 @@ import org.phoebus.applications.saveandrestore.model.TagData; import org.phoebus.applications.saveandrestore.model.search.Filter; import org.phoebus.applications.saveandrestore.model.search.SearchResult; -import org.phoebus.applications.saveandrestore.service.SaveAndRestoreClient; -import org.phoebus.applications.saveandrestore.service.SaveAndRestoreJerseyClient; +import org.phoebus.applications.saveandrestore.client.SaveAndRestoreClient; +import org.phoebus.applications.saveandrestore.client.SaveAndRestoreJerseyClient; import javax.ws.rs.core.MultivaluedMap; import java.util.ArrayList; From 8040627d51e7e45e721caeec96d9dfe7d3617f04 Mon Sep 17 00:00:00 2001 From: georgweiss Date: Mon, 11 Sep 2023 20:08:38 +0200 Subject: [PATCH 3/3] Updated preferences file name --- .../saveandrestore/client/SaveAndRestoreJerseyClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java index d5e2bbd5ce..1038eb3804 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/client/SaveAndRestoreJerseyClient.java @@ -51,7 +51,7 @@ public class SaveAndRestoreJerseyClient implements org.phoebus.applications.save public SaveAndRestoreJerseyClient() { - PreferencesReader preferencesReader = new PreferencesReader(SaveAndRestoreClient.class, "/client_preferences.properties"); + PreferencesReader preferencesReader = new PreferencesReader(SaveAndRestoreClient.class, "/save_and_restore_preferences.properties"); this.jmasarServiceUrl = preferencesReader.get("jmasar.service.url"); int httpClientReadTimeout = DEFAULT_READ_TIMEOUT;