/*
* Copyright (c) 2010-2013 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.repo.sql.data.common;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.repo.sql.data.RepositoryContext;
import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference;
import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString;
import com.evolveum.midpoint.repo.sql.data.common.enums.*;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbName;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbPath;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.MidPointJoinedPersister;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.Index;
import org.hibernate.annotations.Persister;
import javax.persistence.*;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Collection;
import java.util.Set;
/**
* @author lazyman
*/
@Entity
@Table(name = "m_task", indexes = {
@javax.persistence.Index(name = "iTaskWfProcessInstanceId", columnList = "wfProcessInstanceId"),
@javax.persistence.Index(name = "iTaskWfStartTimestamp", columnList = "wfStartTimestamp"),
@javax.persistence.Index(name = "iTaskWfEndTimestamp", columnList = "wfEndTimestamp"),
@javax.persistence.Index(name = "iTaskWfRequesterOid", columnList = "wfRequesterRef_targetOid"),
@javax.persistence.Index(name = "iTaskWfObjectOid", columnList = "wfObjectRef_targetOid"),
@javax.persistence.Index(name = "iTaskWfTargetOid", columnList = "wfTargetRef_targetOid") })
@ForeignKey(name = "fk_task")
@Persister(impl = MidPointJoinedPersister.class)
public class RTask extends RObject<TaskType> implements OperationResult {
private RPolyString name;
private String taskIdentifier;
private RTaskExecutionStatus executionStatus;
private String node;
private String category;
private String handlerUri;
//operation result
private ROperationResultStatus status;
//end of operation result
private XMLGregorianCalendar lastRunStartTimestamp;
private XMLGregorianCalendar lastRunFinishTimestamp;
private XMLGregorianCalendar completionTimestamp;
private RTaskRecurrence recurrence;
private RTaskBinding binding;
private REmbeddedReference objectRef;
private REmbeddedReference ownerRefTask;
private String parent;
private String canRunOnNode;
private RThreadStopAction threadStopAction;
private Set<String> dependent;
private RTaskWaitingReason waitingReason;
// workflow-related information (note: objectRef is already present in task information)
private String wfProcessInstanceId;
private REmbeddedReference wfRequesterRef;
private REmbeddedReference wfObjectRef;
private REmbeddedReference wfTargetRef;
private XMLGregorianCalendar wfStartTimestamp;
private XMLGregorianCalendar wfEndTimestamp;
@ElementCollection
@ForeignKey(name = "fk_task_dependent")
@CollectionTable(name = "m_task_dependent", joinColumns = {
@JoinColumn(name = "task_oid", referencedColumnName = "oid")
})
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<String> getDependent() {
return dependent;
}
@Enumerated(EnumType.ORDINAL)
public RTaskWaitingReason getWaitingReason() {
return waitingReason;
}
@Column(nullable = true)
public String getCanRunOnNode() {
return canRunOnNode;
}
public String getCategory() {
return category;
}
@Enumerated(EnumType.ORDINAL)
@Column(nullable = true)
public RThreadStopAction getThreadStopAction() {
return threadStopAction;
}
@Embedded
public REmbeddedReference getObjectRef() {
return objectRef;
}
@JaxbName(localPart = "ownerRef")
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "relation", column = @Column(name = "ownerRef_relation", length = RUtil.COLUMN_LENGTH_QNAME)),
@AttributeOverride(name = "targetOid", column = @Column(name = "ownerRef_targetOid", length = RUtil.COLUMN_LENGTH_OID)),
@AttributeOverride(name = "type", column = @Column(name = "ownerRef_type"))
})
public REmbeddedReference getOwnerRefTask() {
return ownerRefTask;
}
@Index(name = "iParent")
@Column(name = "parent")
public String getParent() {
return parent;
}
@Enumerated(EnumType.ORDINAL)
@Column(nullable = true)
public RTaskBinding getBinding() {
return binding;
}
@Enumerated(EnumType.ORDINAL)
public RTaskExecutionStatus getExecutionStatus() {
return executionStatus;
}
@Enumerated(EnumType.ORDINAL)
public RTaskRecurrence getRecurrence() {
return recurrence;
}
@Embedded
public RPolyString getName() {
return name;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "processInstanceId") })
public String getWfProcessInstanceId() {
return wfProcessInstanceId;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "requesterRef") })
@Embedded
public REmbeddedReference getWfRequesterRef() {
return wfRequesterRef;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "objectRef") })
@Embedded
public REmbeddedReference getWfObjectRef() {
return wfObjectRef;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "targetRef") })
@Embedded
public REmbeddedReference getWfTargetRef() {
return wfTargetRef;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "startTimestamp") })
public XMLGregorianCalendar getWfStartTimestamp() {
return wfStartTimestamp;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "endTimestamp") })
public XMLGregorianCalendar getWfEndTimestamp() {
return wfEndTimestamp;
}
public void setName(RPolyString name) {
this.name = name;
}
public void setCanRunOnNode(String canRunOnNode) {
this.canRunOnNode = canRunOnNode;
}
public void setThreadStopAction(RThreadStopAction threadStopAction) {
this.threadStopAction = threadStopAction;
}
public void setObjectRef(REmbeddedReference objectRef) {
this.objectRef = objectRef;
}
public void setOwnerRefTask(REmbeddedReference ownerRefTask) {
this.ownerRefTask = ownerRefTask;
}
public void setParent(String parent) {
this.parent = parent;
}
public void setCategory(String category) {
this.category = category;
}
public void setWfProcessInstanceId(String wfProcessInstanceId) {
this.wfProcessInstanceId = wfProcessInstanceId;
}
public void setWfRequesterRef(REmbeddedReference wfRequesterRef) {
this.wfRequesterRef = wfRequesterRef;
}
public void setWfObjectRef(REmbeddedReference wfObjectRef) {
this.wfObjectRef = wfObjectRef;
}
public void setWfTargetRef(REmbeddedReference wfTargetRef) {
this.wfTargetRef = wfTargetRef;
}
public void setWfStartTimestamp(XMLGregorianCalendar wfStartTimestamp) {
this.wfStartTimestamp = wfStartTimestamp;
}
public void setWfEndTimestamp(XMLGregorianCalendar wfEndTimestamp) {
this.wfEndTimestamp = wfEndTimestamp;
}
public String getHandlerUri() {
return handlerUri;
}
@Column(nullable = true)
public XMLGregorianCalendar getLastRunFinishTimestamp() {
return lastRunFinishTimestamp;
}
@Column(nullable = true)
public XMLGregorianCalendar getCompletionTimestamp() {
return completionTimestamp;
}
@Column(nullable = true)
public XMLGregorianCalendar getLastRunStartTimestamp() {
return lastRunStartTimestamp;
}
@Column(nullable = true)
public String getNode() {
return node;
}
@Column(nullable = true)
public String getTaskIdentifier() {
return taskIdentifier;
}
@Enumerated(EnumType.ORDINAL)
public ROperationResultStatus getStatus() {
return status;
}
public void setStatus(ROperationResultStatus status) {
this.status = status;
}
public void setBinding(RTaskBinding binding) {
this.binding = binding;
}
public void setExecutionStatus(RTaskExecutionStatus executionStatus) {
this.executionStatus = executionStatus;
}
public void setHandlerUri(String handlerUri) {
this.handlerUri = handlerUri;
}
public void setLastRunFinishTimestamp(XMLGregorianCalendar lastRunFinishTimestamp) {
this.lastRunFinishTimestamp = lastRunFinishTimestamp;
}
public void setCompletionTimestamp(XMLGregorianCalendar completionTimestamp) {
this.completionTimestamp = completionTimestamp;
}
public void setLastRunStartTimestamp(XMLGregorianCalendar lastRunStartTimestamp) {
this.lastRunStartTimestamp = lastRunStartTimestamp;
}
public void setNode(String node) {
this.node = node;
}
public void setRecurrence(RTaskRecurrence recurrence) {
this.recurrence = recurrence;
}
public void setTaskIdentifier(String taskIdentifier) {
this.taskIdentifier = taskIdentifier;
}
public void setDependent(Set<String> dependent) {
this.dependent = dependent;
}
public void setWaitingReason(RTaskWaitingReason waitingReason) {
this.waitingReason = waitingReason;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
RTask rTask = (RTask) o;
if (name != null ? !name.equals(rTask.name) : rTask.name != null) return false;
if (binding != rTask.binding) return false;
if (executionStatus != rTask.executionStatus) return false;
if (handlerUri != null ? !handlerUri.equals(rTask.handlerUri) : rTask.handlerUri != null) return false;
if (lastRunFinishTimestamp != null ? !lastRunFinishTimestamp.equals(rTask.lastRunFinishTimestamp) : rTask.lastRunFinishTimestamp != null)
return false;
if (completionTimestamp != null ? !completionTimestamp.equals(rTask.completionTimestamp) : rTask.completionTimestamp != null)
return false;
if (lastRunStartTimestamp != null ? !lastRunStartTimestamp.equals(rTask.lastRunStartTimestamp) : rTask.lastRunStartTimestamp != null)
return false;
if (node != null ? !node.equals(rTask.node) : rTask.node != null) return false;
if (objectRef != null ? !objectRef.equals(rTask.objectRef) : rTask.objectRef != null) return false;
if (ownerRefTask != null ? !ownerRefTask.equals(rTask.ownerRefTask) : rTask.ownerRefTask != null) return false;
if (recurrence != rTask.recurrence) return false;
if (taskIdentifier != null ? !taskIdentifier.equals(rTask.taskIdentifier) : rTask.taskIdentifier != null)
return false;
if (canRunOnNode != null ? !canRunOnNode.equals(rTask.canRunOnNode) : rTask.canRunOnNode != null) return false;
if (threadStopAction != null ? !threadStopAction.equals(rTask.threadStopAction) :
rTask.threadStopAction != null) return false;
if (category != null ? !category.equals(rTask.category) : rTask.category != null) return false;
if (parent != null ? !parent.equals(rTask.parent) : rTask.parent != null) return false;
if (dependent != null ? !dependent.equals(rTask.dependent) : rTask.dependent != null) return false;
if (waitingReason != null ? !waitingReason.equals(rTask.waitingReason) : rTask.waitingReason != null)
return false;
if (status != rTask.status) return false;
if (wfRequesterRef != null ? !wfRequesterRef.equals(rTask.wfRequesterRef) : rTask.wfRequesterRef != null) return false;
if (wfObjectRef != null ? !wfObjectRef.equals(rTask.wfObjectRef) : rTask.wfObjectRef != null) return false;
if (wfTargetRef != null ? !wfTargetRef.equals(rTask.wfTargetRef) : rTask.wfTargetRef != null) return false;
if (wfProcessInstanceId != null ? !wfProcessInstanceId.equals(rTask.wfProcessInstanceId) : rTask.wfProcessInstanceId != null) return false;
if (wfStartTimestamp != null ? !wfStartTimestamp.equals(rTask.wfStartTimestamp) : rTask.wfStartTimestamp != null) return false;
if (wfEndTimestamp != null ? !wfEndTimestamp.equals(rTask.wfEndTimestamp) : rTask.wfEndTimestamp != null) return false;
return true;
}
@Override
public int hashCode() {
int result1 = super.hashCode();
result1 = 31 * result1 + (name != null ? name.hashCode() : 0);
result1 = 31 * result1 + (taskIdentifier != null ? taskIdentifier.hashCode() : 0);
result1 = 31 * result1 + (executionStatus != null ? executionStatus.hashCode() : 0);
result1 = 31 * result1 + (node != null ? node.hashCode() : 0);
result1 = 31 * result1 + (handlerUri != null ? handlerUri.hashCode() : 0);
result1 = 31 * result1 + (lastRunStartTimestamp != null ? lastRunStartTimestamp.hashCode() : 0);
result1 = 31 * result1 + (completionTimestamp != null ? completionTimestamp.hashCode() : 0);
result1 = 31 * result1 + (lastRunFinishTimestamp != null ? lastRunFinishTimestamp.hashCode() : 0);
result1 = 31 * result1 + (recurrence != null ? recurrence.hashCode() : 0);
result1 = 31 * result1 + (binding != null ? binding.hashCode() : 0);
result1 = 31 * result1 + (canRunOnNode != null ? canRunOnNode.hashCode() : 0);
result1 = 31 * result1 + (threadStopAction != null ? threadStopAction.hashCode() : 0);
result1 = 31 * result1 + (category != null ? category.hashCode() : 0);
result1 = 31 * result1 + (parent != null ? parent.hashCode() : 0);
result1 = 31 * result1 + (waitingReason != null ? waitingReason.hashCode() : 0);
result1 = 31 * result1 + (status != null ? status.hashCode() : 0);
return result1;
}
public static void copyFromJAXB(TaskType jaxb, RTask repo, RepositoryContext repositoryContext,
IdGeneratorResult generatorResult) throws DtoTranslationException {
RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult);
PrismObjectDefinition<TaskType> taskDefinition = jaxb.asPrismObject().getDefinition();
repo.setName(RPolyString.copyFromJAXB(jaxb.getName()));
repo.setTaskIdentifier(jaxb.getTaskIdentifier());
repo.setExecutionStatus(RUtil.getRepoEnumValue(jaxb.getExecutionStatus(), RTaskExecutionStatus.class));
repo.setHandlerUri(jaxb.getHandlerUri());
repo.setLastRunFinishTimestamp(jaxb.getLastRunFinishTimestamp());
repo.setCompletionTimestamp(jaxb.getCompletionTimestamp());
repo.setLastRunStartTimestamp(jaxb.getLastRunStartTimestamp());
repo.setNode(jaxb.getNode());
repo.setBinding(RUtil.getRepoEnumValue(jaxb.getBinding(), RTaskBinding.class));
repo.setRecurrence(RUtil.getRepoEnumValue(jaxb.getRecurrence(), RTaskRecurrence.class));
repo.setCanRunOnNode(jaxb.getCanRunOnNode());
repo.setThreadStopAction(RUtil.getRepoEnumValue(jaxb.getThreadStopAction(), RThreadStopAction.class));
repo.setCategory(jaxb.getCategory());
repo.setParent(jaxb.getParent());
repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), repositoryContext.prismContext));
repo.setOwnerRefTask(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext));
repo.setWaitingReason(RUtil.getRepoEnumValue(jaxb.getWaitingReason(), RTaskWaitingReason.class));
repo.setDependent(RUtil.listToSet(jaxb.getDependent()));
WfContextType wfc = jaxb.getWorkflowContext();
if (wfc != null) {
repo.setWfProcessInstanceId(wfc.getProcessInstanceId());
repo.setWfRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), repositoryContext.prismContext));
repo.setWfObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getObjectRef(), repositoryContext.prismContext));
repo.setWfTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getTargetRef(), repositoryContext.prismContext));
repo.setWfStartTimestamp(wfc.getStartTimestamp());
repo.setWfEndTimestamp(wfc.getEndTimestamp());
}
RUtil.copyResultFromJAXB(taskDefinition, jaxb.F_RESULT, jaxb.getResult(), repo, repositoryContext.prismContext);
}
@Override
public TaskType toJAXB(PrismContext prismContext, Collection<SelectorOptions<GetOperationOptions>> options)
throws DtoTranslationException {
TaskType object = new TaskType();
RUtil.revive(object, prismContext);
RTask.copyToJAXB(this, object, prismContext, options);
return object;
}
}