/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.permission.dao.jpa;
import com.google.common.base.Function;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Root;
import org.apereo.portal.jpa.BasePortalJpaDao;
import org.apereo.portal.jpa.OpenEntityManager;
import org.apereo.portal.permission.IPermissionActivity;
import org.apereo.portal.permission.IPermissionOwner;
import org.apereo.portal.permission.dao.IPermissionOwnerDao;
import org.springframework.stereotype.Repository;
/**
* JpaPermissionOwnerDao provides a default JPA/Hibernate implementation of the IPermissionOwnerDao
* interface.
*
* @since 3.3
*/
@Repository("permissionOwnerDao")
public class JpaPermissionOwnerDao extends BasePortalJpaDao implements IPermissionOwnerDao {
private CriteriaQuery<PermissionOwnerImpl> findAllPermissionOwners;
@Override
public void afterPropertiesSet() throws Exception {
this.findAllPermissionOwners =
this.createCriteriaQuery(
new Function<CriteriaBuilder, CriteriaQuery<PermissionOwnerImpl>>() {
@Override
public CriteriaQuery<PermissionOwnerImpl> apply(CriteriaBuilder cb) {
final CriteriaQuery<PermissionOwnerImpl> criteriaQuery =
cb.createQuery(PermissionOwnerImpl.class);
final Root<PermissionOwnerImpl> ownerRoot =
criteriaQuery.from(PermissionOwnerImpl.class);
criteriaQuery.select(ownerRoot);
ownerRoot.fetch(PermissionOwnerImpl_.activities, JoinType.LEFT);
return criteriaQuery;
}
});
}
@Override
public List<IPermissionOwner> getAllPermissionOwners() {
final TypedQuery<PermissionOwnerImpl> query =
this.createCachedQuery(this.findAllPermissionOwners);
final List<PermissionOwnerImpl> resultList = query.getResultList();
return new ArrayList<IPermissionOwner>(new LinkedHashSet<IPermissionOwner>(resultList));
}
@Override
@PortalTransactional
public IPermissionOwner getOrCreatePermissionOwner(String name, String fname) {
IPermissionOwner owner = getPermissionOwner(fname);
if (owner == null) {
owner = new PermissionOwnerImpl(name, fname);
this.getEntityManager().persist(owner);
}
return owner;
}
@Override
public IPermissionOwner getPermissionOwner(long id) {
return getEntityManager().find(PermissionOwnerImpl.class, id);
}
@OpenEntityManager(unitName = PERSISTENCE_UNIT_NAME)
@Override
public IPermissionOwner getPermissionOwner(String fname) {
final NaturalIdQuery<PermissionOwnerImpl> query =
this.createNaturalIdQuery(PermissionOwnerImpl.class);
query.using(PermissionOwnerImpl_.fname, fname);
return query.load();
}
@Override
@PortalTransactional
public IPermissionOwner saveOwner(IPermissionOwner owner) {
this.getEntityManager().persist(owner);
return owner;
}
@Override
@PortalTransactional
public IPermissionActivity getOrCreatePermissionActivity(
IPermissionOwner owner, String name, String fname, String targetProviderKey) {
IPermissionActivity activity = getPermissionActivity(owner.getId(), fname);
if (activity == null) {
activity = new PermissionActivityImpl(name, fname, targetProviderKey);
owner.getActivities().add(activity);
}
return activity;
}
@Override
public IPermissionActivity getPermissionActivity(long id) {
return getEntityManager().find(PermissionActivityImpl.class, id);
}
@Override
public IPermissionActivity getPermissionActivity(long ownerId, String activityFname) {
final IPermissionOwner permissionOwner = this.getPermissionOwner(ownerId);
return findActivity(permissionOwner, activityFname);
}
@PortalTransactionalReadOnly
@Override
public IPermissionActivity getPermissionActivity(String ownerFname, String activityFname) {
final IPermissionOwner permissionOwner = this.getPermissionOwner(ownerFname);
return findActivity(permissionOwner, activityFname);
}
@Override
@PortalTransactional
public IPermissionActivity savePermissionActivity(IPermissionActivity activity) {
this.getEntityManager().persist(activity);
return activity;
}
protected IPermissionActivity findActivity(
final IPermissionOwner permissionOwner, String activityFname) {
if (permissionOwner == null) {
return null;
}
final Set<IPermissionActivity> activities = permissionOwner.getActivities();
for (final IPermissionActivity permissionActivity : activities) {
if (activityFname.equals(permissionActivity.getFname())) {
return permissionActivity;
}
}
return null;
}
}