From 2fc5993572446fdf7eb700bd625f6da03c205d67 Mon Sep 17 00:00:00 2001 From: schauderd Date: Tue, 4 Mar 2025 09:24:02 -0500 Subject: [PATCH 1/2] added Db Cleanup option to remove large TmWorkspaces --- .../admin/AdministrationTopComponent.java | 40 +++- .../admin/DatabaseCleanupPanel.java | 225 ++++++++++++++++++ .../workstation/admin/images/clean.png | Bin 0 -> 4674 bytes .../janelia/workstation/admin/images/logs.png | Bin 5015 -> 5937 bytes .../access/TiledMicroscopeDomainMgr.java | 11 + .../access/TiledMicroscopeRestClient.java | 31 +++ pom.xml | 2 +- 7 files changed, 300 insertions(+), 9 deletions(-) create mode 100644 modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java create mode 100644 modules/AdministrationGUI/src/main/resources/org/janelia/workstation/admin/images/clean.png diff --git a/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/AdministrationTopComponent.java b/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/AdministrationTopComponent.java index 74485408a..782aee2a8 100644 --- a/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/AdministrationTopComponent.java +++ b/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/AdministrationTopComponent.java @@ -77,9 +77,11 @@ private void setupGUI() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.topMenu = new JPanel(); - BoxLayout layout = new BoxLayout(topMenu, BoxLayout.X_AXIS); - topMenu.setLayout(layout); + topMenu.setLayout(new BoxLayout(topMenu, BoxLayout.Y_AXIS)); // Main panel with vertical layout + // First row with "Users" and "Groups" + JPanel row1 = new JPanel(); + row1.setLayout(new BoxLayout(row1, BoxLayout.X_AXIS)); // top level buttons JButton listUsersButton = new JButton(UIUtils.getClasspathImage(this.getClass(), "/org/janelia/workstation/admin/images/user.png")); listUsersButton.setText("Users"); @@ -87,9 +89,9 @@ private void setupGUI() { listUsersButton.setVerticalTextPosition(SwingConstants.BOTTOM); listUsersButton.setHorizontalTextPosition(SwingConstants.CENTER); listUsersButton.addActionListener(event -> viewUserList()); - topMenu.add(listUsersButton); + row1.add(listUsersButton); - topMenu.add(Box.createHorizontalStrut(20)); + row1.add(Box.createHorizontalStrut(20)); // Add space between buttons JButton listGroupsButton = new JButton(UIUtils.getClasspathImage(this.getClass(), "/org/janelia/workstation/admin/images/group.png")); listGroupsButton.setText("Groups"); @@ -97,17 +99,30 @@ private void setupGUI() { listGroupsButton.setToolTipText("Show all groups"); listGroupsButton.setVerticalTextPosition(SwingConstants.BOTTOM); listGroupsButton.setHorizontalTextPosition(SwingConstants.CENTER); - topMenu.add(listGroupsButton); - - topMenu.add(Box.createHorizontalStrut(20)); + listGroupsButton.addActionListener(event -> viewGroupList()); + row1.add(listGroupsButton); + row1.add(Box.createHorizontalStrut(20)); JButton getLogsButton = new JButton(UIUtils.getClasspathImage(this.getClass(), "/org/janelia/workstation/admin/images/logs.png")); getLogsButton.setText("Logs"); getLogsButton.setToolTipText("Retrieve Logs"); getLogsButton.addActionListener(event -> getLogs()); getLogsButton.setVerticalTextPosition(SwingConstants.BOTTOM); getLogsButton.setHorizontalTextPosition(SwingConstants.CENTER); - topMenu.add(getLogsButton); + row1.add(getLogsButton); + + row1.add(Box.createHorizontalStrut(20)); + + JButton workspaceCleanupButton = new JButton(UIUtils.getClasspathImage(this.getClass(), "/org/janelia/workstation/admin/images/clean.png")); + workspaceCleanupButton.setText("Cleanup Db"); + workspaceCleanupButton.setToolTipText("Manage and delete large workspaces"); + workspaceCleanupButton.setVerticalTextPosition(SwingConstants.BOTTOM); + workspaceCleanupButton.setHorizontalTextPosition(SwingConstants.CENTER); + workspaceCleanupButton.addActionListener(event -> databaseCleanup()); + row1.add(workspaceCleanupButton); + + // Add both rows to the main menu + topMenu.add(row1); add(topMenu); add(Box.createVerticalGlue()); @@ -127,6 +142,15 @@ public void objectsInvalidated(DomainObjectInvalidationEvent event) { } } + void databaseCleanup() { + DatabaseCleanupPanel panel = new DatabaseCleanupPanel(this); + removeAll(); + add(panel); + revalidate(); + repaint(); + this.currentView = panel; + } + void viewUserList() { UserManagementPanel panel = new UserManagementPanel(this); removeAll(); diff --git a/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java b/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java new file mode 100644 index 000000000..5fd3922f7 --- /dev/null +++ b/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java @@ -0,0 +1,225 @@ +package org.janelia.workstation.admin; + +import org.janelia.model.domain.tiledMicroscope.TmWorkspace; +import org.janelia.model.domain.tiledMicroscope.TmWorkspaceInfo; +import org.janelia.workstation.common.gui.support.DesktopApi; +import org.janelia.workstation.controller.access.TiledMicroscopeDomainMgr; +import org.janelia.workstation.core.util.Refreshable; +import org.janelia.workstation.core.workers.BackgroundWorker; +import org.janelia.workstation.core.workers.SimpleWorker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.swing.*; +import javax.swing.table.AbstractTableModel; +import java.awt.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +public class DatabaseCleanupPanel extends JPanel implements Refreshable { + private static final Logger log = LoggerFactory.getLogger(DatabaseCleanupPanel.class); + private final AdministrationTopComponent parent; + private JTable workspaceTable; + private WorkspaceTableModel tableModel; + + public DatabaseCleanupPanel(AdministrationTopComponent parent) { + this.parent = parent; + refresh(); + } + + private void setupUI() { + setLayout(new BorderLayout()); + removeAll(); + + JPanel titlePanel = new TitlePanel("Manage Workspaces", "Return To Top Menu", + event -> refresh(), + event -> returnHome()); + add(titlePanel, BorderLayout.NORTH); + + tableModel = new WorkspaceTableModel(); + workspaceTable = new JTable(tableModel); + JScrollPane scrollPane = new JScrollPane(workspaceTable); + add(scrollPane, BorderLayout.CENTER); + + JButton refreshButton = new JButton("Load Largest Workspaces"); + refreshButton.addActionListener(e -> loadLargestWorkspaces()); + + JButton deleteButton = new JButton("Delete Selected Workspaces"); + deleteButton.addActionListener(e -> deleteSelectedWorkspaces()); + + JPanel buttonPanel = new JPanel(); + buttonPanel.add(refreshButton); + buttonPanel.add(deleteButton); + add(buttonPanel, BorderLayout.SOUTH); + + revalidate(); + } + + private void loadLargestWorkspaces() { + SimpleWorker worker = new SimpleWorker() { + private List workspaceResults; + + @Override + protected void doStuff() { + SwingUtilities.invokeLater(() -> tableModel.clear()); + + TiledMicroscopeDomainMgr domainMgr = TiledMicroscopeDomainMgr.getDomainMgr(); + workspaceResults = domainMgr.getLargestWorkspaces(); + } + + @Override + protected void hadSuccess() { + tableModel.setWorkspaces(workspaceResults); + } + + @Override + protected void hadError(Throwable error) { + log.error("Error loading workspaces", error); + JOptionPane.showMessageDialog(DatabaseCleanupPanel.this, + "Failed to load workspaces: " + error.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + }; + worker.execute(); + } + + private void deleteSelectedWorkspaces() { + List selectedWorkspaces = tableModel.getSelectedWorkspaces(); + if (selectedWorkspaces.isEmpty()) { + JOptionPane.showMessageDialog(this, "Please select at least one workspace to delete.", "No Selection", JOptionPane.WARNING_MESSAGE); + return; + } + + int confirmation = JOptionPane.showConfirmDialog(this, + "Are you sure you want to delete the selected workspaces?", + "Confirm Deletion", JOptionPane.YES_NO_OPTION); + + if (confirmation == JOptionPane.YES_OPTION) { + + BackgroundWorker deleter = new BackgroundWorker() { + @Override + public String getName() { + return "Deleting TmWorkspaces"; + } + + @Override + protected void doStuff() { + TiledMicroscopeDomainMgr domainMgr = TiledMicroscopeDomainMgr.getDomainMgr(); + domainMgr.removeWorkspaces(selectedWorkspaces); + } + + @Override + protected void hadSuccess() { + loadLargestWorkspaces(); + JOptionPane.showMessageDialog(DatabaseCleanupPanel.this, + "Selected workspaces deleted successfully.", "Success", JOptionPane.INFORMATION_MESSAGE); + } + + @Override + protected void hadError(Throwable error) { + log.error("Error deleting workspaces", error); + JOptionPane.showMessageDialog(DatabaseCleanupPanel.this, + "Failed to delete workspaces: " + error.getMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } + }; + deleter.executeWithEvents(); + } + } + + @Override + public void refresh() { + setupUI(); + } + + private void returnHome() { + parent.viewTopMenu(); + } +} + +class WorkspaceTableModel extends AbstractTableModel { + private final String[] columnNames = {"Select", "Name", "Owner", "Date Created", "Size"}; + private List workspaceResults = new ArrayList<>(); + private final List selected = new ArrayList<>(); + + public void setWorkspaces(List workspaceResults) { + this.workspaceResults = workspaceResults; + selected.clear(); + for (int i = 0; i < workspaceResults.size(); i++) { + selected.add(false); // Initialize selection state + } + fireTableDataChanged(); + } + + @Override + public int getRowCount() { + return workspaceResults.size(); + } + + @Override + public int getColumnCount() { + return columnNames.length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + TmWorkspaceInfo workspaceInfo = workspaceResults.get(rowIndex); + switch (columnIndex) { + case 0: + return selected.get(rowIndex); // Boolean checkbox + case 1: + return workspaceInfo.getWorkspaceName(); + case 2: + return workspaceInfo.getOwnerKey(); + case 3: + return workspaceInfo.getDateCreated(); + case 4: + return workspaceInfo.getTotalSize(); + default: + return null; + } + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == 0; // Allow only checkboxes to be editable + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if (columnIndex == 0 && aValue instanceof Boolean) { + selected.set(rowIndex, (Boolean) aValue); + fireTableCellUpdated(rowIndex, columnIndex); // Notify JTable of the change + } + } + + public void clear() { + workspaceResults.clear(); + selected.clear(); + fireTableDataChanged(); // Notify the table UI that the data has changed + } + + @Override + public Class getColumnClass(int columnIndex) { + return columnIndex == 0 ? Boolean.class : String.class; + } + + public List getSelectedWorkspaces() { + List selectedWorkspaces = new ArrayList<>(); + for (int i = 0; i < workspaceResults.size(); i++) { + if (selected.get(i)) { + selectedWorkspaces.add(workspaceResults.get(i).getWorkspaceId()); + } + } + return selectedWorkspaces; + } + + @Override + public String getColumnName(int column) { + return columnNames[column]; + } +} + diff --git a/modules/AdministrationGUI/src/main/resources/org/janelia/workstation/admin/images/clean.png b/modules/AdministrationGUI/src/main/resources/org/janelia/workstation/admin/images/clean.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0815fe1d8b3615005bcea0b0e4bf327e38e9b1 GIT binary patch literal 4674 zcmeHLdr(tX8o!{+tAK#*N~`GIbf-SbO>&bP@-Pt)B7`NtLST99xSrg50=MQxa!CTU z6`@iE+v>JDTFdxAsXIlicB+f(iWTeH8GLlB4z;!wd@!tNp}UmbMR3necuqUB!|eJW znI!j~?|k?7ec$ixYm)(mm3+zxT*VNDq3xnapF3U9+hhq|9$?tgAW&Fw26zwN4yS-;^xZb5NyH(*wt z9Vu@;+fW@9c&YB4!Zd^ZZkm4X=9)N#cA@%=kkt&dE!}#2Z)9Ft|4>SNeZbG(HT}!@ z%glM#3l5F=fA&^nLBgIx-Mi=K%Kdk3y}9?x6UILr`)%uo4@+x0g6s3|9kmVY|LUt_ zr)TYt3I6r75%aO(JC%*W0Uxd25^?d_TxIpm^m*UgG6T=f>r@sj5T_TlVwm4+Y*JE| zE-7iO98|=6uWZw#wk1T@eA`&7T~_6aC=JT4@7*tW^WzZhp@^3@=EbB7hpS%*)792B z+$yy96(9ZEt*)jIsz1PkMk@dKR7R~ZyUVTHr`_USFxdCa;OU#M1O~kk@lft8 z>c8LE^p|Db#HGT6=L-k#h(fyuw!`Kxo=c3X%deUp8S>JS2LJiwjk4_613l`_+lySo zQ7un9wtsTrXyr2MLi3_Wb6y?1zARl|q3fJ|Ww=YRh)%dHywbG%(%{kCRA%KZsr}%I z;cEfnAzj6v4{P759I@Q$I(c~M%V+L}i~qq~XzWc(EL^z{JGJL?`Q6G-iuSrM-Y>ep z;QcuXH5J=W`h|yY=oi2vL#LKs{qn^6wS~h&e#s9V@0_ah&%&_q)hv=%zCK+=+blxB z*o;u*Q7+MOfgiWn*z?_N<16{F} zRx*P46(MSm3ISLk2XK$YY;~$U8i5yAh3ErMofL7+~QA34RJV@(reP05X)@s=|=5fpA5e~R~5?Otc(rPr&HZFCtQRF|v~ z@cF738_hB*->qB@0WdOzDGo3MWu!<#p;Xd@$w)z?f>A(7l9QlxRwoCnG~}TWxR6CS zN|G{3WE4#RS|KAS6OO82Apzn@ zlAz?I5`ik?h&U-Dkx-0L8E1rED83J>#4MdgAQ6fuELmp2nQRV=MxX~Yo|!W-V_+>X zhXXuoq?{tf$~aOfQHte~IOT*>9&|X7;&@O}ER-s|GYqX-g&+Y^4r>9$P-M3jdnfq5 zs8BVCS-=YwA$#qp7*&!30?y_z*lcEvfKL|ZA;+inXgx821Id7cD4JLzQ;DT2F=Y@d zRFqOBlMrHLndEO{SX23b^X69%uJ-jjm35-{64bwNTf)gKn4L)s!T4YWO7u$uXE!J{%?+M>~pFB;$SM@d5oKgrjq;GSd%9G?j?Eq-U{nxSi23{1;;MqM*>O^bnPInSu; z|3+8H#Gw&d(N8@$IuaHg=q^XcNmEw3LF+wOVvip`MmK$ZeMLn@j~+dG@ZdpbXJZ2rKLr!R9v79vu1~p)D5#miA-B`$%%&iwg)?who8YilUiQ?ZvEv9 z!=d0M=c|N2Tn~!>Ys8Af1v_BOGpjfMKm=47;&lrDGuJ}%w6VwXM*RI2t(r5i29E5E z2#!7<_Pc8pmv%&kRQ6xa+xIZ#SbZXuC~1EC_^WGzdO1hQ(x|Nml78{pNBV#}&*aYe tXDg;3`1>0ayx=~#?(2Vl1`4jTnvF%&>&-9cRHM8woi-!6dF7g_{{XcLkhK5+ literal 0 HcmV?d00001 diff --git a/modules/AdministrationGUI/src/main/resources/org/janelia/workstation/admin/images/logs.png b/modules/AdministrationGUI/src/main/resources/org/janelia/workstation/admin/images/logs.png index 77b1da29a568d8a5551b8971820485d8bc5b88ef..ce2743d6765d24322ba36190918b6115ad978e99 100644 GIT binary patch delta 2083 zcmZuxXH=637X1<+K$IE=krF};Ab~F-gb+|c2oR-7TM6hANJ5bkq(}=1Dn+p%k>d1dIERz=2;d*@B` zId7Eip|-9@o;n+rl~-@EPy2mdkWnc)b*=$!ULA8mnA>)U_zsi4AEkgI<^W5LA0!pow1i z=IEsxXj}O;xAwlp3}%3OwU4?qWxaJ~v4m0oOxsz# z@W3%yHF%7f5UPWHo#JPCW!7h)JuvX@?1czR_}#$|`r zCW!hGPJ>oMwGIPIHz)BvT!{_qYRlSl7`Q^o=&U23_v+}`S=^cQ7Du<#mkoz5FN+xPo~AOb{b;s@L15EfWs59L?RYP z_zx+FaU>}^A%3SJ&I$`!*${cPa!4Kl7VT_H0&PejJ^&<=Y(Wy9hygb*;7?&%9E;?Y zK#yjoyV8;wn^F+>f7neD*ery%MLyJ+iHoqIV?ic{jSAMQqkI2UH9RTY`p7{&Nw;!Qf? z_4(fg`E6})4yvqJDqFW3=*%2^*Sp;P*p&BbrgC{;Arq>osL0vepV)A}5Dsq|7?kl> zBcFxVxYg+7qMZm`@cEM+eQ;J!RNxLv$cyDpac~&&8sz1=a9*8dRN;4q^fY}k)}((d2@D1emt z4p~GF?y6`)SOV6JKGHN86o5DY+x4nX7Kjg-(Vxd1l8Xm+e>*TH3o7XrjQ1>{1agkh zP}x*r^<%f1zvT#b>Q1eRpI;{D95QXt8R5vMN2OPY;ZlM$kpJf&I4VY^QL}*TWE26t z&z%&D)?%)tthWxwbT-HynAyhdMJ-nqHaWmLet&G+3DMvI54)9R-hc8GM=e&TtP9dU zW8=?J2koDYI%^qaLG)cOSCOb|N1N`J^2LL1=pMJ<*^x!La%H-xo#vvgZIv6Xzp z_GdZpvbu#c59a1Ysagj#%4dsR={k&9x`*oW5hnLa--E(8?{AOWn|qz_?)Rq zK<6y@bsC_5m`F>9ubU?gK&?4+`VEK(ch-(7zvCQL@Q;JF7q06xF6TKmiRU~fM@Srl zKeCJ-nDIrUYRHQLtvc1mKL~O{ipM|6zo=W-mJ>tn#MHedC6$jEmVe2CrKdoi{w|*tRl)Gb)Vgsq%I&Eid0e1(j!2- zGbCnGILn>c0qfshXYpeB@7zpd61}}gkDqwCz`H@?LK{YsK}eBX2au)7w@n8FUoT~q z2oj`vpMugO2dYnV^sv;mLwF@Kxv`LzfvznbXyhv6H}!qutAaFpdL_qu@05y-Ns<>n zH$KT2?kPtJC~0jOTw?@1RZU0pZpTqhk6A?={v=_KPJ5m_30Q8g3%XKr$6Rf~TNua= z(?+4cUrt$%R}7{#^3c0*)H;nmMeRCo>dcaS%-E~~!+}l44)r(r>&|6#YzCu2`B5HcP_mRx?iK~$&q}u6#$kWh$Ul&%eo|x$kh01ES`9(Ww(z{>j>)}X6QK7Xx*lr+;V?eYK49Jv z5sZO6K7e+FP%TKtKzkUW7E7-%j*)C3|Mql%zG*I6Di;T(=>Px$g=s@WP)S2WAaHVT zW@&6?004NLeUUv#!$2IxUsFp(Dh?JA5y?*61A{7G`jVtud{CZQTxp(f02&0QCqkD$h}+pP1PPiAp-QQPYnR+2s{aj5w>OBI3jsYnDPKo z0hW0RR6fAzCqVr{ZDt6gdH|P@V9nG-J-|#KP#b-XB0vo(OXcBxfYlC<^cXCOAR!Q? z*QhK3O3^>>0l=AVl#y>4gEh6n*G-f*@aDgR-m`!95=arsf6eox4K{L+ANh#wYJ#a5 z!AUwro^qxjG7l)#@>8_0#8nSOS{j>@NWDbyyMPNYKA0D45?-s?}aVmrSd2KvEayT3gheHT| Xi17%L9NDVj00000NkvXXu0mjfb?+bU diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeDomainMgr.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeDomainMgr.java index 2e037dabb..a1cf84b81 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeDomainMgr.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeDomainMgr.java @@ -15,6 +15,7 @@ import org.janelia.workstation.core.events.Events; import org.janelia.workstation.core.events.lifecycle.ConsolePropsLoaded; import org.janelia.model.domain.tiledMicroscope.BoundingBox3d; +import org.janelia.model.domain.tiledMicroscope.TmWorkspaceInfo; import org.janelia.workstation.integration.util.FrameworkAccess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -153,6 +154,11 @@ public Collection getWorkspaceBoundingBoxes(Long workspaceId) thr return client.getWorkspaceBoundingBoxes(workspaceId); } + public List getLargestWorkspaces () { + LOG.debug("getLargestWorkspaces()"); + return client.getLargestWorkspaces(AccessManager.getSubjectKey()); + } + public List getOperationLogs (Long workspaceId, Long neuronId, Date startTime, Date endTime, String subjectKey) { LOG.debug("getOperationLogs(workspaceId={}, neuronId={}, startTime={}, endTime={})", @@ -231,6 +237,11 @@ public void remove(TmWorkspace workspace) throws Exception { getModel().notifyDomainObjectRemoved(workspace); } + public void removeWorkspaces(List selectedWorkspaces) { + LOG.debug("removeWorkspaces({})", selectedWorkspaces); + client.removeWorkspaces(selectedWorkspaces); + } + class RetrieveNeuronsTask extends RecursiveTask> { double defaultLength = 50000.0; int start; diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeRestClient.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeRestClient.java index 217903c64..eb338b110 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeRestClient.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/access/TiledMicroscopeRestClient.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.io.ByteStreams; @@ -118,6 +119,27 @@ public TmSample create(TmSample tmSample, Map storageAttributes) return response.readEntity(TmSample.class); } + public List getLargestWorkspaces(String subjectKey ) { + WebTarget target = getMouselightDataEndpoint("/workspace/largest") + .queryParam("username", subjectKey); + Response response = target + .request("application/json") + .get(); + checkBadResponse(target, response); + try { + String jsonResponse = response.readEntity(String.class); + + + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(jsonResponse, new TypeReference>() { + }); + } catch (Exception e) { + FrameworkAccess.handleException(e); + LOG.error ("Problems returning the largest workspaces in the db"); + throw new RemoteServiceException("Client had problems retrieving largest workspaces"); + } + } + public List getOperationLogs(Long workspaceId, Long neuronId, Date startTime, Date endTime, String subjectKey ) { @@ -501,4 +523,13 @@ public boolean isServerPathAvailable(String serverPath, boolean directoryOnly, M int responseStatus = response.getStatus(); return responseStatus == 200; } + + public void removeWorkspaces(List selectedWorkspaces) { + WebTarget target = getMouselightDataEndpoint("/workspaces/remove"); + + Response response = target + .request("application/json") + .put(Entity.json(selectedWorkspaces)); + checkBadResponse(target, response); + } } diff --git a/pom.xml b/pom.xml index 1b55413d4..f2a949e61 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ 9.4.46.v20220331 - 3.3.0 + 3.3.4 2.5.0 From ab0b6eea10935ba8b6aa026e6d78c4ce384436d0 Mon Sep 17 00:00:00 2001 From: schauderd Date: Tue, 4 Mar 2025 12:30:59 -0500 Subject: [PATCH 2/2] moved table model reset --- .../org/janelia/workstation/admin/DatabaseCleanupPanel.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java b/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java index 5fd3922f7..9e921d507 100644 --- a/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java +++ b/modules/AdministrationGUI/src/main/java/org/janelia/workstation/admin/DatabaseCleanupPanel.java @@ -64,14 +64,13 @@ private void loadLargestWorkspaces() { @Override protected void doStuff() { - SwingUtilities.invokeLater(() -> tableModel.clear()); - TiledMicroscopeDomainMgr domainMgr = TiledMicroscopeDomainMgr.getDomainMgr(); workspaceResults = domainMgr.getLargestWorkspaces(); } @Override protected void hadSuccess() { + tableModel.clear(); tableModel.setWorkspaces(workspaceResults); }