From 2d895cdd231b65cc7b0e5effd9c196865ae96d1c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 15 Apr 2015 11:15:44 +0200 Subject: [PATCH 1/3] Fixed testing of first character on empty passwords --- .../evolveum/midpoint/common/policy/PasswordPolicyUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/policy/PasswordPolicyUtils.java b/infra/common/src/main/java/com/evolveum/midpoint/common/policy/PasswordPolicyUtils.java index 58bb1400d67..e8be361a42d 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/policy/PasswordPolicyUtils.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/policy/PasswordPolicyUtils.java @@ -19,6 +19,7 @@ import java.util.HashSet; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import com.evolveum.midpoint.prism.PrismObject; @@ -306,7 +307,8 @@ public static OperationResult validatePassword(String password, ValuePolicyType if (l.isMustBeFirst() == null){ l.setMustBeFirst(false); } - if (l.isMustBeFirst() && !validChars.contains(password.substring(0, 1))) { + // we check mustBeFirst only for non-empty passwords + if (StringUtils.isNotEmpty(password) && l.isMustBeFirst() && !validChars.contains(password.substring(0, 1))) { String msg = "First character is not from allowed set. Allowed set: " + validChars.toString(); limitResult.addSubresult(new OperationResult("Check valid first char", From 6a440e6d28bc99bc3e2b9f92e17a86234d534223 Mon Sep 17 00:00:00 2001 From: erik Date: Wed, 15 Apr 2015 13:29:46 +0200 Subject: [PATCH 2/3] MID-2295 implementation --- .../assignment/AssignmentTablePanel.java | 3 - .../web/component/org/OrgTreeTablePanel.java | 2 - .../web/page/admin/server/PageTaskAdd.html | 4 + .../web/page/admin/server/PageTaskAdd.java | 131 ++++++++++++- .../page/admin/server/PageTaskAdd.properties | 2 +- .../web/page/admin/server/PageTaskEdit.html | 4 + .../web/page/admin/server/PageTaskEdit.java | 159 ++++++++++++++-- .../page/admin/server/PageTaskEdit.properties | 1 + .../web/page/admin/server/dto/TaskAddDto.java | 82 ++++++++ .../web/page/admin/server/dto/TaskDto.java | 177 +++++++++++++++++- .../admin/server/dto/TaskDtoProvider.java | 6 +- .../schema/constants/SchemaConstants.java | 1 + 12 files changed, 528 insertions(+), 44 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java index 5bcbcede637..a70e020823f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java @@ -39,11 +39,9 @@ import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.SimplePanel; import com.evolveum.midpoint.web.page.admin.users.component.AssignableOrgPopupContent; -import com.evolveum.midpoint.web.page.admin.users.component.AssignablePopupContent; import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; @@ -56,7 +54,6 @@ import org.apache.wicket.model.Model; import javax.xml.namespace.QName; - import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePanel.java index 0470e9676be..62d03df15ed 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePanel.java @@ -115,8 +115,6 @@ public OrgTreeTablePanel(String id, IModel rootOid) { @Override protected void initLayout() { - - WebMarkupContainer treeHeader = new WebMarkupContainer(ID_TREE_HEADER); treeHeader.setOutputMarkupId(true); add(treeHeader); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.html index a9e250c348d..1b6f5d84a9b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.html @@ -43,6 +43,10 @@

+ + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java index edab596052c..e728944b476 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.web.page.admin.server; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -24,6 +26,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.MidPointPrincipal; @@ -45,6 +48,7 @@ import com.evolveum.midpoint.web.security.SecurityUtils; import com.evolveum.midpoint.web.util.InfoTooltipBehavior; import com.evolveum.midpoint.web.util.WebMiscUtil; +import com.evolveum.midpoint.web.util.WebModelUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; @@ -52,6 +56,8 @@ import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.datetime.markup.html.form.DateTextField; +import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings; +import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField; import org.apache.wicket.extensions.yui.calendar.DateTimeField; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; @@ -60,10 +66,10 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.util.string.Strings; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import javax.xml.namespace.QName; +import java.util.*; /** * @author lazyman @@ -83,6 +89,7 @@ public class PageTaskAdd extends PageAdminTasks { private static final String ID_DRY_RUN = "dryRun"; private static final String ID_KIND = "kind"; private static final String ID_INTENT = "intent"; + private static final String ID_OBJECT_CLASS = "objectClass"; private static final String ID_FORM_MAIN = "mainForm"; private static final String ID_NAME = "name"; private static final String ID_CATEGORY = "category"; @@ -109,6 +116,7 @@ public class PageTaskAdd extends PageAdminTasks { private static final Trace LOGGER = TraceManager.getTrace(PageTaskAdd.class); private static final String DOT_CLASS = PageTaskAdd.class.getName() + "."; private static final String OPERATION_LOAD_RESOURCES = DOT_CLASS + "createResourceList"; + private static final String OPERATION_LOAD_RESOURCE = DOT_CLASS + "loadResource"; private static final String OPERATION_SAVE_TASK = DOT_CLASS + "saveTask"; private IModel model; @@ -131,7 +139,7 @@ private void initLayout() { Form mainForm = new Form(ID_FORM_MAIN); add(mainForm); - final DropDownChoice resource = new DropDownChoice(ID_RESOURCE, + final DropDownChoice resource = new DropDownChoice<>(ID_RESOURCE, new PropertyModel(model, TaskAddDto.F_RESOURCE), new AbstractReadOnlyModel>() { @@ -162,10 +170,41 @@ public boolean isEnabled() { return sync || recon || importAccounts; } }); + resource.add(new AjaxFormComponentUpdatingBehavior("onchange") { + + @Override + protected void onUpdate(AjaxRequestTarget target) { + OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCE); + List objectClassList = new ArrayList<>(); + + TaskAddResourcesDto resourcesDto = model.getObject().getResource(); + + if(resourcesDto != null){ + PrismObject resource = WebModelUtils.loadObject(ResourceType.class, resourcesDto.getOid(), result, PageTaskAdd.this); + + try { + ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, getPrismContext()); + schema.getObjectClassDefinitions(); + + for(Definition def: schema.getDefinitions()){ + objectClassList.add(def.getTypeName()); + } + + model.getObject().setObjectClassList(objectClassList); + } catch (Exception e){ + LoggingUtils.logException(LOGGER, "Couldn't load object class list from resource.", e); + error("Couldn't load object class list from resource."); + } + + } + + target.add(get(ID_FORM_MAIN + ":" + ID_OBJECT_CLASS)); + } + }); resource.setOutputMarkupId(true); mainForm.add(resource); - final DropDownChoice kind = new DropDownChoice(ID_KIND, + final DropDownChoice kind = new DropDownChoice<>(ID_KIND, new PropertyModel(model, TaskAddDto.F_KIND), new AbstractReadOnlyModel>() { @@ -191,7 +230,10 @@ public String getIdValue(ShadowKindType object, int index) { @Override public boolean isEnabled() { TaskAddDto dto = model.getObject(); - return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); + boolean recon = TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean importAccounts = TaskCategory.IMPORTING_ACCOUNTS.equals(dto.getCategory()); + return sync || recon || importAccounts; } }); mainForm.add(kind); @@ -204,11 +246,37 @@ public boolean isEnabled() { @Override public boolean isEnabled() { TaskAddDto dto = model.getObject(); - return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); + boolean recon = TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean importAccounts = TaskCategory.IMPORTING_ACCOUNTS.equals(dto.getCategory()); + return sync || recon || importAccounts; + } + }); + + AutoCompleteSettings autoCompleteSettings = new AutoCompleteSettings(); + autoCompleteSettings.setShowListOnEmptyInput(true); + final AutoCompleteTextField objectClass = new AutoCompleteTextField(ID_OBJECT_CLASS, + new PropertyModel(model, TaskAddDto.F_OBJECT_CLASS), autoCompleteSettings) { + + @Override + protected Iterator getChoices(String input) { + return prepareObjectClassChoiceList(input); + } + }; + objectClass.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isEnabled() { + TaskAddDto dto = model.getObject(); + boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); + boolean recon = TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean importAccounts = TaskCategory.IMPORTING_ACCOUNTS.equals(dto.getCategory()); + return sync || recon || importAccounts; } }); + mainForm.add(objectClass); - DropDownChoice type = new DropDownChoice(ID_CATEGORY, new PropertyModel(model, TaskAddDto.F_CATEGORY), + DropDownChoice type = new DropDownChoice<>(ID_CATEGORY, new PropertyModel(model, TaskAddDto.F_CATEGORY), new AbstractReadOnlyModel>() { @Override @@ -234,6 +302,7 @@ protected void onUpdate(AjaxRequestTarget target) { target.add(resource); target.add(intent); target.add(kind); + target.add(objectClass); } }); type.setRequired(true); @@ -252,6 +321,30 @@ protected void onUpdate(AjaxRequestTarget target) { initButtons(mainForm); } + private Iterator prepareObjectClassChoiceList(String input){ + List choices = new ArrayList<>(); + + if(model.getObject().getResource() == null){ + return choices.iterator(); + } + + if(Strings.isEmpty(input)){ + for(QName q: model.getObject().getObjectClassList()){ + choices.add(q.getLocalPart()); + Collections.sort(choices); + } + } else { + for(QName q: model.getObject().getObjectClassList()){ + if(q.getLocalPart().startsWith(input)){ + choices.add(q.getLocalPart()); + } + Collections.sort(choices); + } + } + + return choices.iterator(); + } + private void initScheduling(final Form mainForm) { final WebMarkupContainer container = new WebMarkupContainer(ID_CONTAINER); container.setOutputMarkupId(true); @@ -369,7 +462,7 @@ private void initAdvanced(Form mainForm) { CheckBox createSuspended = new CheckBox(ID_CREATE_SUSPENDED, createSuspendedCheck); mainForm.add(createSuspended); - DropDownChoice threadStop = new DropDownChoice(ID_THREAD_STOP, new Model() { + DropDownChoice threadStop = new DropDownChoice<>(ID_THREAD_STOP, new Model() { @Override public ThreadStopActionType getObject() { @@ -394,7 +487,7 @@ public void setObject(ThreadStopActionType object) { mainForm.add(new TsaValidator(runUntilNodeDown, threadStop)); - DropDownChoice misfire = new DropDownChoice(ID_MISFIRE_ACTION, new PropertyModel( + DropDownChoice misfire = new DropDownChoice<>(ID_MISFIRE_ACTION, new PropertyModel( model, TaskAddDto.F_MISFIRE_ACTION), WebMiscUtil.createReadonlyModelFromEnum(MisfireActionType.class), new EnumChoiceRenderer(PageTaskAdd.this)); mainForm.add(misfire); @@ -605,6 +698,24 @@ private TaskType createTask(TaskAddDto dto) throws SchemaException { intent.setRealValue(dto.getIntent()); } + if(dto.getObjectClass() != null && StringUtils.isNotEmpty(dto.getObjectClass())){ + PrismObject prismTask = task.asPrismObject(); + ItemPath path = new ItemPath(TaskType.F_EXTENSION, SchemaConstants.OBJECTCLASS_PROPERTY_NAME); + PrismProperty objectClassProperty = prismTask.findOrCreateProperty(path); + + QName objectClass = null; + for(QName q: model.getObject().getObjectClassList()){ + if(q.getLocalPart().equals(dto.getObjectClass())){ + objectClass = q; + } + } + + SchemaRegistry registry = getPrismContext().getSchemaRegistry(); + PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.OBJECTCLASS_PROPERTY_NAME); + objectClassProperty.setDefinition(def); + objectClassProperty.setRealValue(objectClass); + } + return task; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.properties index d7088aee6c7..b66cc865975 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.properties @@ -21,6 +21,7 @@ pageTask.browse=Browse pageTask.name=Task name pageTask.kind=Kind pageTask.intent=Intent +pageTask.objectClass=Object class pageTask.scheduleTitle=Scheduling pageTask.recurring=Recurring task pageTask.bound=Tightly bound (use if recurring task runs often) @@ -57,5 +58,4 @@ pageTask.boundHelp=Tightly bound tasks are used to run short actions, which are is not supported for these tasks; you have to specify the time interval. pageTask.cronHelp=Cron-like specification is in the form: SECONDS MINUTES HOURS DAY-OF-MONTH MONTH DAY-OF-WEEK YEAR \ (optional), e.g. '0 0 12 ? * WED' which means 'every Wednesday at 12:00:00 pm'. -pageTask.cronHelpLink=For more information, please see diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.html index a9cb8389db9..922b77c4ccf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.html @@ -67,6 +67,10 @@

+ + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java index eae4d4c455b..49e054f5a51 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.web.page.admin.server; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -26,6 +28,7 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.security.api.AuthorizationConstants; @@ -59,13 +62,15 @@ import com.evolveum.midpoint.web.util.InfoTooltipBehavior; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.web.util.WebMiscUtil; +import com.evolveum.midpoint.web.util.WebModelUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; +import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings; +import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; @@ -74,14 +79,12 @@ import org.apache.wicket.markup.html.form.*; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.model.ResourceModel; +import org.apache.wicket.model.*; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; +import org.apache.wicket.util.string.Strings; +import javax.xml.namespace.QName; import java.util.*; /** @@ -105,6 +108,7 @@ public class PageTaskEdit extends PageAdminTasks { private static final String OPERATION_RESUME_TASK = DOT_CLASS + "resumeTask"; private static final String OPERATION_RUN_NOW_TASK = DOT_CLASS + "runNowTask"; private static final String OPERATION_LOAD_RESOURCES = DOT_CLASS + "createResourceList"; + private static final String OPERATION_LOAD_RESOURCE = DOT_CLASS + "loadResource"; private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_IDENTIFIER = "identifier"; @@ -113,6 +117,7 @@ public class PageTaskEdit extends PageAdminTasks { private static final String ID_RESOURCE_REF = "resourceRef"; private static final String ID_KIND = "kind"; private static final String ID_INTENT = "intent"; + private static final String ID_OBJECT_CLASS = "objectClass"; private static final String ID_WORKER_THREADS = "workerThreads"; private static final String ID_MODEL_OPERATION_STATUS_LABEL = "modelOperationStatusLabel"; private static final String ID_MODEL_OPERATION_STATUS_PANEL = "modelOperationStatusPanel"; @@ -217,7 +222,8 @@ private TaskDto loadTask() { } private TaskDto prepareTaskDto(TaskType task, OperationResult result) throws SchemaException, ObjectNotFoundException { - TaskDto taskDto = new TaskDto(task, getModelService(), getTaskService(), getModelInteractionService(), getTaskManager(), TaskDtoProviderOptions.fullOptions(), result); + TaskDto taskDto = new TaskDto(task, getModelService(), getTaskService(), getModelInteractionService(), + getTaskManager(), TaskDtoProviderOptions.fullOptions(), result, this); for (TaskType child : task.getSubtask()) { taskDto.addChildTaskDto(prepareTaskDto(child, result)); } @@ -280,16 +286,16 @@ public boolean isVisible() { panel.add(modelOpBehaviour); mainForm.add(panel); - SortableDataProvider provider = new ListDataProvider(this, + SortableDataProvider provider = new ListDataProvider<>(this, new PropertyModel>(model, "opResult")); - TablePanel result = new TablePanel("operationResult", provider, initResultColumns()); + TablePanel result = new TablePanel<>("operationResult", provider, initResultColumns()); result.setStyle("padding-top: 0px;"); result.setShowPaging(false); result.setOutputMarkupId(true); result.add(hiddenWhenEditing); mainForm.add(result); - DropDownChoice threadStop = new DropDownChoice("threadStop", new Model() { + DropDownChoice threadStop = new DropDownChoice<>("threadStop", new Model() { @Override public ThreadStopActionType getObject() { @@ -325,7 +331,7 @@ public boolean isEnabled() { } private void initMainInfo(Form mainForm) { - RequiredTextField name = new RequiredTextField(ID_NAME, new PropertyModel( + RequiredTextField name = new RequiredTextField<>(ID_NAME, new PropertyModel( model, TaskDto.F_NAME)); name.add(new VisibleEnableBehaviour() { @@ -347,7 +353,7 @@ public boolean isVisible() { }); mainForm.add(nameLabel); - TextArea description = new TextArea(ID_DESCRIPTION, new PropertyModel( + TextArea description = new TextArea<>(ID_DESCRIPTION, new PropertyModel( model, TaskDto.F_DESCRIPTION)); description.add(new VisibleEnableBehaviour() { @@ -377,7 +383,7 @@ public boolean isVisible() { Label category = new Label("category", new PropertyModel(model, "category")); mainForm.add(category); - LinkPanel parent = new LinkPanel(ID_PARENT, new PropertyModel(model, TaskDto.F_PARENT_TASK_NAME)) { + LinkPanel parent = new LinkPanel(ID_PARENT, new PropertyModel<>(model, TaskDto.F_PARENT_TASK_NAME)) { @Override public void onClick(AjaxRequestTarget target) { String oid = model.getObject().getParentTaskOid(); @@ -449,8 +455,9 @@ public String getIdValue(TaskAddResourcesDto object, int index) { @Override public boolean isEnabled() { - if(!edit) + if(!edit){ return false; + } TaskDto dto = model.getObject(); boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); @@ -459,9 +466,40 @@ public boolean isEnabled() { return sync || recon || importAccounts; } }); + resource.add(new AjaxFormComponentUpdatingBehavior("onchange") { + + @Override + protected void onUpdate(AjaxRequestTarget target) { + OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCE); + List objectClassList = new ArrayList<>(); + + TaskAddResourcesDto resourcesDto = model.getObject().getResource(); + + if(resourcesDto != null){ + PrismObject resource = WebModelUtils.loadObject(ResourceType.class, resourcesDto.getOid(), result, PageTaskEdit.this); + + try { + ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, getPrismContext()); + schema.getObjectClassDefinitions(); + + for(Definition def: schema.getDefinitions()){ + objectClassList.add(def.getTypeName()); + } + + model.getObject().setObjectClassList(objectClassList); + } catch (Exception e){ + LoggingUtils.logException(LOGGER, "Couldn't load object class list from resource.", e); + error("Couldn't load object class list from resource."); + } + + } + + target.add(get(ID_MAIN_FORM + ":" + ID_OBJECT_CLASS)); + } + }); mainForm.add(resource); - final DropDownChoice kind = new DropDownChoice(ID_KIND, + final DropDownChoice kind = new DropDownChoice<>(ID_KIND, new PropertyModel(model, TaskDto.F_KIND), new AbstractReadOnlyModel>() { @@ -487,11 +525,15 @@ public String getIdValue(ShadowKindType object, int index) { @Override public boolean isEnabled() { - if(!edit) + if(!edit){ return false; + } TaskDto dto = model.getObject(); - return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); + boolean recon = TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean importAccounts = TaskCategory.IMPORTING_ACCOUNTS.equals(dto.getCategory()); + return sync || recon || importAccounts; } }); mainForm.add(kind); @@ -503,14 +545,46 @@ public boolean isEnabled() { @Override public boolean isEnabled() { - if(!edit) + if(!edit){ return false; + } TaskDto dto = model.getObject(); - return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); + boolean recon = TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean importAccounts = TaskCategory.IMPORTING_ACCOUNTS.equals(dto.getCategory()); + return sync || recon || importAccounts; } }); + AutoCompleteSettings autoCompleteSettings = new AutoCompleteSettings(); + autoCompleteSettings.setShowListOnEmptyInput(true); + final AutoCompleteTextField objectClass = new AutoCompleteTextField(ID_OBJECT_CLASS, + new PropertyModel(model, TaskDto.F_OBJECT_CLASS), autoCompleteSettings) { + + @Override + protected Iterator getChoices(String input) { + + return prepareObjectClassChoiceList(input); + } + }; + objectClass.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isEnabled() { + if(!edit){ + return false; + } + + TaskDto dto = model.getObject(); + boolean sync = TaskCategory.LIVE_SYNCHRONIZATION.equals(dto.getCategory()); + boolean recon = TaskCategory.RECONCILIATION.equals(dto.getCategory()); + boolean importAccounts = TaskCategory.IMPORTING_ACCOUNTS.equals(dto.getCategory()); + return sync || recon || importAccounts; + } + }); + mainForm.add(objectClass); + final TextField workerThreads = new TextField<>(ID_WORKER_THREADS, new PropertyModel(model, TaskDto.F_WORKER_THREADS)); mainForm.add(workerThreads); workerThreads.setOutputMarkupId(true); @@ -544,6 +618,30 @@ public String getObject() { mainForm.add(node); } + private Iterator prepareObjectClassChoiceList(String input){ + List choices = new ArrayList<>(); + + if(model.getObject().getResource() == null){ + return choices.iterator(); + } + + if(Strings.isEmpty(input)){ + for(QName q: model.getObject().getObjectClassList()){ + choices.add(q.getLocalPart()); + Collections.sort(choices); + } + } else { + for(QName q: model.getObject().getObjectClassList()){ + if(q.getLocalPart().startsWith(input)){ + choices.add(q.getLocalPart()); + } + Collections.sort(choices); + } + } + + return choices.iterator(); + } + private List createShadowKindTypeList(){ List kindList = new ArrayList<>(); @@ -1029,6 +1127,29 @@ private Task updateTask(TaskDto dto, Task existingTask) throws SchemaException { } } + if(dto.getObjectClass() != null && StringUtils.isNotEmpty(dto.getObjectClass())){ + PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.OBJECTCLASS_PROPERTY_NAME); + PrismProperty objectClassProperty = new PrismProperty(SchemaConstants.OBJECTCLASS_PROPERTY_NAME); + objectClassProperty.setRealValue(def); + + QName objectClass = null; + for(QName q: model.getObject().getObjectClassList()){ + if(q.getLocalPart().equals(dto.getObjectClass())){ + objectClass = q; + } + } + + objectClassProperty.setRealValue(objectClass); + existingTask.addExtensionProperty(objectClassProperty); + + } else { + PrismProperty objectClass = existingTask.getExtensionProperty(SchemaConstants.OBJECTCLASS_PROPERTY_NAME); + + if(objectClass != null){ + existingTask.deleteExtensionProperty(objectClass); + } + } + if(dto.getWorkerThreads() != null) { PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_WORKER_THREADS); PrismProperty workerThreads = new PrismProperty(SchemaConstants.MODEL_EXTENSION_WORKER_THREADS); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.properties index 5ce7e7202f4..66f6fb2f497 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.properties @@ -34,6 +34,7 @@ pageTaskEdit.execution=Execution status pageTaskEdit.objectRef=Resource reference pageTaskEdit.kind=Kind pageTaskEdit.intent=Intent +pageTaskEdit.objectClass=Object class pageTaskEdit.workerThreads=Worker threads pageTaskEdit.suspendReq=For editing is necessary to suspend the task diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskAddDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskAddDto.java index 316550a9aa9..a8953e9d71f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskAddDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskAddDto.java @@ -17,12 +17,16 @@ package com.evolveum.midpoint.web.page.admin.server.dto; import java.io.Serializable; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import com.evolveum.midpoint.xml.ns._public.common.common_3.MisfireActionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ThreadStopActionType; +import javax.xml.namespace.QName; + /** * @author lazyman */ @@ -31,6 +35,7 @@ public class TaskAddDto implements Serializable { public static final String F_DRY_RUN = "dryRun"; public static final String F_KIND = "kind"; public static final String F_INTENT = "intent"; + public static final String F_OBJECT_CLASS = "objectClass"; public static final String F_RESOURCE = "resource"; public static final String F_CATEGORY = "category"; public static final String F_NAME = "name"; @@ -67,6 +72,8 @@ public class TaskAddDto implements Serializable { private boolean dryRun; private ShadowKindType kind; private String intent; + private String objectClass; + private List objectClassList; public String getCategory() { return category; @@ -195,4 +202,79 @@ public String getIntent() { public void setIntent(String intent) { this.intent = intent; } + + public String getObjectClass() { + return objectClass; + } + + public void setObjectClass(String objectClass) { + this.objectClass = objectClass; + } + + public List getObjectClassList() { + if(objectClassList == null){ + objectClassList = new ArrayList<>(); + } + + return objectClassList; + } + + public void setObjectClassList(List objectClassList) { + this.objectClassList = objectClassList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TaskAddDto)) return false; + + TaskAddDto that = (TaskAddDto) o; + + if (bound != that.bound) return false; + if (dryRun != that.dryRun) return false; + if (reccuring != that.reccuring) return false; + if (runUntilNodeDown != that.runUntilNodeDown) return false; + if (suspendedState != that.suspendedState) return false; + if (category != null ? !category.equals(that.category) : that.category != null) return false; + if (cron != null ? !cron.equals(that.cron) : that.cron != null) return false; + if (intent != null ? !intent.equals(that.intent) : that.intent != null) return false; + if (interval != null ? !interval.equals(that.interval) : that.interval != null) return false; + if (kind != that.kind) return false; + if (misfireAction != that.misfireAction) return false; + if (name != null ? !name.equals(that.name) : that.name != null) return false; + if (notStartAfter != null ? !notStartAfter.equals(that.notStartAfter) : that.notStartAfter != null) + return false; + if (notStartBefore != null ? !notStartBefore.equals(that.notStartBefore) : that.notStartBefore != null) + return false; + if (objectClass != null ? !objectClass.equals(that.objectClass) : that.objectClass != null) return false; + if (objectClassList != null ? !objectClassList.equals(that.objectClassList) : that.objectClassList != null) + return false; + if (resource != null ? !resource.equals(that.resource) : that.resource != null) return false; + if (threadStop != that.threadStop) return false; + + return true; + } + + @Override + public int hashCode() { + int result = category != null ? category.hashCode() : 0; + result = 31 * result + (resource != null ? resource.hashCode() : 0); + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (reccuring ? 1 : 0); + result = 31 * result + (bound ? 1 : 0); + result = 31 * result + (interval != null ? interval.hashCode() : 0); + result = 31 * result + (cron != null ? cron.hashCode() : 0); + result = 31 * result + (notStartBefore != null ? notStartBefore.hashCode() : 0); + result = 31 * result + (notStartAfter != null ? notStartAfter.hashCode() : 0); + result = 31 * result + (runUntilNodeDown ? 1 : 0); + result = 31 * result + (suspendedState ? 1 : 0); + result = 31 * result + (threadStop != null ? threadStop.hashCode() : 0); + result = 31 * result + (misfireAction != null ? misfireAction.hashCode() : 0); + result = 31 * result + (dryRun ? 1 : 0); + result = 31 * result + (kind != null ? kind.hashCode() : 0); + result = 31 * result + (intent != null ? intent.hashCode() : 0); + result = 31 * result + (objectClass != null ? objectClass.hashCode() : 0); + result = 31 * result + (objectClassList != null ? objectClassList.hashCode() : 0); + return result; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java index c18353bf7e1..db9272fae9f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java @@ -21,14 +21,12 @@ import java.util.Date; import java.util.List; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.ModelInteractionService; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.api.TaskService; import com.evolveum.midpoint.model.api.context.ModelContext; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismReference; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.DeltaConvertor; @@ -36,6 +34,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.*; @@ -48,6 +47,7 @@ import com.evolveum.midpoint.web.component.model.operationStatus.ModelOperationStatusDto; import com.evolveum.midpoint.web.component.util.Selectable; import com.evolveum.midpoint.web.component.wf.WfHistoryEventDto; +import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.web.util.WebModelUtils; import com.evolveum.midpoint.wf.api.WfTaskExtensionItemsNames; @@ -69,6 +69,7 @@ public class TaskDto extends Selectable { public static final String CLASS_DOT = TaskDto.class.getName() + "."; public static final String OPERATION_NEW = CLASS_DOT + "new"; + public static final String OPERATION_LOAD_RESOURCE = CLASS_DOT + "loadResource"; private static final transient Trace LOGGER = TraceManager.getTrace(TaskDto.class); public static final String F_MODEL_OPERATION_STATUS = "modelOperationStatus"; @@ -89,6 +90,7 @@ public class TaskDto extends Selectable { public static final String F_DRY_RUN = "dryRun"; public static final String F_KIND = "kind"; public static final String F_INTENT = "intent"; + public static final String F_OBJECT_CLASS = "objectClass"; public static final String F_WORKER_THREADS = "workerThreads"; public static final String F_RESOURCE_REFERENCE = "resourceRef"; @@ -133,19 +135,23 @@ public class TaskDto extends Selectable { private boolean dryRun; private ShadowKindType kind; private String intent; + private String objectClass; + private List objectClassList; private Integer workerThreads; private TaskType taskType; //region Construction - public TaskDto(TaskType taskType, ModelService modelService, TaskService taskService, ModelInteractionService modelInteractionService, TaskManager taskManager, TaskDtoProviderOptions options, OperationResult parentResult) throws SchemaException, ObjectNotFoundException { + public TaskDto(TaskType taskType, ModelService modelService, TaskService taskService, ModelInteractionService modelInteractionService, + TaskManager taskManager, TaskDtoProviderOptions options, OperationResult parentResult, PageBase pageBase) throws SchemaException, ObjectNotFoundException { Validate.notNull(taskType, "Task must not be null."); Validate.notNull(modelService); Validate.notNull(taskService); Validate.notNull(modelInteractionService); Validate.notNull(taskManager); Validate.notNull(parentResult); + Validate.notNull(pageBase); this.taskType = taskType; @@ -153,7 +159,7 @@ public TaskDto(TaskType taskType, ModelService modelService, TaskService taskSer fillInTimestamps(taskType); fillInHandlerUriList(taskType); fillInScheduleAttributes(taskType); - fillInResourceReference(taskType, taskManager, thisOpResult, modelService); + fillInResourceReference(taskType, taskManager, thisOpResult, modelService, pageBase); fillInObjectRefAttributes(taskType, modelService, taskManager, options, thisOpResult); fillInParentTaskAttributes(taskType, taskService, options, thisOpResult); fillInOperationResultAttributes(taskType); @@ -163,16 +169,40 @@ public TaskDto(TaskType taskType, ModelService modelService, TaskService taskSer fillInWorkflowAttributes(taskType); thisOpResult.computeStatusIfUnknown(); - //dryRun, intent, kind, workerThreads + //dryRun, intent, kind, objectCLass, workerThreads fillFromExtension(taskType); } - private void fillInResourceReference(TaskType task, TaskManager manager, OperationResult result, ModelService service){ + private void fillInResourceReference(TaskType task, TaskManager manager, OperationResult result, ModelService service, PageBase pageBase){ ObjectReferenceType ref = task.getObjectRef(); if(ref != null && ResourceType.COMPLEX_TYPE.equals(ref.getType())){ resourceRef = new TaskAddResourcesDto(ref.getOid(), getTaskObjectName(task, manager, service, result)); } + + updateObjectClassList(pageBase); + } + + private void updateObjectClassList(PageBase pageBase){ + OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCE); + List objectClassList = new ArrayList<>(); + + if(resourceRef != null){ + PrismObject resource = WebModelUtils.loadObject(ResourceType.class, resourceRef.getOid(), result, pageBase); + + try { + ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, pageBase.getPrismContext()); + schema.getObjectClassDefinitions(); + + for(Definition def: schema.getDefinitions()){ + objectClassList.add(def.getTypeName()); + } + + setObjectClassList(objectClassList); + } catch (Exception e){ + LoggingUtils.logException(LOGGER, "Couldn't load object class list from resource.", e); + } + } } private void fillFromExtension(TaskType taskType) { @@ -199,6 +229,11 @@ private void fillFromExtension(TaskType taskType) { intent = intentItem.getRealValue(); } + PrismProperty objectClassItem = task.getExtension().findProperty(SchemaConstants.OBJECTCLASS_PROPERTY_NAME); + if(objectClassItem != null && objectClassItem.getRealValue() != null){ + objectClass = objectClassItem.getRealValue().getLocalPart(); + } + PrismProperty workerThreadsItem = task.getExtension().findProperty(SchemaConstants.MODEL_EXTENSION_WORKER_THREADS); if(workerThreadsItem != null) { workerThreads = workerThreadsItem.getRealValue(); @@ -761,4 +796,130 @@ public ShadowKindType getKind() { public void setKind(ShadowKindType kind) { this.kind = kind; } + + public String getObjectClass() { + return objectClass; + } + + public void setObjectClass(String objectClass) { + this.objectClass = objectClass; + } + + public List getObjectClassList() { + if(objectClassList == null){ + objectClassList = new ArrayList<>(); + } + + return objectClassList; + } + + public void setObjectClassList(List objectClassList) { + this.objectClassList = objectClassList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TaskDto)) return false; + + TaskDto taskDto = (TaskDto) o; + + if (dryRun != taskDto.dryRun) return false; + if (workflowProcessInstanceFinished != taskDto.workflowProcessInstanceFinished) return false; + if (workflowShadowTask != taskDto.workflowShadowTask) return false; + if (binding != taskDto.binding) return false; + if (completionTimestampLong != null ? !completionTimestampLong.equals(taskDto.completionTimestampLong) : taskDto.completionTimestampLong != null) + return false; + if (cronSpecification != null ? !cronSpecification.equals(taskDto.cronSpecification) : taskDto.cronSpecification != null) + return false; + if (handlerUriList != null ? !handlerUriList.equals(taskDto.handlerUriList) : taskDto.handlerUriList != null) + return false; + if (intent != null ? !intent.equals(taskDto.intent) : taskDto.intent != null) return false; + if (interval != null ? !interval.equals(taskDto.interval) : taskDto.interval != null) return false; + if (kind != taskDto.kind) return false; + if (lastRunFinishTimestampLong != null ? !lastRunFinishTimestampLong.equals(taskDto.lastRunFinishTimestampLong) : taskDto.lastRunFinishTimestampLong != null) + return false; + if (lastRunStartTimestampLong != null ? !lastRunStartTimestampLong.equals(taskDto.lastRunStartTimestampLong) : taskDto.lastRunStartTimestampLong != null) + return false; + if (misfireAction != taskDto.misfireAction) return false; + if (modelOperationStatusDto != null ? !modelOperationStatusDto.equals(taskDto.modelOperationStatusDto) : taskDto.modelOperationStatusDto != null) + return false; + if (nextRunStartTimeLong != null ? !nextRunStartTimeLong.equals(taskDto.nextRunStartTimeLong) : taskDto.nextRunStartTimeLong != null) + return false; + if (notStartAfter != null ? !notStartAfter.equals(taskDto.notStartAfter) : taskDto.notStartAfter != null) + return false; + if (notStartBefore != null ? !notStartBefore.equals(taskDto.notStartBefore) : taskDto.notStartBefore != null) + return false; + if (objectClass != null ? !objectClass.equals(taskDto.objectClass) : taskDto.objectClass != null) return false; + if (objectClassList != null ? !objectClassList.equals(taskDto.objectClassList) : taskDto.objectClassList != null) + return false; + if (objectRefName != null ? !objectRefName.equals(taskDto.objectRefName) : taskDto.objectRefName != null) + return false; + if (objectRefType != taskDto.objectRefType) return false; + if (opResult != null ? !opResult.equals(taskDto.opResult) : taskDto.opResult != null) return false; + if (parentTaskName != null ? !parentTaskName.equals(taskDto.parentTaskName) : taskDto.parentTaskName != null) + return false; + if (parentTaskOid != null ? !parentTaskOid.equals(taskDto.parentTaskOid) : taskDto.parentTaskOid != null) + return false; + if (recurrence != taskDto.recurrence) return false; + if (resourceRef != null ? !resourceRef.equals(taskDto.resourceRef) : taskDto.resourceRef != null) return false; + if (subtasks != null ? !subtasks.equals(taskDto.subtasks) : taskDto.subtasks != null) return false; + if (taskOperationResult != null ? !taskOperationResult.equals(taskDto.taskOperationResult) : taskDto.taskOperationResult != null) + return false; + if (taskType != null ? !taskType.equals(taskDto.taskType) : taskDto.taskType != null) return false; + if (workerThreads != null ? !workerThreads.equals(taskDto.workerThreads) : taskDto.workerThreads != null) + return false; + if (workflowDeltasIn != null ? !workflowDeltasIn.equals(taskDto.workflowDeltasIn) : taskDto.workflowDeltasIn != null) + return false; + if (workflowDeltasOut != null ? !workflowDeltasOut.equals(taskDto.workflowDeltasOut) : taskDto.workflowDeltasOut != null) + return false; + if (workflowHistory != null ? !workflowHistory.equals(taskDto.workflowHistory) : taskDto.workflowHistory != null) + return false; + if (workflowLastDetails != null ? !workflowLastDetails.equals(taskDto.workflowLastDetails) : taskDto.workflowLastDetails != null) + return false; + if (workflowProcessInstanceId != null ? !workflowProcessInstanceId.equals(taskDto.workflowProcessInstanceId) : taskDto.workflowProcessInstanceId != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = handlerUriList != null ? handlerUriList.hashCode() : 0; + result = 31 * result + (parentTaskName != null ? parentTaskName.hashCode() : 0); + result = 31 * result + (parentTaskOid != null ? parentTaskOid.hashCode() : 0); + result = 31 * result + (resourceRef != null ? resourceRef.hashCode() : 0); + result = 31 * result + (interval != null ? interval.hashCode() : 0); + result = 31 * result + (cronSpecification != null ? cronSpecification.hashCode() : 0); + result = 31 * result + (notStartBefore != null ? notStartBefore.hashCode() : 0); + result = 31 * result + (notStartAfter != null ? notStartAfter.hashCode() : 0); + result = 31 * result + (misfireAction != null ? misfireAction.hashCode() : 0); + result = 31 * result + (opResult != null ? opResult.hashCode() : 0); + result = 31 * result + (taskOperationResult != null ? taskOperationResult.hashCode() : 0); + result = 31 * result + (modelOperationStatusDto != null ? modelOperationStatusDto.hashCode() : 0); + result = 31 * result + (objectRefType != null ? objectRefType.hashCode() : 0); + result = 31 * result + (objectRefName != null ? objectRefName.hashCode() : 0); + result = 31 * result + (subtasks != null ? subtasks.hashCode() : 0); + result = 31 * result + (lastRunStartTimestampLong != null ? lastRunStartTimestampLong.hashCode() : 0); + result = 31 * result + (lastRunFinishTimestampLong != null ? lastRunFinishTimestampLong.hashCode() : 0); + result = 31 * result + (nextRunStartTimeLong != null ? nextRunStartTimeLong.hashCode() : 0); + result = 31 * result + (completionTimestampLong != null ? completionTimestampLong.hashCode() : 0); + result = 31 * result + (binding != null ? binding.hashCode() : 0); + result = 31 * result + (recurrence != null ? recurrence.hashCode() : 0); + result = 31 * result + (workflowShadowTask ? 1 : 0); + result = 31 * result + (workflowProcessInstanceId != null ? workflowProcessInstanceId.hashCode() : 0); + result = 31 * result + (workflowProcessInstanceFinished ? 1 : 0); + result = 31 * result + (workflowLastDetails != null ? workflowLastDetails.hashCode() : 0); + result = 31 * result + (workflowDeltasIn != null ? workflowDeltasIn.hashCode() : 0); + result = 31 * result + (workflowDeltasOut != null ? workflowDeltasOut.hashCode() : 0); + result = 31 * result + (workflowHistory != null ? workflowHistory.hashCode() : 0); + result = 31 * result + (dryRun ? 1 : 0); + result = 31 * result + (kind != null ? kind.hashCode() : 0); + result = 31 * result + (intent != null ? intent.hashCode() : 0); + result = 31 * result + (objectClass != null ? objectClass.hashCode() : 0); + result = 31 * result + (objectClassList != null ? objectClassList.hashCode() : 0); + result = 31 * result + (workerThreads != null ? workerThreads.hashCode() : 0); + result = 31 * result + (taskType != null ? taskType.hashCode() : 0); + return result; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java index bc031471c0d..c457a8a2be7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; +import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import org.apache.wicket.Component; @@ -48,10 +49,12 @@ public class TaskDtoProvider extends BaseSortableDataProvider { private static final String OPERATION_COUNT_TASKS = DOT_CLASS + "countTasks"; private TaskDtoProviderOptions options; + private Component component; public TaskDtoProvider(Component component, TaskDtoProviderOptions options) { super(component); this.options = options; + this.component = component; } public TaskDtoProvider(Component component) { @@ -84,7 +87,8 @@ public Iterator internalIterator(long first, long count) { List> tasks = getModel().searchObjects(TaskType.class, query, searchOptions, operationTask, result); for (PrismObject task : tasks) { try { - TaskDto taskDto = new TaskDto(task.asObjectable(), getModel(), getTaskService(), getModelInteractionService(), getTaskManager(), options, result); + TaskDto taskDto = new TaskDto(task.asObjectable(), getModel(), getTaskService(), + getModelInteractionService(), getTaskManager(), options, result, (PageBase)component); getAvailableData().add(taskDto); } catch (Exception ex) { LoggingUtils.logException(LOGGER, "Unhandled exception when getting task {} details", ex, task.getOid()); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 94fac7317c3..02fea8375ff 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -174,6 +174,7 @@ public abstract class SchemaConstants { public static final QName MODEL_EXTENSION_DRY_RUN = new QName(NS_MODEL_EXTENSION, "dryRun"); public static final QName MODEL_EXTENSION_KIND = new QName(NS_MODEL_EXTENSION, "kind"); public static final QName MODEL_EXTENSION_INTENT = new QName(NS_MODEL_EXTENSION, "intent"); + public static final QName OBJECTCLASS_PROPERTY_NAME = new QName(NS_MODEL_EXTENSION, "objectclass"); public static final QName MODEL_EXTENSION_LAST_SCAN_TIMESTAMP_PROPERTY_NAME = new QName(NS_MODEL_EXTENSION, "lastScanTimestamp"); public static final String NS_MODEL_DISABLE_REASON = NS_MODEL + "/disableReason"; From 73daf9f9e11eee9be2a5de95d37fad3d5a4baa9a Mon Sep 17 00:00:00 2001 From: erik Date: Wed, 15 Apr 2015 13:30:11 +0200 Subject: [PATCH 3/3] fix for icons in preview assignments window. --- .../evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java index ff69dadead2..113e1df8754 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java @@ -32,7 +32,7 @@ public enum ObjectTypeGuiDescriptor { GENERIC_OBJECT(ObjectTypes.GENERIC_OBJECT, "ObjectTypeGuiDescriptor.genericObject", "silk-page_white_code"), - RESOURCE(ObjectTypes.RESOURCE, "ObjectTypeGuiDescriptor.resource", "silk-server"), + RESOURCE(ObjectTypes.RESOURCE, "ObjectTypeGuiDescriptor.resource", "silk-drive"), USER(ObjectTypes.USER, "ObjectTypeGuiDescriptor.user", "silk-user"), @@ -46,7 +46,7 @@ public enum ObjectTypeGuiDescriptor { OBJECT(ObjectTypes.OBJECT, "ObjectTypeGuiDescriptor.object", "silk-page_white"), - ROLE(ObjectTypes.ROLE, "ObjectTypeGuiDescriptor.role", "silk-medal_gold_3"), + ROLE(ObjectTypes.ROLE, "ObjectTypeGuiDescriptor.role", "silk-user_suit"), VALUE_POLICY(ObjectTypes.PASSWORD_POLICY, "ObjectTypeGuiDescriptor.valuePolicy", "silk-lock"),