/* * 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.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.id.RCertWorkItemId; import com.evolveum.midpoint.repo.sql.query.definition.JaxbName; import com.evolveum.midpoint.repo.sql.query.definition.JaxbPath; import com.evolveum.midpoint.repo.sql.query.definition.JaxbType; import com.evolveum.midpoint.repo.sql.query.definition.OwnerGetter; import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister; import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.schema.util.WorkItemTypeUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationWorkItemType; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Persister; import javax.persistence.*; import javax.xml.datatype.XMLGregorianCalendar; import java.util.HashSet; import java.util.Objects; import java.util.Set; import static com.evolveum.midpoint.repo.sql.data.common.container.RAccessCertificationWorkItem.TABLE; /** * @author mederly */ @JaxbType(type = AccessCertificationWorkItemType.class) @Entity @IdClass(RCertWorkItemId.class) @Table(name = TABLE, indexes = { }) @Persister(impl = MidPointSingleTablePersister.class) public class RAccessCertificationWorkItem implements L2Container<RAccessCertificationCase> { private static final Trace LOGGER = TraceManager.getTrace(RAccessCertificationWorkItem.class); public static final String TABLE = "m_acc_cert_wi"; public static final String F_OWNER = "owner"; private Boolean trans; private String ownerOwnerOid; // campaign OID private RAccessCertificationCase owner; private Integer ownerId; private Integer id; private Integer stageNumber; private Set<RCertWorkItemReference> assigneeRef = new HashSet<>(); private REmbeddedReference performerRef; private String outcome; private XMLGregorianCalendar outputChangeTimestamp; private XMLGregorianCalendar closeTimestamp; public RAccessCertificationWorkItem() { } // ridiculous name, but needed in order to match case.owner_oid @Column(name = "owner_owner_oid", length = RUtil.COLUMN_LENGTH_OID, nullable = false) //@OwnerIdGetter() // this is not a single-valued owner id public String getOwnerOwnerOid() { return ownerOwnerOid; } public void setOwnerOwnerOid(String ownerOwnerOid) { this.ownerOwnerOid = ownerOwnerOid; } @Id @ForeignKey(name = "fk_acc_cert_wi_owner") @MapsId("owner") @ManyToOne(fetch = FetchType.LAZY) @OwnerGetter(ownerClass = RAccessCertificationCase.class) public RAccessCertificationCase getOwner() { return owner; } public void setOwner(RAccessCertificationCase _case) { this.owner = _case; if (_case != null) { // sometimes we are called with null _case but non-null IDs this.ownerId = _case.getId(); this.ownerOwnerOid = _case.getOwnerOid(); } } @Column(name = "owner_id", length = RUtil.COLUMN_LENGTH_OID, nullable = false) //@OwnerIdGetter() // this is not a single-valued owner id public Integer getOwnerId() { return ownerId; } public void setOwnerId(Integer ownerId) { this.ownerId = ownerId; } @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; } @Column public Integer getStageNumber() { return stageNumber; } public void setStageNumber(Integer stageNumber) { this.stageNumber = stageNumber; } @JaxbName(localPart = "assigneeRef") @OneToMany(mappedBy = "owner", orphanRemoval = true) @ForeignKey(name = "none") @Cascade({org.hibernate.annotations.CascadeType.ALL}) public Set<RCertWorkItemReference> getAssigneeRef() { return assigneeRef; } public void setAssigneeRef(Set<RCertWorkItemReference> assigneeRef) { this.assigneeRef = assigneeRef; } @Column public REmbeddedReference getPerformerRef() { return performerRef; } public void setPerformerRef(REmbeddedReference performerRef) { this.performerRef = performerRef; } @JaxbPath(itemPath = { @JaxbName(localPart = "output"), @JaxbName(localPart = "outcome") }) @Column public String getOutcome() { return outcome; } public void setOutcome(String outcome) { this.outcome = outcome; } @Column public XMLGregorianCalendar getOutputChangeTimestamp() { return outputChangeTimestamp; } public void setOutputChangeTimestamp(XMLGregorianCalendar outputChangeTimestamp) { this.outputChangeTimestamp = outputChangeTimestamp; } @Column public XMLGregorianCalendar getCloseTimestamp() { return closeTimestamp; } public void setCloseTimestamp(XMLGregorianCalendar closeTimestamp) { this.closeTimestamp = closeTimestamp; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof RAccessCertificationWorkItem)) return false; RAccessCertificationWorkItem that = (RAccessCertificationWorkItem) o; return Objects.equals(ownerOwnerOid, that.ownerOwnerOid) && Objects.equals(ownerId, that.ownerId) && Objects.equals(id, that.id) && Objects.equals(stageNumber, that.stageNumber) && Objects.equals(assigneeRef, that.assigneeRef) && Objects.equals(performerRef, that.performerRef) && Objects.equals(outcome, that.outcome) && Objects.equals(outputChangeTimestamp, that.outputChangeTimestamp) && Objects.equals(closeTimestamp, that.closeTimestamp); } @Override public int hashCode() { return Objects .hash(ownerOwnerOid, ownerId, id, stageNumber, assigneeRef, performerRef, outcome, outputChangeTimestamp, closeTimestamp); } @Transient public Boolean isTransient() { return trans; } public void setTransient(Boolean trans) { this.trans = trans; } public static RAccessCertificationWorkItem toRepo(RAccessCertificationCase _case, AccessCertificationWorkItemType workItem, RepositoryContext context) throws DtoTranslationException { RAccessCertificationWorkItem rWorkItem = new RAccessCertificationWorkItem(); rWorkItem.setOwner(_case); toRepo(rWorkItem, workItem, context); return rWorkItem; } public static RAccessCertificationWorkItem toRepo(String campaignOid, Integer caseId, AccessCertificationWorkItemType workItem, RepositoryContext context) throws DtoTranslationException { RAccessCertificationWorkItem rWorkItem = new RAccessCertificationWorkItem(); rWorkItem.setOwnerOwnerOid(campaignOid); rWorkItem.setOwnerId(caseId); toRepo(rWorkItem, workItem, context); return rWorkItem; } private static void toRepo(RAccessCertificationWorkItem rWorkItem, AccessCertificationWorkItemType workItem, RepositoryContext context) throws DtoTranslationException { rWorkItem.setTransient(null); // we don't try to advise hibernate - let it do its work, even if it would cost some SELECTs Integer idInt = RUtil.toInteger(workItem.getId()); if (idInt == null) { throw new IllegalArgumentException("No ID for access certification work item: " + workItem); } rWorkItem.setId(idInt); rWorkItem.setStageNumber(workItem.getStageNumber()); rWorkItem.getAssigneeRef().addAll(RCertWorkItemReference.safeListReferenceToSet( workItem.getAssigneeRef(), context.prismContext, rWorkItem)); rWorkItem.setPerformerRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getPerformerRef(), context.prismContext)); rWorkItem.setOutcome(WorkItemTypeUtil.getOutcome(workItem)); rWorkItem.setOutputChangeTimestamp(workItem.getOutputChangeTimestamp()); rWorkItem.setCloseTimestamp(workItem.getCloseTimestamp()); } }