/*
* Copyright (c) 2010-2017 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.container;
import com.evolveum.midpoint.repo.sql.data.RepositoryContext;
import com.evolveum.midpoint.repo.sql.data.common.RObject;
import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference;
import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus;
import com.evolveum.midpoint.repo.sql.data.common.id.RContainerId;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbType;
import com.evolveum.midpoint.repo.sql.query.definition.OwnerIdGetter;
import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity;
import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty;
import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationExecutionType;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Persister;
import org.jetbrains.annotations.NotNull;
import javax.persistence.*;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Objects;
/**
* @author mederly
*/
@JaxbType(type = OperationExecutionType.class)
@Entity
@QueryEntity
@IdClass(RContainerId.class)
@Table(name = "m_operation_execution", indexes = {
@Index(name = "iOpExecTaskOid", columnList = "taskRef_targetOid"),
@Index(name = "iOpExecInitiatorOid", columnList = "initiatorRef_targetOid"),
@Index(name = "iOpExecStatus", columnList = "status")})
@Persister(impl = MidPointSingleTablePersister.class)
public class ROperationExecution implements Container<RObject<?>> {
public static final String F_OWNER = "owner";
private static final Trace LOGGER = TraceManager.getTrace(ROperationExecution.class);
private Boolean trans;
private RObject<?> owner;
private String ownerOid;
private Integer id;
private REmbeddedReference initiatorRef;
private REmbeddedReference taskRef;
private ROperationResultStatus status;
private XMLGregorianCalendar timestamp;
public ROperationExecution() {
this(null);
}
public ROperationExecution(RObject<?> owner) {
this.setOwner(owner);
}
@Id
@org.hibernate.annotations.ForeignKey(name = "fk_op_exec_owner")
@MapsId("owner")
@ManyToOne(fetch = FetchType.LAZY)
@NotQueryable
@Override
public RObject<?> getOwner() {
return owner;
}
@Override
public void setOwner(RObject owner) {
this.owner = owner;
}
@Column(name = "owner_oid", length = RUtil.COLUMN_LENGTH_OID, nullable = false)
@OwnerIdGetter()
@Override
public String getOwnerOid() {
if (owner != null && ownerOid == null) {
ownerOid = owner.getOid();
}
return ownerOid;
}
public void setOwnerOid(String ownerOid) {
this.ownerOid = ownerOid;
}
@Id
@GeneratedValue(generator = "ContainerIdGenerator")
@GenericGenerator(name = "ContainerIdGenerator", strategy = "com.evolveum.midpoint.repo.sql.util.ContainerIdGenerator")
@Column(name = "id")
@IdQueryProperty
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Embedded
public REmbeddedReference getInitiatorRef() {
return initiatorRef;
}
public void setInitiatorRef(REmbeddedReference initiatorRef) {
this.initiatorRef = initiatorRef;
}
@Embedded
public REmbeddedReference getTaskRef() {
return taskRef;
}
public void setTaskRef(REmbeddedReference taskRef) {
this.taskRef = taskRef;
}
public ROperationResultStatus getStatus() {
return status;
}
public void setStatus(ROperationResultStatus status) {
this.status = status;
}
@Column(name = "timestampValue")
public XMLGregorianCalendar getTimestamp() {
return timestamp;
}
public void setTimestamp(XMLGregorianCalendar timestamp) {
this.timestamp = timestamp;
}
@Transient
@Override
public Boolean isTransient() {
return trans;
}
@Override
public void setTransient(Boolean trans) {
this.trans = trans;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof ROperationExecution))
return false;
ROperationExecution that = (ROperationExecution) o;
return Objects.equals(trans, that.trans) &&
Objects.equals(getOwnerOid(), that.getOwnerOid()) &&
Objects.equals(id, that.id) &&
Objects.equals(initiatorRef, that.initiatorRef) &&
Objects.equals(taskRef, that.taskRef) &&
Objects.equals(timestamp, that.timestamp) &&
status == that.status;
}
@Override
public int hashCode() {
return Objects.hash(trans, getOwnerOid(), id, initiatorRef, taskRef, status);
}
public static void copyFromJAXB(@NotNull OperationExecutionType jaxb, @NotNull ROperationExecution repo,
ObjectType parent, RepositoryContext repositoryContext,
IdGeneratorResult generatorResult) throws DtoTranslationException {
repo.setTransient(generatorResult.isTransient(jaxb.asPrismContainerValue()));
repo.setOwnerOid(parent.getOid());
repo.setId(RUtil.toInteger(jaxb.getId()));
repo.setTaskRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTaskRef(), repositoryContext.prismContext));
repo.setInitiatorRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getInitiatorRef(), repositoryContext.prismContext));
repo.setStatus(RUtil.getRepoEnumValue(jaxb.getStatus(), ROperationResultStatus.class));
repo.setTimestamp(jaxb.getTimestamp());
}
@Override
public String toString() {
return "ROperationExecution{" +
"ownerOid='" + ownerOid + '\'' +
", id=" + id +
", initiatorRef=" + initiatorRef +
", taskRef=" + taskRef +
", status=" + status +
", timestamp=" + timestamp +
'}';
}
}