/*
* @(#)WebResourceStatisticsDAOImpl.java
*
* Copyright 2011 SAS OPEN-S. All rights reserved.
* OPEN-S PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
* This file is protected by the intellectual property rights
* in France and other countries, any applicable copyrights or
* patent rights, and international treaty provisions. No part may be
* reproduced in any form by any mean without prior written
* authorization of OPEN-S.
*/
package org.tanaguru.entity.dao.statistics;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import org.tanaguru.entity.audit.SSP;
import org.tanaguru.entity.audit.SSPImpl;
import org.tanaguru.entity.audit.TestSolution;
import org.tanaguru.entity.parameterization.Parameter;
import org.tanaguru.entity.reference.Test;
import org.tanaguru.entity.reference.TestImpl;
import org.tanaguru.entity.statistics.WebResourceStatistics;
import org.tanaguru.entity.statistics.WebResourceStatisticsImpl;
import org.tanaguru.entity.subject.WebResource;
import org.tanaguru.entity.subject.WebResourceImpl;
import org.tanaguru.sdk.entity.dao.jpa.AbstractJPADAO;
/**
*
* @author jkowalczyk
*/
public class WebResourceStatisticsDAOImpl extends
AbstractJPADAO<WebResourceStatistics, Long> implements
WebResourceStatisticsDAO {
private static final String JOIN_PROCESS_RESULT = " LEFT JOIN r.processResultSet pr ";
private static final String JOIN_TEST = " LEFT JOIN pr.test t";
@Override
protected Class<? extends WebResourceStatistics> getEntityClass() {
return WebResourceStatisticsImpl.class;
}
@Override
public Class<? extends WebResource> getWebResourceEntityClass() {
return WebResourceImpl.class;
}
private Class<? extends SSP> getSspEntityClass() {
return SSPImpl.class;
}
private Class<? extends Test> getTestEntityClass() {
return TestImpl.class;
}
@Override
public Long findResultCountByResultType(Long webresourceId,
TestSolution testSolution) {
if (webresourceId == null) {
return null;
}
Query query = entityManager.createQuery("SELECT count (pr.id) FROM "
+ getWebResourceEntityClass().getName() + " r"
+ JOIN_PROCESS_RESULT + " WHERE (r.id=:id OR r.parent.id=:id)"
+ " AND pr.definiteValue = :value");
query.setParameter("id", webresourceId);
query.setParameter("value", testSolution);
try {
return (Long) query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
@Override
public BigDecimal findWeightedResultCountByResultType(Long webresourceId,
Collection<Parameter> paramSet, TestSolution testSolution,
boolean isManualAudit) {
if (webresourceId == null) {
return null;
}
String queryStringForAutomatic = "SELECT t FROM "
+ getWebResourceEntityClass().getName() + " r"
+ JOIN_PROCESS_RESULT + JOIN_TEST
+ " WHERE (r.id=:id OR r.parent.id=:id)"
+ " AND pr.definiteValue = :value";
String queryStringForManual = "SELECT t FROM "
+ getWebResourceEntityClass().getName() + " r"
+ JOIN_PROCESS_RESULT + JOIN_TEST
+ " WHERE (r.id=:id OR r.parent.id=:id)"
+ " AND pr.manualDefiniteValue = :value";
Query query = null;
if (isManualAudit) {
query = entityManager.createQuery(queryStringForManual);
} else {
query = entityManager.createQuery(queryStringForAutomatic);
}
query.setParameter("id", webresourceId);
query.setParameter("value", testSolution);
try {
return computeWeightedCountFromTestList(
(List<Test>) query.getResultList(), paramSet);
} catch (NoResultException e) {
return null;
}
}
@Override
public Long findNumberOfOccurrencesByWebResourceAndResultType(
Long webresourceId, TestSolution testSolution, boolean isManualAudit) {
if (webresourceId == null) {
return null;
}
String queryStringForAutomatic = "SELECT count(pk.id) FROM "
+ getWebResourceEntityClass().getName() + " r"
+ JOIN_PROCESS_RESULT + " JOIN pr.remarkSet pk"
+ " WHERE (r.id=:id OR r.parent.id=:id)"
+ " AND pr.definiteValue = :value" + " AND pk.issue = :value";
String queryStringForManual = "SELECT count(pk.id) FROM "
+ getWebResourceEntityClass().getName() + " r"
+ JOIN_PROCESS_RESULT + " JOIN pr.remarkSet pk"
+ " WHERE (r.id=:id OR r.parent.id=:id)"
+ " AND pr.manualDefiniteValue = :value" + " AND pk.issue = :value";
Query query = null;
if(isManualAudit){
query = entityManager.createQuery(queryStringForManual);
} else {
query = entityManager.createQuery(queryStringForAutomatic);
}
query.setParameter("id", webresourceId);
query.setParameter("value", testSolution);
try {
return (Long) query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
@Override
public Integer findHttpStatusCodeByWebResource(Long webresourceId) {
if (webresourceId == null) {
return null;
}
Query query = entityManager
.createQuery("SELECT s.httpStatusCode FROM "
+ getSspEntityClass().getName() + " s"
+ " WHERE s.page.id=:id");
query.setParameter("id", webresourceId);
try {
return (Integer) query.getSingleResult();
} catch (NoResultException e) {
return -1;
} catch (NullPointerException e) {
return -1;
}
}
@Override
public WebResourceStatistics findWebResourceStatisticsByWebResource(
WebResource webResource) {
//FIXME :YNE: henceforth, we have two lines of WebResourceStatistics (auto and manual). this methode must be adapted to this function
//TODO :YNE we can do so by adding a new critorion manualAudit !=1 (That can return the automatic audit stats)
if (webResource == null) {
return null;
}
Query query = entityManager.createQuery("SELECT s FROM "
+ getEntityClass().getName() + " s"
+ " WHERE s.webResource=:webResource");
query.setParameter("webResource", webResource);
try {
return (WebResourceStatistics) query.getSingleResult();
} catch (NoResultException e) {
return null;
} catch (NullPointerException e) {
return null;
}
}
/**
*
* @param testList
* @param paramSet
* @return
*/
private BigDecimal computeWeightedCountFromTestList(List<Test> testList,
Collection<Parameter> paramSet) {
BigDecimal weightedCount = BigDecimal.ZERO;
for (Test test : testList) {
BigDecimal weight = getTestWeightFromParameter(test, paramSet);
if (weight == null) {
weight = test.getWeight();
}
weightedCount = weightedCount.add(weight);
}
return weightedCount;
}
/**
*
* @param test
* @param paramSet
* @return
*/
private BigDecimal getTestWeightFromParameter(Test test,
Collection<Parameter> paramSet) {
for (Parameter param : paramSet) {
if (param.getParameterElement().getParameterElementCode()
.equals(test.getCode())) {
return BigDecimal.valueOf(Double.valueOf(param.getValue()));
}
}
return null;
}
/**
* {@inheritDoc}
* */
@Override
public WebResourceStatistics findWebResourceStatisticsByWebResource(
WebResource webResource, boolean manual) {
if (webResource == null) {
return null;
}
Query query = entityManager.createQuery("SELECT s FROM "
+ getEntityClass().getName() + " s"
+ " WHERE s.webResource=:webResource" + " AND s.isManualAuditStatistics=:manual");
query.setParameter("webResource", webResource);
query.setParameter("manual", manual? 1 : 0 );
try {
return (WebResourceStatistics) query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
}