Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion query/src/org/labkey/query/CustomViewImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions query/src/org/labkey/query/QueryModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());

Expand Down
2 changes: 1 addition & 1 deletion query/src/org/labkey/query/QueryServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
272 changes: 272 additions & 0 deletions query/src/org/labkey/query/audit/GridViewAuditProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
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;
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";
public static final String COLUMN_NAME_HIDDEN = "Hidden";

static final List<FieldKey> 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 <K extends AuditTypeEvent> Class<K> getEventClass()
{
return (Class<K>) GridViewAuditEvent.class;
}

public static String getGridViewNameForAudit(String viewName)
{
return StringUtils.isEmpty(viewName) ? "Default" : viewName;
}

@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<FieldKey> 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;
private boolean _hidden;

/** 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;
}

public boolean isHidden()
{
return _hidden;
}

public void setHidden(boolean hidden)
{
_hidden = hidden;
}

@Override
public Map<String, Object> getAuditLogMessageElements()
{
Map<String, Object> elements = new LinkedHashMap<>();
elements.put("customViewId", getCustomViewId());
elements.put("viewName", getGridViewNameForAudit(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;
}
}

public static class GridViewAuditDomainKind extends AbstractAuditDomainKind
{
public static final String NAME = "GridViewAuditDomain";
public static String NAMESPACE_PREFIX = "Audit-" + NAME;

private final Set<PropertyDescriptor> _fields;

public GridViewAuditDomainKind()
{
super(EVENT_TYPE);

Set<PropertyDescriptor> 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(createPropertyDescriptor(COLUMN_NAME_HIDDEN, PropertyType.BOOLEAN));
fields.add(createOldDataMapPropertyDescriptor());
fields.add(createNewDataMapPropertyDescriptor());
_fields = Collections.unmodifiableSet(fields);
}

@Override
public Set<PropertyDescriptor> getProperties()
{
return _fields;
}

@Override
protected String getNamespacePrefix()
{
return NAMESPACE_PREFIX;
}

@Override
public String getKindName()
{
return NAME;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
Loading