Skip to content

Commit

Permalink
Merge branch 'master' of github.com:Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Jul 25, 2023
2 parents e7e59cc + e730eaf commit 51c4387
Show file tree
Hide file tree
Showing 8 changed files with 361 additions and 140 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* Copyright (C) 2010-2023 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.gui.impl.component.button;

import com.evolveum.midpoint.gui.api.component.result.OpResult;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.ResourceObjectsPanel;
import com.evolveum.midpoint.model.api.ActivitySubmissionOptions;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.AjaxIconButton;

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

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.jetbrains.annotations.Nullable;

import java.time.Duration;

public abstract class ReloadableButton extends AjaxIconButton {

private static final String DOT_CLASS = ResourceObjectsPanel.class.getName() + ".";
protected static final String OPERATION_RELOAD = DOT_CLASS + "reload";

private AjaxSelfUpdatingTimerBehavior reloadedBehaviour;
private String taskOidForReloaded;

private final PageBase pageBase;

public ReloadableButton(String id, PageBase pageBase) {
super(id, Model.of(""), pageBase.createStringResource("ReloadableButton.reload"));
this.pageBase = pageBase;
}

@Override
protected void onInitialize() {
super.onInitialize();

setModel(createIconModel());

add(AttributeAppender.append("class", "btn btn-primary btn-sm mr-2"));
setOutputMarkupId(true);
showTitleAsLabel(true);

add(AttributeAppender.append("class", new IModel<String>() {

private static final long serialVersionUID = 1L;

@Override
public String getObject() {
return taskOidForReloaded != null ? "disabled" : "";
}
}));

if (taskOidForReloaded != null) {
add(reloadedBehaviour);
}
}

private IModel<String> createIconModel() {
return () -> {
if (taskOidForReloaded == null) {
return "fa fa-rotate-right";
}
return "fa fa-spinner fa-spin-pulse";
};
}

@Override
public void onClick(AjaxRequestTarget target) {
taskOidForReloaded = pageBase.taskAwareExecutor(target, OPERATION_RELOAD)
.withOpResultOptions(
OpResult.Options.create()
.withHideSuccess(true)
.withHideInProgress(true))
.run((task, result) -> pageBase.getModelInteractionService().submit(
createActivityDefinition(),
ActivitySubmissionOptions.create()
.withTaskTemplate(new TaskType()
.name(getTaskName())
.cleanupAfterCompletion(XmlTypeConverter.createDuration("PT0S"))),
task, result)
);
reloadedBehaviour = new AjaxSelfUpdatingTimerBehavior(Duration.ofSeconds(5)) {

@Override
protected void onPostProcessTarget(AjaxRequestTarget target) {
super.onPostProcessTarget(target);
if (taskOidForReloaded == null) {
stop(target);
refresh(target);
return;
}

Task task = pageBase.createSimpleTask("Load task");
@Nullable PrismObject<TaskType> taskBean = WebModelServiceUtils.loadObject(
TaskType.class, taskOidForReloaded, null, true, pageBase, task, task.getResult());
if (taskBean == null || WebComponentUtil.isClosedTask(taskBean.asObjectable())) {
stop(target);
taskOidForReloaded = null;
}
refresh(target);
}
};
add(reloadedBehaviour);
refresh(target);
}

protected abstract void refresh(AjaxRequestTarget target);

protected abstract ActivityDefinitionType createActivityDefinition() throws SchemaException;

protected abstract String getTaskName();

@Override
protected void onComponentTag(ComponentTag tag) {
tag.setName("button");
super.onComponentTag(tag);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,38 @@

package com.evolveum.midpoint.gui.impl.page.admin.resource.component;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.component.result.OpResult;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;

import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.component.button.ReloadableButton;
import com.evolveum.midpoint.gui.impl.component.search.wrapper.AssociationSearchItemWrapper;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.util.task.ActivityDefinitionBuilder;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.input.DurationWithOneElementPanel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;

import com.evolveum.midpoint.xml.ns._public.model.scripting_3.*;

import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

import jakarta.xml.bind.JAXBElement;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
Expand Down Expand Up @@ -67,12 +88,15 @@
import com.evolveum.wicket.chartjs.ChartConfiguration;
import com.evolveum.wicket.chartjs.ChartJsPanel;

import org.jetbrains.annotations.Nullable;

public abstract class ResourceObjectsPanel extends AbstractObjectMainPanel<ResourceType, ResourceDetailsModel> {

private static final Trace LOGGER = TraceManager.getTrace(ResourceObjectsPanel.class);
private static final String DOT_CLASS = ResourceObjectsPanel.class.getName() + ".";
private static final String OPERATION_GET_TOTALS = DOT_CLASS + "getTotals";
protected static final String OPERATION_RECLASSIFY_SHADOWS = DOT_CLASS + "reclassifyShadows";
protected static final String OPERATION_RELOAD_SHADOWS = DOT_CLASS + "reloadShadows";

private static final String ID_OBJECT_TYPE = "objectType";
private static final String ID_TABLE = "table";
Expand All @@ -85,6 +109,9 @@ public abstract class ResourceObjectsPanel extends AbstractObjectMainPanel<Resou

private IModel<Boolean> showStatisticsModel = Model.of(false);

private AjaxSelfUpdatingTimerBehavior reloadedBehaviour;
private String taskOidForReloaded;

public ResourceObjectsPanel(String id, ResourceDetailsModel resourceDetailsModel, ContainerPanelConfigurationType config) {
super(id, resourceDetailsModel, config);
}
Expand Down Expand Up @@ -196,7 +223,7 @@ private Integer countFor(ObjectFilter situationFilter) {
ObjectQuery query = PrismContext.get().queryFactory().createQuery(
PrismContext.get().queryFactory().createAnd(filter, situationFilter));
return getPageBase().getModelService().countObjects(ShadowType.class, query, options, task, result);
} catch (CommonException |RuntimeException ex) {
} catch (CommonException | RuntimeException ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count shadows", ex);
}

Expand Down Expand Up @@ -248,6 +275,7 @@ public CompiledObjectCollectionView getObjectCollectionView() {
protected List<Component> createToolbarButtonsList(String buttonId) {
List<Component> buttonsList = new ArrayList<>();
buttonsList.add(createReclassifyButton(buttonId));
buttonsList.add(createReloadButton(buttonId));
buttonsList.addAll(super.createToolbarButtonsList(buttonId));
return buttonsList;

Expand Down Expand Up @@ -327,7 +355,7 @@ protected PageStorage getPageStorage() {

@Override
protected ObjectQuery getCustomizeContentQuery() {
return getResourceContentQuery();
return getResourceContentQuery();
}

};
Expand Down Expand Up @@ -371,6 +399,44 @@ private void showEditObjectTypeWizard(AjaxRequestTarget target, PrismContainerVa

}

private ReloadableButton createReloadButton(String buttonId) {

ReloadableButton reload = new ReloadableButton(
buttonId, getPageBase()) {

@Override
protected void refresh(AjaxRequestTarget target) {
target.add(getShadowTable());
}

@Override
protected ActivityDefinitionType createActivityDefinition() throws SchemaException {
SelectExpressionType selectAction = new SelectExpressionType()
.path(new ItemPathType(ItemPath.create(ShadowType.F_NAME)));
ExecuteScriptType script = new ExecuteScriptType()
.scriptingExpression(
new JAXBElement<>(
SchemaConstantsGenerated.SC_SELECT,
SelectExpressionType.class,
selectAction));
return ActivityDefinitionBuilder.create(new IterativeScriptingWorkDefinitionType()
.objects(new ObjectSetType()
.type(ShadowType.COMPLEX_TYPE)
.query(PrismContext.get().getQueryConverter()
.createQueryType(getResourceContentQuery())))
.scriptExecutionRequest(script))
.build();
}

@Override
protected String getTaskName() {
return "Reload objects on " + getObjectWrapperObject().asObjectable();
}
};
reload.add(new VisibleBehaviour(() -> getSelectedObjectType() != null));
return reload;
}

private AjaxIconButton createReclassifyButton(String buttonId) {
AjaxIconButton reclassify = new AjaxIconButton(buttonId, Model.of("fa fa-rotate-right"),
createStringResource("ResourceCategorizedPanel.button.reclassify")) {
Expand Down

0 comments on commit 51c4387

Please sign in to comment.