/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.core.persistence;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.eclipse.jubula.client.core.businessprocess.TestDataBP;
import org.eclipse.jubula.client.core.model.IDataSetPO;
import org.eclipse.jubula.client.core.model.IParamNodePO;
import org.eclipse.jubula.client.core.model.IParameterInterfacePO;
import org.eclipse.jubula.client.core.model.IProjectPO;
import org.eclipse.jubula.client.core.model.ITestDataCubePO;
import org.eclipse.jubula.client.core.model.PoMaker;
/**
* PM to handle all test data cube related Persistence (JPA / EclipseLink)
* queries
*
* @author BREDEX GmbH
* @created Jul 21, 2010
*/
public class TestDataCubePM {
/** hide */
private TestDataCubePM() {
// empty
}
/**
* @param tdc
* the test data cube to search for reusage
* @param session
* The session into which the test cases will be loaded.
* @return list of ITestDataCubePO
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List<ITestDataCubePO> computeReuser(IParameterInterfacePO tdc,
EntityManager session) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery();
Root from = query.from(PoMaker.getTestDataCubeClass());
query.select(from)
.where(builder.and(
builder.isNotNull(from.get("hbmReferencedDataCube")), //$NON-NLS-1$
builder.equal(from.get("hbmParentProjectId"), //$NON-NLS-1$
tdc.getParentProjectId())));
List<ITestDataCubePO> queryResult =
session.createQuery(query).getResultList();
List<ITestDataCubePO> result = new ArrayList<ITestDataCubePO>();
for (ITestDataCubePO pio : queryResult) {
if (areEqual(pio.getReferencedDataCube(), tdc)) {
result.add(pio);
}
}
return result;
}
/**
* @param pioToSearch
* the test data cube to search for reusage
* @param session
* The session into which the test cases will be loaded.
* @param proj
* the project to search in
* @return list of param node po; without any ITestDataCubePOs themselves as
* they don't have a parent project id
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List<IParamNodePO> computeParamNodeReuser(
IParameterInterfacePO pioToSearch, EntityManager session,
IProjectPO proj) {
Query query = session.createQuery(
"select paramPO from ParamNodePO paramPO where paramPO.hbmParentProjectId = :projId"); //$NON-NLS-1$
query.setParameter("projId", proj.getId()); //$NON-NLS-1$
List<IParameterInterfacePO> queryResult = query.getResultList();
List<IParamNodePO> result = new ArrayList<IParamNodePO>();
for (IParameterInterfacePO pio : queryResult) {
search: if (pio instanceof IParamNodePO) {
IParamNodePO pn = (IParamNodePO) pio;
if (areEqual(pn.getReferencedDataCube(), pioToSearch)) {
result.add(pn);
continue;
}
/*
* Search for function call ?getCentralTestDataSetValue()
*/
for (IDataSetPO dataSet : pn.getDataManager().getDataSets()) {
for (int i = 0; i < dataSet.getColumnCount(); i++) {
if (TestDataBP.isCTDSReferenced(pioToSearch.getName(),
dataSet.getValueAt(i))) {
result.add(pn);
break search;
}
}
}
}
}
return result;
}
/**
* @param po1
* the first poi
* @param po2
* the second poi
* @return true if regarded as equal
*/
private static boolean areEqual(IParameterInterfacePO po1,
IParameterInterfacePO po2) {
if (po1 != null && po2 != null) {
EqualsBuilder eb = new EqualsBuilder();
eb.append(po1.getId(), po2.getId());
return eb.isEquals();
}
return false;
}
}