package com.evolveum.midpoint.repo.sql.data.factory;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.sql.data.common.Metadata;
import com.evolveum.midpoint.repo.sql.data.common.RObject;
import com.evolveum.midpoint.repo.sql.data.common.container.RAssignment;
import com.evolveum.midpoint.repo.sql.data.common.container.RAssignmentReference;
import com.evolveum.midpoint.repo.sql.data.common.other.RCReferenceOwner;
import com.evolveum.midpoint.repo.sql.data.common.other.RReferenceOwner;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author lazyman
*/
public class MetadataFactory {
public static MetadataType toJAXB(Metadata repo, PrismContext context) {
if (isNull(repo)) {
return null;
}
MetadataType jaxb = new MetadataType();
jaxb.setCreateChannel(repo.getCreateChannel());
jaxb.setCreateTimestamp(repo.getCreateTimestamp());
jaxb.setModifyChannel(repo.getModifyChannel());
jaxb.setModifyTimestamp(repo.getModifyTimestamp());
if (repo.getCreatorRef() != null) {
jaxb.setCreatorRef(repo.getCreatorRef().toJAXB(context));
}
if (repo.getModifierRef() != null) {
jaxb.setModifierRef(repo.getModifierRef().toJAXB(context));
}
if (repo instanceof RObject) {
List refs = RUtil.safeSetReferencesToList(repo.getCreateApproverRef(), context);
if (!refs.isEmpty()) {
jaxb.getCreateApproverRef().addAll(refs);
}
refs = RUtil.safeSetReferencesToList(repo.getModifyApproverRef(), context);
if (!refs.isEmpty()) {
jaxb.getModifyApproverRef().addAll(refs);
}
} else {
}
return jaxb;
}
private static boolean isNull(Metadata repo) {
return StringUtils.isNotEmpty(repo.getCreateChannel())
&& repo.getCreateTimestamp() == null
&& (repo.getCreateApproverRef() == null || repo.getCreateApproverRef().isEmpty())
&& repo.getCreatorRef() == null
&& StringUtils.isNotEmpty(repo.getModifyChannel())
&& repo.getModifyTimestamp() == null
&& (repo.getModifyApproverRef() == null || repo.getModifyApproverRef().isEmpty())
&& repo.getModifierRef() == null;
}
public static void fromJAXB(MetadataType jaxb, Metadata repo, PrismContext prismContext)
throws DtoTranslationException {
if (jaxb == null) {
return;
}
repo.setCreateChannel(jaxb.getCreateChannel());
repo.setCreateTimestamp(jaxb.getCreateTimestamp());
repo.setModifyChannel(jaxb.getModifyChannel());
repo.setModifyTimestamp(jaxb.getModifyTimestamp());
repo.setCreatorRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getCreatorRef(), prismContext));
repo.setModifierRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getModifierRef(), prismContext));
if (repo instanceof RObject) {
repo.getCreateApproverRef().addAll(RUtil.safeListReferenceToSet(jaxb.getCreateApproverRef(), prismContext,
(RObject) repo, RReferenceOwner.CREATE_APPROVER));
repo.getModifyApproverRef().addAll(RUtil.safeListReferenceToSet(jaxb.getModifyApproverRef(), prismContext,
(RObject) repo, RReferenceOwner.MODIFY_APPROVER));
} else {
repo.getCreateApproverRef().addAll(safeListReferenceToSet(jaxb.getCreateApproverRef(), prismContext,
(RAssignment) repo, RCReferenceOwner.CREATE_APPROVER));
repo.getModifyApproverRef().addAll(safeListReferenceToSet(jaxb.getModifyApproverRef(), prismContext,
(RAssignment) repo, RCReferenceOwner.MODIFY_APPROVER));
}
}
public static boolean equals(Metadata m1, Metadata m2) {
if (m1 == m2) return true;
if (m1.getCreateApproverRef() != null ? !m1.getCreateApproverRef().equals(m2.getCreateApproverRef()) : m2.getCreateApproverRef() != null)
return false;
if (m1.getCreateChannel() != null ? !m1.getCreateChannel().equals(m2.getCreateChannel()) : m2.getCreateChannel() != null)
return false;
if (m1.getCreateTimestamp() != null ? !m1.getCreateTimestamp().equals(m2.getCreateTimestamp()) : m2.getCreateTimestamp() != null)
return false;
if (m1.getCreatorRef() != null ? !m1.getCreatorRef().equals(m2.getCreatorRef()) : m2.getCreatorRef() != null)
return false;
if (m1.getModifierRef() != null ? !m1.getModifierRef().equals(m2.getModifierRef()) : m2.getModifierRef() != null)
return false;
if (m1.getModifyApproverRef() != null ? !m1.getModifyApproverRef().equals(m2.getModifyApproverRef()) : m2.getModifyApproverRef() != null)
return false;
if (m1.getModifyChannel() != null ? !m1.getModifyChannel().equals(m2.getModifyChannel()) : m2.getModifyChannel() != null)
return false;
if (m1.getModifyTimestamp() != null ? !m1.getModifyTimestamp().equals(m2.getModifyTimestamp()) : m2.getModifyTimestamp() != null)
return false;
return true;
}
public static Set<RAssignmentReference> safeListReferenceToSet(List<ObjectReferenceType> list, PrismContext prismContext,
RAssignment owner, RCReferenceOwner refOwner) {
Set<RAssignmentReference> set = new HashSet<>();
if (list == null || list.isEmpty()) {
return set;
}
for (ObjectReferenceType ref : list) {
RAssignmentReference rRef = jaxbRefToRepo(ref, prismContext, owner, refOwner);
if (rRef != null) {
set.add(rRef);
}
}
return set;
}
public static RAssignmentReference jaxbRefToRepo(ObjectReferenceType reference, PrismContext prismContext,
RAssignment owner, RCReferenceOwner refOwner) {
if (reference == null) {
return null;
}
Validate.notNull(owner, "Owner of reference must not be null.");
Validate.notNull(refOwner, "Reference owner of reference must not be null.");
Validate.notEmpty(reference.getOid(), "Target oid reference must not be null.");
RAssignmentReference repoRef = new RAssignmentReference();
repoRef.setReferenceType(refOwner);
repoRef.setOwner(owner);
RAssignmentReference.copyFromJAXB(reference, repoRef);
return repoRef;
}
}