/*******************************************************************************
* 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.Collections;
import java.util.List;
import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Transient;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.eclipse.jubula.client.core.businessprocess.ProjectNameBP;
import org.eclipse.jubula.client.core.businessprocess.db.TestSuiteBP;
import org.eclipse.jubula.client.core.i18n.Messages;
import org.eclipse.jubula.client.core.persistence.PersistenceUtil;
import org.eclipse.jubula.tools.internal.exception.JBFatalException;
import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author BREDEX GmbH
* @created 04.02.2005
*/
@Entity
@DiscriminatorValue(value = "P")
class ProjectPO extends ParamNodePO implements IProjectPO {
/** standard logging */
private static Logger log = LoggerFactory.getLogger(ProjectPO.class);
/** the properties for this project */
private ProjectPropertiesPO m_projectProperties = null;
/** object to manage all AUTs */
private AUTContPO m_autCont = null;
/**
* <code>m_execObjCont</code>object to manage all executable object such as
* test suites, test jobs and the categories they belong to
*/
private ExecObjContPO m_execObjCont = null;
/**
* <code>m_specObjCont</code>object to manage all specObjects
*/
private SpecObjContPO m_specObjCont = null;
/**
* <code>m_clientMetaDataVersion</code>metaDataVersion of Client which
* was used for creation of project
*/
private Integer m_clientMetaDataVersion = null;
/**
* <code>m_testdatacubecont</code> object to manage all test data cubes
*/
private ITestDataCategoryPO m_testdatacubecont;
/**
* only for Persistence (JPA / EclipseLink)
*/
ProjectPO() {
// only for Persistence (JPA / EclipseLink)
}
/**
* The constructor.
* @param name The name of the project.
* @param metadataVersion metadata version
* @param isGenerated indicates whether this node has been generated
*/
ProjectPO(String name, Integer metadataVersion, boolean isGenerated) {
this(metadataVersion, 1, 0, null, null,
PersistenceUtil.generateUUID(), isGenerated);
ProjectNameBP.getInstance().setName(this.getGuid(), name, false);
}
/**
* The constructor for projects that already have a GUID and version number.
* @param metadataVersion metadataVersion
* @param majorNumber The major version number for this project
* @param minorNumber The minor version number for this project
* @param microNumber The micro version number for this project
* @param versionQualifier The version qualifier for this project
* @param guid The GUID of the project.
* @param isGenerated indicates whether this node has been generated
*/
ProjectPO(Integer metadataVersion, Integer majorNumber,
Integer minorNumber, Integer microNumber, String versionQualifier,
String guid, boolean isGenerated) {
super("dummy", guid, isGenerated); //$NON-NLS-1$
if (majorNumber == null && versionQualifier == null) {
throw new JBFatalException(
"Project with empty qualifier and version number are not allowed", //$NON-NLS-1$
MessageIDs.E_DELETE_TESTRESULT);
}
init(metadataVersion, majorNumber, minorNumber, microNumber,
versionQualifier);
}
/**
* @param metadataVersion metadataVersion
* @param majorNumber The major version number of the project.
* @param minorNumber The minor version number of the project.
* @param microNumber The micro version number for this project
* @param versionQualifier The version qualifier for this project
*/
private void init(Integer metadataVersion,
Integer majorNumber, Integer minorNumber,
Integer microNumber, String versionQualifier) {
setProjectProperties(
PoMaker.createProjectPropertiesPO(getGuid(),
majorNumber, minorNumber, microNumber, versionQualifier));
setAutCont(PoMaker.createAUTContPO());
setTestDataCubeContPO(PoMaker.createTestDataCategoryPO());
setExecObjCont(PoMaker.createExecObjContPO());
setSpecObjCont(PoMaker.createSpecObjContPO());
setClientMetaDataVersion(metadataVersion);
}
/**
* {@inheritDoc}
*/
@Transient
public Set<IAUTMainPO> getAutMainList() {
AUTContPO autCont = getHbmAutCont();
if (autCont != null) {
Set<IAUTMainPO> autMainList = autCont.getAutMainList();
if (autMainList != null) {
return Collections.unmodifiableSet(autMainList);
}
log.error("The AUT main list unexpectedly returned null!"); //$NON-NLS-1$
} else {
log.error("The AUT Cont was unexpectedly null!"); //$NON-NLS-1$
}
return null;
}
/**
* Adds an AUT to a project.
* @param aut The AUT to add.
*/
public void addAUTMain(IAUTMainPO aut) {
getHbmAutCont().addAUTMain(aut);
}
/**
* Removes an AUT from a project.
* @param aut The AUT to remove.
*/
public void removeAUTMain(IAUTMainPO aut) {
getHbmAutCont().removeAUTMain(aut);
List<ITestSuitePO> tsList = TestSuiteBP.getListOfTestSuites();
for (ITestSuitePO ts : tsList) {
if (aut == ts.getAut()) {
ts.setAut(null);
}
}
}
/**
* {@inheritDoc}
*/
@Transient
public String getMarkupLanguage() {
return m_projectProperties.getMarkupLanguage();
}
/**
*
* {@inheritDoc}
*/
public void setMarkupLanguage(String markupLanguage) {
m_projectProperties.setMarkupLanguage(markupLanguage);
}
/**
* {@inheritDoc}
*/
@Transient
public ISpecObjContPO getSpecObjCont() {
return getHbmSpecObjCont();
}
/**
* @param specObjCont The specObjCont to set.
*/
private void setSpecObjCont(ISpecObjContPO specObjCont) {
setHbmSpecObjCont((SpecObjContPO)specObjCont);
getHbmSpecObjCont().setParentProjectId(getId());
}
/**
* {@inheritDoc}
*/
@Transient
public IExecObjContPO getExecObjCont() {
return getHbmExecObjCont();
}
/**
* @param execObjCont The execObjCont to set.
*/
private void setExecObjCont(IExecObjContPO execObjCont) {
setHbmExecObjCont((ExecObjContPO)execObjCont);
getHbmExecObjCont().setParentProjectId(getId());
}
/**
* @param autCont The autCont to set.
*/
private void setAutCont(IAUTContPO autCont) {
setHbmAutCont((AUTContPO)autCont);
}
/**
*
* @return Returns the specObjCont.
*/
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JoinColumn(name = "SPECOBJ_CONT", unique = true)
private SpecObjContPO getHbmSpecObjCont() {
return m_specObjCont;
}
/**
* @param specObjCont The specObjCont to set.
*/
private void setHbmSpecObjCont(SpecObjContPO specObjCont) {
m_specObjCont = specObjCont;
}
/**
*
* @return Returns the execObjCont.
*/
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JoinColumn(name = "EXECOBJ_CONT", unique = true)
private ExecObjContPO getHbmExecObjCont() {
return m_execObjCont;
}
/**
* @param execObjCont The execObjCont to set.
*/
private void setHbmExecObjCont(ExecObjContPO execObjCont) {
m_execObjCont = execObjCont;
}
/**
*
* @return Returns the AutCont.
*/
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JoinColumn(name = "AUT_CONT", unique = true)
private AUTContPO getHbmAutCont() {
return m_autCont;
}
/**
* @param autCont The autCont to set.
*/
private void setHbmAutCont(AUTContPO autCont) {
m_autCont = autCont;
}
/**
*
* @return the AUT container.
*/
@Transient
public IAUTContPO getAutCont() {
return getHbmAutCont();
}
/**
*
* {@inheritDoc}
*/
public void setTestDataCubeContPO(ITestDataCategoryPO testDataCategory) {
setHbmTestDataCubeContPO(testDataCategory);
testDataCategory.setParentProjectId(getId());
}
/**
*
* @return Returns the clientMetaDataVersion.
*/
@Basic
@Column(name = "CONF_MAJ_VERS")
public Integer getClientMetaDataVersion() {
return m_clientMetaDataVersion;
}
/**
* @param metaDataVersion The metaDataVersion to set.
*/
public void setClientMetaDataVersion(Integer metaDataVersion) {
m_clientMetaDataVersion = metaDataVersion;
}
/**
*
* {@inheritDoc}
*/
@Transient
public Set<IReusedProjectPO> getUsedProjects() {
return Collections.unmodifiableSet(
getProjectProperties().getUsedProjects());
}
/**
*
* {@inheritDoc}
*/
@Transient
public Integer getMajorProjectVersion() {
return getProjectProperties().getMajorNumber();
}
/**
*
* {@inheritDoc}
*/
@Transient
public Integer getMinorProjectVersion() {
return getProjectProperties().getMinorNumber();
}
/**
*
* {@inheritDoc}
*/
@Transient
public Integer getMicroProjectVersion() {
return getProjectProperties().getMicroNumber();
}
/**
*
* {@inheritDoc}
*/
@Transient
public String getProjectVersionQualifier() {
return getProjectProperties().getVersionQualifier();
}
/**
*
* {@inheritDoc}
*/
@Transient
public boolean getIsReusable() {
return getProjectProperties().getIsReusable();
}
/**
*
* {@inheritDoc}
*/
public void setIsReusable(boolean isReusable) {
getProjectProperties().setIsReusable(isReusable);
}
/**
* {@inheritDoc}
*/
@Transient
public boolean getIsProtected() {
return getProjectProperties().getIsProtected();
}
/**
* {@inheritDoc}
*/
public void setIsProtected(boolean isProtected) {
getProjectProperties().setIsProtected(isProtected);
}
/**
* {@inheritDoc}
*/
@Transient
public List<IALMReportingRulePO> getALMReportingRules() {
return getProjectProperties().getALMReportingRules();
}
/**
* {@inheritDoc}
*/
public void setALMReportingRules(
List<IALMReportingRulePO> reportingRules) {
getProjectProperties().setALMReportingRules(reportingRules);
}
/**
* {@inheritDoc}
*/
@Transient
public boolean getIsTrackingActivated() {
return getProjectProperties().getIsTrackingActivated();
}
/**
* {@inheritDoc}
*/
public void setIsTrackingActivated(boolean isTrackingActivated) {
getProjectProperties().setIsTrackingActivated(isTrackingActivated);
}
/**
* {@inheritDoc}
*/
public void addUsedProject(IReusedProjectPO reusedProject) {
getProjectProperties().addUsedProject(reusedProject);
}
/**
* {@inheritDoc}
*/
public void removeUsedProject(IReusedProjectPO project) {
getProjectProperties().removeUsedProject(project);
}
/**
* Sets the child node's parentProjectId equal to this node's id.
*
* @param childNode The node that will have its parentProjectId set.
*/
protected void setParentProjectIdForChildNode(INodePO childNode) {
childNode.setParentProjectId(getId());
}
/**
* {@inheritDoc}
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof IProjectPO) {
IProjectPO proj = (IProjectPO)obj;
return new EqualsBuilder()
.append(getGuid(), proj.getGuid())
.append(getMajorProjectVersion(), proj.getMajorProjectVersion())
.append(getMinorProjectVersion(), proj.getMinorProjectVersion())
.append(getMicroProjectVersion(), proj.getMicroProjectVersion())
.append(getProjectVersionQualifier(),
proj.getProjectVersionQualifier())
.isEquals();
}
return false;
}
/**
* {@inheritDoc}
*/
public int hashCode() {
return new HashCodeBuilder()
.append(getGuid())
.append(getMajorProjectVersion())
.append(getMinorProjectVersion())
.append(getMicroProjectVersion())
.append(getProjectVersionQualifier())
.toHashCode();
}
/**
* This method is intended for use by the persistence layer and should do
* nothing other than return the properties.
*
* @return Returns the project properties.
*/
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.EAGER)
@JoinColumn(name = "PROJECT_PROPERTIES", unique = true)
public ProjectPropertiesPO getProperties() {
return m_projectProperties;
}
/**
* This method is intended for use by the persistence layer and should do
* nothing other than assign the properties.
*
* @param properties The new project properties.
*/
private void setProperties(ProjectPropertiesPO properties) {
m_projectProperties = properties;
}
/**
*
* @param properties The new project properties.
*/
private void setProjectProperties(IProjectPropertiesPO properties) {
setProperties((ProjectPropertiesPO)properties);
if (getProjectProperties() != null) {
getProjectProperties().setParentProjectId(getId());
}
}
/**
*
* @return the project properties.
*/
@Transient
public IProjectPropertiesPO getProjectProperties() {
return getProperties();
}
/**
* {@inheritDoc}
*/
@Transient
public String getToolkit() {
return getProjectProperties().getToolkit();
}
/**
* {@inheritDoc}
*/
public void setToolkit(String toolkit) {
getProjectProperties().setToolkit(toolkit);
}
/**
* {@inheritDoc}
*/
public void clearUsedProjects() {
getProjectProperties().clearUsedProjects();
}
/**
*
* @return a displayable name for the project. The returned String is of the
* form: [name]_[majorNumber].[minorNumber]
*/
@Transient
public String getDisplayName() {
StringBuffer sb = new StringBuffer(getName());
sb.append(IProjectPO.NAME_SEPARATOR).append(getVersionString());
return sb.toString();
}
/**
* {@inheritDoc}
*/
@Transient
public String getName() {
return ProjectNameBP.getInstance().getName(getGuid());
}
/**
* {@inheritDoc}
*/
public void setName(String name) {
//ProjectNameBP.getInstance().setName(getGuid(), name);
log.debug(Messages.SetNameNotSupportedOnProjectPO);
}
/**
* Sets parentProjectId for all existing child nodes.
* {@inheritDoc}
*/
public void setParentProjectId(Long projectId) {
getDataManager().setParentProjectId(projectId);
if (getProjectProperties() != null) {
getProjectProperties().setParentProjectId(projectId);
}
if (getHbmAutCont() != null) {
getHbmAutCont().setParentProjectId(projectId);
}
if (getHbmSpecObjCont() != null) {
getHbmSpecObjCont().setParentProjectId(projectId);
}
if (getHbmExecObjCont() != null) {
getHbmExecObjCont().setParentProjectId(projectId);
}
if (getHbmTestDataCubeContPO() != null) {
getHbmTestDataCubeContPO().setParentProjectId(projectId);
}
}
/**
* {@inheritDoc}
*/
@Transient
public String getVersionString() {
return getProjectVersion().toString();
}
/** {@inheritDoc}
* @see org.eclipse.jubula.client.core.model.NodePO#isInterfaceLocked()
*/
@Transient
public Boolean isReused() {
return true;
}
/**
* {@inheritDoc}
*/
@Transient
public ITestDataCategoryPO getTestDataCubeCont() {
return getHbmTestDataCubeContPO();
}
/**
*
* @param testDataCategory The receiver's new top-level Test Data Category.
*/
private void setHbmTestDataCubeContPO(
ITestDataCategoryPO testDataCategory) {
m_testdatacubecont = testDataCategory;
}
/**
*
* @return Returns the test data cube container.
*/
@OneToOne(cascade = CascadeType.ALL,
targetEntity = TestDataCategoryPO.class,
fetch = FetchType.LAZY)
@JoinColumn(name = "TDC_CONT", unique = true)
private ITestDataCategoryPO getHbmTestDataCubeContPO() {
return m_testdatacubecont;
}
/**
* {@inheritDoc}
*/
public void setTestResultCleanupInterval(int noOfDays) {
getProjectProperties().setTestResultCleanupInterval(noOfDays);
}
/**
* {@inheritDoc}
*/
@Transient
public Integer getTestResultCleanupInterval() {
return getProjectProperties().getTestResultCleanupInterval();
}
/**
* {@inheritDoc}
*/
@Transient
public ProjectVersion getProjectVersion() {
return new ProjectVersion(getMajorProjectVersion(),
getMinorProjectVersion(), getMicroProjectVersion(),
getProjectVersionQualifier());
}
}