From 7b4f078cdaaf5e95b116a7d1cf2af18000fafa8d Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Sat, 15 Dec 2012 00:40:42 +0000 Subject: [PATCH] wip audit services --- .../audit/api/AuditApiResource.java | 22 +- .../mifosplatform/audit/data/AuditData.java | 77 ++++--- .../audit/data/AuditSearchData.java | 8 +- .../service/AuditReadPlatformServiceImpl.java | 201 ++++++++++-------- 4 files changed, 175 insertions(+), 133 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/audit/api/AuditApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/audit/api/AuditApiResource.java index 5c169d91a..80fc73396 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/audit/api/AuditApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/audit/api/AuditApiResource.java @@ -65,8 +65,8 @@ public class AuditApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveAuditEntries( @Context final UriInfo uriInfo, - @QueryParam("apiOperation") final String apiOperation, - @QueryParam("resource") final String resource, + @QueryParam("actionName") final String actionName, + @QueryParam("entityName") final String entityName, @QueryParam("resourceId") final Long resourceId, @QueryParam("makerId") final Long makerId, @QueryParam("makerDateTimeFrom") final String makerDateTimeFrom, @@ -78,7 +78,7 @@ public class AuditApiResource { context.authenticatedUser().validateHasReadPermission( resourceNameForPermissions); - final String extraCriteria = getExtraCriteria(apiOperation, resource, + final String extraCriteria = getExtraCriteria(actionName, entityName, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo, checkerId, checkerDateTimeFrom, checkerDateTimeTo); @@ -133,21 +133,21 @@ public class AuditApiResource { auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE); } - private String getExtraCriteria(final String apiOperation, - final String resource, final Long resourceId, final Long makerId, + private String getExtraCriteria(final String actionName, + final String entityName, final Long resourceId, final Long makerId, final String makerDateTimeFrom, final String makerDateTimeTo, final Long checkerId, final String checkerDateTimeFrom, final String checkerDateTimeTo) { String extraCriteria = ""; - if (apiOperation != null) { - extraCriteria += " and aud.api_operation = " - + ApiParameterHelper.sqlEncodeString(apiOperation); + if (actionName != null) { + extraCriteria += " and aud.action_name = " + + ApiParameterHelper.sqlEncodeString(actionName); } - if (resource != null) { - extraCriteria += " and aud.api_resource = " - + ApiParameterHelper.sqlEncodeString(resource); + if (entityName != null) { + extraCriteria += " and aud.entity_name like " + + ApiParameterHelper.sqlEncodeString(entityName + "%"); } if (resourceId != null) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditData.java b/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditData.java index b5e47ed14..3f60ae2ab 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditData.java @@ -7,36 +7,53 @@ import org.joda.time.DateTime; */ public final class AuditData { - @SuppressWarnings("unused") - private final Long id; - @SuppressWarnings("unused") - private final String apiOperation; - @SuppressWarnings("unused") - private final String resource; - @SuppressWarnings("unused") - private final Long resourceId; - @SuppressWarnings("unused") - private final String maker; - @SuppressWarnings("unused") - private final DateTime madeOnDate; - @SuppressWarnings("unused") - private final String checker; - @SuppressWarnings("unused") - private final DateTime checkedOnDate; - @SuppressWarnings("unused") - private final String commandAsJson; + @SuppressWarnings("unused") + private final Long id; + @SuppressWarnings("unused") + private final String actionName; + @SuppressWarnings("unused") + private final String entityName; + @SuppressWarnings("unused") + private final String apiOperation; + @SuppressWarnings("unused") + private final String resource; + @SuppressWarnings("unused") + private final Long resourceId; + @SuppressWarnings("unused") + private final String subResource; + @SuppressWarnings("unused") + private final Long subResourceId; + @SuppressWarnings("unused") + private final String maker; + @SuppressWarnings("unused") + private final DateTime madeOnDate; + @SuppressWarnings("unused") + private final String checker; + @SuppressWarnings("unused") + private final DateTime checkedOnDate; + @SuppressWarnings("unused") + private final String commandAsJson; - public AuditData(final Long id, final String apiOperation, final String resource, final Long resourceId, final String maker, - final DateTime madeOnDate, final String checker, final DateTime checkedOnDate, final String commandAsJson) { + public AuditData(final Long id, final String actionName, + final String entityName, final String apiOperation, + final String resource, final Long resourceId, + final String subResource, final Long subResourceId, + final String maker, final DateTime madeOnDate, + final String checker, final DateTime checkedOnDate, + final String commandAsJson) { - this.id = id; - this.apiOperation = apiOperation; - this.resource = resource; - this.resourceId = resourceId; - this.maker = maker; - this.madeOnDate = madeOnDate; - this.checker = checker; - this.checkedOnDate = checkedOnDate; - this.commandAsJson = commandAsJson; - } + this.id = id; + this.actionName = actionName; + this.entityName = entityName; + this.apiOperation = apiOperation; + this.resource = resource; + this.resourceId = resourceId; + this.subResource = subResource; + this.subResourceId = subResourceId; + this.maker = maker; + this.madeOnDate = madeOnDate; + this.checker = checker; + this.checkedOnDate = checkedOnDate; + this.commandAsJson = commandAsJson; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditSearchData.java b/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditSearchData.java index 08d03d2c5..9af72cf3b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditSearchData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/audit/data/AuditSearchData.java @@ -13,13 +13,13 @@ public final class AuditSearchData { @SuppressWarnings("unused") private final Collection appUsers; @SuppressWarnings("unused") - private final List apiOperations; + private final List actionNames; @SuppressWarnings("unused") - private final List resources; + private final List entityNames; public AuditSearchData(final Collection appUsers, final List apiOperations, final List resources) { this.appUsers = appUsers; - this.apiOperations = apiOperations; - this.resources = resources; + this.actionNames = apiOperations; + this.entityNames = resources; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/audit/service/AuditReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/audit/service/AuditReadPlatformServiceImpl.java index d50bb7483..c09a5d55c 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/audit/service/AuditReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/audit/service/AuditReadPlatformServiceImpl.java @@ -11,7 +11,6 @@ import org.mifosplatform.audit.data.AuditData; import org.mifosplatform.audit.data.AuditSearchData; import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; -import org.mifosplatform.infrastructure.dataqueries.service.ReadWriteNonCoreDataServiceImpl; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.useradministration.data.AppUserLookup; import org.mifosplatform.useradministration.service.AppUserReadPlatformService; @@ -25,118 +24,144 @@ import org.springframework.stereotype.Service; @Service public class AuditReadPlatformServiceImpl implements AuditReadPlatformService { - private final static Logger logger = LoggerFactory.getLogger(AuditReadPlatformServiceImpl.class); - private final JdbcTemplate jdbcTemplate; - private final PlatformSecurityContext context; - private final AppUserReadPlatformService appUserReadPlatformService; + private final static Logger logger = LoggerFactory + .getLogger(AuditReadPlatformServiceImpl.class); + private final JdbcTemplate jdbcTemplate; + private final PlatformSecurityContext context; + private final AppUserReadPlatformService appUserReadPlatformService; - @Autowired - public AuditReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource, - final AppUserReadPlatformService appUserReadPlatformService) { - this.context = context; - this.jdbcTemplate = new JdbcTemplate(dataSource); - this.appUserReadPlatformService = appUserReadPlatformService; - } + @Autowired + public AuditReadPlatformServiceImpl(final PlatformSecurityContext context, + final TenantAwareRoutingDataSource dataSource, + final AppUserReadPlatformService appUserReadPlatformService) { + this.context = context; + this.jdbcTemplate = new JdbcTemplate(dataSource); + this.appUserReadPlatformService = appUserReadPlatformService; + } - private static final class AuditMapper implements RowMapper { + private static final class AuditMapper implements RowMapper { - public String schema(boolean includeJson) { + public String schema(boolean includeJson) { - String commandAsJsonString = ""; - if (includeJson) commandAsJsonString = ", aud.command_as_json as commandAsJson "; + String commandAsJsonString = ""; + if (includeJson) + commandAsJsonString = ", aud.command_as_json as commandAsJson "; - return " aud.id as id, aud.api_operation as apiOperation, aud.api_resource as resource, aud.resource_id as resourceId," - + " mk.username as maker, aud.made_on_date as madeOnDate, ck.username as checker, aud.checked_on_date as checkedOnDate" - + commandAsJsonString + " from m_portfolio_command_source aud " + " left join m_appuser mk on mk.id = aud.maker_id" - + " left join m_appuser ck on ck.id = aud.checker_id"; - } + return " aud.id as id, aud.action_name as actionName, aud.entity_name as entityName, aud.api_operation as apiOperation, " + + " aud.api_resource as resource, aud.resource_id as resourceId, aud.api_subresource as subResource, aud.subresource_id as subResourceId," + + " mk.username as maker, aud.made_on_date as madeOnDate, ck.username as checker, aud.checked_on_date as checkedOnDate" + + commandAsJsonString + + " from m_portfolio_command_source aud " + + " left join m_appuser mk on mk.id = aud.maker_id" + + " left join m_appuser ck on ck.id = aud.checker_id"; + } - @Override - public AuditData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + @Override + public AuditData mapRow(final ResultSet rs, + @SuppressWarnings("unused") final int rowNum) + throws SQLException { - final Long id = rs.getLong("id"); - final String apiOperation = rs.getString("apiOperation"); - final String resource = rs.getString("resource"); - final Long resourceId = JdbcSupport.getLong(rs, "resourceId"); - final String maker = rs.getString("maker"); - final DateTime madeOnDate = JdbcSupport.getDateTime(rs, "madeOnDate"); - final String checker = rs.getString("checker"); - final DateTime checkedOnDate = JdbcSupport.getDateTime(rs, "checkedOnDate"); - String commandAsJson; - // commandAsJson might not be on the select list of columns - try { - commandAsJson = rs.getString("commandAsJson"); - } catch (SQLException e) { - commandAsJson = null; - } - return new AuditData(id, apiOperation, resource, resourceId, maker, madeOnDate, checker, checkedOnDate, commandAsJson); - } - } + final Long id = rs.getLong("id"); + final String actionName = rs.getString("actionName"); + final String entityName = rs.getString("entityName"); + final String apiOperation = rs.getString("apiOperation"); + final String resource = rs.getString("resource"); + final Long resourceId = JdbcSupport.getLong(rs, "resourceId"); + final String subResource = rs.getString("subResource"); + final Long subResourceId = JdbcSupport.getLong(rs, "subResourceId"); + final String maker = rs.getString("maker"); + final DateTime madeOnDate = JdbcSupport.getDateTime(rs, + "madeOnDate"); + final String checker = rs.getString("checker"); + final DateTime checkedOnDate = JdbcSupport.getDateTime(rs, + "checkedOnDate"); + String commandAsJson; + // commandAsJson might not be on the select list of columns + try { + commandAsJson = rs.getString("commandAsJson"); + } catch (SQLException e) { + commandAsJson = null; + } + return new AuditData(id, actionName, entityName, apiOperation, + resource, resourceId, subResource, subResourceId, maker, + madeOnDate, checker, checkedOnDate, commandAsJson); + } + } - @Override - public Collection retrieveAuditEntries(String extraCriteria, boolean includeJson) { - context.authenticatedUser(); + @Override + public Collection retrieveAuditEntries(String extraCriteria, + boolean includeJson) { + context.authenticatedUser(); - final AuditMapper rm = new AuditMapper(); + final AuditMapper rm = new AuditMapper(); - String sql = "select " + rm.schema(includeJson); - if (StringUtils.isNotBlank(extraCriteria)) sql += " where (" + extraCriteria + ")"; - sql += " order by aud.id DESC"; - logger.info("sql: " + sql); - return this.jdbcTemplate.query(sql, rm, new Object[] {}); - } + String sql = "select " + rm.schema(includeJson); + if (StringUtils.isNotBlank(extraCriteria)) + sql += " where (" + extraCriteria + ")"; + sql += " order by aud.id DESC"; + logger.info("sql: " + sql); + return this.jdbcTemplate.query(sql, rm, new Object[] {}); + } - @Override - public AuditData retrieveAuditEntry(Long auditId) { - context.authenticatedUser(); + @Override + public AuditData retrieveAuditEntry(Long auditId) { + context.authenticatedUser(); - final AuditMapper rm = new AuditMapper(); + final AuditMapper rm = new AuditMapper(); - String sql = "select " + rm.schema(true); - sql += " where aud.id = " + auditId; + String sql = "select " + rm.schema(true); + sql += " where aud.id = " + auditId; - return this.jdbcTemplate.queryForObject(sql, rm, new Object[] {}); - } + return this.jdbcTemplate.queryForObject(sql, rm, new Object[] {}); + } - @Override - public AuditSearchData retrieveSearchTemplate() { - Collection appUsers = appUserReadPlatformService.retrieveSearchTemplate(); + @Override + public AuditSearchData retrieveSearchTemplate() { + Collection appUsers = appUserReadPlatformService + .retrieveSearchTemplate(); - ApiOperationsMapper mapper = new ApiOperationsMapper(); - List apiOperations = this.jdbcTemplate.query(mapper.schema(), mapper, new Object[] {}); + ActionNamesMapper mapper = new ActionNamesMapper(); + List actionNames = this.jdbcTemplate.query(mapper.schema(), + mapper, new Object[] {}); - ApiResourcesMapper mapper2 = new ApiResourcesMapper(); - List resources = this.jdbcTemplate.query(mapper2.schema(), mapper2, new Object[] {}); + EntityNamesMapper mapper2 = new EntityNamesMapper(); + List entityNames = this.jdbcTemplate.query(mapper2.schema(), + mapper2, new Object[] {}); - return new AuditSearchData(appUsers, apiOperations, resources); - } + return new AuditSearchData(appUsers, actionNames, entityNames); + } - private static final class ApiOperationsMapper implements RowMapper { + private static final class ActionNamesMapper implements RowMapper { - @Override - public String mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + @Override + public String mapRow(final ResultSet rs, + @SuppressWarnings("unused") final int rowNum) + throws SQLException { - return rs.getString("apiOperation"); - } + return rs.getString("actionName"); + } - public String schema() { + public String schema() { - return " SELECT distinct(action_name) as apiOperation FROM m_permission " - + " where action_name is not null and action_name <> 'READ' " - + " order by if(action_name in ('CREATE', 'DELETE', 'UPDATE'), action_name, 'ZZZ'), action_name"; - } + return " SELECT distinct(action_name) as actionName FROM m_permission " + + " where action_name is not null and action_name <> 'READ' " + + " order by if(action_name in ('CREATE', 'DELETE', 'UPDATE'), action_name, 'ZZZ'), action_name"; + } - } + } - private static final class ApiResourcesMapper implements RowMapper { + private static final class EntityNamesMapper implements RowMapper { - @Override - public String mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - return rs.getString("resource"); - } + @Override + public String mapRow(final ResultSet rs, + @SuppressWarnings("unused") final int rowNum) + throws SQLException { + return rs.getString("entityName"); + } - public String schema() { - return " select distinct(api_resource) as resource from m_portfolio_command_source order by api_resource"; - } - } + public String schema() { + return " select distinct(entity_name) as entityName from m_permission where action_name is not null and action_name <> 'READ' " + + " order by if(grouping = 'datatable', 'ZZZ', entity_name), entity_name"; + } + } } \ No newline at end of file