Skip to content

Commit

Permalink
Sqale: AccessCertificationWorkItem WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Jun 28, 2021
1 parent d6286ad commit 812c8ed
Show file tree
Hide file tree
Showing 9 changed files with 424 additions and 4 deletions.
3 changes: 2 additions & 1 deletion repo/repo-sqale/sql/pgnew-repo.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1306,7 +1306,7 @@ CREATE INDEX m_access_cert_campaign_policySituation_idx
ON m_access_cert_campaign USING GIN(policysituations gin__int_ops);
CREATE INDEX m_access_cert_campaign_ext_idx ON m_access_cert_campaign USING gin (ext);

-- TODO not mapped yet
-- TODO WIP
CREATE TABLE m_access_cert_case (
ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE,
containerType ContainerType GENERATED ALWAYS AS ('ACCESS_CERTIFICATION_CASE') STORED
Expand Down Expand Up @@ -1346,6 +1346,7 @@ CREATE TABLE m_access_cert_case (
)
INHERITS(m_container);

-- TODO not mapped yet
CREATE TABLE m_access_cert_wi (
ownerOid UUID NOT NULL, -- PK+FK
accCertCaseCid INTEGER NOT NULL, -- PK+FK
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

import com.evolveum.midpoint.repo.sqale.qmodel.accesscert.QAccessCertificationCaseMapping;

import com.evolveum.midpoint.repo.sqale.qmodel.accesscert.QAccessCertificationWorkItemMapping;

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
Expand Down Expand Up @@ -131,6 +133,7 @@ public SqaleRepoContext sqlRepoContext(
QAccessCertificationCampaignMapping.init(repositoryContext))
.register(AccessCertificationCaseType.COMPLEX_TYPE,
QAccessCertificationCaseMapping.init(repositoryContext))
.register(AccessCertificationWorkItemType.COMPLEX_TYPE, QAccessCertificationWorkItemMapping.init(repositoryContext))
.register(ArchetypeType.COMPLEX_TYPE, QArchetypeMapping.init(repositoryContext))
.register(AssignmentHolderType.COMPLEX_TYPE,
QAssignmentHolderMapping.init(repositoryContext))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sqale.qmodel.accesscert;

import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType;

import java.time.Instant;
import java.util.UUID;

/**
* Querydsl "row bean" type related to {@link QAccessCertificationWorkItem}.
*/
public class MAccessCertificationWorkItem extends MContainer {

public Long accCertCaseCid;

public Instant closeTimestamp;
public Integer campaignIteration;
public String outcome;
public Instant outputChangeTimestamp;
public UUID performerRefTargetOid;
public MObjectType performerRefTargetType;
public Integer performerRefRelationId;
public Integer stageNumber;
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public void storeRelatedEntities(
List<AccessCertificationCaseType> cases = schemaObject.getCase();
if (!cases.isEmpty()) {
for (AccessCertificationCaseType c : cases) {
QAccessCertificationCaseMapping.get().insert(c, row, jdbcSession);
MAccessCertificationCase cRow = QAccessCertificationCaseMapping.get().insert(c, row, jdbcSession);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationWorkItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType;

import org.jetbrains.annotations.NotNull;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.*;
Expand Down Expand Up @@ -174,6 +176,8 @@ public MAccessCertificationCase insert(AccessCertificationCaseType acase, MAcces

insert(row, jdbcSession);

storeWorkItems(ownerRow, row, acase, jdbcSession);

// storeRefs(row, acase.getAssigneeRef(),
// QCaseWorkItemReferenceMapping.getForCaseWorkItemAssignee(), jdbcSession);
// storeRefs(row, acase.getCandidateRef(),
Expand All @@ -192,4 +196,15 @@ private byte[] createFullObject(AccessCertificationCaseType schemaObject) throws
.serialize(schemaObject.asPrismContainerValue())
.getBytes(StandardCharsets.UTF_8);
}

public void storeWorkItems(@NotNull MAccessCertificationCampaign campaignRow,
@NotNull MAccessCertificationCase caseRow, @NotNull AccessCertificationCaseType schemaObject, @NotNull JdbcSession jdbcSession) throws SchemaException {

List<AccessCertificationWorkItemType> wis = schemaObject.getWorkItem();
if (!wis.isEmpty()) {
for (AccessCertificationWorkItemType wi : wis) {
QAccessCertificationWorkItemMapping.get().insert(wi, campaignRow, caseRow, jdbcSession);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sqale.qmodel.accesscert;

import java.sql.Types;
import java.time.Instant;

import com.querydsl.core.types.dsl.*;
import com.querydsl.sql.ColumnMetadata;

import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType;
import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath;

/**
* Querydsl query type for {@value #TABLE_NAME} table.
*/
@SuppressWarnings("unused")
public class QAccessCertificationWorkItem extends QContainer<MAccessCertificationWorkItem, MAccessCertificationCampaign> {

private static final long serialVersionUID = -672265595179912120L;

public static final String TABLE_NAME = "m_access_cert_wi";

public static final ColumnMetadata ACC_CERT_CASE_CID =
ColumnMetadata.named("accCertCaseCid").ofType(Types.BIGINT).notNull();

public static final ColumnMetadata CLOSE_TIMESTAMP =
ColumnMetadata.named("closeTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE);
public static final ColumnMetadata CAMPAIGN_ITERATION =
ColumnMetadata.named("campaignIteration").ofType(Types.INTEGER);
public static final ColumnMetadata OUTCOME =
ColumnMetadata.named("outcome").ofType(Types.VARCHAR);
public static final ColumnMetadata OUTPUT_CHANGE_TIMESTAMP =
ColumnMetadata.named("outputChangeTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE);
public static final ColumnMetadata PERFORMER_REF_TARGET_OID =
ColumnMetadata.named("performerRefTargetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata PERFORMER_REF_TARGET_TYPE =
ColumnMetadata.named("performerRefTargetType").ofType(Types.OTHER);
public static final ColumnMetadata PERFORMER_REF_RELATION_ID =
ColumnMetadata.named("performerRefRelationId").ofType(Types.INTEGER);
public static final ColumnMetadata STAGE_NUMBER =
ColumnMetadata.named("stageNumber").ofType(Types.INTEGER);

// attributes

public final NumberPath<Long> accCertCaseCid =
createLong("accCertCaseCid", ACC_CERT_CASE_CID);

public final DateTimePath<Instant> closeTimestamp =
createInstant("closeTimestamp", CLOSE_TIMESTAMP);
public final NumberPath<Integer> campaignIteration =
createInteger("campaignIteration", CAMPAIGN_ITERATION);
public final StringPath outcome = createString("outcome", OUTCOME);
public final DateTimePath<Instant> outputChangeTimestamp =
createInstant("outputChangeTimestamp", OUTPUT_CHANGE_TIMESTAMP);
public final UuidPath performerRefTargetOid =
createUuid("performerRefTargetOid", PERFORMER_REF_TARGET_OID);
public final EnumPath<MObjectType> performerRefTargetType =
createEnum("performerRefTargetType", MObjectType.class, PERFORMER_REF_TARGET_TYPE);
public final NumberPath<Integer> performerRefRelationId =
createInteger("performerRefRelationId", PERFORMER_REF_RELATION_ID);
public final NumberPath<Integer> stageNumber =
createInteger("stageNumber", STAGE_NUMBER);

public QAccessCertificationWorkItem(String variable) {
this(variable, DEFAULT_SCHEMA_NAME, TABLE_NAME);
}

public QAccessCertificationWorkItem(String variable, String schema, String table) {
super(MAccessCertificationWorkItem.class, variable, schema, table);
}

@Override
public BooleanExpression isOwnedBy(MAccessCertificationCampaign ownerRow) {
return ownerOid.eq(ownerRow.oid);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sqale.qmodel.accesscert;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationWorkItemType.*;

import java.util.Objects;

import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationWorkItemType;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemOutputType;

/**
* Mapping between {@link QAccessCertificationWorkItem} and {@link AccessCertificationWorkItemType}.
*/
public class QAccessCertificationWorkItemMapping
extends QContainerMapping<AccessCertificationWorkItemType, QAccessCertificationWorkItem, MAccessCertificationWorkItem, MAccessCertificationCampaign> {

public static final String DEFAULT_ALIAS_NAME = "acwi";

private static QAccessCertificationWorkItemMapping instance;

public static QAccessCertificationWorkItemMapping init(
@NotNull SqaleRepoContext repositoryContext) {
if (instance == null) {
instance = new QAccessCertificationWorkItemMapping(repositoryContext);
}
return get();
}

public static QAccessCertificationWorkItemMapping get() {
return Objects.requireNonNull(instance);
}

private QAccessCertificationWorkItemMapping(@NotNull SqaleRepoContext repositoryContext) {
super(QAccessCertificationWorkItem.TABLE_NAME, DEFAULT_ALIAS_NAME,
AccessCertificationWorkItemType.class, QAccessCertificationWorkItem.class, repositoryContext);

addItemMapping(F_CLOSE_TIMESTAMP, timestampMapper(q -> q.closeTimestamp));
// TODO: iteration -> campaignIteration
addItemMapping(F_ITERATION, integerMapper(q -> q.campaignIteration));
addNestedMapping(F_OUTPUT, AbstractWorkItemOutputType.class)
.addItemMapping(AbstractWorkItemOutputType.F_OUTCOME, stringMapper(q -> q.outcome));
addItemMapping(F_OUTPUT_CHANGE_TIMESTAMP, timestampMapper(q -> q.outputChangeTimestamp));
addItemMapping(F_PERFORMER_REF, refMapper(
q -> q.performerRefTargetOid,
q -> q.performerRefTargetType,
q -> q.performerRefRelationId));

// TODO
// addRefMapping(F_ASSIGNEE_REF,
// QCaseWorkItemReferenceMapping.initForCaseWorkItemAssignee(repositoryContext));
// addRefMapping(F_CANDIDATE_REF,
// QCaseWorkItemReferenceMapping.initForCaseWorkItemCandidate(repositoryContext));

addItemMapping(F_STAGE_NUMBER, integerMapper(q -> q.stageNumber));

}

@Override
protected QAccessCertificationWorkItem newAliasInstance(String alias) {
return new QAccessCertificationWorkItem(alias);
}

@Override
public MAccessCertificationWorkItem newRowObject() {
return new MAccessCertificationWorkItem();
}

@Override
public MAccessCertificationWorkItem newRowObject(MAccessCertificationCampaign ownerRow) {
MAccessCertificationWorkItem row = newRowObject();
row.ownerOid = ownerRow.oid;
return row;
}

// about duplication see the comment in QObjectMapping.toRowObjectWithoutFullObject
@SuppressWarnings("DuplicatedCode")
public MAccessCertificationWorkItem insert(AccessCertificationWorkItemType workItem, MAccessCertificationCampaign campaignRow, MAccessCertificationCase caseRow, JdbcSession jdbcSession) {
MAccessCertificationWorkItem row = initRowObject(workItem, campaignRow);
row.accCertCaseCid = caseRow.cid;

row.closeTimestamp = MiscUtil.asInstant(workItem.getCloseTimestamp());
// TODO: iteration -> campaignIteration
row.campaignIteration = workItem.getIteration();

AbstractWorkItemOutputType output = workItem.getOutput();
if (output != null) {
row.outcome = output.getOutcome();
}

row.outputChangeTimestamp = MiscUtil.asInstant(workItem.getOutputChangeTimestamp());

setReference(workItem.getPerformerRef(),
o -> row.performerRefTargetOid = o,
t -> row.performerRefTargetType = t,
r -> row.performerRefRelationId = r);

row.stageNumber = workItem.getStageNumber();

insert(row, jdbcSession);

// TODO
// storeRefs(row, workItem.getAssigneeRef(),
// QCaseWorkItemReferenceMapping.getForCaseWorkItemAssignee(), jdbcSession);
// storeRefs(row, workItem.getCandidateRef(),
// QCaseWorkItemReferenceMapping.getForCaseWorkItemCandidate(), jdbcSession);

return row;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1678,6 +1678,7 @@ public void test842AccessCertificationCampaign() throws Exception {
Instant endTimestamp = Instant.ofEpochMilli(System.currentTimeMillis());
String disableReason = "Whatever!";
String currentStageOutcome = "Big bada BOOM";

Integer caseIteration = 5;
UUID caseObjectRefOid = UUID.randomUUID();
QName caseObjectRefRelationUri = QName.valueOf("{https://other.uri}case-object-ref-relation");
Expand All @@ -1690,6 +1691,12 @@ public void test842AccessCertificationCampaign() throws Exception {
UUID caseTenantRefOid = UUID.randomUUID();
QName caseTenantRefRelationUri = QName.valueOf("{https://some.uri}case-tenant-ref-relation");

Instant wiCloseTimestamp = Instant.ofEpochMilli(999123);
Instant wiOutputChangeTimestamp = Instant.ofEpochMilli(999001);
UUID performer1Oid = UUID.randomUUID();
QName performer1Relation = QName.valueOf("{https://random.org/ns}wi-performer1-rel");


var accessCertificationCampaign = new AccessCertificationCampaignType(prismContext)
.name(objectName)
.definitionRef(definitionRefOid.toString(), UserType.COMPLEX_TYPE, definitionRefRelationUri)
Expand Down Expand Up @@ -1727,6 +1734,19 @@ public void test842AccessCertificationCampaign() throws Exception {
.stageNumber(caseStageNumber)
.targetRef(caseTargetRefOid.toString(), RoleType.COMPLEX_TYPE, caseTargetRefRelationUri)
.tenantRef(caseTenantRefOid.toString(), OrgType.COMPLEX_TYPE, caseTenantRefRelationUri)
.workItem(new AccessCertificationWorkItemType(prismContext)
.id(55L)
.closeTimestamp(MiscUtil.asXMLGregorianCalendar(wiCloseTimestamp))
// TODO: iteration -> campaignIteration
.iteration(81)
.output(new AbstractWorkItemOutputType()
.outcome("almost, but not quite, entirely done")
)
.outputChangeTimestamp(MiscUtil.asXMLGregorianCalendar(wiOutputChangeTimestamp))
.performerRef(performer1Oid.toString(),
UserType.COMPLEX_TYPE, performer1Relation)
.stageNumber(21)
)
);

when("adding it to the repository");
Expand Down Expand Up @@ -1758,6 +1778,7 @@ public void test842AccessCertificationCampaign() throws Exception {

MAccessCertificationCase caseRow = caseRows.get(0);
assertThat(caseRow.cid).isEqualTo(48); // assigned in advance
assertThat(caseRow.containerType).isEqualTo(MContainerType.ACCESS_CERTIFICATION_CASE);
assertThat(caseRow.administrativeStatus).isEqualTo(ActivationStatusType.ARCHIVED);
assertThat(caseRow.archiveTimestamp).isEqualTo(archiveTimestamp);
assertThat(caseRow.disableReason).isEqualTo(disableReason);
Expand Down Expand Up @@ -1789,6 +1810,24 @@ public void test842AccessCertificationCampaign() throws Exception {
assertThat(caseRow.tenantRefTargetType).isEqualTo(MObjectType.ORG);
assertCachedUri(caseRow.tenantRefRelationId, caseTenantRefRelationUri);

QAccessCertificationWorkItem wiAlias = aliasFor(QAccessCertificationWorkItem.class);
List<MAccessCertificationWorkItem> wiRows = select(wiAlias,
wiAlias.ownerOid.eq(UUID.fromString(accessCertificationCampaign.getOid())));
assertThat(wiRows).hasSize(1);
wiRows.sort(comparing(tr -> tr.cid));

MAccessCertificationWorkItem wiRow = wiRows.get(0);
assertThat(wiRow.cid).isEqualTo(55); // assigned in advance
assertThat(wiRow.accCertCaseCid).isEqualTo(48);
assertThat(wiRow.containerType).isEqualTo(MContainerType.ACCESS_CERTIFICATION_WORK_ITEM);
assertThat(wiRow.closeTimestamp).isEqualTo(wiCloseTimestamp);
assertThat(wiRow.campaignIteration).isEqualTo(81);
assertThat(wiRow.outcome).isEqualTo("almost, but not quite, entirely done");
assertThat(wiRow.outputChangeTimestamp).isEqualTo(wiOutputChangeTimestamp);
assertThat(wiRow.performerRefTargetOid).isEqualTo(performer1Oid);
assertThat(wiRow.performerRefTargetType).isEqualTo(MObjectType.USER);
assertCachedUri(wiRow.performerRefRelationId, performer1Relation);
assertThat(wiRow.stageNumber).isEqualTo(21);
}

private <C extends Containerable> void assertContainerFullObject(byte[] rowFullObject, C sObject) throws Exception {
Expand Down

0 comments on commit 812c8ed

Please sign in to comment.