/*******************************************************************************
* 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.model;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.Query;
import javax.persistence.Transient;
import org.apache.commons.collections.iterators.IteratorChain;
import org.eclipse.jubula.client.core.i18n.Messages;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.exception.InvalidDataException;
import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs;
import org.eclipse.persistence.annotations.BatchFetch;
import org.eclipse.persistence.annotations.BatchFetchType;
/**
* @author BREDEX GmbH
* @created 07.06.2005
*/
@Entity
@DiscriminatorValue(value = "T")
abstract class TestCasePO extends ParamNodePO implements ITestCasePO {
/**
* <code>m_eventExecTcMap</code><br>
* eventhandler for each eventType (key)
*/
private Map<String, IEventExecTestCasePO> m_eventExecTcMap =
new HashMap<String, IEventExecTestCasePO>(
IEventHandlerContainer.MAX_NUMBER_OF_EVENT_HANDLER);
/**
* @param name name of testcase
* @param isGenerated indicates whether this node has been generated
*/
public TestCasePO(String name, boolean isGenerated) {
super(name, isGenerated);
}
/**
* @param name name of testcase
* @param guid the GUID of the testcase
* @param isGenerated indicates whether this node has been generated
*/
public TestCasePO(String name, String guid, boolean isGenerated) {
super(name, guid, isGenerated);
}
/**
* only for Persistence (JPA / EclipseLink)
*/
TestCasePO() {
// only for Persistence (JPA / EclipseLink)
}
/**
*
* @return Returns the eventExecTestCaseMap.
*/
@OneToMany(targetEntity = EventExecTestCasePO.class,
fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "EVENT_HANDLERS",
inverseJoinColumns = @JoinColumn(name = "TEST_CASE_ID"),
joinColumns = @JoinColumn(name = "EVENT_HANDLER_ID"))
@MapKeyColumn(name = "EVENT_TYPE_KEY", nullable = false,
table = "EVENT_HANDLERS")
@BatchFetch(value = BatchFetchType.JOIN)
public Map<String, IEventExecTestCasePO> getEventExecTcMap() {
return m_eventExecTcMap;
}
/**
* Removes the links to the event handlers
* @param sess the session
*/
private void removeEventHandlers(EntityManager sess) {
if (m_eventExecTcMap.isEmpty()) {
return;
}
Query q = sess.createNativeQuery("delete from EVENT_HANDLERS where EVENT_HANDLER_ID = ?1"); //$NON-NLS-1$
q.setParameter(1, getId()).executeUpdate();
for (INodePO node : getEventExecTcMap().values()) {
node.goingToBeDeleted(sess);
q = sess.createNativeQuery("delete from NODE where ID = ?1"); //$NON-NLS-1$
q.setParameter(1, node.getId()).executeUpdate();
}
}
/**
* only for Persistence (JPA / EclipseLink)
* @param eventExecTestCaseList
* The eventExecTestCaseList to set.
*/
@SuppressWarnings("unused")
private void setEventExecTcMap(
Map<String, IEventExecTestCasePO> eventExecTestCaseList) {
m_eventExecTcMap = eventExecTestCaseList;
}
/**
* @param eventTC eventExecTestCase to add
* @throws InvalidDataException if an eventTestCase is already
* existent for the associated event
*/
public void addEventTestCase(IEventExecTestCasePO eventTC)
throws InvalidDataException {
if (!getEventExecTcMap().containsKey(eventTC.getEventType())) {
getEventExecTcMap().put(eventTC.getEventType(), eventTC);
eventTC.setParentProjectId(getParentProjectId());
eventTC.setParentNode(this);
} else {
throw new InvalidDataException(
Messages.DoubleEventTestCaseForTheSameEvent
+ StringConstants.SPACE + StringConstants.SLASH
+ eventTC.getEventType() + StringConstants.SLASH,
MessageIDs.E_DOUBLE_EVENT);
}
}
/**
* get the eventExecTC for a given eventType
* @param eventType eventType for wanted eventExecTC
* @return the eventExecTC for given eventType or null
*/
public IEventExecTestCasePO getEventExecTC(String eventType) {
setParents(getEventExecTcMap().values());
return getEventExecTcMap().get(eventType);
}
/**
* @return all EventExecTestCases of this SpecTestCasePO.
*/
@Transient
public Collection<IEventExecTestCasePO> getAllEventEventExecTC() {
Collection<IEventExecTestCasePO> evHandlers =
getEventExecTcMap().values();
setParents(evHandlers);
return Collections.unmodifiableCollection(evHandlers);
}
/** {@inheritDoc} */
@Transient
public Iterator<INodePO> getAllNodeIter() {
IteratorChain chain = new IteratorChain();
chain.addIterator(getNodeListIterator());
chain.addIterator(getAllEventEventExecTC().iterator());
for (INodePO node : getUnmodifiableNodeList()) {
if (node instanceof IControllerPO) {
for (INodePO cont : node.getUnmodifiableNodeList()) {
chain.addIterator(cont.getNodeListIterator());
}
}
}
return chain;
}
/**
* {@inheritDoc}
*/
public void setParentProjectId(Long projectId) {
super.setParentProjectId(projectId);
for (IEventExecTestCasePO eh : getAllEventEventExecTC()) {
eh.setParentProjectId(projectId);
}
}
/**
* @param evHandlers the event handlers to set the parent for
*/
private void setParents(Collection<IEventExecTestCasePO> evHandlers) {
for (IEventExecTestCasePO evTc : evHandlers) {
evTc.setParentNode(this);
}
}
/** {@inheritDoc} */
public void goingToBeDeleted(EntityManager sess) {
removeEventHandlers(sess);
super.goingToBeDeleted(sess);
}
}