/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package org.ebayopensource.turmeric.policyservice.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.ebayopensource.turmeric.policyservice.exceptions.PolicyFinderException;
import org.ebayopensource.turmeric.policyservice.exceptions.PolicyProviderException.Category;
import org.ebayopensource.turmeric.security.v1.services.OperationKey;
import org.ebayopensource.turmeric.security.v1.services.ResourceKey;
import org.ebayopensource.turmeric.security.v1.services.SubjectKey;
import org.ebayopensource.turmeric.utils.jpa.AbstractDAO;
/**
* The Class ResourceDAOImpl.
*/
public class ResourceDAOImpl extends AbstractDAO implements ResourceDAO {
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#persistResource(org.ebayopensource.turmeric.policyservice.model.Resource)
*/
@Override
public void persistResource(final Resource resource) {
persistEntity(resource);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#persistOperation(org.ebayopensource.turmeric.policyservice.model.Operation)
*/
@Override
public void persistOperation(final Operation operation) {
persistEntity(operation);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findResourceById(long)
*/
@Override
public Resource findResourceById(final long id) {
return findEntity(Resource.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findResourceByName(java.lang.String)
*/
@Override
public Resource findResourceByName(final String name) {
return getSingleResultOrNull(Resource.class, "resourceName", name);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findResourceByType(java.lang.String)
*/
@Override
public List<Resource> findResourceByType(final String type) {
return getResultList(Resource.class, "resourceType", type);
}
/*
* It removes a Resource entity an all its assigned operations
*
* @see
* org.ebayopensource.turmeric.policyservice.model.ResourceDAO#removeResource
* (long)
*/
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#removeResource(long)
*/
@Override
public void removeResource(final long resourceId) {
removeEntity(Resource.class, resourceId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#removeOperation(java.lang.Long, java.lang.String)
*/
@Override
public void removeOperation(final Long resourceId,
final String operationName) {
final Resource resource = findResourceById(resourceId);
final Set<Operation> operations = resource.getOperations();
for (Operation operation : operations) {
if (operationName.equals(operation.getOperationName())) {
removeOperation(operation.getId());
}
}
}
private void removeOperation(final long operationId) {
removeEntity(Operation.class, operationId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findOperationById(long)
*/
@Override
public Operation findOperationById(final long operationId) {
return findEntity(Operation.class, operationId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findOperationByName(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public Operation findOperationByName(final String resourceName,
final String operationName, final String resourceType) {
final StringBuilder jpql = new StringBuilder();
jpql.append(" from ").append(Operation.class.getName())
.append(" as op ");
jpql.append(" where op.resource.resourceName = :resourceName ");
jpql.append(" and op.operationName = :operationName ");
jpql.append(" and op.resource.resourceType = :resourceType ");
final EntityManager entityManager = getEntityManager();
Query query = entityManager.createQuery(jpql.toString());
query.setParameter("resourceName", resourceName);
query.setParameter("operationName", operationName);
query.setParameter("resourceType", resourceType);
return getSingleResultOrNull(query);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findOperationByResourceId(long)
*/
@Override
public Set<Operation> findOperationByResourceId(final long resourceId) {
return findEntity(Resource.class, resourceId).getOperations();
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#findResourceByOperationId(long)
*/
@Override
public Resource findResourceByOperationId(final long operationId) {
final Operation op = findEntity(Operation.class, operationId);
final StringBuilder jpql = new StringBuilder();
jpql.append("from ").append(Resource.class.getName()).append(" as rs ");
jpql.append(" where id = :id");
final EntityManager entityManager = getEntityManager();
final Query query = entityManager.createQuery(jpql.toString());
query.setParameter("id", op.getResource().getId());
return getSingleResultOrNull(query);
}
/**
* Convert.
*
* @param resource
* the resource
* @return the resource
*/
public static Resource convert(final org.ebayopensource.turmeric.security.v1.services.Resource resource) {
final List<org.ebayopensource.turmeric.policyservice.model.Operation> operationList =
new ArrayList<org.ebayopensource.turmeric.policyservice.model.Operation>();
final List<org.ebayopensource.turmeric.security.v1.services.Operation> operations =
resource.getOperation();
if (operations != null && !operations.isEmpty()) {
for (org.ebayopensource.turmeric.security.v1.services.Operation operation : operations) {
operationList.add(convert(operation));
}
}
return new org.ebayopensource.turmeric.policyservice.model.Resource(
resource.getResourceType(), resource.getResourceName(),
resource.getDescription());
}
/**
* Convert.
*
* @param jpaResource
* the jpa resource
* @return the org.ebayopensource.turmeric.security.v1.services. resource
* @throws PolicyFinderException
* the policy finder exception
*/
public static org.ebayopensource.turmeric.security.v1.services.Resource convert(final Resource jpaResource)
throws PolicyFinderException {
final org.ebayopensource.turmeric.security.v1.services.Resource result =
new org.ebayopensource.turmeric.security.v1.services.Resource();
result.setResourceName(jpaResource.getResourceName());
result.setResourceType(jpaResource.getResourceType());
result.setDescription(jpaResource.getDescription());
result.setResourceId(jpaResource.getId());
return result;
}
/**
* Convert.
*
* @param operation
* the operation
* @return the operation
*/
public static Operation convert(final org.ebayopensource.turmeric.security.v1.services.Operation operation) {
return new org.ebayopensource.turmeric.policyservice.model.Operation(
operation.getOperationName(), operation.getDescription());
}
/**
* Convert.
*
* @param jpaOperation
* the jpa operation
* @return the org.ebayopensource.turmeric.security.v1.services. operation
* @throws PolicyFinderException
* the policy finder exception
*/
public static org.ebayopensource.turmeric.security.v1.services.Operation convert(final Operation jpaOperation)
throws PolicyFinderException {
final org.ebayopensource.turmeric.security.v1.services.Operation result =
new org.ebayopensource.turmeric.security.v1.services.Operation();
result.setOperationName(jpaOperation.getOperationName());
result.setDescription(jpaOperation.getDescription());
result.setOperationId(jpaOperation.getId());
if(jpaOperation.getResource()!=null){
result.setResourceId(jpaOperation.getResource().getId());
}
return result;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#getResourceHistory(long, java.util.Date, java.util.Date)
*/
@Override
public List<AuditHistory> getResourceHistory(long resourceId, Date start, Date end) {
return getResultList(AuditHistory.class, "category", Category.RESOURCE.name(),
"entityId", resourceId, "auditInfo.createdOn", start, end);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#getResourceHistory(java.lang.String, java.util.Date, java.util.Date)
*/
@Override
public List<AuditHistory> getResourceHistory(String resourceType, Date start, Date end) {
return getResultList(AuditHistory.class, "category", Category.RESOURCE.name(),
"entityType", resourceType, "auditInfo.createdOn", start, end);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#getOperationHistory(long, java.util.Date, java.util.Date)
*/
@Override
public List<AuditHistory> getOperationHistory(long operationId, Date start, Date end) {
return getResultList(AuditHistory.class, "category", Category.OPERATION.name(),
"entityId", operationId, "auditInfo.createdOn", start, end);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#getOperationHistory(java.lang.String, java.util.Date, java.util.Date)
*/
@Override
public List<AuditHistory> getOperationHistory(String resourceType, Date start, Date end) {
return getResultList(AuditHistory.class, "category", Category.OPERATION.name(),
"entityType", resourceType, "auditInfo.createdOn", start, end);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#audit(org.ebayopensource.turmeric.security.v1.services.ResourceKey, java.lang.String, org.ebayopensource.turmeric.security.v1.services.SubjectKey)
*/
@Override
public void audit(ResourceKey resourceKey, String operationType, SubjectKey loginSubject) {
persistEntity(AuditHistory.newRecord(resourceKey, operationType, loginSubject));
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.ResourceDAO#audit(org.ebayopensource.turmeric.security.v1.services.OperationKey, java.lang.String, org.ebayopensource.turmeric.security.v1.services.SubjectKey)
*/
@Override
public void audit(OperationKey operationKey, String operationType, SubjectKey loginSubject) {
persistEntity(AuditHistory.newRecord(operationKey, operationType, loginSubject));
}
}