/**
* 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.tenants;
import com.google.common.base.Function;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Root;
import org.apereo.portal.jpa.BasePortalJpaDao;
import org.springframework.stereotype.Repository;
@Repository
/* package-private */ class JpaTenantDao extends BasePortalJpaDao implements ITenantDao {
private CriteriaQuery<JpaTenant> allTenantsQuery;
private CriteriaQuery<JpaTenant> tenantByNameQuery;
private CriteriaQuery<JpaTenant> tenantByFNameQuery;
private ParameterExpression<String> nameParameter;
private ParameterExpression<String> fnameParameter;
@Override
public void afterPropertiesSet() throws Exception {
nameParameter = createParameterExpression(String.class, "name");
fnameParameter = createParameterExpression(String.class, "fname");
allTenantsQuery =
createCriteriaQuery(
new Function<CriteriaBuilder, CriteriaQuery<JpaTenant>>() {
@Override
public CriteriaQuery<JpaTenant> apply(CriteriaBuilder cb) {
final CriteriaQuery<JpaTenant> rslt =
cb.createQuery(JpaTenant.class);
Root<JpaTenant> root = rslt.from(JpaTenant.class);
rslt.orderBy(cb.asc(root.get(JpaTenant_.name)));
return rslt;
}
});
tenantByNameQuery =
createCriteriaQuery(
new Function<CriteriaBuilder, CriteriaQuery<JpaTenant>>() {
@Override
public CriteriaQuery<JpaTenant> apply(CriteriaBuilder cb) {
final CriteriaQuery<JpaTenant> rslt =
cb.createQuery(JpaTenant.class);
Root<JpaTenant> root = rslt.from(JpaTenant.class);
rslt.where(cb.equal(root.get(JpaTenant_.name), nameParameter));
return rslt;
}
});
tenantByFNameQuery =
createCriteriaQuery(
new Function<CriteriaBuilder, CriteriaQuery<JpaTenant>>() {
@Override
public CriteriaQuery<JpaTenant> apply(CriteriaBuilder cb) {
final CriteriaQuery<JpaTenant> rslt =
cb.createQuery(JpaTenant.class);
Root<JpaTenant> root = rslt.from(JpaTenant.class);
rslt.where(cb.equal(root.get(JpaTenant_.fname), fnameParameter));
return rslt;
}
});
}
@Override
public Set<ITenant> getAllTenants() {
final TypedQuery<JpaTenant> query = createCachedQuery(allTenantsQuery);
final List<JpaTenant> resultList = query.getResultList();
return new HashSet<ITenant>(resultList);
}
@Override
public ITenant getTenantByName(String name) {
final TypedQuery<JpaTenant> query = createCachedQuery(tenantByNameQuery);
query.setParameter(nameParameter, name);
final List<JpaTenant> list = query.getResultList();
if (list.size() == 0) {
final String msg = "Tenant not found with name: " + name;
throw new IllegalArgumentException(msg);
}
return list.get(0);
}
@Override
public ITenant getTenantByFName(String fname) {
final TypedQuery<JpaTenant> query = createCachedQuery(tenantByFNameQuery);
query.setParameter(fnameParameter, fname);
final List<JpaTenant> list = query.getResultList();
if (list.size() == 0) {
final String msg = "Tenant not found with fname: " + fname;
throw new IllegalArgumentException(msg);
}
return list.get(0);
}
@Override
public ITenant instantiate() {
return new JpaTenant();
}
@Override
@PortalTransactional
public void createOrUpdateTenant(ITenant tenant) {
EntityManager entityManager = getEntityManager();
// Assertions
if (tenant instanceof JpaTenant) {
final ITenant persistantTenant;
if (entityManager.contains(tenant)) {
persistantTenant = tenant;
} else {
persistantTenant = entityManager.merge(tenant);
}
entityManager.persist(persistantTenant);
} else {
// This object is not supported by this DAO
final String msg =
"The specified tenant is not an instanceof JpaTenant: " + tenant.getFname();
throw new IllegalArgumentException(msg);
}
}
@Override
@PortalTransactional
public void removeTenant(ITenant tenant) {
// Assertions
if (tenant.getId() == -1) {
final String msg = "The specified tenant does not exist: " + tenant.getFname();
throw new IllegalArgumentException(msg);
}
getEntityManager().remove(tenant);
}
}