/*******************************************************************************
* 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.GregorianCalendar;
import java.util.List;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import org.ebayopensource.turmeric.policyservice.exceptions.PolicyFinderException;
import org.ebayopensource.turmeric.policyservice.exceptions.PolicyProviderException.Category;
import org.ebayopensource.turmeric.policyservice.provider.utils.RuleHelper;
import org.ebayopensource.turmeric.security.v1.services.PolicyKey;
import org.ebayopensource.turmeric.security.v1.services.SubjectKey;
import org.ebayopensource.turmeric.utils.jpa.AbstractDAO;
import org.ebayopensource.turmeric.utils.jpa.model.AuditInfo;
/**
* The Class PolicyDAOImpl.
*/
public class PolicyDAOImpl extends AbstractDAO implements PolicyDAO {
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#persistPolicy(org.ebayopensource.turmeric.policyservice.model.Policy)
*/
@Override
public void persistPolicy(Policy policy) {
persistEntity(policy);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#removePolicy(long)
*/
@Override
public void removePolicy(long id) {
removeEntity(Policy.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyById(java.lang.Long)
*/
@Override
public Policy findPolicyById(Long id) {
return findEntity(Policy.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyByName(java.lang.String)
*/
@Override
public Policy findPolicyByName(String name) {
return getSingleResultOrNull(Policy.class, "policyName", name);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findOperationById(java.lang.Long)
*/
@Override
public Operation findOperationById(Long id) {
return findEntity(Operation.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findResourceById(java.lang.Long)
*/
@Override
public Resource findResourceById(Long id) {
return findEntity(Resource.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findSubjectById(java.lang.Long)
*/
@Override
public Subject findSubjectById(Long id) {
return findEntity(Subject.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findSubjectTypeById(java.lang.Long)
*/
@Override
public SubjectType findSubjectTypeById(Long id) {
return findEntity(SubjectType.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findSubjectGroupById(java.lang.Long)
*/
@Override
public SubjectGroup findSubjectGroupById(Long id) {
return findEntity(SubjectGroup.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyBySubjectId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyBySubjectId(Long subjectId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "subjects", subjectId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyBySubjectTypeId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyBySubjectTypeId(Long subjectTypeId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "subjectTypes", subjectTypeId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyBySubjectGroupId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyBySubjectGroupId(Long subjGrpId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "subjectGroups", subjGrpId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyByOperationId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyByOperationId(Long opId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "operations", opId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyByResourceId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyByResourceId(Long resId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "resources", resId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findAllByName(java.lang.String, java.lang.String)
*/
@Override
public List<Policy> findAllByName(String name, String policyType) {
return getWildcardResultList(Policy.class, "policyType", policyType, "policyName", name);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findAllByType(java.lang.String)
*/
@Override
public List<Policy> findAllByType(String policyType) {
return getResultList(Policy.class, "policyType", policyType);
}
/**
* Convert.
*
* @param policy
* the policy
* @return the policy
*/
public static Policy convert(org.ebayopensource.turmeric.security.v1.services.Policy policy){
Boolean value;
if(policy == null){
return null;
}
final List<org.ebayopensource.turmeric.policyservice.model.Rule> ruleList =
new ArrayList<org.ebayopensource.turmeric.policyservice.model.Rule>();
final List<org.ebayopensource.turmeric.security.v1.services.Rule> rules=
policy.getRule();
if (rules != null && !rules.isEmpty()) {
for (org.ebayopensource.turmeric.security.v1.services.Rule rule: rules) {
Rule converted = RuleHelper.convert(rule);
if(converted != null){
ruleList.add(converted);
}
}
}
Policy jpaPolicy = new Policy();
jpaPolicy.setPolicyName(policy.getPolicyName());
jpaPolicy.setPolicyType(policy.getPolicyType());
jpaPolicy.setDescription(policy.getDescription());
jpaPolicy.setActive((value = policy.isActive())==null ? false:value);
jpaPolicy.getRules().addAll(ruleList);
return jpaPolicy;
}
/**
* Convert.
*
* @param jpaPolicy
* the jpa policy
* @return the org.ebayopensource.turmeric.security.v1.services. policy
* @throws PolicyFinderException
* the policy finder exception
*/
public static org.ebayopensource.turmeric.security.v1.services.Policy convert(Policy jpaPolicy)
throws PolicyFinderException {
if( jpaPolicy==null) {
return null;
}
org.ebayopensource.turmeric.security.v1.services.Policy policy =
new org.ebayopensource.turmeric.security.v1.services.Policy();
policy.setPolicyId(jpaPolicy.getId());
policy.setPolicyName(jpaPolicy.getPolicyName());
policy.setPolicyType(jpaPolicy.getPolicyType());
policy.setActive(jpaPolicy.isActive());
policy.setDescription(jpaPolicy.getDescription());
if(jpaPolicy.getRules() != null && jpaPolicy.getRules().size() > 0){
policy.getRule().addAll(RuleHelper.convert(jpaPolicy.getRules()));
}
AuditInfo auditInfo = jpaPolicy.getAuditInfo();
if (auditInfo != null) {
policy.setCreatedBy(auditInfo.getCreatedBy());
policy.setLastModifiedBy(auditInfo.getUpdatedBy());
try {
GregorianCalendar updatedOn = new GregorianCalendar();
Date updateDate = auditInfo.getUpdatedOn();
updatedOn.setTime(updateDate == null ? auditInfo.getCreatedOn() : updateDate);
policy.setLastModified(DatatypeFactory.newInstance().newXMLGregorianCalendar(
updatedOn));
}
catch (DatatypeConfigurationException ex) {
throw new PolicyFinderException(Category.POLICY, jpaPolicy.getPolicyType(),
null, jpaPolicy.getPolicyName(), "Failed to convert policy", ex);
}
}
return policy;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#getPolicyHistory(long, java.util.Date, java.util.Date)
*/
@Override
public List<AuditHistory> getPolicyHistory(long policyId, Date start, Date end) {
return getResultList(AuditHistory.class, "category", Category.POLICY.name(),
"entityId", policyId, "auditInfo.createdOn", start, end);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#getPolicyHistory(java.lang.String, java.util.Date, java.util.Date)
*/
@Override
public List<AuditHistory> getPolicyHistory(String policyType, Date start, Date end) {
return getResultList(AuditHistory.class, "category", Category.POLICY.name(),
"entityType", policyType, "auditInfo.createdOn", start, end);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#audit(org.ebayopensource.turmeric.security.v1.services.PolicyKey, java.lang.String, org.ebayopensource.turmeric.security.v1.services.SubjectKey)
*/
@Override
public void audit(PolicyKey policyKey, String operationType, SubjectKey loginSubject) {
persistEntity(AuditHistory.newRecord(policyKey, operationType, loginSubject));
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyByExclusionSubjectId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyByExclusionSubjectId(Long subjectId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "exclusionSubjects", subjectId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.PolicyDAO#findPolicyByExclusionSubjectGroupId(java.lang.Long, java.lang.String)
*/
@Override
public List<Policy> findPolicyByExclusionSubjectGroupId(Long subjGrpId, String policyType) {
return findEntityByMemberId(Policy.class, "policyType", policyType, "exclusionSubjectGroups", subjGrpId);
}
}