From 43e2826eded73e747533b156c0c6024cfc2d5fb7 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 16 Feb 2026 09:47:16 -0800 Subject: [PATCH 1/4] GitHub Issue 465: Add auditing capabilities for grid views --- .../src/org/labkey/query/CustomViewImpl.java | 2 +- query/src/org/labkey/query/QueryModule.java | 2 + .../org/labkey/query/QueryServiceImpl.java | 2 +- .../query/audit/GridViewAuditProvider.java | 252 ++++++++++++++++++ .../query/controllers/QueryController.java | 2 +- .../labkey/query/persist/QueryManager.java | 50 +++- .../query/view/QueryDataViewProvider.java | 2 +- 7 files changed, 304 insertions(+), 8 deletions(-) create mode 100644 query/src/org/labkey/query/audit/GridViewAuditProvider.java diff --git a/query/src/org/labkey/query/CustomViewImpl.java b/query/src/org/labkey/query/CustomViewImpl.java index 60fbe657897..77a63c8baf9 100644 --- a/query/src/org/labkey/query/CustomViewImpl.java +++ b/query/src/org/labkey/query/CustomViewImpl.java @@ -287,7 +287,7 @@ public void delete(User user, HttpServletRequest request) throws QueryException if (isNew()) return; - _mgr.delete(_cstmView); + _mgr.delete(user, _cstmView); _mgr.fireViewDeleted(this); _cstmView = null; } diff --git a/query/src/org/labkey/query/QueryModule.java b/query/src/org/labkey/query/QueryModule.java index b9a63544ada..478e659c401 100644 --- a/query/src/org/labkey/query/QueryModule.java +++ b/query/src/org/labkey/query/QueryModule.java @@ -90,6 +90,7 @@ import org.labkey.query.analytics.AggregatesSumAnalyticsProvider; import org.labkey.query.analytics.RemoveColumnAnalyticsProvider; import org.labkey.query.analytics.SummaryStatisticsAnalyticsProvider; +import org.labkey.query.audit.GridViewAuditProvider; import org.labkey.query.audit.QueryExportAuditProvider; import org.labkey.query.audit.QueryUpdateAuditProvider; import org.labkey.query.controllers.OlapController; @@ -292,6 +293,7 @@ public void doStartup(ModuleContext moduleContext) { AuditLogService.get().registerAuditType(new QueryExportAuditProvider()); AuditLogService.get().registerAuditType(new QueryUpdateAuditProvider()); + AuditLogService.get().registerAuditType(new GridViewAuditProvider()); } AuditLogService.get().registerAuditType(new ReportAuditProvider()); diff --git a/query/src/org/labkey/query/QueryServiceImpl.java b/query/src/org/labkey/query/QueryServiceImpl.java index cc576f9d55d..b0719e0fe75 100644 --- a/query/src/org/labkey/query/QueryServiceImpl.java +++ b/query/src/org/labkey/query/QueryServiceImpl.java @@ -1413,7 +1413,7 @@ public int importCustomViews(User user, Container container, VirtualFile viewDir // Delete them for (CstmView view : views) - mgr.delete(view); + mgr.delete(user, view); // owner == null since we're exporting/importing only shared views CustomView cv = qd.createSharedCustomView(reader.getName()); diff --git a/query/src/org/labkey/query/audit/GridViewAuditProvider.java b/query/src/org/labkey/query/audit/GridViewAuditProvider.java new file mode 100644 index 00000000000..0351f0d2691 --- /dev/null +++ b/query/src/org/labkey/query/audit/GridViewAuditProvider.java @@ -0,0 +1,252 @@ +package org.labkey.query.audit; + +import org.labkey.api.audit.AbstractAuditTypeProvider; +import org.labkey.api.audit.AuditTypeEvent; +import org.labkey.api.audit.AuditTypeProvider; +import org.labkey.api.audit.DetailedAuditTypeEvent; +import org.labkey.api.audit.query.AbstractAuditDomainKind; +import org.labkey.api.audit.query.DefaultAuditTypeTable; +import org.labkey.api.data.Container; +import org.labkey.api.data.ContainerFilter; +import org.labkey.api.data.MutableColumnInfo; +import org.labkey.api.data.TableInfo; +import org.labkey.api.exp.PropertyDescriptor; +import org.labkey.api.exp.PropertyType; +import org.labkey.api.query.FieldKey; +import org.labkey.api.query.UserSchema; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class GridViewAuditProvider extends AbstractAuditTypeProvider implements AuditTypeProvider +{ + public static final String EVENT_TYPE = "GridViewAuditEvent"; + + public static final String COLUMN_NAME_CUSTOM_VIEW_ID = "CustomViewId"; + public static final String COLUMN_NAME_VIEW_NAME = "ViewName"; + public static final String COLUMN_NAME_SCHEMA_NAME = "SchemaName"; + public static final String COLUMN_NAME_QUERY_NAME = "QueryName"; + public static final String COLUMN_NAME_CUSTOM_VIEW_OWNER = "CustomViewOwner"; + public static final String COLUMN_NAME_INHERITABLE = "Inheritable"; + + static final List defaultVisibleColumns = new ArrayList<>(); + + static + { + defaultVisibleColumns.add(FieldKey.fromParts(COLUMN_NAME_CREATED)); + defaultVisibleColumns.add(FieldKey.fromParts(COLUMN_NAME_CREATED_BY)); + defaultVisibleColumns.add(FieldKey.fromParts(COLUMN_NAME_COMMENT)); + defaultVisibleColumns.add(FieldKey.fromParts(COLUMN_NAME_VIEW_NAME)); + defaultVisibleColumns.add(FieldKey.fromParts(COLUMN_NAME_SCHEMA_NAME)); + defaultVisibleColumns.add(FieldKey.fromParts(COLUMN_NAME_QUERY_NAME)); + } + + public GridViewAuditProvider() + { + super(new GridViewAuditDomainKind()); + } + + @Override + public String getEventName() + { + return EVENT_TYPE; + } + + @Override + public String getLabel() + { + return "Grid view events"; + } + + @Override + public String getDescription() + { + return "Events about grid view creation, modification, and deletion."; + } + + @Override + public Class getEventClass() + { + return (Class) GridViewAuditEvent.class; + } + + @Override + public TableInfo createTableInfo(UserSchema userSchema, ContainerFilter cf) + { + DefaultAuditTypeTable table = new DefaultAuditTypeTable(this, createStorageTableInfo(), userSchema, cf, defaultVisibleColumns) + { + @Override + protected void initColumn(MutableColumnInfo col) + { + if (COLUMN_NAME_VIEW_NAME.equalsIgnoreCase(col.getName())) + { + col.setLabel("View Name"); + } + else if (COLUMN_NAME_SCHEMA_NAME.equalsIgnoreCase(col.getName())) + { + col.setLabel("Schema Name"); + } + else if (COLUMN_NAME_QUERY_NAME.equalsIgnoreCase(col.getName())) + { + col.setLabel("Query Name"); + } + else if (COLUMN_NAME_CUSTOM_VIEW_OWNER.equalsIgnoreCase(col.getName())) + { + col.setLabel("View Owner"); + } + } + }; + appendValueMapColumns(table, EVENT_TYPE); + + return table; + } + + @Override + public List getDefaultVisibleColumns() + { + return defaultVisibleColumns; + } + + public static class GridViewAuditEvent extends DetailedAuditTypeEvent + { + private int _customViewId; + private String _viewName; + private String _schemaName; + private String _queryName; + private Integer _customViewOwner; + private boolean _inheritable; + + /** Important for reflection-based instantiation */ + @SuppressWarnings("unused") + public GridViewAuditEvent() + { + super(); + } + + public GridViewAuditEvent(Container container, String comment) + { + super(EVENT_TYPE, container, comment); + } + + public int getCustomViewId() + { + return _customViewId; + } + + public void setCustomViewId(int customViewId) + { + _customViewId = customViewId; + } + + public String getViewName() + { + return _viewName; + } + + public void setViewName(String viewName) + { + _viewName = viewName; + } + + public String getSchemaName() + { + return _schemaName; + } + + public void setSchemaName(String schemaName) + { + _schemaName = schemaName; + } + + public String getQueryName() + { + return _queryName; + } + + public void setQueryName(String queryName) + { + _queryName = queryName; + } + + public Integer getCustomViewOwner() + { + return _customViewOwner; + } + + public void setCustomViewOwner(Integer customViewOwner) + { + _customViewOwner = customViewOwner; + } + + public boolean isInheritable() + { + return _inheritable; + } + + public void setInheritable(boolean inheritable) + { + _inheritable = inheritable; + } + + @Override + public Map getAuditLogMessageElements() + { + Map elements = new LinkedHashMap<>(); + elements.put("customViewId", getCustomViewId()); + elements.put("viewName", getViewName()); + elements.put("schemaName", getSchemaName()); + elements.put("queryName", getQueryName()); + elements.put("customViewOwner", getCustomViewOwner()); + elements.put("inheritable", isInheritable()); + elements.putAll(super.getAuditLogMessageElements()); + return elements; + } + } + + public static class GridViewAuditDomainKind extends AbstractAuditDomainKind + { + public static final String NAME = "GridViewAuditDomain"; + public static String NAMESPACE_PREFIX = "Audit-" + NAME; + + private final Set _fields; + + public GridViewAuditDomainKind() + { + super(EVENT_TYPE); + + Set fields = new LinkedHashSet<>(); + fields.add(createPropertyDescriptor(COLUMN_NAME_CUSTOM_VIEW_ID, PropertyType.INTEGER)); + fields.add(createPropertyDescriptor(COLUMN_NAME_VIEW_NAME, PropertyType.STRING)); + fields.add(createPropertyDescriptor(COLUMN_NAME_SCHEMA_NAME, PropertyType.STRING)); + fields.add(createPropertyDescriptor(COLUMN_NAME_QUERY_NAME, PropertyType.STRING)); + fields.add(createPropertyDescriptor(COLUMN_NAME_CUSTOM_VIEW_OWNER, PropertyType.INTEGER)); + fields.add(createPropertyDescriptor(COLUMN_NAME_INHERITABLE, PropertyType.BOOLEAN)); + fields.add(createOldDataMapPropertyDescriptor()); + fields.add(createNewDataMapPropertyDescriptor()); + _fields = Collections.unmodifiableSet(fields); + } + + @Override + public Set getProperties() + { + return _fields; + } + + @Override + protected String getNamespacePrefix() + { + return NAMESPACE_PREFIX; + } + + @Override + public String getKindName() + { + return NAME; + } + } +} diff --git a/query/src/org/labkey/query/controllers/QueryController.java b/query/src/org/labkey/query/controllers/QueryController.java index 0aa6dfbf970..17857f9805f 100644 --- a/query/src/org/labkey/query/controllers/QueryController.java +++ b/query/src/org/labkey/query/controllers/QueryController.java @@ -6373,7 +6373,7 @@ public ModelAndView getConfirmView(InternalViewForm form, BindException errors) public boolean handlePost(InternalViewForm form, BindException errors) { CstmView view = form.getViewAndCheckPermission(); - QueryManager.get().delete(view); + QueryManager.get().delete(getUser(), view); return true; } diff --git a/query/src/org/labkey/query/persist/QueryManager.java b/query/src/org/labkey/query/persist/QueryManager.java index 28e10d84736..0be3a282c76 100644 --- a/query/src/org/labkey/query/persist/QueryManager.java +++ b/query/src/org/labkey/query/persist/QueryManager.java @@ -24,6 +24,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; +import org.labkey.api.audit.AbstractAuditTypeProvider; +import org.labkey.api.audit.AuditLogService; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; @@ -65,6 +67,7 @@ import org.labkey.api.view.NotFoundException; import org.labkey.query.ExternalSchema; import org.labkey.query.ExternalSchemaDocumentProvider; +import org.labkey.query.audit.GridViewAuditProvider.GridViewAuditEvent; import org.springframework.jdbc.BadSqlGrammarException; import java.net.URISyntaxException; @@ -75,6 +78,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -298,8 +302,12 @@ public List getCstmViews(Container container, @Nullable String schemaN public CstmView update(User user, CstmView view) { + CstmView oldView = new TableSelector(getTableInfoCustomView()).getObject(view.getCustomViewId(), CstmView.class); CstmView cstmView = Table.update(user, getTableInfoCustomView(), view, view.getCustomViewId()); - CustomViewCache.uncache(ContainerManager.getForId(cstmView.getContainerId())); + Container container = ContainerManager.getForId(cstmView.getContainerId()); + CustomViewCache.uncache(container); + + addGridViewAuditEvent(user, container, "Grid view updated: " + cstmView.getName(), cstmView, oldView, cstmView); return cstmView; } @@ -307,15 +315,49 @@ public CstmView update(User user, CstmView view) public CstmView insert(User user, CstmView view) { CstmView cstmView = Table.insert(user, getTableInfoCustomView(), view); - CustomViewCache.uncache(ContainerManager.getForId(cstmView.getContainerId())); + Container container = ContainerManager.getForId(cstmView.getContainerId()); + CustomViewCache.uncache(container); + + addGridViewAuditEvent(user, container, "Grid view created: " + cstmView.getName(), cstmView, null, cstmView); return cstmView; } - public void delete(CstmView view) + public void delete(User user, CstmView view) { + Container container = ContainerManager.getForId(view.getContainerId()); + addGridViewAuditEvent(user, container, "Grid view deleted: " + view.getName(), view, view, null); + Table.delete(getTableInfoCustomView(), view.getCustomViewId()); - CustomViewCache.uncache(ContainerManager.getForId(view.getContainerId())); + CustomViewCache.uncache(container); + } + + private void addGridViewAuditEvent(User user, Container container, String comment, CstmView view, @Nullable CstmView oldView, @Nullable CstmView newView) + { + GridViewAuditEvent event = new GridViewAuditEvent(container, comment); + event.setCustomViewId(view.getCustomViewId()); + event.setViewName(view.getName()); + event.setSchemaName(view.getSchema()); + event.setQueryName(view.getQueryName()); + event.setCustomViewOwner(view.getCustomViewOwner()); + event.setInheritable((view.getFlags() & FLAG_INHERITABLE) != 0); + + if (oldView != null) + event.setOldRecordMap(encodeViewDataMap(oldView)); + if (newView != null) + event.setNewRecordMap(encodeViewDataMap(newView)); + + AuditLogService.get().addEvent(user, event); + } + + private static String encodeViewDataMap(CstmView view) + { + Map map = new LinkedHashMap<>(); + if (view.getColumns() != null) + map.put("columns", view.getColumns()); + if (view.getFilter() != null) + map.put("filter", view.getFilter()); + return AbstractAuditTypeProvider.encodeForDataMap(map); } @Nullable diff --git a/query/src/org/labkey/query/view/QueryDataViewProvider.java b/query/src/org/labkey/query/view/QueryDataViewProvider.java index b49e085fabb..70c27de2559 100644 --- a/query/src/org/labkey/query/view/QueryDataViewProvider.java +++ b/query/src/org/labkey/query/view/QueryDataViewProvider.java @@ -96,7 +96,7 @@ public void deleteView(Container container, User user, String id) throws Validat if (!container.hasPermission(user, EditSharedViewPermission.class)) throw new ValidationException("The specified view is shared, you must be in the Editor role to be allowed to delete a shared view."); } - QueryManager.get().delete(view); + QueryManager.get().delete(user, view); } } } From 35946874aa333ef9cde5aa35a7dc7b50e4512947 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 16 Feb 2026 18:18:23 -0800 Subject: [PATCH 2/4] code review changes --- .../query/audit/GridViewAuditProvider.java | 17 ++++++++++++++++- .../org/labkey/query/persist/QueryManager.java | 3 ++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/query/src/org/labkey/query/audit/GridViewAuditProvider.java b/query/src/org/labkey/query/audit/GridViewAuditProvider.java index 0351f0d2691..2ed6bdbcbe7 100644 --- a/query/src/org/labkey/query/audit/GridViewAuditProvider.java +++ b/query/src/org/labkey/query/audit/GridViewAuditProvider.java @@ -1,5 +1,6 @@ package org.labkey.query.audit; +import org.apache.commons.lang3.StringUtils; import org.labkey.api.audit.AbstractAuditTypeProvider; import org.labkey.api.audit.AuditTypeEvent; import org.labkey.api.audit.AuditTypeProvider; @@ -33,6 +34,7 @@ public class GridViewAuditProvider extends AbstractAuditTypeProvider implements public static final String COLUMN_NAME_QUERY_NAME = "QueryName"; public static final String COLUMN_NAME_CUSTOM_VIEW_OWNER = "CustomViewOwner"; public static final String COLUMN_NAME_INHERITABLE = "Inheritable"; + public static final String COLUMN_NAME_HIDDEN = "Hidden"; static final List defaultVisibleColumns = new ArrayList<>(); @@ -120,6 +122,7 @@ public static class GridViewAuditEvent extends DetailedAuditTypeEvent private String _queryName; private Integer _customViewOwner; private boolean _inheritable; + private boolean _hidden; /** Important for reflection-based instantiation */ @SuppressWarnings("unused") @@ -193,16 +196,27 @@ public void setInheritable(boolean inheritable) _inheritable = inheritable; } + public boolean isHidden() + { + return _hidden; + } + + public void setHidden(boolean hidden) + { + _hidden = hidden; + } + @Override public Map getAuditLogMessageElements() { Map elements = new LinkedHashMap<>(); elements.put("customViewId", getCustomViewId()); - elements.put("viewName", getViewName()); + elements.put("viewName", StringUtils.isEmpty(getViewName()) ? "default" : getViewName()); elements.put("schemaName", getSchemaName()); elements.put("queryName", getQueryName()); elements.put("customViewOwner", getCustomViewOwner()); elements.put("inheritable", isInheritable()); + elements.put("hidden", isHidden()); elements.putAll(super.getAuditLogMessageElements()); return elements; } @@ -226,6 +240,7 @@ public GridViewAuditDomainKind() fields.add(createPropertyDescriptor(COLUMN_NAME_QUERY_NAME, PropertyType.STRING)); fields.add(createPropertyDescriptor(COLUMN_NAME_CUSTOM_VIEW_OWNER, PropertyType.INTEGER)); fields.add(createPropertyDescriptor(COLUMN_NAME_INHERITABLE, PropertyType.BOOLEAN)); + fields.add(createPropertyDescriptor(COLUMN_NAME_HIDDEN, PropertyType.BOOLEAN)); fields.add(createOldDataMapPropertyDescriptor()); fields.add(createNewDataMapPropertyDescriptor()); _fields = Collections.unmodifiableSet(fields); diff --git a/query/src/org/labkey/query/persist/QueryManager.java b/query/src/org/labkey/query/persist/QueryManager.java index 0be3a282c76..a73ab79f6cc 100644 --- a/query/src/org/labkey/query/persist/QueryManager.java +++ b/query/src/org/labkey/query/persist/QueryManager.java @@ -340,7 +340,8 @@ private void addGridViewAuditEvent(User user, Container container, String commen event.setSchemaName(view.getSchema()); event.setQueryName(view.getQueryName()); event.setCustomViewOwner(view.getCustomViewOwner()); - event.setInheritable((view.getFlags() & FLAG_INHERITABLE) != 0); + event.setInheritable(canInherit(view.getFlags())); + event.setHidden(isHidden(view.getFlags())); if (oldView != null) event.setOldRecordMap(encodeViewDataMap(oldView)); From 4398e63d8fa17c2e3fff8026c4fa2d53897ac3ad Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 17 Feb 2026 09:39:58 -0800 Subject: [PATCH 3/4] Show Default instead of blank --- .../org/labkey/query/audit/GridViewAuditProvider.java | 7 ++++++- query/src/org/labkey/query/persist/QueryManager.java | 9 +++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/query/src/org/labkey/query/audit/GridViewAuditProvider.java b/query/src/org/labkey/query/audit/GridViewAuditProvider.java index 2ed6bdbcbe7..47f095558f2 100644 --- a/query/src/org/labkey/query/audit/GridViewAuditProvider.java +++ b/query/src/org/labkey/query/audit/GridViewAuditProvider.java @@ -77,6 +77,11 @@ public Class getEventClass() return (Class) GridViewAuditEvent.class; } + public static String getGridViewNameForAudit(String viewName) + { + return StringUtils.isEmpty(viewName) ? "Default" : viewName; + } + @Override public TableInfo createTableInfo(UserSchema userSchema, ContainerFilter cf) { @@ -211,7 +216,7 @@ public Map getAuditLogMessageElements() { Map elements = new LinkedHashMap<>(); elements.put("customViewId", getCustomViewId()); - elements.put("viewName", StringUtils.isEmpty(getViewName()) ? "default" : getViewName()); + elements.put("viewName", getGridViewNameForAudit(getViewName())); elements.put("schemaName", getSchemaName()); elements.put("queryName", getQueryName()); elements.put("customViewOwner", getCustomViewOwner()); diff --git a/query/src/org/labkey/query/persist/QueryManager.java b/query/src/org/labkey/query/persist/QueryManager.java index a73ab79f6cc..cad9ed960b5 100644 --- a/query/src/org/labkey/query/persist/QueryManager.java +++ b/query/src/org/labkey/query/persist/QueryManager.java @@ -67,6 +67,7 @@ import org.labkey.api.view.NotFoundException; import org.labkey.query.ExternalSchema; import org.labkey.query.ExternalSchemaDocumentProvider; +import org.labkey.query.audit.GridViewAuditProvider; import org.labkey.query.audit.GridViewAuditProvider.GridViewAuditEvent; import org.springframework.jdbc.BadSqlGrammarException; @@ -307,7 +308,7 @@ public CstmView update(User user, CstmView view) Container container = ContainerManager.getForId(cstmView.getContainerId()); CustomViewCache.uncache(container); - addGridViewAuditEvent(user, container, "Grid view updated: " + cstmView.getName(), cstmView, oldView, cstmView); + addGridViewAuditEvent(user, container, "Grid view updated: " + GridViewAuditProvider.getGridViewNameForAudit(cstmView.getName()), cstmView, oldView, cstmView); return cstmView; } @@ -318,7 +319,7 @@ public CstmView insert(User user, CstmView view) Container container = ContainerManager.getForId(cstmView.getContainerId()); CustomViewCache.uncache(container); - addGridViewAuditEvent(user, container, "Grid view created: " + cstmView.getName(), cstmView, null, cstmView); + addGridViewAuditEvent(user, container, "Grid view created: " + GridViewAuditProvider.getGridViewNameForAudit(cstmView.getName()), cstmView, null, cstmView); return cstmView; } @@ -326,7 +327,7 @@ public CstmView insert(User user, CstmView view) public void delete(User user, CstmView view) { Container container = ContainerManager.getForId(view.getContainerId()); - addGridViewAuditEvent(user, container, "Grid view deleted: " + view.getName(), view, view, null); + addGridViewAuditEvent(user, container, "Grid view deleted: " + GridViewAuditProvider.getGridViewNameForAudit(view.getName()), view, view, null); Table.delete(getTableInfoCustomView(), view.getCustomViewId()); CustomViewCache.uncache(container); @@ -336,7 +337,7 @@ private void addGridViewAuditEvent(User user, Container container, String commen { GridViewAuditEvent event = new GridViewAuditEvent(container, comment); event.setCustomViewId(view.getCustomViewId()); - event.setViewName(view.getName()); + event.setViewName(GridViewAuditProvider.getGridViewNameForAudit(view.getName())); event.setSchemaName(view.getSchema()); event.setQueryName(view.getQueryName()); event.setCustomViewOwner(view.getCustomViewOwner()); From 58a33b4819e81814241554a08f5d1ee846363d60 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 17 Feb 2026 12:07:48 -0800 Subject: [PATCH 4/4] update tests --- query/src/org/labkey/query/persist/QueryManager.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/query/src/org/labkey/query/persist/QueryManager.java b/query/src/org/labkey/query/persist/QueryManager.java index cad9ed960b5..a9a80b692bc 100644 --- a/query/src/org/labkey/query/persist/QueryManager.java +++ b/query/src/org/labkey/query/persist/QueryManager.java @@ -308,7 +308,7 @@ public CstmView update(User user, CstmView view) Container container = ContainerManager.getForId(cstmView.getContainerId()); CustomViewCache.uncache(container); - addGridViewAuditEvent(user, container, "Grid view updated: " + GridViewAuditProvider.getGridViewNameForAudit(cstmView.getName()), cstmView, oldView, cstmView); + addGridViewAuditEvent(user, container, "Grid view updated: ", cstmView, oldView, cstmView); return cstmView; } @@ -319,7 +319,7 @@ public CstmView insert(User user, CstmView view) Container container = ContainerManager.getForId(cstmView.getContainerId()); CustomViewCache.uncache(container); - addGridViewAuditEvent(user, container, "Grid view created: " + GridViewAuditProvider.getGridViewNameForAudit(cstmView.getName()), cstmView, null, cstmView); + addGridViewAuditEvent(user, container, "Grid view created: ", cstmView, null, cstmView); return cstmView; } @@ -327,15 +327,16 @@ public CstmView insert(User user, CstmView view) public void delete(User user, CstmView view) { Container container = ContainerManager.getForId(view.getContainerId()); - addGridViewAuditEvent(user, container, "Grid view deleted: " + GridViewAuditProvider.getGridViewNameForAudit(view.getName()), view, view, null); + addGridViewAuditEvent(user, container, "Grid view deleted: ", view, view, null); Table.delete(getTableInfoCustomView(), view.getCustomViewId()); CustomViewCache.uncache(container); } - private void addGridViewAuditEvent(User user, Container container, String comment, CstmView view, @Nullable CstmView oldView, @Nullable CstmView newView) + private void addGridViewAuditEvent(User user, Container container, String commentPrefix, CstmView view, @Nullable CstmView oldView, @Nullable CstmView newView) { - GridViewAuditEvent event = new GridViewAuditEvent(container, comment); + String viewName = GridViewAuditProvider.getGridViewNameForAudit(view.getName()); + GridViewAuditEvent event = new GridViewAuditEvent(container, commentPrefix + viewName); event.setCustomViewId(view.getCustomViewId()); event.setViewName(GridViewAuditProvider.getGridViewNameForAudit(view.getName())); event.setSchemaName(view.getSchema());