Skip to content

Commit

Permalink
MID-7605 MID-7606 task created from resource details now has prepopul…
Browse files Browse the repository at this point in the history
…ated name, ownerRef, objectRef, resoruce object set (resourceRef, kind, intent, object class) if possible
  • Loading branch information
1azyman committed Mar 8, 2022
1 parent 640d49f commit f65dcde
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,31 @@
*/
package com.evolveum.midpoint.gui.impl.page.admin.resource.component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.StringResourceModel;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.MainObjectListPanel;
import com.evolveum.midpoint.gui.api.component.ObjectListPanel;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.page.admin.AbstractObjectMainPanel;
import com.evolveum.midpoint.gui.impl.page.admin.ObjectDetailsModels;
import com.evolveum.midpoint.gui.impl.page.admin.resource.ResourceDetailsModel;
import com.evolveum.midpoint.gui.impl.util.ObjectCollectionViewUtil;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand All @@ -35,19 +46,11 @@
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.TaskOperationUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.StringResourceModel;

import java.util.ArrayList;
import java.util.List;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;

@PanelType(name = "resourceTasks")
@PanelInstance(identifier = "resourceTasks", applicableForType = ResourceType.class, applicableForOperation = OperationTypeType.MODIFY,
display = @PanelDisplay(label = "PageResource.tab.content.tasks", icon = GuiStyleConstants.CLASS_OBJECT_TASK_ICON,order = 40))
display = @PanelDisplay(label = "PageResource.tab.content.tasks", icon = GuiStyleConstants.CLASS_OBJECT_TASK_ICON, order = 40))
public class ResourceTasksPanel extends AbstractObjectMainPanel<ResourceType, ResourceDetailsModel> implements Popupable {
private static final long serialVersionUID = 1L;

Expand All @@ -61,13 +64,12 @@ public class ResourceTasksPanel extends AbstractObjectMainPanel<ResourceType, Re
private static final String ID_RESUME = "resume";
private static final String ID_SUSPEND = "suspend";

// private IModel<PrismObject<ResourceType>> resourceModel;
// private IModel<PrismObject<ResourceType>> resourceModel;
String[] resourceTaskArchetypeOids = new String[] { SystemObjectsType.ARCHETYPE_RECONCILIATION_TASK.value(),
SystemObjectsType.ARCHETYPE_LIVE_SYNC_TASK.value(),
SystemObjectsType.ARCHETYPE_IMPORT_TASK.value(),
SystemObjectsType.ARCHETYPE_ASYNC_UPDATE_TASK.value() };


public ResourceTasksPanel(String id, final ResourceDetailsModel resourceModel, ContainerPanelConfigurationType config) {
super(id, resourceModel, config);
}
Expand Down Expand Up @@ -110,6 +112,8 @@ protected void newObjectPerformed(AjaxRequestTarget target, AssignmentObjectRela
resourceRef.setType(ResourceType.COMPLEX_TYPE);
newTask.setObjectRef(resourceRef);

prepopulateTask(newTask, collectionView, archetypeRef);

WebComponentUtil.initNewObjectWithReference(getPageBase(), newTask, archetypeRef);
} catch (SchemaException ex) {
getPageBase().getFeedbackMessages().error(ResourceTasksPanel.this, ex.getUserFriendlyMessage());
Expand Down Expand Up @@ -192,6 +196,130 @@ public void onClick(AjaxRequestTarget target) {
add(suspend);
}

private void prepopulateTask(TaskType task, CompiledObjectCollectionView view, List<ObjectReferenceType> archetypeRefs) {
String name = createNewTaskName(getObjectWrapper(), view);
task.setName(new PolyStringType(name));

SchemaHandlingType schemaHandling = getObjectWrapper().getObject().asObjectable().getSchemaHandling();
List<ResourceObjectTypeDefinitionType> objectTypes = Collections.emptyList();
if (schemaHandling != null) {
objectTypes = schemaHandling.getObjectType();
}

if (task.getObjectRef() != null && ResourceType.COMPLEX_TYPE.equals(task.getObjectRef().getType())) {
if (hasArchetype(archetypeRefs, SystemObjectsType.ARCHETYPE_RECONCILIATION_TASK.value())) {
WorkDefinitionsType work = findWork(task);

ReconciliationWorkDefinitionType recon = work.getReconciliation();
if (recon == null) {
recon = new ReconciliationWorkDefinitionType();
work.setReconciliation(recon);
}

ResourceObjectSetType set = updateResourceObjectsSet(recon.getResourceObjects(), task.getObjectRef(), objectTypes);
recon.setResourceObjects(set);
} else if (hasArchetype(archetypeRefs, SystemObjectsType.ARCHETYPE_IMPORT_TASK.value())) {
WorkDefinitionsType work = findWork(task);

ImportWorkDefinitionType imp = work.getImport();
if (imp == null) {
imp = new ImportWorkDefinitionType();
work.setImport(imp);
}

ResourceObjectSetType set = updateResourceObjectsSet(imp.getResourceObjects(), task.getObjectRef(), objectTypes);
imp.setResourceObjects(set);
} else if (hasArchetype(archetypeRefs, SystemObjectsType.ARCHETYPE_LIVE_SYNC_TASK.value())) {
WorkDefinitionsType work = findWork(task);

LiveSyncWorkDefinitionType live = work.getLiveSynchronization();
if (live == null) {
live = new LiveSyncWorkDefinitionType();
work.setLiveSynchronization(live);
}

ResourceObjectSetType set = updateResourceObjectsSet(live.getResourceObjects(), task.getObjectRef(), objectTypes);
live.setResourceObjects(set);
} else if (hasArchetype(archetypeRefs, SystemObjectsType.ARCHETYPE_ASYNC_UPDATE_TASK.value())) {
WorkDefinitionsType work = findWork(task);

AsyncUpdateWorkDefinitionType async = work.getAsynchronousUpdate();
if (async == null) {
async = new AsyncUpdateWorkDefinitionType();
work.setAsynchronousUpdate(async);
}

ResourceObjectSetType set = updateResourceObjectsSet(async.getUpdatedResourceObjects(), task.getObjectRef(), objectTypes);
async.setUpdatedResourceObjects(set);
}
}
}

private WorkDefinitionsType findWork(TaskType task) {
ActivityDefinitionType activity = task.getActivity();
if (activity == null) {
activity = new ActivityDefinitionType();
task.setActivity(activity);
}
WorkDefinitionsType work = activity.getWork();
if (work == null) {
work = new WorkDefinitionsType();
activity.setWork(work);
}
return work;
}

private ResourceObjectSetType updateResourceObjectsSet(ResourceObjectSetType set, ObjectReferenceType objectRef, List<ResourceObjectTypeDefinitionType> objectTypes) {
if (set == null) {
set = new ResourceObjectSetType();
}

if (set.getResourceRef() == null) {
set.setResourceRef(objectRef);
}

if (objectTypes.size() == 1) {
ResourceObjectTypeDefinitionType def = objectTypes.get(0);
set.setKind(def.getKind());
set.setIntent(def.getIntent());
set.setObjectclass(def.getObjectClass());
}

return set;
}

private boolean hasArchetype(List<ObjectReferenceType> archetypeRefs, String oid) {
if (oid == null) {
return false;
}

for (ObjectReferenceType ref : archetypeRefs) {
if (Objects.equals(oid, ref.getOid())) {
return true;
}
}

return false;
}

private String createNewTaskName(PrismObjectWrapper<ResourceType> wrapper, CompiledObjectCollectionView view) {
StringBuilder sb = new StringBuilder();
DisplayType display = view.getDisplay();
if (display != null && display.getLabel() != null) {
sb.append(display.getLabel().getOrig());
sb.append(": ");
} else {
sb.append("Task: ");
}

PolyString name = ResourceTasksPanel.this.getObjectWrapper().getObject().getName();
if (name != null) {
sb.append(name.getOrig());
}

return sb.toString();
}

private ObjectQuery createResourceTasksQuery() {
return getPageBase().getPrismContext().queryFor(TaskType.class)
.item(TaskType.F_OBJECT_REF).ref(getObjectWrapper().getOid())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,33 @@

package com.evolveum.midpoint.gui.impl.page.admin.task;

import java.util.Collection;

import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import com.evolveum.midpoint.authentication.api.authorization.AuthorizationAction;
import com.evolveum.midpoint.authentication.api.authorization.PageDescriptor;
import com.evolveum.midpoint.authentication.api.authorization.Url;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.PageAssignmentHolderDetails;
import com.evolveum.midpoint.gui.impl.page.admin.component.TaskOperationalButtonsPanel;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.authentication.api.authorization.AuthorizationAction;
import com.evolveum.midpoint.authentication.api.authorization.PageDescriptor;
import com.evolveum.midpoint.authentication.api.authorization.Url;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.web.page.admin.server.TaskSummaryPanel;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import java.util.Collection;

@PageDescriptor(
urls = {
@Url(mountUrl = "/admin/taskNew")
Expand Down Expand Up @@ -67,9 +68,26 @@ public Class<TaskType> getType() {

@Override
protected TaskDetailsModel createObjectDetailsModels(PrismObject<TaskType> object) {
if (object != null && object.getOid() == null) {
// we're adding task, let's see what we can prepare for use beforehand (not very nice in here, but so far there's no other place)
prepopulateTask(object);
}
return new TaskDetailsModel(createPrismObjectModel(object), PageTask.this);
}

@Deprecated
private void prepopulateTask(PrismObject<TaskType> object) {
TaskType task = object.asObjectable();
if (task.getOwnerRef() == null) {
try {
FocusType focus = getSecurityContextManager().getPrincipal().getFocus();
task.ownerRef(getSecurityContextManager().getPrincipalOid(), focus.asPrismObject().getDefinition().getTypeName());
} catch (SecurityViolationException e) {
// we can ignore it here probably
}
}
}

@Override
protected Panel createSummaryPanel(String id, IModel<TaskType> summaryModel) {
return new TaskSummaryPanel(id, summaryModel, getObjectDetailsModels().getRootTaskModel(), getSummaryPanelSpecification());
Expand Down Expand Up @@ -122,7 +140,7 @@ public void refresh(AjaxRequestTarget target, boolean soft) {
if (isEditObject()) {
((TaskSummaryPanel) getSummaryPanel()).getTaskInfoModel().reset();
}
super.refresh(target, soft) ;
super.refresh(target, soft);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>


<div wicket:id="taskTable"></div>

<a class="btn btn-danger" wicket:id="suspend" />
<a class="btn btn-success" wicket:id="resume" />
<a class="btn btn-success" wicket:id="runNow" />

<a class="btn btn-success" wicket:id="resume" />
<a class="btn btn-success" wicket:id="runNow" />

</wicket:panel>
</html>

0 comments on commit f65dcde

Please sign in to comment.