Skip to content

Commit

Permalink
Certification work item convergence, part 2: work item outcome as URI…
Browse files Browse the repository at this point in the history
… (+ fixed XMLs in tests).
  • Loading branch information
mederly committed Apr 5, 2017
1 parent 8f45a44 commit c2379ac
Show file tree
Hide file tree
Showing 20 changed files with 164 additions and 96 deletions.
Expand Up @@ -16,6 +16,7 @@

package com.evolveum.midpoint.web.page.admin.certification.dto;

import com.evolveum.midpoint.certification.api.OutcomeUtils;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType;
Expand Down Expand Up @@ -52,7 +53,7 @@ public void setComment(String value) {
}

public AccessCertificationResponseType getResponse() {
return workItem.getOutcome();
return OutcomeUtils.fromUri(workItem.getOutcome());
}

public long getWorkItemId() {
Expand Down
Expand Up @@ -309,6 +309,17 @@ public abstract class SchemaConstants {
public static final String MODEL_APPROVAL_OUTCOME_SKIPPED =
QNameUtil.qNameToUri(new QName(NS_MODEL_APPROVAL_OUTCOME, "skipped"));

public static final String NS_MODEL_CERTIFICATION = NS_MODEL + "/certification";
public static final String NS_MODEL_CERTIFICATION_OUTCOME = NS_MODEL_CERTIFICATION + "/outcome";
public static final String MODEL_CERTIFICATION_OUTCOME_ACCEPT =
QNameUtil.qNameToUri(new QName(NS_MODEL_CERTIFICATION_OUTCOME, "accept"));
public static final String MODEL_CERTIFICATION_OUTCOME_REVOKE =
QNameUtil.qNameToUri(new QName(NS_MODEL_CERTIFICATION_OUTCOME, "revoke"));
public static final String MODEL_CERTIFICATION_OUTCOME_REDUCE =
QNameUtil.qNameToUri(new QName(NS_MODEL_CERTIFICATION_OUTCOME, "reduce"));
public static final String MODEL_CERTIFICATION_OUTCOME_NOT_DECIDED =
QNameUtil.qNameToUri(new QName(NS_MODEL_CERTIFICATION_OUTCOME, "notDecided"));

public static final QName MODEL_EXTENSION_OBJECT_TYPE = new QName(NS_MODEL_EXTENSION, "objectType");
public static final QName MODEL_EXTENSION_OBJECT_QUERY = new QName(NS_MODEL_EXTENSION, "objectQuery");
public static final QName MODEL_EXTENSION_OBJECT_DELTA = new QName(NS_MODEL_EXTENSION, "objectDelta");
Expand Down
Expand Up @@ -167,8 +167,8 @@ public static int getUnansweredCases(List<AccessCertificationCaseType> caseList,
for (AccessCertificationWorkItemType workItem : aCase.getWorkItem()) {
if (workItem.getStageNumber() == campaignStageNumber
&& workItem.getClosedTimestamp() == null
&& (workItem.getOutcome() == null || workItem.getOutcome() == NO_RESPONSE)) {
unansweredCases++; // TODO what about delegations?
&& workItem.getOutcome() == null) {
unansweredCases++;
break;
}
}
Expand Down Expand Up @@ -232,7 +232,7 @@ public static float getDecisionsDonePercentage(List<AccessCertificationCaseType>
continue;
}
decisionsRequested++;
if (workItem.getOutcome() != null && workItem.getOutcome() != NO_RESPONSE) { // TODO what about delegations?
if (workItem.getOutcome() != null) {
decisionsDone++;
}
}
Expand All @@ -259,7 +259,7 @@ public static Date getReviewedTimestamp(List<AccessCertificationWorkItemType> wo
}

private static boolean hasNoResponse(AccessCertificationWorkItemType workItem) {
return (workItem.getOutcome() == null || workItem.getOutcome() == NO_RESPONSE) && StringUtils.isEmpty(workItem.getComment());
return workItem.getOutcome() == null && StringUtils.isEmpty(workItem.getComment());
}

public static List<ObjectReferenceType> getReviewedBy(List<AccessCertificationWorkItemType> workItems) {
Expand Down
Expand Up @@ -933,7 +933,7 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="outcome" type="tns:AccessCertificationResponseType" minOccurs="0" maxOccurs="1">
<xsd:element name="outcome" type="xsd:anyURI" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
The response.
Expand Down
Expand Up @@ -25,8 +25,8 @@
<currentStageNumber>1</currentStageNumber>
<workItem id="1">
<stageNumber>1</stageNumber>
<reviewerRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"/>
<response>revoke</response>
<assigneeRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"/>
<outcome>http://midpoint.evolveum.com/xml/ns/public/model/certification/outcome#revoke</outcome>
<timestamp>2015-12-04T01:10:13.814+01:00</timestamp>
</workItem>
<currentReviewRequestedTimestamp>2015-12-04T00:38:00.708+01:00</currentReviewRequestedTimestamp>
Expand Down
3 changes: 1 addition & 2 deletions infra/schema/src/test/resources/common/xml/ns/wf-context.xml
Expand Up @@ -33,8 +33,7 @@
<stageNumber>1</stageNumber>
<workItemId>116</workItemId>
<result>
<outcome>approve</outcome>
<outcomeAsString>__APPROVED__</outcomeAsString>
<outcome>http://midpoint.evolveum.com/xml/ns/public/model/approval/outcome#approve</outcome>
</result>
</event>
</workflowContext>
@@ -0,0 +1,62 @@
/*
* 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.certification.api;

import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemOutcomeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemResultType;
import org.apache.commons.lang.BooleanUtils;

/**
* TEMPORARY
* =========
*
* @author mederly
*/
public class OutcomeUtils {

public static String toUri(AccessCertificationResponseType response) {
if (response == null || response == AccessCertificationResponseType.NO_RESPONSE) {
return null;
}
switch (response) {
case ACCEPT: return SchemaConstants.MODEL_CERTIFICATION_OUTCOME_ACCEPT;
case REVOKE: return SchemaConstants.MODEL_CERTIFICATION_OUTCOME_REVOKE;
case REDUCE: return SchemaConstants.MODEL_CERTIFICATION_OUTCOME_REDUCE;
case NOT_DECIDED: return SchemaConstants.MODEL_CERTIFICATION_OUTCOME_NOT_DECIDED;
default: throw new AssertionError("Unexpected response: " + response);
}
}

public static AccessCertificationResponseType fromUri(String uri) {
if (uri == null) {
return null;
} else if (SchemaConstants.MODEL_CERTIFICATION_OUTCOME_ACCEPT.equals(uri)) {
return AccessCertificationResponseType.ACCEPT;
} else if (SchemaConstants.MODEL_CERTIFICATION_OUTCOME_REVOKE.equals(uri)) {
return AccessCertificationResponseType.REVOKE;
} else if (SchemaConstants.MODEL_CERTIFICATION_OUTCOME_REDUCE.equals(uri)) {
return AccessCertificationResponseType.REDUCE;
} else if (SchemaConstants.MODEL_CERTIFICATION_OUTCOME_NOT_DECIDED.equals(uri)) {
return AccessCertificationResponseType.NOT_DECIDED;
} else {
throw new IllegalArgumentException("Unrecognized URI: " + uri);
}
}

}
Expand Up @@ -16,6 +16,7 @@

package com.evolveum.midpoint.certification.impl;

import com.evolveum.midpoint.certification.api.OutcomeUtils;
import com.evolveum.midpoint.certification.impl.handlers.CertificationHandler;
import com.evolveum.midpoint.common.Clock;
import com.evolveum.midpoint.prism.PrismContainerValue;
Expand Down Expand Up @@ -96,7 +97,7 @@ void recordDecision(String campaignOid, long caseId, long workItemId,
XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar();
ItemPath workItemPath = new ItemPath(F_CASE, caseId, F_WORK_ITEM, workItemId);
Collection<ItemDelta<?,?>> deltaList = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext)
.item(workItemPath.subPath(AccessCertificationWorkItemType.F_OUTCOME)).replace(response)
.item(workItemPath.subPath(AccessCertificationWorkItemType.F_OUTCOME)).replace(OutcomeUtils.toUri(response))
.item(workItemPath.subPath(AccessCertificationWorkItemType.F_COMMENT)).replace(comment)
.item(workItemPath.subPath(AccessCertificationWorkItemType.F_TIMESTAMP)).replace(now)
.item(workItemPath.subPath(AccessCertificationWorkItemType.F_EXECUTOR_REF)).replace(responderRef)
Expand Down
Expand Up @@ -99,8 +99,7 @@ public List<AccessCertificationWorkItemType> searchWorkItems(ObjectQuery baseWor
ObjectFilter filterToAdd;
if (notDecidedOnly) {
ObjectFilter noResponseFilter = QueryBuilder.queryFor(AccessCertificationWorkItemType.class, prismContext)
.item(F_OUTCOME).eq(NO_RESPONSE)
.or().item(F_OUTCOME).isNull()
.item(F_OUTCOME).isNull()
.buildFilter();
filterToAdd = AndFilter.createAnd(reviewerAndEnabledFilter, noResponseFilter);
} else {
Expand Down
Expand Up @@ -16,6 +16,7 @@

package com.evolveum.midpoint.certification.impl;

import com.evolveum.midpoint.certification.api.OutcomeUtils;
import com.evolveum.midpoint.certification.impl.outcomeStrategies.OutcomeStrategy;
import com.evolveum.midpoint.certification.impl.outcomeStrategies.ResponsesSummary;
import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil;
Expand Down Expand Up @@ -129,7 +130,7 @@ private AccessCertificationResponseType computeResponseForStageInternal(
private List<AccessCertificationResponseType> getResponses(AccessCertificationCaseType _case, int stageNumber) {
return _case.getWorkItem().stream()
.filter(wi -> wi.getStageNumber() == stageNumber)
.map(wi -> wi.getOutcome())
.map(wi -> OutcomeUtils.fromUri(wi.getOutcome()))
.collect(Collectors.toList());
}

Expand Down
Expand Up @@ -17,6 +17,7 @@

import com.evolveum.icf.dummy.resource.DummyResource;
import com.evolveum.midpoint.certification.api.CertificationManager;
import com.evolveum.midpoint.certification.api.OutcomeUtils;
import com.evolveum.midpoint.certification.impl.AccCertGeneralHelper;
import com.evolveum.midpoint.certification.impl.AccCertQueryHelper;
import com.evolveum.midpoint.certification.impl.AccCertResponseComputationHelper;
Expand Down Expand Up @@ -439,7 +440,7 @@ protected void assertSingleDecision(AccessCertificationCaseType _case, AccessCer
List<AccessCertificationWorkItemType> currentWorkItems = getCurrentWorkItems(_case, stageNumber, false);
assertEquals("wrong # of decisions for stage " + stageNumber + " for case #" + _case.getId(), 1, currentWorkItems.size());
AccessCertificationWorkItemType workItem = currentWorkItems.get(0);
assertEquals("wrong response", response, workItem.getOutcome());
assertEquals("wrong response", response, OutcomeUtils.fromUri(workItem.getOutcome()));
assertEquals("wrong comment", comment, workItem.getComment());
assertEquals("Wrong # of reviewers", 1, workItem.getAssigneeRef().size());
assertRefEquals("wrong reviewerRef", ObjectTypeUtil.createObjectRef(reviewerOid, ObjectTypes.USER), workItem.getAssigneeRef().get(0));
Expand All @@ -457,7 +458,7 @@ protected void assertReviewerDecision(AccessCertificationCaseType _case, AccessC
int stageNumber, String reviewerOid, AccessCertificationResponseType currentStageOutcome, boolean checkHistory) {
AccessCertificationWorkItemType workItem = getWorkItemsForReviewer(_case, stageNumber, reviewerOid);
assertNotNull("No work item for reviewer " + reviewerOid + " in stage " + stageNumber, workItem);
assertEquals("wrong response", response, workItem.getOutcome());
assertEquals("wrong response", response, OutcomeUtils.fromUri(workItem.getOutcome()));
assertEquals("wrong comment", comment, workItem.getComment());
if (response != null) {
assertApproximateTime("timestamp", new Date(), workItem.getTimestamp());
Expand Down Expand Up @@ -493,7 +494,7 @@ protected void assertCaseHistoricOutcomes(AccessCertificationCaseType aCase, Acc
public List<AccessCertificationWorkItemType> getCurrentWorkItems(AccessCertificationCaseType _case, int stageNumber, boolean decidedOnly) {
List<AccessCertificationWorkItemType> rv = new ArrayList<>();
for (AccessCertificationWorkItemType workItem : _case.getWorkItem()) {
if (decidedOnly && (workItem.getOutcome() == null || workItem.getOutcome() == NO_RESPONSE)) {
if (decidedOnly && workItem.getOutcome() == null) {
continue;
}
if (workItem.getStageNumber() == stageNumber && workItem.getClosedTimestamp() == null) {
Expand Down Expand Up @@ -534,7 +535,7 @@ protected void assertDecision2(AccessCertificationCaseType _case, AccessCertific
int stageNumber, String reviewerOid, AccessCertificationResponseType aggregatedResponse) {
AccessCertificationWorkItemType decision = CertCampaignTypeUtil.findWorkItem(_case, stageNumber, reviewerOid);
assertNotNull("decision does not exist", decision);
assertEquals("wrong response", response, decision.getOutcome());
assertEquals("wrong response", response, OutcomeUtils.fromUri(decision.getOutcome()));
assertEquals("wrong comment", comment, decision.getComment());
if (response != null) {
assertApproximateTime("timestamp", new Date(), decision.getTimestamp());
Expand Down
Expand Up @@ -617,8 +617,8 @@ public void test330RecordDecisionsThirdStage() throws Exception {
assertNoDecision(guybrushCooCase, 3, REVOKE, false);
assertReviewerDecision(administratorCooCase, ACCEPT, null, 3, USER_ELAINE_OID, ACCEPT, false);
assertReviewerDecision(administratorCooCase, null, null, 3, USER_ADMINISTRATOR_OID, ACCEPT, false);
assertReviewerDecision(administratorCeoCase, NO_RESPONSE, null, 3, USER_ELAINE_OID, NO_RESPONSE, false);
assertReviewerDecision(administratorCeoCase, NO_RESPONSE, null, 3, USER_ADMINISTRATOR_OID, NO_RESPONSE, false);
assertReviewerDecision(administratorCeoCase, null, null, 3, USER_ELAINE_OID, NO_RESPONSE, false);
assertReviewerDecision(administratorCeoCase, null, null, 3, USER_ADMINISTRATOR_OID, NO_RESPONSE, false);
assertNoDecision(jackCeoCase, 3, NO_RESPONSE, false);
assertReviewerDecision(jackCtoCase, null, null, 3, USER_ELAINE_OID, NO_RESPONSE, false);
assertReviewerDecision(jackCtoCase, null, null, 3, USER_ADMINISTRATOR_OID, NO_RESPONSE, false);
Expand Down
12 changes: 6 additions & 6 deletions model/model-intest/src/test/resources/security/campaigns.xml
Expand Up @@ -54,8 +54,8 @@
<currentStageNumber>1</currentStageNumber>
<workItem id="1">
<stageNumber>1</stageNumber>
<reviewerRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"><!-- administrator --></reviewerRef>
<response>notDecided</response>
<assigneeRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"><!-- administrator --></assigneeRef>
<outcome>http://midpoint.evolveum.com/xml/ns/public/model/certification/outcome#notDecided</outcome>
<timestamp>2015-12-04T01:10:20.032+01:00</timestamp>
</workItem>
<currentReviewRequestedTimestamp>2015-12-04T00:38:00.708+01:00</currentReviewRequestedTimestamp>
Expand Down Expand Up @@ -104,8 +104,8 @@
<currentReviewDeadline>2015-12-18T23:59:59.999+01:00</currentReviewDeadline>
<workItem id="1">
<stageNumber>1</stageNumber>
<reviewerRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"><!-- administrator --></reviewerRef>
<response>accept</response>
<assigneeRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"><!-- administrator --></assigneeRef>
<outcome>http://midpoint.evolveum.com/xml/ns/public/model/certification/outcome#accept</outcome>
<timestamp>2015-12-04T01:04:06.385+01:00</timestamp>
</workItem>
<currentStageOutcome>accept</currentStageOutcome>
Expand All @@ -124,8 +124,8 @@
<currentReviewDeadline>2015-12-18T23:59:59.999+01:00</currentReviewDeadline>
<workItem id="1">
<stageNumber>1</stageNumber>
<reviewerRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"><!-- administrator --></reviewerRef>
<response>noResponse</response>
<assigneeRef oid="00000000-0000-0000-0000-000000000002" type="c:UserType"><!-- administrator --></assigneeRef>
<outcome>http://midpoint.evolveum.com/xml/ns/public/model/certification/outcome#noResponse</outcome>
<timestamp>2015-12-04T01:10:08.670+01:00</timestamp>
</workItem>
<currentStageOutcome>noResponse</currentStageOutcome>
Expand Down
Expand Up @@ -62,7 +62,7 @@ public Collection<AccessCertificationCaseType> getCasesAwaitingResponseFromReque
private boolean awaitsResponseFromRequestee(AccessCertificationCaseType aCase, String reviewerOid, int currentStageNumber) {
for (AccessCertificationWorkItemType workItem : aCase.getWorkItem()) {
if (workItem.getStageNumber() == currentStageNumber
&& (workItem.getOutcome() == null || workItem.getOutcome() == NO_RESPONSE)
&& workItem.getOutcome() == null
&& workItem.getClosedTimestamp() == null
&& ObjectTypeUtil.containsOid(workItem.getAssigneeRef(), reviewerOid)) {
return true;
Expand Down

0 comments on commit c2379ac

Please sign in to comment.