/******************************************************************************* * 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.provider; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.EntityManagerFactory; import javax.xml.datatype.XMLGregorianCalendar; import org.ebayopensource.turmeric.policyservice.exceptions.PolicyCreationException; import org.ebayopensource.turmeric.policyservice.exceptions.PolicyDeleteException; import org.ebayopensource.turmeric.policyservice.exceptions.PolicyFinderException; import org.ebayopensource.turmeric.policyservice.exceptions.PolicyUpdateException; import org.ebayopensource.turmeric.policyservice.model.AuditHistory; import org.ebayopensource.turmeric.policyservice.model.ResourceDAO; import org.ebayopensource.turmeric.policyservice.model.ResourceDAOImpl; import org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider; import org.ebayopensource.turmeric.policyservice.provider.common.OperationEditObject; import org.ebayopensource.turmeric.security.v1.services.EntityHistory; import org.ebayopensource.turmeric.security.v1.services.KeyValuePair; import org.ebayopensource.turmeric.security.v1.services.Operation; import org.ebayopensource.turmeric.security.v1.services.OperationKey; import org.ebayopensource.turmeric.security.v1.services.Resource; import org.ebayopensource.turmeric.security.v1.services.ResourceKey; import org.ebayopensource.turmeric.security.v1.services.SubjectKey; import org.ebayopensource.turmeric.utils.jpa.JPAAroundAdvice; import org.ebayopensource.turmeric.utils.jpa.PersistenceContext; import org.ebayopensource.turmeric.utils.jpa.model.AuditContext; /** * The Class ResourceBase. */ public abstract class ResourceBase implements ResourceTypeProvider { /** The factory. */ protected EntityManagerFactory factory; /** The impl. */ protected ResourceTypeProvider impl; /** * Gets the resource type. * * @return the resource type */ public abstract String getResourceType(); /** * Instantiates a new resource base. */ public ResourceBase() { factory = PersistenceContext .createEntityManagerFactory("policyservice"); final ClassLoader classLoader = ResourceTypeProvider.class .getClassLoader(); final Class[] interfaces = { ResourceTypeProvider.class }; final ResourceTypeProvider target = new ResourceBaseImpl( getResourceType()); impl = (ResourceTypeProvider) Proxy.newProxyInstance(classLoader, interfaces, new JPAAroundAdvice(factory, target)); } /** * The Class ResourceBaseImpl. */ public static class ResourceBaseImpl implements ResourceTypeProvider { private final ResourceDAO resourceDAO; private final String resourceType; /** * Instantiates a new resource base impl. * * @param resourceType * the resource type */ public ResourceBaseImpl(final String resourceType) { this.resourceType = resourceType; resourceDAO = new ResourceDAOImpl(); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#createResource(org.ebayopensource.turmeric.security.v1.services.Resource, org.ebayopensource.turmeric.policyservice.provider.common.OperationEditObject, org.ebayopensource.turmeric.security.v1.services.SubjectKey) */ @Override public ResourceKey createResource(final Resource resource, final OperationEditObject operationEditObject, final SubjectKey createdBy) throws PolicyCreationException { if (createdBy != null) { AuditContext.setUser(createdBy.getSubjectName()); } try { final org.ebayopensource.turmeric.policyservice.model.Resource jpaResource = ResourceDAOImpl.convert(resource); resourceDAO.persistResource(jpaResource); final ResourceKey resourceKey = new ResourceKey(); resourceKey.setResourceId(jpaResource.getId()); resourceKey.setResourceName(resource.getResourceName()); resourceKey.setResourceType(resource.getResourceType()); if (operationEditObject != null) { final List<String> addOpNameList = operationEditObject .getAddList(); if (addOpNameList != null && !addOpNameList.isEmpty()) { createOperation(resourceKey.getResourceId(), addOpNameList, createdBy); } } return resourceKey; } finally { AuditContext.clear(); } } private List<OperationKey> createOperation(final Long resourceId, final List<String> operationNameList, final SubjectKey createdBy) throws PolicyCreationException{ final List<OperationKey> operationKeyList = new ArrayList<OperationKey>(); if (operationNameList != null && !operationNameList.isEmpty()) { OperationKey operationKey = null; org.ebayopensource.turmeric.policyservice.model.Resource resourceParent = null; resourceParent = resourceDAO.findResourceById(resourceId); Set<org.ebayopensource.turmeric.policyservice.model.Operation> jpaOperationSet = resourceParent.getOperations(); for (String operationName : operationNameList) { // description is not necessary final org.ebayopensource.turmeric.policyservice.model.Operation jpaOperation = new org.ebayopensource.turmeric.policyservice.model.Operation(operationName, null); jpaOperation.setResource(resourceParent); resourceDAO.persistOperation(jpaOperation); jpaOperationSet.add(jpaOperation); operationKey = new OperationKey(); operationKey.setOperationId(jpaOperation.getId()); operationKey.setOperationName(jpaOperation.getOperationName()); operationKey.setResourceName(resourceParent.getResourceName()); operationKey.setResourceType(resourceParent.getResourceType()); operationKeyList.add(operationKey); try { audit(operationKey, resourceParent.getResourceType(), createdBy); } catch (PolicyFinderException e) { // do nothing } } } return operationKeyList; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#updateResource(org.ebayopensource.turmeric.security.v1.services.Resource, org.ebayopensource.turmeric.policyservice.provider.common.OperationEditObject, org.ebayopensource.turmeric.security.v1.services.SubjectKey) */ @Override public ResourceKey updateResource(final Resource resource, final OperationEditObject operationEditObject, final SubjectKey modifiedBy) throws PolicyUpdateException, PolicyCreationException, PolicyDeleteException { if (modifiedBy != null) { AuditContext.setUser(modifiedBy.getSubjectName()); } try { org.ebayopensource.turmeric.policyservice.model.Resource jpaResource = resourceDAO .findResourceById(resource.getResourceId()); // Resource Info if (resource.getResourceType() != null) { jpaResource.setResourceType(resource.getResourceType()); } if (resource.getDescription() != null) { jpaResource.setDescription(resource.getDescription()); } if (resource.getResourceName() != null) { jpaResource.setResourceName(resource.getResourceName()); } ResourceKey resourceKey = new ResourceKey(); resourceKey.setResourceId(jpaResource.getId()); resourceKey.setResourceName(jpaResource.getResourceName()); resourceKey.setResourceType(jpaResource.getResourceType()); Set<org.ebayopensource.turmeric.policyservice.model.Operation> jpaOperationSet = jpaResource.getOperations(); // adding operations for (String operationName : operationEditObject.getAddList()) { final org.ebayopensource.turmeric.policyservice.model.Operation operation = new org.ebayopensource.turmeric.policyservice.model.Operation(operationName, null); operation.setResource(jpaResource); resourceDAO.persistOperation(operation); jpaOperationSet.add(operation); } // removing operations for (String operationName : operationEditObject.getRemoveList()) { org.ebayopensource.turmeric.policyservice.model.Operation operation = resourceDAO.findOperationByName(resource.getResourceName(), operationName, resource.getResourceType()); if (operation != null) { resourceDAO.removeOperation(resourceKey.getResourceId(), operation.getOperationName()); jpaOperationSet.remove(operation); } } // resourceDAO.persistResource(jpaResource); return resourceKey; } finally { AuditContext.clear(); } } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#deleteResource(java.lang.Long) */ @Override public void deleteResource(final Long resourceId) throws PolicyFinderException, PolicyDeleteException { List<Operation> operations = getOperationByResourceId(resourceId); List<String> removeList = new ArrayList<String>(); for (Operation op : operations) { removeList.add(op.getOperationName()); } removeOperation(resourceId, removeList); removeResourceInfo(resourceId); } private void removeResourceInfo(final Long resourceId) throws PolicyDeleteException { resourceDAO.removeResource(resourceId); } private void removeOperation(final Long resourceId, final List<String> operationNameList) throws PolicyDeleteException { for (String operationName : operationNameList) { resourceDAO.removeOperation(resourceId, operationName); } } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getResourceInfoById(java.lang.Long) */ @Override public Resource getResourceInfoById(final Long resourceId) throws PolicyFinderException { org.ebayopensource.turmeric.policyservice.model.Resource jpaResource = resourceDAO .findResourceById(resourceId); if (jpaResource != null) { return ResourceDAOImpl.convert(jpaResource); } return null; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getResourceInfoByName(java.lang.String) */ @Override public Resource getResourceInfoByName(final String resourceName) throws PolicyFinderException { org.ebayopensource.turmeric.policyservice.model.Resource jpaResource = resourceDAO .findResourceByName(resourceName); if (jpaResource != null) { return ResourceDAOImpl.convert(jpaResource); } return null; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getResourceInfoByType() */ @Override public Map<Long, Resource> getResourceInfoByType() throws PolicyFinderException { final Map<Long, Resource> result = new HashMap<Long, Resource>(); final List<org.ebayopensource.turmeric.policyservice.model.Resource> jpaResourceList = resourceDAO .findResourceByType(resourceType); if (jpaResourceList != null && !jpaResourceList.isEmpty()) { for (org.ebayopensource.turmeric.policyservice.model.Resource jpaResource : jpaResourceList) { result.put(jpaResource.getId(), ResourceDAOImpl.convert(jpaResource)); } } return result; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getOperationById(java.lang.String, java.lang.Long) */ @Override public Operation getOperationById(final String resourceName, final Long operationId) throws PolicyFinderException { return getOperationById(operationId); } private Operation getOperationById(final Long operationId) throws PolicyFinderException { final org.ebayopensource.turmeric.policyservice.model.Operation jpaOperation = resourceDAO .findOperationById(operationId); if (jpaOperation != null) { return ResourceDAOImpl.convert(jpaOperation); } return null; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getOperationByName(java.lang.String, java.lang.String) */ @Override public Operation getOperationByName(final String resourceName, final String operationName) throws PolicyFinderException { final org.ebayopensource.turmeric.policyservice.model.Operation jpaOperation = resourceDAO .findOperationByName(resourceName, operationName, resourceType); if (jpaOperation != null) { return ResourceDAOImpl.convert(jpaOperation); } return null; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getOperationByResourceId(java.lang.Long) */ @Override public List<Operation> getOperationByResourceId(final Long resourceId) throws PolicyFinderException { final List<Operation> result = new ArrayList<Operation>(); final Set<org.ebayopensource.turmeric.policyservice.model.Operation> jpaOperations = resourceDAO .findOperationByResourceId(resourceId); if (jpaOperations != null && !jpaOperations.isEmpty()) { for (org.ebayopensource.turmeric.policyservice.model.Operation jpaOperation : jpaOperations) { result.add(ResourceDAOImpl.convert(jpaOperation)); } } return result; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getResourceInfoByOperationId(java.lang.Long) */ @Override public Resource getResourceInfoByOperationId(final Long operationId) throws PolicyFinderException { final org.ebayopensource.turmeric.policyservice.model.Resource jpaResource = resourceDAO .findResourceByOperationId(operationId); if (jpaResource != null) { return ResourceDAOImpl.convert(jpaResource); } return null; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getAuditHistory(org.ebayopensource.turmeric.security.v1.services.ResourceKey, javax.xml.datatype.XMLGregorianCalendar, javax.xml.datatype.XMLGregorianCalendar) */ @Override public List<EntityHistory> getAuditHistory( final ResourceKey resourceKey, final XMLGregorianCalendar startDate, final XMLGregorianCalendar endDate) throws PolicyFinderException { String resourceType = resourceKey.getResourceType(); if (resourceType != null) { return getAuditHistoryByResourceType(startDate, endDate, resourceType); } return getAuditHistoryByIdOrName(resourceKey, startDate, endDate); } private List<EntityHistory> getAuditHistoryByResourceType( XMLGregorianCalendar startDate, XMLGregorianCalendar endDate, String resourceType) { List<EntityHistory> entityHistory = new ArrayList<EntityHistory>(); List<AuditHistory> auditHistory = resourceDAO.getResourceHistory( resourceType, startDate.toGregorianCalendar().getTime(), endDate.toGregorianCalendar().getTime()); for (AuditHistory entry : auditHistory) { entityHistory.add(AuditHistory.convert(entry)); } return entityHistory; } private List<EntityHistory> getAuditHistoryByIdOrName( ResourceKey resourceKey, XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { List<EntityHistory> entityHistory = new ArrayList<EntityHistory>(); Long resourceId = resourceKey.getResourceId(); if (resourceId == null) { org.ebayopensource.turmeric.policyservice.model.Resource resource = resourceDAO.findResourceByName(resourceKey.getResourceName()); if (resource != null) { resourceId = resource.getId(); } } if (resourceId != null) { List<AuditHistory> auditHistory = resourceDAO.getResourceHistory( resourceId.longValue(), startDate.toGregorianCalendar().getTime(), endDate.toGregorianCalendar().getTime()); for (AuditHistory entry : auditHistory) { entityHistory.add(AuditHistory.convert(entry)); } } return entityHistory; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getAuditHistory(org.ebayopensource.turmeric.security.v1.services.OperationKey, javax.xml.datatype.XMLGregorianCalendar, javax.xml.datatype.XMLGregorianCalendar) */ @Override public List<EntityHistory> getAuditHistory( final OperationKey operationKey, final XMLGregorianCalendar startDate, final XMLGregorianCalendar endDate) throws PolicyFinderException { String resourceType = operationKey.getResourceType(); if (resourceType != null) { return getAuditHistoryByOperationType(startDate, endDate, resourceType); } return getAuditHistoryByIdOrName(operationKey, startDate, endDate); } private List<EntityHistory> getAuditHistoryByOperationType( XMLGregorianCalendar startDate, XMLGregorianCalendar endDate, String operationType) { List<EntityHistory> entityHistory = new ArrayList<EntityHistory>(); // List<org.ebayopensource.turmeric.policyservice.model.Resource> allResources= resourceDAO.findResourceByType(resourceType); // List<org.ebayopensource.turmeric.policyservice.model.Operation> allOperations = new ArrayList<org.ebayopensource.turmeric.policyservice.model.Operation>(); // for (org.ebayopensource.turmeric.policyservice.model.Resource resource : allResources) { // List<org.ebayopensource.turmeric.policyservice.model.Operation> operations = new ArrayList<org.ebayopensource.turmeric.policyservice.model.Operation>(resourceDAO.findOperationByResourceId(resource.getId().longValue())); // allOperations.addAll(operations); // } // // for (org.ebayopensource.turmeric.policyservice.model.Operation operation : allOperations) { List<AuditHistory> auditHistory = resourceDAO.getOperationHistory( resourceType, startDate.toGregorianCalendar().getTime(), endDate.toGregorianCalendar().getTime()); for (AuditHistory entry : auditHistory) { entityHistory.add(AuditHistory.convert(entry)); } // } return entityHistory; } private List<EntityHistory> getAuditHistoryByIdOrName( OperationKey operationKey, XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { List<EntityHistory> entityHistory = new ArrayList<EntityHistory>(); Long operationId = operationKey.getOperationId(); if (operationId == null) { org.ebayopensource.turmeric.policyservice.model.Operation operation = resourceDAO.findOperationByName(operationKey.getResourceName(), operationKey.getOperationName(),operationKey.getResourceType()); if (operation != null) { operationId = operation.getId(); } } if (operationId != null) { List<AuditHistory> auditHistory = resourceDAO.getOperationHistory( operationId.longValue(), startDate.toGregorianCalendar().getTime(), endDate.toGregorianCalendar().getTime()); for (AuditHistory entry : auditHistory) { entityHistory.add(AuditHistory.convert(entry)); } } return entityHistory; } /** * {@inheritDoc} * */ public void audit(final ResourceKey resourceKey, final String operationType, final SubjectKey loginSubject) throws PolicyFinderException { resourceDAO.audit(resourceKey, operationType, loginSubject); } /** * {@inheritDoc} */ public void audit(final OperationKey operationKey, final String operationType, final SubjectKey loginSubject) throws PolicyFinderException { resourceDAO.audit(operationKey, operationType, loginSubject); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getMetaData(java.lang.String) */ @Override public List<KeyValuePair> getMetaData(String queryValue) throws PolicyFinderException { if (queryValue.equals("Type")) { List<KeyValuePair> ret = new ArrayList<KeyValuePair>(); KeyValuePair valuePair = new KeyValuePair(); valuePair.setKey(resourceType); ret.add(valuePair); return ret; } return null; } } // The following methods are needed to allow wrapping this class with JPA // transaction wrapper /** * {@inheritDoc} */ public ResourceKey createResource(final Resource resource, final OperationEditObject operationEditObject, final SubjectKey createdBy) throws PolicyCreationException { return impl.createResource(resource, operationEditObject, createdBy); } /** * {@inheritDoc} */ public ResourceKey updateResource(final Resource resource, final OperationEditObject operationEditObject, final SubjectKey modifiedBy) throws PolicyUpdateException, PolicyCreationException, PolicyDeleteException { return impl.updateResource(resource, operationEditObject, modifiedBy); } /** * {@inheritDoc} */ public void deleteResource(final Long resourceId) throws PolicyFinderException, PolicyDeleteException { impl.deleteResource(resourceId); } /** * {@inheritDoc} */ public Resource getResourceInfoById(final Long resourceId) throws PolicyFinderException { return impl.getResourceInfoById(resourceId); } /** * {@inheritDoc} */ public Resource getResourceInfoByName(final String resourceName) throws PolicyFinderException { return impl.getResourceInfoByName(resourceName); } /** * {@inheritDoc} */ public Map<Long, Resource> getResourceInfoByType() throws PolicyFinderException { return impl.getResourceInfoByType(); } /** * {@inheritDoc} */ public Operation getOperationById(final String resourceName, final Long operationId) throws PolicyFinderException { return impl.getOperationById(resourceName, operationId); } /** * {@inheritDoc} */ public Operation getOperationByName(final String resourceName, final String operationName) throws PolicyFinderException { return impl.getOperationByName(resourceName, operationName); } /** * {@inheritDoc} */ public List<Operation> getOperationByResourceId(final Long resourceId) throws PolicyFinderException { return impl.getOperationByResourceId(resourceId); } /** * {@inheritDoc} */ public Resource getResourceInfoByOperationId(final Long operationId) throws PolicyFinderException { return impl.getResourceInfoByOperationId(operationId); } /** * {@inheritDoc} */ public List<EntityHistory> getAuditHistory(final ResourceKey resourceKey, final XMLGregorianCalendar startDate, final XMLGregorianCalendar endDate) throws PolicyFinderException { return impl.getAuditHistory(resourceKey, startDate, endDate); } /** * {@inheritDoc} */ public List<EntityHistory> getAuditHistory(final OperationKey operationKey, final XMLGregorianCalendar startDate, final XMLGregorianCalendar endDate) throws PolicyFinderException { return impl.getAuditHistory(operationKey, startDate, endDate); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policyservice.provider.ResourceTypeProvider#getMetaData(java.lang.String) */ @Override public List<KeyValuePair> getMetaData(String queryValue) throws PolicyFinderException { return impl.getMetaData(queryValue); } /** * {@inheritDoc} */ public void audit(final ResourceKey resourceKey, final String operationType, final SubjectKey loginSubject) throws PolicyFinderException { impl.audit(resourceKey, operationType, loginSubject); } /** * {@inheritDoc} */ public void audit(final OperationKey operationKey, final String operationType, final SubjectKey loginSubject) throws PolicyFinderException { impl.audit(operationKey, operationType, loginSubject); } }