/*
* Tanaguru - Automated webpage assessment
* Copyright (C) 2008-2015 Tanaguru.org
*
* This file is part of Tanaguru.
*
* Tanaguru is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact us by mail: tanaguru AT tanaguru DOT org
*/
package org.tanaguru.entity.dao.parameterization;
import java.util.*;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import org.tanaguru.entity.audit.Audit;
import org.tanaguru.entity.audit.AuditImpl;
import org.tanaguru.entity.parameterization.Parameter;
import org.tanaguru.entity.parameterization.ParameterElement;
import org.tanaguru.entity.parameterization.ParameterFamily;
import org.tanaguru.entity.parameterization.ParameterImpl;
import org.tanaguru.sdk.entity.dao.jpa.AbstractJPADAO;
/**
*
* @author jkowalczyk
*/
public class ParameterDAOImpl extends AbstractJPADAO<Parameter, Long> implements
ParameterDAO {
@Override
protected Class<? extends Parameter> getEntityClass() {
return ParameterImpl.class;
}
@Override
public Set<Parameter> findParameterSet(ParameterFamily parameterFamily, Audit audit) {
return findParametersFromParameterFamily(parameterFamily, findParameterSetFromAudit(audit));
}
/**
* The database has to contain only one default parameter value for a given
* parameter element. The control is made on application-side. The first
* encountered default value is considered as the default value.
*
* @return
* the default parameter set.
*/
@Override
public Set<Parameter> findDefaultParameterSet() {
Set<Parameter> paramSet = new LinkedHashSet<Parameter>();
Set<String> paramElementSet = new HashSet<String>();
Query query = entityManager.createQuery("SELECT p FROM "
+ getEntityClass().getName() + " p"
+ " WHERE p.isDefaultParameterValue = :isDefault");
query.setParameter("isDefault", true);
try {
for (Parameter parameter : (List<Parameter>)query.getResultList()) {
String paramElement = parameter.getParameterElement().getParameterElementCode();
if (!paramElementSet.contains(paramElement)) {
paramSet.add(parameter);
}
paramElementSet.add(paramElement);
}
return paramSet;
} catch (NoResultException nre) {
return paramSet;
}
}
@Override
public Set<Parameter> findParameterSetFromAudit(Audit audit) {
if (audit != null) {
Query query = entityManager.createQuery("SELECT a FROM "
+ AuditImpl.class.getName() + " a"
+ " WHERE a.id = :idAudit");
query.setParameter("idAudit", audit.getId());
try {
audit = (Audit)(query.getSingleResult());
Set<Parameter> paramSet = new HashSet<Parameter>();
paramSet.addAll(audit.getParameterSet());
return paramSet;
} catch (NoResultException nre) {
return null;
}
}
return null;
}
@Override
public Parameter findParameter(ParameterElement parameterElement, String parameterValue) {
Query query = entityManager.createQuery("SELECT p FROM "
+ getEntityClass().getName() + " p"
+ " WHERE p.parameterElement = :parameterElement"
+ " AND p.parameterValue = :parameterValue");
query.setParameter("parameterElement", parameterElement);
query.setParameter("parameterValue", parameterValue);
try {
return (Parameter)(query.getSingleResult());
} catch (NoResultException nre) {
return null;
}
}
@Override
public Parameter findLevelParameter(String parameterValue) {
Query query = entityManager.createQuery("SELECT p FROM "
+ getEntityClass().getName() + " p"
+ " WHERE p.parameterElement.parameterElementCode = :parameterElementCode"
+ " AND p.parameterValue = :parameterValue");
query.setParameter("parameterValue", parameterValue);
query.setParameter("parameterElementCode", "LEVEL");
try {
return (Parameter)(query.getSingleResult());
} catch (NoResultException nre) {
return null;
}
}
@Override
public Parameter findParameter(Audit audit, String parameterElementCode) {
for (Parameter param : findParameterSetFromAudit(audit)) {
if (param.getParameterElement().getParameterElementCode().equals(parameterElementCode)) {
return param;
}
}
return null;
}
@Override
public Parameter findDefaultParameter(ParameterElement parameterElement) {
Query query = entityManager.createQuery("SELECT p FROM "
+ getEntityClass().getName() + " p"
+ " WHERE p.isDefaultParameterValue = :isDefault"
+ " AND p.parameterElement = :parameterElement");
query.setParameter("isDefault", true);
query.setParameter("parameterElement", parameterElement);
try {
return (Parameter)query.getSingleResult();
} catch (NoResultException nre) {
return null;
} catch (NonUniqueResultException nure) {
return (Parameter)query.getResultList().iterator().next();
}
}
@Override
public Set<Parameter> findParametersFromParameterFamily(
ParameterFamily parameterFamily,
Collection<Parameter> globalParamSet) {
Set<Parameter> paramSet = new HashSet<Parameter>();
for (Parameter param : globalParamSet) {
if (param.getParameterElement().getParameterFamily().equals(parameterFamily)) {
paramSet.add(param);
}
}
return paramSet;
}
}