use of com.evolveum.midpoint.util.Holder in project midpoint by Evolveum.
the class CompleteBucketOperation method computeCompletionModifications.
@NotNull
private Collection<ItemDelta<?, ?>> computeCompletionModifications(@NotNull TaskType task) {
ActivityStateType activityState = ActivityStateUtil.getActivityStateRequired(task.getActivityState(), activityPath);
ActivityBucketingStateType bucketing = activityState.getBucketing();
List<WorkBucketType> buckets = CloneUtil.cloneCollectionMembers(bucketing.getBucket());
WorkBucketType bucket = BucketingUtil.findBucketByNumberRequired(buckets, sequentialNumber);
checkBucketReadyOrDelegated(bucket);
bucketProgressHolder.accept(new BucketProgressOverviewType().totalBuckets(bucketing.getNumberOfBuckets()).completeBuckets(BucketingUtil.getCompleteBucketsNumber(buckets) + 1));
ItemPath statePath = ActivityStateUtil.getStateItemPath(task.getActivityState(), activityPath);
List<ItemDelta<?, ?>> closingMods = bucketStateChangeDeltas(statePath, bucket, WorkBucketStateType.COMPLETE);
WorkBucketType bucketBeforeCompletion = bucket.clone();
// needed for compressing buckets
bucket.setState(WorkBucketStateType.COMPLETE);
Holder<Boolean> recentlyClosedBucketDeleted = new Holder<>();
List<ItemDelta<?, ?>> compressingMods = compressCompletedBuckets(statePath, buckets, bucketBeforeCompletion, recentlyClosedBucketDeleted);
if (Boolean.TRUE.equals(recentlyClosedBucketDeleted.getValue())) {
return compressingMods;
} else {
return ListUtils.union(closingMods, compressingMods);
}
}
use of com.evolveum.midpoint.util.Holder in project midpoint by Evolveum.
the class NodeFoundDeadHelper method markTaskAsNotRunning.
private void markTaskAsNotRunning(PrismObject<TaskType> task, Set<String> nodes, OperationResult result) throws CommonException {
Holder<Boolean> changed = new Holder<>();
repositoryService.modifyObjectDynamically(TaskType.class, task.getOid(), null, currentTask -> {
changed.setValue(false);
if (currentTask.getNode() != null && nodes.contains(currentTask.getNode())) {
S_ItemEntry builder = PrismContext.get().deltaFor(TaskType.class).item(TaskType.F_NODE).replace();
// The following should be always true. But let's check that just to be sure.
if (currentTask.getExecutionState() == TaskExecutionStateType.RUNNING) {
builder = builder.item(TaskType.F_EXECUTION_STATE).replace(TaskExecutionStateType.RUNNABLE);
changed.setValue(true);
}
return builder.asItemDeltas();
} else {
return List.of();
}
}, null, result);
// We invoke specific cleanup actions only if the task state was really changed from RUNNING to RUNNABLE by us.
if (changed.getValue()) {
Objects.requireNonNull(taskHandlerRegistry.getHandler(task.asObjectable().getHandlerUri()), "No handler").onNodeDown(task.asObjectable(), result);
}
}
use of com.evolveum.midpoint.util.Holder in project midpoint by Evolveum.
the class TaskRetriever method getTaskFromRemoteNode.
private PrismObject<TaskType> getTaskFromRemoteNode(String oid, Collection<SelectorOptions<GetOperationOptions>> options, ClusterStatusInformation csi, OperationResult parentResult) throws SchemaException {
if (csi == null) {
// in case no fetch was used...
return null;
}
NodeType runsAt = csi.findNodeInfoForTask(oid);
if (runsAt == null || clusterManager.isCurrentNode(runsAt.asPrismObject())) {
return null;
}
Holder<PrismObject<TaskType>> taskPrism = new Holder<>();
clusterExecutionHelper.execute(runsAt, (client, node, opResult) -> {
Response response = client.path(TaskConstants.GET_TASK_REST_PATH + oid).query("include", GetOperationOptions.toRestIncludeOption(options)).get();
Response.StatusType statusType = response.getStatusInfo();
if (statusType.getFamily() == Response.Status.Family.SUCCESSFUL) {
TaskType taskType = response.readEntity(TaskType.class);
taskPrism.setValue(taskType.asPrismObject());
} else {
LOGGER.warn("Cannot get task from {}", node);
}
}, new ClusterExecutionOptions().tryAllNodes(), "load task (cluster)", parentResult);
return taskPrism.getValue();
}
use of com.evolveum.midpoint.util.Holder in project midpoint by Evolveum.
the class PageDebugView method savePerformed.
public void savePerformed(AjaxRequestTarget target) {
if (StringUtils.isEmpty(objectViewDtoModel.getObject().getXml())) {
error(getString("pageDebugView.message.cantSaveEmpty"));
target.add(getFeedbackPanel());
return;
}
Task task = createSimpleTask(OPERATION_SAVE_OBJECT);
OperationResult result = task.getResult();
try {
PrismObject<? extends ObjectType> oldObject = objectViewDtoModel.getObject().getObject();
oldObject.revive(getPrismContext());
Holder<? extends ObjectType> objectHolder = new Holder<>(null);
validateObject(result, (Holder) objectHolder);
if (result.isAcceptable()) {
PrismObject<? extends ObjectType> newObject = objectHolder.getValue().asPrismObject();
ObjectDelta<? extends ObjectType> delta = oldObject.diff((PrismObject) newObject, EquivalenceStrategy.LITERAL);
if (delta.getPrismContext() == null) {
LOGGER.warn("No prism context in delta {} after diff, adding it", delta);
delta.revive(getPrismContext());
}
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Delta to be applied:\n{}", delta.debugDump());
}
// quick fix for now (MID-1910), maybe it should be somewhere in objectViewModel..
// if (isReport(oldObject)){
// ReportTypeUtil.applyConfigurationDefinition((PrismObject)newObject, delta, getPrismContext());
// }
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscUtil.createCollection(delta);
ModelExecuteOptions options = ModelExecuteOptions.create(getPrismContext());
if (isTrue(DebugViewOptions.ID_SAVE_AS_RAW)) {
options.raw(true);
}
if (isTrue(DebugViewOptions.ID_REEVALUATE_SEARCH_FILTERS)) {
options.reevaluateSearchFilters(true);
}
if (!isTrue(DebugViewOptions.ID_ENCRYPT)) {
options.noCrypt(true);
}
getModelService().executeChanges(deltas, options, task, result);
result.computeStatus();
}
} catch (Exception ex) {
result.recordFatalError(getString("WebModelUtils.couldntSaveObject"), ex);
}
if (result.isError()) {
showResult(result);
target.add(getFeedbackPanel());
} else {
showResult(result);
// to handle returning back to list objects page instead of edit object page
if (getBreadcrumbs().size() >= 3) {
redirectBack(3);
} else {
redirectBack();
}
}
}
use of com.evolveum.midpoint.util.Holder in project midpoint by Evolveum.
the class PageResourceEdit method savePerformed.
private void savePerformed(AjaxRequestTarget target) {
ObjectViewDto dto = model.getObject();
if (StringUtils.isEmpty(dto.getXml())) {
error(getString("pageResourceEdit.message.emptyXml"));
target.add(getFeedbackPanel());
return;
}
Task task = createSimpleTask(OPERATION_SAVE_RESOURCE);
OperationResult result = task.getResult();
try {
Holder<PrismObject<ResourceType>> objectHolder = new Holder<PrismObject<ResourceType>>(null);
validateObject(dto.getXml(), objectHolder, PrismContext.LANG_XML, false, result);
if (result.isAcceptable()) {
PrismObject<ResourceType> newResource = objectHolder.getValue();
updateConnectorRef(newResource, task, result);
if (!isEditing()) {
//we're adding new resource
ObjectDelta delta = ObjectDelta.createAddDelta(newResource);
getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), null, task, result);
} else {
//we're editing existing resource
PrismObject<ResourceType> oldResource = dto.getObject();
ObjectDelta<ResourceType> delta = oldResource.diff(newResource);
getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, result);
}
result.computeStatus();
}
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't save resource", ex);
result.recordFatalError("Couldn't save resource.", ex);
}
if (WebComponentUtil.isSuccessOrHandledError(result)) {
showResult(result);
setResponsePage(new PageResources(false));
} else {
showResult(result);
target.add(getFeedbackPanel());
}
}
Aggregations