diff --git a/build-system/pom.xml b/build-system/pom.xml index 13f29b01044..99953e090df 100644 --- a/build-system/pom.xml +++ b/build-system/pom.xml @@ -48,8 +48,9 @@ 3.0.1.e1 3.0.1 2.4.7 - 2.2.7 - 2.2.7 + 2.2.9 + 2.2.10-b140310.1920 + 2.2.10-b140310.1920 4.8.2 2.4.3 1.8.5 @@ -178,11 +179,21 @@ je 4.1.10 + + jaxb-api + javax.xml.bind + ${jaxb-api.version} + com.sun.xml.bind jaxb-impl ${jaxb.version} + + com.sun.xml.bind + jaxb-core + ${jaxb.version} + com.sun.xsom xsom diff --git a/gui/admin-gui/pom.xml b/gui/admin-gui/pom.xml index 4d21267a6da..81cea65d3ff 100644 --- a/gui/admin-gui/pom.xml +++ b/gui/admin-gui/pom.xml @@ -594,12 +594,10 @@ jaxb-api javax.xml.bind - ${jaxb.version} jaxb-core com.sun.xml.bind - ${jaxb.version} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java index 1f25036a2da..48c8ac3c7dd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java @@ -22,6 +22,8 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ReportTypeUtil; @@ -177,16 +179,18 @@ private Boolean importObject(PrismObject object, File file, Task task, Operation boolean importObject = true; try { - model.getObject(object.getCompileTimeClass(), object.getOid(), null, task, result); + model.getObject(object.getCompileTimeClass(), object.getOid(), SelectorOptions.createCollection(GetOperationOptions.createAllowNotFound()), task, result); importObject = false; result.recordSuccess(); } catch (ObjectNotFoundException ex) { importObject = true; } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "Couldn't get object with oid {} from model", ex, - object.getOid()); - result.recordWarning("Couldn't get object with oid '" + object.getOid() + "' from model", - ex); + if (!importObject){ + LoggingUtils.logException(LOGGER, "Couldn't get object with oid {} from model", ex, + object.getOid()); + result.recordWarning("Couldn't get object with oid '" + object.getOid() + "' from model", + ex); + } } if (!importObject) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/application/DescriptorLoader.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/application/DescriptorLoader.java index 46349bef831..72eeca108d2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/application/DescriptorLoader.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/application/DescriptorLoader.java @@ -185,11 +185,28 @@ private void scanPackagesForPages(List packages, MidPointApplication app private void loadActions(PageDescriptor descriptor) { for (String url : descriptor.url()) { List actions = new ArrayList<>(); + + //avoid of setting guiAll authz for "public" pages (e.g. login page) + if (descriptor.action() == null || descriptor.action().length == 0){ + return; + } + + boolean canAccess = true; + for (AuthorizationAction action : descriptor.action()) { actions.add(new AuthorizationActionValue(action.actionUri(), action.label(), action.description())); + if (AuthorizationConstants.AUTZ_NO_ACCESS_URL.equals(action.actionUri())){ + canAccess = false; + break; + } } - actions.add(new AuthorizationActionValue(AuthorizationConstants.AUTZ_GUI_ALL_URI, + + //add http://.../..#guAll authorization only for displayable pages, not for pages used for development.. + if (canAccess){ + + actions.add(new AuthorizationActionValue(AuthorizationConstants.AUTZ_GUI_ALL_URI, AuthorizationConstants.AUTZ_GUI_ALL_LABEL, AuthorizationConstants.AUTZ_GUI_ALL_DESCRIPTION)); + } this.actions.put(url, actions.toArray(new DisplayableValue[actions.size()])); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index f855ca87b29..c68f9ac9f59 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -17,11 +17,16 @@ package com.evolveum.midpoint.web.component.assignment; import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.page.PageBase; +import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; 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 com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -36,16 +41,21 @@ */ public class AssignmentEditorDto extends SelectableBean implements Comparable { + private static final String DOT_CLASS = AssignmentEditorDto.class.getName() + "."; + private static final String OPERATION_LOAD_ORG_TENANT = DOT_CLASS + "loadTenantOrg"; + public static final String F_TYPE = "type"; public static final String F_NAME = "name"; public static final String F_DESCRIPTION = "description"; public static final String F_ACTIVATION = "activation"; public static final String F_RELATION = "relation"; + public static final String F_TENANT_REF = "tenantRef"; private String name; private AssignmentEditorDtoType type; private UserDtoStatus status; private AssignmentType oldAssignment; + private ObjectViewDto tenantRef; private boolean showEmpty = false; private boolean minimized = true; @@ -53,7 +63,7 @@ public class AssignmentEditorDto extends SelectableBean implements Comparable attributes; - public AssignmentEditorDto(ObjectType targetObject, AssignmentEditorDtoType type, UserDtoStatus status, AssignmentType assignment) { + public AssignmentEditorDto(ObjectType targetObject, AssignmentEditorDtoType type, UserDtoStatus status, AssignmentType assignment, PageBase pageBase) { Validate.notNull(status, "User dto status must not be null."); Validate.notNull(type, "Type must not be null."); Validate.notNull(assignment, "Assignment must not be null."); @@ -75,9 +85,32 @@ public AssignmentEditorDto(ObjectType targetObject, AssignmentEditorDtoType type // newAssignment.setConstruction(construction.clone()); // } + this.tenantRef = loadTenantReference(targetObject, assignment, pageBase); + this.name = getNameForTargetObject(targetObject); } + private ObjectViewDto loadTenantReference(ObjectType object, AssignmentType assignment, PageBase page){ + ObjectViewDto dto; + + if(object instanceof RoleType){ + if(assignment.getTenantRef() != null){ + ObjectReferenceType ref = assignment.getTenantRef(); + + OperationResult result = new OperationResult(OPERATION_LOAD_ORG_TENANT); + PrismObject org = WebModelUtils.loadObject(OrgType.class, ref.getOid(), result, page); + + dto = new ObjectViewDto(ref.getOid(), WebMiscUtil.getName(org.asObjectable())); + dto.setType(OrgType.class); + return dto; + } + } + + dto = new ObjectViewDto(); + dto.setType(OrgType.class); + return dto; + } + private String getNameForTargetObject(ObjectType object) { if (object == null) { return null; @@ -105,12 +138,18 @@ private String getNameForTargetObject(ObjectType object) { builder.append(" (").append(getRelation()).append(')'); } + if(object instanceof RoleType){ + if(tenantRef != null && tenantRef.getOid() != null){ + builder.append(" - ").append(tenantRef.getName()); + } + } + return builder.toString(); } public List getAttributes() { if (attributes == null) { - attributes = new ArrayList(); + attributes = new ArrayList<>(); } return attributes; } @@ -181,6 +220,16 @@ public PrismContainerValue getNewValue() throws SchemaException { newAssignment.setActivation(null); } + if(tenantRef != null && AssignmentEditorDtoType.ROLE.equals(this.type)){ + if(tenantRef.getOid() == null){ + newAssignment.setTenantRef(null); + } else { + ObjectReferenceType ref = new ObjectReferenceType(); + ref.setOid(this.tenantRef.getOid()); + newAssignment.setTenantRef(ref); + } + } + ConstructionType construction = newAssignment.getConstruction(); if (construction == null) { return newAssignment.asPrismContainerValue(); @@ -245,4 +294,12 @@ private int getIndexOfType(AssignmentEditorDtoType type) { return 0; } + + public ObjectViewDto getTenantRef() { + return tenantRef; + } + + public void setTenantRef(ObjectViewDto tenantRef) { + this.tenantRef = tenantRef; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html index e3e4a9130a9..7ed0d54d8f2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html @@ -53,6 +53,13 @@ + + + + + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java index 42ce25bda48..2bcc477e3cf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java @@ -19,6 +19,9 @@ import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.EqualFilter; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; @@ -34,6 +37,9 @@ import com.evolveum.midpoint.web.component.util.SimplePanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.PageBase; +import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypeDialog; +import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypePanel; +import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -98,10 +104,11 @@ public class AssignmentEditorPanel extends SimplePanel { private static final String ID_TARGET = "target"; private static final String ID_TARGET_CONTAINER = "targetContainer"; private static final String ID_CONSTRUCTION_CONTAINER = "constructionContainer"; + private static final String ID_CONTAINER_TENANT_REF = "tenantRefContainer"; + private static final String ID_TENANT_CHOOSER = "tenantRefChooser"; private IModel> attributesModel; - public AssignmentEditorPanel(String id, IModel model) { super(id, model); @@ -250,6 +257,39 @@ private void initBodyLayout(WebMarkupContainer body) { relation.setEnabled(false); body.add(relation); + //TODO - add VisibleEnableBehaviour so we can only edit tenantRef in RoleAssignments + WebMarkupContainer tenantRefContainer = new WebMarkupContainer(ID_CONTAINER_TENANT_REF); + ChooseTypePanel tenantRef = new ChooseTypePanel(ID_TENANT_CHOOSER, + new PropertyModel(getModel(), AssignmentEditorDto.F_TENANT_REF)){ + + @Override + protected ObjectQuery getChooseQuery(){ + ObjectQuery query = new ObjectQuery(); + + ObjectFilter filter = EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, + getPageBase().getPrismContext(), null, true); + query.setFilter(filter); + + return query; + } + }; + tenantRefContainer.add(tenantRef); + tenantRefContainer.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isVisible() { + AssignmentEditorDto dto = getModel().getObject(); + if(dto != null){ + if(AssignmentEditorDtoType.ROLE.equals(dto.getType())){ + return true; + } + } + + return false; + } + }); + body.add(tenantRefContainer); + WebMarkupContainer activationBlock = new WebMarkupContainer(ID_ACTIVATION_BLOCK); activationBlock.add(new VisibleEnableBehaviour() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties index 6f99fb0ed8f..c2b1bec1388 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties @@ -24,5 +24,6 @@ AssignmentEditorPanel.enabledFromTo={0}, from {1,date,medium} to {2,date,medium} AssignmentEditorPanel.enabledFrom={0}, from {1,date,medium} AssignmentEditorPanel.enabledTo={0}, to {1,date,medium} AssignmentEditorPanel.relation=Relation +AssignmentEditorPanel.tenantRef=Tenant 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 deebfc8ef6c..8f5646564b6 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 @@ -133,7 +133,7 @@ public List loadFromAssignmentTypeList(List } } - list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment)); + list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment, getPageBase())); } Collections.sort(list); @@ -383,7 +383,7 @@ private void addSelectedAssignablePerformed(AjaxRequestTarget target, List assignments = assignmentModel.getObject(); AssignmentEditorDto dto = new AssignmentEditorDto(resource, AssignmentEditorDtoType.ACCOUNT_CONSTRUCTION, - UserDtoStatus.ADD, assignment); + UserDtoStatus.ADD, assignment, getPageBase()); assignments.add(dto); dto.setMinimized(false); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.html index b2e4f252c75..ce1f551e1c4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.html @@ -16,33 +16,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java index b6a4911fdbc..aca2ab9d3f0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java @@ -27,7 +27,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.AjaxSubmitButton; +import com.evolveum.midpoint.web.component.BasicSearchPanel; import com.evolveum.midpoint.web.component.data.ObjectDataProvider; import com.evolveum.midpoint.web.component.data.TablePanel; import com.evolveum.midpoint.web.component.data.column.IconColumn; @@ -50,7 +50,6 @@ import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.*; @@ -62,6 +61,16 @@ */ public class UserBrowserDialog extends ModalWindow { + private static final String ID_SEARCH_FORM = "searchForm"; + private static final String ID_MAIN_FORM = "mainForm"; + private static final String ID_CHECK_NAME = "nameCheck"; + private static final String ID_CHECK_FULL_NAME = "fullNameCheck"; + private static final String ID_CHECK_GIVEN_NAME = "givenNameCheck"; + private static final String ID_CHECK_FAMILY_NAME = "familyNameCheck"; + private static final String ID_BASIC_SEARCH = "basicSearch"; + private static final String ID_BUTTON_CANCEL = "cancelButton"; + private static final String ID_TABLE = "table"; + private static final Trace LOGGER = TraceManager.getTrace(UserBrowserDialog.class); private IModel model; private boolean initialized; @@ -102,44 +111,51 @@ protected void onBeforeRender() { } private void initLayout(WebMarkupContainer content) { - Form mainForm = new Form("mainForm"); + Form mainForm = new Form(ID_MAIN_FORM); content.add(mainForm); - TextField search = new TextField("searchText", new PropertyModel(model, "searchText")); - mainForm.add(search); + Form searchForm = new Form(ID_SEARCH_FORM); + searchForm.setOutputMarkupId(true); + content.add(searchForm); - CheckBox nameCheck = new CheckBox("nameCheck", new PropertyModel(model, "name")); - mainForm.add(nameCheck); - CheckBox fullNameCheck = new CheckBox("fullNameCheck", new PropertyModel(model, "fullName")); - mainForm.add(fullNameCheck); - CheckBox givenNameCheck = new CheckBox("givenNameCheck", new PropertyModel(model, "givenName")); - mainForm.add(givenNameCheck); - CheckBox familyNameCheck = new CheckBox("familyNameCheck", new PropertyModel(model, "familyName")); - mainForm.add(familyNameCheck); +// TextField search = new TextField("searchText", new PropertyModel(model, "searchText")); +// mainForm.add(search); + CheckBox nameCheck = new CheckBox(ID_CHECK_NAME, new PropertyModel(model, UserBrowserDto.F_NAME)); + searchForm.add(nameCheck); + CheckBox fullNameCheck = new CheckBox(ID_CHECK_FULL_NAME, new PropertyModel(model, UserBrowserDto.F_FULL_NAME)); + searchForm.add(fullNameCheck); + CheckBox givenNameCheck = new CheckBox(ID_CHECK_GIVEN_NAME, new PropertyModel(model, UserBrowserDto.F_GIVEN_NAME)); + searchForm.add(givenNameCheck); + CheckBox familyNameCheck = new CheckBox(ID_CHECK_FAMILY_NAME, new PropertyModel(model, UserBrowserDto.F_FAMILY_NAME)); + searchForm.add(familyNameCheck); - List, String>> columns = initColumns(); - TablePanel table = new TablePanel>("table", - new ObjectDataProvider(getPageBase(), UserType.class), columns); - table.setOutputMarkupId(true); - mainForm.add(table); + BasicSearchPanel basicSearch = new BasicSearchPanel(ID_BASIC_SEARCH) { - AjaxSubmitButton searchButton = new AjaxSubmitButton("searchButton", - createStringResource("userBrowserDialog.button.searchButton")) { + @Override + protected IModel createSearchTextModel() { + return new PropertyModel<>(model, UserBrowserDto.F_SEARCH_TEXT); + } @Override - protected void onError(AjaxRequestTarget target, Form> form) { - target.add(getPageBase().getFeedbackPanel()); + protected void searchPerformed(AjaxRequestTarget target) { + UserBrowserDialog.this.searchPerformed(target); } @Override - protected void onSubmit(AjaxRequestTarget target, Form> form) { - searchPerformed(target); + protected void clearSearchPerformed(AjaxRequestTarget target) { + UserBrowserDialog.this.clearSearchPerformed(target); } }; - mainForm.add(searchButton); + searchForm.add(basicSearch); + + List, String>> columns = initColumns(); + TablePanel table = new TablePanel<>(ID_TABLE, + new ObjectDataProvider(getPageBase(), UserType.class), columns); + table.setOutputMarkupId(true); + mainForm.add(table); - AjaxButton cancelButton = new AjaxButton("cancelButton", + AjaxButton cancelButton = new AjaxButton(ID_BUTTON_CANCEL, createStringResource("userBrowserDialog.button.cancelButton")) { @Override @@ -176,7 +192,7 @@ public String getObject() { } }); - IColumn column = new LinkColumn>(createStringResource("userBrowserDialog.name"), "name", "value.name") { + IColumn column = new LinkColumn>(createStringResource("userBrowserDialog.name"), UserBrowserDto.F_NAME, "value.name") { @Override public void onClick(AjaxRequestTarget target, IModel> rowModel) { @@ -186,13 +202,13 @@ public void onClick(AjaxRequestTarget target, IModel> r }; columns.add(column); - column = new PropertyColumn(createStringResource("userBrowserDialog.givenName"), "givenName", "value.givenName"); + column = new PropertyColumn(createStringResource("userBrowserDialog.givenName"), UserBrowserDto.F_GIVEN_NAME, SelectableBean.F_VALUE + ".givenName"); columns.add(column); - column = new PropertyColumn(createStringResource("userBrowserDialog.familyName"), "familyName", "value.familyName"); + column = new PropertyColumn(createStringResource("userBrowserDialog.familyName"), UserBrowserDto.F_FAMILY_NAME, SelectableBean.F_VALUE + ".familyName"); columns.add(column); - column = new PropertyColumn(createStringResource("userBrowserDialog.fullName"), "fullName", "value.fullName.orig"); + column = new PropertyColumn(createStringResource("userBrowserDialog.fullName"), UserBrowserDto.F_FULL_NAME, SelectableBean.F_VALUE + ".fullName.orig"); columns.add(column); column = new AbstractColumn, String>(createStringResource("userBrowserDialog.email")) { @@ -275,6 +291,18 @@ private ObjectQuery createQuery() { return query; } + private void clearSearchPerformed(AjaxRequestTarget target){ + model.setObject(new UserBrowserDto()); + + TablePanel panel = getTable(); + DataTable table = panel.getDataTable(); + ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider(); + provider.setQuery(null); + + target.add(getContent().get(ID_SEARCH_FORM)); + target.add(panel); + } + private void cancelPerformed(AjaxRequestTarget target) { close(target); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java index 0f7a256553c..8295cd5337e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java @@ -23,6 +23,12 @@ */ public class UserBrowserDto implements Serializable { + public static final String F_SEARCH_TEXT = "searchText"; + public static final String F_NAME = "name"; + public static final String F_FULL_NAME = "fullName"; + public static final String F_GIVEN_NAME = "givenName"; + public static final String F_FAMILY_NAME = "familyName"; + private String searchText; private boolean name = true; private boolean fullName; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java index 669b82df92f..d1f22d2124f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java @@ -20,11 +20,7 @@ import com.evolveum.midpoint.common.validator.EventHandler; import com.evolveum.midpoint.common.validator.EventResult; import com.evolveum.midpoint.common.validator.Validator; -import com.evolveum.midpoint.model.api.ModelDiagnosticService; -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.WorkflowService; +import com.evolveum.midpoint.model.api.*; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; @@ -59,6 +55,8 @@ public abstract class PageBase extends PageTemplate { private static final Trace LOGGER = TraceManager.getTrace(PageBase.class); + @SpringBean(name = "modelController") + private ScriptingService scriptingService; @SpringBean(name = "modelController") private ModelService modelService; @SpringBean(name = "modelController") @@ -121,6 +119,10 @@ public ModelService getModelService() { return modelService; } + public ScriptingService getScriptingService(){ + return scriptingService; + } + public TaskService getTaskService() { return taskService; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java index cc0e429e592..6bfced82ed7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java @@ -31,7 +31,7 @@ /** * @author lazyman */ -@PageDescriptor(url = "/admin/test", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) +@PageDescriptor(url = "/admin/test", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageTest extends PageBase { public PageTest() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java index 001b17a520d..ab06869a7a7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java @@ -33,7 +33,7 @@ * * @author shood */ -@PageDescriptor(url = "/capability", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) +@PageDescriptor(url = "/capability", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageTest2 extends PageBase { private static final String ID_CAPABILITY = "capability"; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java index 29009292c83..dcc1658a1ba 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java @@ -16,12 +16,23 @@ package com.evolveum.midpoint.web.page.admin.configuration; +import com.evolveum.midpoint.model.api.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionResult; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AceEditor; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.page.admin.configuration.dto.BulkActionDto; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; @@ -29,18 +40,24 @@ import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import javax.xml.bind.JAXBElement; + /** * @author lazyman */ @PageDescriptor(url = "/admin/config/bulk", action = { -// @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, -// label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), -// @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#bulkAction", -// label = "PageBulkAction.auth.bulkAction.label", description = "PageBulkAction.auth.bulkAction.description") - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL) + @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, + label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#bulkAction", + label = "PageBulkAction.auth.bulkAction.label", description = "PageBulkAction.auth.bulkAction.description") }) public class PageBulkAction extends PageAdminConfiguration { + private static final Trace LOGGER = TraceManager.getTrace(PageBulkAction.class); + + private static final String DOT_CLASS = PageBulkAction.class.getName() + "."; + private static final String OPERATION_PERFORM_BULK = "performBulkAction"; + private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_START = "start"; private static final String ID_EDITOR = "editor"; @@ -78,8 +95,50 @@ protected void onSubmit(AjaxRequestTarget target, Form> form) { } private void startPerformed(AjaxRequestTarget target) { - model.getObject(); + Task task = createSimpleTask(OPERATION_PERFORM_BULK); + OperationResult result = new OperationResult(OPERATION_PERFORM_BULK); + + BulkActionDto bulkActionDto = model.getObject(); + + ScriptingExpressionType expression = null; + try { + Object parsed = getPrismContext().parseAnyValue(bulkActionDto.getScript(), PrismContext.LANG_XML); + if (parsed == null) { + result.recordFatalError("No bulk action object was provided."); + } + if (parsed instanceof JAXBElement) { + parsed = ((JAXBElement) parsed).getValue(); + } + if (parsed instanceof ScriptingExpressionType) { + expression = (ScriptingExpressionType) parsed; + } else { + result.recordFatalError("Provided XML text is not a bulk action object. An instance of {scripting-3}ScriptingExpressionType is expected; you have provided " + parsed.getClass() + " instead."); + } + } catch (SchemaException|RuntimeException e) { + result.recordFatalError("Couldn't parse bulk action object", e); + } + + if (expression != null) { + if (bulkActionDto.isAsync()) { + try { + getScriptingService().evaluateExpressionInBackground(expression, task, result); + result.recordStatus(OperationResultStatus.IN_PROGRESS, task.getName() + " has been successfully submitted to execution"); + } catch (SchemaException|SecurityViolationException e) { + result.recordFatalError("Couldn't submit bulk action to execution", e); + } + } else { + try { + ScriptExecutionResult executionResult = getScriptingService().evaluateExpression(expression, task, result); + result.recordStatus(OperationResultStatus.SUCCESS, "Action executed. Returned " + executionResult.getDataOutput().size() + " item(s). Console and data output available via 'Export to XML' function."); + result.addReturn("console", executionResult.getConsoleOutput()); + result.addCollectionOfSerializablesAsReturn("data", executionResult.getDataOutput()); + } catch (ScriptExecutionException|SchemaException|SecurityViolationException e) { + result.recordFatalError("Couldn't execute bulk action", e); + } + } + } - //todo implement + showResult(result); + target.add(getFeedbackPanel()); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java index dc9e5f4c21a..973101b07a2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java @@ -112,7 +112,7 @@ private SystemConfigurationDto loadSystemConfiguration() { PrismObject systemConfig = getModelService().getObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), options, task, result); - dto = new SystemConfigurationDto(systemConfig, getMidpointApplication().getProtector()); + dto = new SystemConfigurationDto(systemConfig); result.recordSuccess(); } catch(Exception ex){ LoggingUtils.logException(LOGGER, "Couldn't load system configuration", ex); @@ -399,9 +399,11 @@ private SystemConfigurationType saveNotificationConfiguration(SystemConfiguratio mailServerConfig.setUsername(dto.getUsername()); mailServerConfig.setTransportSecurity(dto.getMailTransportSecurityType()); - ProtectedStringType pass = new ProtectedStringType(); - pass.setClearValue(dto.getPassword()); - mailServerConfig.setPassword(pass); + if(dto.getPassword() != null && StringUtils.isNotEmpty(dto.getPassword())){ + ProtectedStringType pass = new ProtectedStringType(); + pass.setClearValue(dto.getPassword()); + mailServerConfig.setPassword(pass); + } if(mailConfig.getServer().isEmpty()){ if(dto.isConfigured()) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java index 0a32e97652a..08396a46c15 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.web.page.admin.configuration.component; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.util.SimplePanel; @@ -94,11 +95,20 @@ private void initDialog(){ protected void chooseOperationPerformed(AjaxRequestTarget target, ObjectType object){ choosePerformed(target, object); } + + @Override + protected ObjectQuery getDataProviderQuery(){ + return getChooseQuery(); + } }; add(dialog); } + protected ObjectQuery getChooseQuery(){ + return null; + } + private void choosePerformed(AjaxRequestTarget target, ObjectType object){ ModalWindow window = (ModalWindow) get(MODAL_ID_SHOW_CHOOSE_OPTIONS); window.close(target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html index 0723db5670b..6075c9e1507 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html @@ -153,8 +153,7 @@ - + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.java index c92e089f1b2..b703f043070 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.web.util.InfoTooltipBehavior; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.MailTransportSecurityType; +import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.*; @@ -101,7 +102,15 @@ protected void initLayout(){ TextField userNameField = new TextField<>(ID_USERNAME, new PropertyModel(getModel(), "notificationConfig.username")); PasswordTextField passwordField = new PasswordTextField(ID_PASSWORD, new PropertyModel(getModel(), "notificationConfig.password")); passwordField.setRequired(false); - passwordField.setResetPassword(false); + + if(getModel().getObject() != null){ + if(getModel().getObject().getNotificationConfig().getPassword() != null){ + passwordField.add(new AttributeAppender("placeholder", createStringResource("SystemConfigPanel.mail.password.placeholder.set"))); + } else { + passwordField.add(new AttributeAppender("placeholder", createStringResource("SystemConfigPanel.mail.password.placeholder.empty"))); + } + } + TextField redirectToFileField = new TextField<>(ID_REDIRECT_TO_FILE, new PropertyModel(getModel(), "notificationConfig.redirectToFile")); IModel choices = WebMiscUtil.createReadonlyModelFromEnum(MailTransportSecurityType.class); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.properties index 30c857ae046..47ce986e1c9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.properties @@ -31,6 +31,8 @@ SystemConfigPanel.mail.host=Host SystemConfigPanel.mail.port=Port SystemConfigPanel.mail.username=Username SystemConfigPanel.mail.password=Password +SystemConfigPanel.mail.password.placeholder.empty=Set password +SystemConfigPanel.mail.password.placeholder.set=Password is set SystemConfigPanel.mail.transportSecurity=Transport security SystemConfigPanel.notification.redirectToFile=Redirect to file SystemConfigPanel.notification.redirectToFile.placeholder=Filename diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java index 113400fea80..e0913d30a95 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java @@ -15,16 +15,13 @@ */ package com.evolveum.midpoint.web.page.admin.configuration.dto; -import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.MailConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MailServerConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MailTransportSecurityType; import com.evolveum.midpoint.xml.ns._public.common.common_3.NotificationConfigurationType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; + import java.io.Serializable; @@ -48,7 +45,7 @@ public class NotificationConfigurationDto implements Serializable{ public NotificationConfigurationDto(){} - public NotificationConfigurationDto(NotificationConfigurationType config, Protector protector){ + public NotificationConfigurationDto(NotificationConfigurationType config){ if(config.getMail() != null){ MailConfigurationType mailConfig = config.getMail(); @@ -71,11 +68,7 @@ public NotificationConfigurationDto(NotificationConfigurationType config, Protec username = serverConfig.getUsername(); if(serverConfig.getPassword() != null){ - try { - password = protector.decryptString(serverConfig.getPassword()); - } catch (Exception e){ - LoggingUtils.logException(LOGGER, "Unable to decrypt password in mail configuration.", e); - } + password = ""; } else { password = null; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/SystemConfigurationDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/SystemConfigurationDto.java index 06f1a9a9fb7..24a51be0382 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/SystemConfigurationDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/SystemConfigurationDto.java @@ -39,14 +39,14 @@ public class SystemConfigurationDto implements Serializable { private NotificationConfigurationDto notificationConfig; public SystemConfigurationDto(){ - this(null, null); + this(null); } - public SystemConfigurationDto(PrismObject config, Protector protector) { - init(config.asObjectable(), protector); + public SystemConfigurationDto(PrismObject config) { + init(config.asObjectable()); } - private void init(SystemConfigurationType config, Protector protector){ + private void init(SystemConfigurationType config){ if(config == null){ return; } @@ -66,7 +66,7 @@ private void init(SystemConfigurationType config, Protector protector){ objectTemplateDto = loadObjectTemplate(config); if(config.getNotificationConfiguration() != null){ - notificationConfig = new NotificationConfigurationDto(config.getNotificationConfiguration(), protector); + notificationConfig = new NotificationConfigurationDto(config.getNotificationConfiguration()); } else { notificationConfig = new NotificationConfigurationDto(); } @@ -76,9 +76,9 @@ private ObjectViewDto loadPasswordPolicy(SystemConfigurationTyp ValuePolicyType passPolicy = config.getGlobalPasswordPolicy(); if(passPolicy != null){ - passPolicyDto = new ObjectViewDto(passPolicy.getOid(), passPolicy.getName().getOrig()); + passPolicyDto = new ObjectViewDto<>(passPolicy.getOid(), passPolicy.getName().getOrig()); }else { - passPolicyDto = new ObjectViewDto(); + passPolicyDto = new ObjectViewDto<>(); } passPolicyDto.setType(ValuePolicyType.class); @@ -89,9 +89,9 @@ private ObjectViewDto loadObjectTemplate(SystemConfiguration ObjectTemplateType objectTemplate = config.getDefaultUserTemplate(); if(objectTemplate != null){ - objectTemplateDto = new ObjectViewDto(objectTemplate.getOid(), objectTemplate.getName().getOrig()); + objectTemplateDto = new ObjectViewDto<>(objectTemplate.getOid(), objectTemplate.getName().getOrig()); }else { - objectTemplateDto = new ObjectViewDto(); + objectTemplateDto = new ObjectViewDto<>(); } objectTemplateDto.setType(ObjectTemplateType.class); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java index 3d687977d41..e919d7da8dd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java @@ -44,7 +44,7 @@ // PageAdminResources.AUTHORIZATION_RESOURCE_ALL, // AuthorizationConstants.NS_AUTHORIZATION + "#resourceWizard"}) @PageDescriptor(url = "/admin/resources/wizard", - action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) + action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageResourceWizard extends PageAdminResources { private static final String ID_WIZARD = "wizard"; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java index 7cdb145c6d4..53a8e112541 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java @@ -558,8 +558,10 @@ private ObjectQuery createQuery() { if (dto.isName()) { List secondaryIdentifiers = new ArrayList<>(); - if (def.getSecondaryIdentifiers() != null) { - secondaryIdentifiers.addAll(def.getSecondaryIdentifiers()); + if (def.getNamingAttribute() != null) { + secondaryIdentifiers.add(def.getNamingAttribute()); + } else if (def.getSecondaryIdentifiers() != null){ + secondaryIdentifiers.addAll(def.getSecondaryIdentifiers()); } for (ResourceAttributeDefinition attrDef : secondaryIdentifiers) { conditions.add(SubstringFilter.createSubstring( diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentEntitlements.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentEntitlements.java index 41ac3fdd714..24c4af07f82 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentEntitlements.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentEntitlements.java @@ -35,7 +35,7 @@ * @author lazyman */ @PageDescriptor(url = "/admin/resources/content/entitlements", encoder = OnePageParameterEncoder.class, action = { - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageContentEntitlements extends PageAdminResources { private IModel> resourceModel; 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 165f0fddc2a..a9e250c348d 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 @@ -35,6 +35,14 @@ + + + + + + + + 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 44dad83cb8a..a9341705db0 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 @@ -47,6 +47,7 @@ import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; @@ -80,6 +81,30 @@ public class PageTaskAdd extends PageAdminTasks { private static final long serialVersionUID = 2317887071933841581L; 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_FORM_MAIN = "mainForm"; + private static final String ID_NAME = "name"; + private static final String ID_CATEGORY = "category"; + private static final String ID_RESOURCE = "resource"; + private static final String ID_RUN_UNTIL_NODW_DOWN = "runUntilNodeDown"; + private static final String ID_CREATE_SUSPENDED = "createSuspended"; + private static final String ID_THREAD_STOP = "threadStop"; + private static final String ID_MISFIRE_ACTION = "misfireAction"; + private static final String ID_RECURRING = "recurring"; + private static final String ID_CONTAINER = "container"; + private static final String ID_BOUND_CONTAINER = "boundContainer"; + private static final String ID_BOUND_HELP = "boundHelp"; + private static final String ID_BOUND = "bound"; + private static final String ID_INTERVAL_CONTAINER = "intervalContainer"; + private static final String ID_INTERVAL = "interval"; + private static final String ID_CRON_CONTAINER = "cronContainer"; + private static final String ID_CRON = "cron"; + private static final String ID_CRON_HELP = "cronHelp"; + private static final String ID_NO_START_BEFORE_FIELD = "notStartBeforeField"; + private static final String ID_NO_START_AFTER_FIELD = "notStartAfterField"; + private static final String ID_BUTTON_BACK = "backButton"; + private static final String ID_BUTTON_SAVE = "saveButton"; private static final Trace LOGGER = TraceManager.getTrace(PageTaskAdd.class); private static final String DOT_CLASS = PageTaskAdd.class.getName() + "."; @@ -103,11 +128,11 @@ private TaskAddDto loadTask() { } private void initLayout() { - Form mainForm = new Form("mainForm"); + Form mainForm = new Form(ID_FORM_MAIN); add(mainForm); - final DropDownChoice resource = new DropDownChoice("resource", - new PropertyModel(model, "resource"), + final DropDownChoice resource = new DropDownChoice(ID_RESOURCE, + new PropertyModel(model, TaskAddDto.F_RESOURCE), new AbstractReadOnlyModel>() { @Override @@ -125,8 +150,7 @@ public Object getDisplayValue(TaskAddResourcesDto dto) { public String getIdValue(TaskAddResourcesDto dto, int index) { return Integer.toString(index); } - } - ); + }); resource.add(new VisibleEnableBehaviour() { @Override @@ -140,7 +164,51 @@ public boolean isEnabled() { }); resource.setOutputMarkupId(true); mainForm.add(resource); - DropDownChoice type = new DropDownChoice("category", new PropertyModel(model, "category"), + + final DropDownChoice kind = new DropDownChoice(ID_KIND, + new PropertyModel(model, TaskAddDto.F_KIND), + new AbstractReadOnlyModel>() { + + @Override + public List getObject() { + return createShadowKindTypeList(); + } + }, new IChoiceRenderer() { + + @Override + public Object getDisplayValue(ShadowKindType object) { + return object.value(); + } + + @Override + public String getIdValue(ShadowKindType object, int index) { + return Integer.toString(index); + } + }); + kind.setOutputMarkupId(true); + kind.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isEnabled() { + TaskAddDto dto = model.getObject(); + return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + } + }); + mainForm.add(kind); + + final TextField intent = new TextField<>(ID_INTENT, new PropertyModel(model, TaskAddDto.F_INTENT)); + mainForm.add(intent); + intent.setOutputMarkupId(true); + intent.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isEnabled() { + TaskAddDto dto = model.getObject(); + return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + } + }); + + DropDownChoice type = new DropDownChoice(ID_CATEGORY, new PropertyModel(model, TaskAddDto.F_CATEGORY), new AbstractReadOnlyModel>() { @Override @@ -158,20 +226,20 @@ public Object getDisplayValue(String item) { public String getIdValue(String item, int index) { return Integer.toString(index); } - - } - ); + }); type.add(new AjaxFormComponentUpdatingBehavior("onChange") { @Override protected void onUpdate(AjaxRequestTarget target) { target.add(resource); + target.add(intent); + target.add(kind); } }); type.setRequired(true); mainForm.add(type); - TextField name = new TextField("name", new PropertyModel(model, "name")); + TextField name = new TextField<>(ID_NAME, new PropertyModel(model, TaskAddDto.F_NAME)); name.setRequired(true); mainForm.add(name); @@ -185,14 +253,14 @@ protected void onUpdate(AjaxRequestTarget target) { } private void initScheduling(final Form mainForm) { - final WebMarkupContainer container = new WebMarkupContainer("container"); + final WebMarkupContainer container = new WebMarkupContainer(ID_CONTAINER); container.setOutputMarkupId(true); mainForm.add(container); - final IModel recurringCheck = new PropertyModel(model, "reccuring"); - final IModel boundCheck = new PropertyModel(model, "bound"); + final IModel recurringCheck = new PropertyModel<>(model, TaskAddDto.F_RECURRING); + final IModel boundCheck = new PropertyModel<>(model, TaskAddDto.F_BOUND); - final WebMarkupContainer boundContainer = new WebMarkupContainer("boundContainer"); + final WebMarkupContainer boundContainer = new WebMarkupContainer(ID_BOUND_CONTAINER); boundContainer.add(new VisibleEnableBehaviour() { @Override @@ -204,7 +272,7 @@ public boolean isVisible() { boundContainer.setOutputMarkupId(true); container.add(boundContainer); - final WebMarkupContainer intervalContainer = new WebMarkupContainer("intervalContainer"); + final WebMarkupContainer intervalContainer = new WebMarkupContainer(ID_INTERVAL_CONTAINER); intervalContainer.add(new VisibleEnableBehaviour() { @Override @@ -216,7 +284,7 @@ public boolean isVisible() { intervalContainer.setOutputMarkupId(true); container.add(intervalContainer); - final WebMarkupContainer cronContainer = new WebMarkupContainer("cronContainer"); + final WebMarkupContainer cronContainer = new WebMarkupContainer(ID_CRON_CONTAINER); cronContainer.add(new VisibleEnableBehaviour() { @Override @@ -228,7 +296,7 @@ public boolean isVisible() { cronContainer.setOutputMarkupId(true); container.add(cronContainer); - AjaxCheckBox recurring = new AjaxCheckBox("recurring", recurringCheck) { + AjaxCheckBox recurring = new AjaxCheckBox(ID_RECURRING, recurringCheck) { @Override protected void onUpdate(AjaxRequestTarget target) { @@ -237,7 +305,7 @@ protected void onUpdate(AjaxRequestTarget target) { }; mainForm.add(recurring); - AjaxCheckBox bound = new AjaxCheckBox("bound", boundCheck) { + AjaxCheckBox bound = new AjaxCheckBox(ID_BOUND, boundCheck) { @Override protected void onUpdate(AjaxRequestTarget target) { @@ -246,29 +314,29 @@ protected void onUpdate(AjaxRequestTarget target) { }; boundContainer.add(bound); - Label boundHelp = new Label("boundHelp"); + Label boundHelp = new Label(ID_BOUND_HELP); boundHelp.add(new InfoTooltipBehavior()); boundContainer.add(boundHelp); - TextField interval = new TextField("interval", - new PropertyModel(model, "interval")); + TextField interval = new TextField<>(ID_INTERVAL, + new PropertyModel(model, TaskAddDto.F_INTERVAL)); interval.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); intervalContainer.add(interval); - TextField cron = new TextField("cron", new PropertyModel( - model, "cron")); + TextField cron = new TextField<>(ID_CRON, new PropertyModel( + model, TaskAddDto.F_CRON)); cron.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); // if (recurringCheck.getObject() && !boundCheck.getObject()) { // cron.setRequired(true); // } cronContainer.add(cron); - Label cronHelp = new Label("cronHelp"); + Label cronHelp = new Label(ID_CRON_HELP); cronHelp.add(new InfoTooltipBehavior()); cronContainer.add(cronHelp); - final DateTimeField notStartBefore = new DateTimeField("notStartBeforeField", - new PropertyModel(model, "notStartBefore")) { + final DateTimeField notStartBefore = new DateTimeField(ID_NO_START_BEFORE_FIELD, + new PropertyModel(model, TaskAddDto.F_NOT_START_BEFORE)) { @Override protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) { return DateTextField.forDatePattern(id, dateFieldModel, "dd/MMM/yyyy"); // todo i18n @@ -277,8 +345,8 @@ protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel notStartBefore.setOutputMarkupId(true); mainForm.add(notStartBefore); - final DateTimeField notStartAfter = new DateTimeField("notStartAfterField", new PropertyModel( - model, "notStartAfter")) { + final DateTimeField notStartAfter = new DateTimeField(ID_NO_START_AFTER_FIELD, new PropertyModel( + model, TaskAddDto.F_NOT_START_AFTER)) { @Override protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) { return DateTextField.forDatePattern(id, dateFieldModel, "dd/MMM/yyyy"); // todo i18n @@ -293,15 +361,15 @@ protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel } private void initAdvanced(Form mainForm) { - CheckBox runUntilNodeDown = new CheckBox("runUntilNodeDown", new PropertyModel(model, - "runUntilNodeDown")); + CheckBox runUntilNodeDown = new CheckBox(ID_RUN_UNTIL_NODW_DOWN, new PropertyModel(model, + TaskAddDto.F_RUN_UNTIL_NODW_DOWN)); mainForm.add(runUntilNodeDown); - final IModel createSuspendedCheck = new PropertyModel(model, "suspendedState"); - CheckBox createSuspended = new CheckBox("createSuspended", createSuspendedCheck); + final IModel createSuspendedCheck = new PropertyModel<>(model, TaskAddDto.F_SUSPENDED_STATE); + CheckBox createSuspended = new CheckBox(ID_CREATE_SUSPENDED, createSuspendedCheck); mainForm.add(createSuspended); - DropDownChoice threadStop = new DropDownChoice("threadStop", new Model() { + DropDownChoice threadStop = new DropDownChoice(ID_THREAD_STOP, new Model() { @Override public ThreadStopActionType getObject() { @@ -326,14 +394,14 @@ public void setObject(ThreadStopActionType object) { mainForm.add(new TsaValidator(runUntilNodeDown, threadStop)); - DropDownChoice misfire = new DropDownChoice("misfireAction", new PropertyModel( - model, "misfireAction"), WebMiscUtil.createReadonlyModelFromEnum(MisfireActionType.class), + 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); } private void initButtons(final Form mainForm) { - AjaxSubmitButton saveButton = new AjaxSubmitButton("saveButton", + AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_BUTTON_SAVE, createStringResource("PageBase.button.save")) { @Override @@ -348,7 +416,7 @@ protected void onError(AjaxRequestTarget target, Form> form) { }; mainForm.add(saveButton); - AjaxButton backButton = new AjaxButton("backButton", + AjaxButton backButton = new AjaxButton(ID_BUTTON_BACK, createStringResource("PageBase.button.back")) { @Override @@ -360,7 +428,7 @@ public void onClick(AjaxRequestTarget target) { } private List createCategoryList() { - List categories = new ArrayList(); + List categories = new ArrayList<>(); // todo change to something better and add i18n // TaskManager manager = getTaskManager(); @@ -381,6 +449,16 @@ private List createCategoryList() { return categories; } + private List createShadowKindTypeList(){ + List kindList = new ArrayList<>(); + + kindList.add(ShadowKindType.ACCOUNT); + kindList.add(ShadowKindType.ENTITLEMENT); + kindList.add(ShadowKindType.GENERIC); + + return kindList; + } + private List createResourceList() { OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCES); Task task = createSimpleTask(OPERATION_LOAD_RESOURCES); @@ -505,6 +583,28 @@ private TaskType createTask(TaskAddDto dto) throws SchemaException { dryRun.setRealValue(true); } + if(dto.getKind() != null){ + PrismObject prismTask = task.asPrismObject(); + ItemPath path = new ItemPath(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_KIND); + PrismProperty kind = prismTask.findOrCreateProperty(path); + + SchemaRegistry registry = getPrismContext().getSchemaRegistry(); + PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_KIND); + kind.setDefinition(def); + kind.setRealValue(dto.getKind()); + } + + if(dto.getIntent() != null && StringUtils.isNotEmpty(dto.getIntent())){ + PrismObject prismTask = task.asPrismObject(); + ItemPath path = new ItemPath(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_INTENT); + PrismProperty intent = prismTask.findOrCreateProperty(path); + + SchemaRegistry registry = getPrismContext().getSchemaRegistry(); + PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_INTENT); + intent.setDefinition(def); + intent.setRealValue(dto.getIntent()); + } + 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 2fdba8fd07e..d7088aee6c7 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 @@ -16,9 +16,11 @@ page.title=New task pageTask.title.edit=Details for '{0}' pageTask.type=Type: -pageTask.objectRef=Object reference +pageTask.objectRef=Resource reference pageTask.browse=Browse pageTask.name=Task name +pageTask.kind=Kind +pageTask.intent=Intent pageTask.scheduleTitle=Scheduling pageTask.recurring=Recurring task pageTask.bound=Tightly bound (use if recurring task runs often) 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 3097922340b..49c65c01a75 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 @@ -55,6 +55,19 @@ + + + + + + + + + + + + + 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 189672215d0..c6038532b12 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 @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; @@ -30,6 +31,7 @@ import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskBinding; +import com.evolveum.midpoint.task.api.TaskCategory; import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -51,22 +53,15 @@ import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.web.page.PageTemplate; -import com.evolveum.midpoint.web.page.admin.server.dto.ScheduleValidator; -import com.evolveum.midpoint.web.page.admin.server.dto.StartEndDateValidator; -import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto; -import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoExecutionStatus; -import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoProviderOptions; +import com.evolveum.midpoint.web.page.admin.server.dto.*; import com.evolveum.midpoint.web.page.admin.server.subtasks.SubtasksPanel; import com.evolveum.midpoint.web.page.admin.server.workflowInformation.WorkflowInformationPanel; 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.xml.ns._public.common.common_3.MisfireActionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ScheduleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ThreadStopActionType; +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; @@ -109,11 +104,15 @@ public class PageTaskEdit extends PageAdminTasks { private static final String OPERATION_SUSPEND_TASKS = DOT_CLASS + "suspendTask"; 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 ID_MAIN_FORM = "mainForm"; private static final String ID_IDENTIFIER = "identifier"; private static final String ID_HANDLER_URI_LIST = "handlerUriList"; private static final String ID_HANDLER_URI = "handlerUri"; + 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_MODEL_OPERATION_STATUS_LABEL = "modelOperationStatusLabel"; private static final String ID_MODEL_OPERATION_STATUS_PANEL = "modelOperationStatusPanel"; private static final String ID_SUBTASKS_LABEL = "subtasksLabel"; @@ -424,6 +423,93 @@ public String getObject() { }); mainForm.add(execution); + final DropDownChoice resource = new DropDownChoice(ID_RESOURCE_REF, + new PropertyModel(model, TaskDto.F_RESOURCE_REFERENCE), + new AbstractReadOnlyModel>() { + + @Override + public List getObject() { + return createResourceList(); + } + }, new IChoiceRenderer() { + + @Override + public Object getDisplayValue(TaskAddResourcesDto object) { + return object.getName(); + } + + @Override + public String getIdValue(TaskAddResourcesDto object, int index) { + return Integer.toString(index); + } + }); + resource.setOutputMarkupId(true); + resource.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(resource); + + final DropDownChoice kind = new DropDownChoice(ID_KIND, + new PropertyModel(model, TaskDto.F_KIND), + new AbstractReadOnlyModel>() { + + @Override + public List getObject() { + return createShadowKindTypeList(); + } + }, new IChoiceRenderer() { + + @Override + public Object getDisplayValue(ShadowKindType object) { + return object.value(); + } + + @Override + public String getIdValue(ShadowKindType object, int index) { + return Integer.toString(index); + } + }); + kind.setOutputMarkupId(true); + kind.setNullValid(true); + kind.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isEnabled() { + if(!edit) + return false; + + TaskDto dto = model.getObject(); + return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + } + }); + mainForm.add(kind); + + final TextField intent = new TextField<>(ID_INTENT, new PropertyModel(model, TaskDto.F_INTENT)); + mainForm.add(intent); + intent.setOutputMarkupId(true); + intent.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isEnabled() { + if(!edit) + return false; + + TaskDto dto = model.getObject(); + return TaskCategory.RECONCILIATION.equals(dto.getCategory()); + } + }); + Label node = new Label("node", new AbstractReadOnlyModel() { @Override public String getObject() { @@ -437,6 +523,16 @@ public String getObject() { mainForm.add(node); } + private List createShadowKindTypeList(){ + List kindList = new ArrayList<>(); + + kindList.add(ShadowKindType.ACCOUNT); + kindList.add(ShadowKindType.ENTITLEMENT); + kindList.add(ShadowKindType.GENERIC); + + return kindList; + } + private void initSchedule(Form mainForm) { //todo probably can be removed, visibility can be updated in children (already components) [lazyman] final WebMarkupContainer container = new WebMarkupContainer("container"); @@ -755,6 +851,30 @@ private List> initResultColumns() { return columns; } + private List createResourceList() { + OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCES); + Task task = createSimpleTask(OPERATION_LOAD_RESOURCES); + List> resources = null; + List resourceList = new ArrayList<>(); + + try { + resources = getModelService().searchObjects(ResourceType.class, new ObjectQuery(), null, task, result); + result.recomputeStatus(); + } catch (Exception ex) { + result.recordFatalError("Couldn't get resource list.", ex); + LoggingUtils.logException(LOGGER, "Couldn't get resource list", ex); + } + + if (resources != null) { + ResourceType item = null; + for (PrismObject resource : resources) { + item = resource.asObjectable(); + resourceList.add(new TaskAddResourcesDto(item.getOid(), WebMiscUtil.getOrigStringFromPoly(item.getName()))); + } + } + return resourceList; + } + private void savePerformed(AjaxRequestTarget target) { LOGGER.debug("Saving new task."); OperationResult result = new OperationResult(OPERATION_SAVE_TASK); @@ -802,6 +922,15 @@ private Task updateTask(TaskDto dto, Task existingTask) throws SchemaException { existingTask.setDescription(dto.getDescription()); } + TaskAddResourcesDto resourceRefDto; + if(dto.getResource() != null){ + resourceRefDto = dto.getResource(); + ObjectReferenceType resourceRef = new ObjectReferenceType(); + resourceRef.setOid(resourceRefDto.getOid()); + resourceRef.setType(ResourceType.COMPLEX_TYPE); + existingTask.setObjectRef(resourceRef); + } + if (!dto.getRecurring()) { existingTask.makeSingle(); } @@ -834,8 +963,8 @@ private Task updateTask(TaskDto dto, Task existingTask) throws SchemaException { // } existingTask.setThreadStopAction(tsa); + SchemaRegistry registry = getPrismContext().getSchemaRegistry(); if (dto.isDryRun()) { - SchemaRegistry registry = getPrismContext().getSchemaRegistry(); PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_DRY_RUN); PrismProperty dryRun = new PrismProperty(SchemaConstants.MODEL_EXTENSION_DRY_RUN); dryRun.setDefinition(def); @@ -848,6 +977,37 @@ private Task updateTask(TaskDto dto, Task existingTask) throws SchemaException { existingTask.deleteExtensionProperty(dryRun); } } + + if(dto.getKind() != null){ + PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_KIND); + PrismProperty kind = new PrismProperty(SchemaConstants.MODEL_EXTENSION_KIND); + kind.setDefinition(def); + kind.setRealValue(dto.getKind()); + + existingTask.addExtensionProperty(kind); + } else { + PrismProperty kind = existingTask.getExtensionProperty(SchemaConstants.MODEL_EXTENSION_KIND); + + if(kind != null){ + existingTask.deleteExtensionProperty(kind); + } + } + + if(dto.getIntent() != null && StringUtils.isNotEmpty(dto.getIntent())){ + PrismPropertyDefinition def = registry.findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_INTENT); + PrismProperty intent = new PrismProperty(SchemaConstants.MODEL_EXTENSION_INTENT); + intent.setDefinition(def); + intent.setRealValue(dto.getIntent()); + + existingTask.addExtensionProperty(intent); + } else { + PrismProperty intent = existingTask.getExtensionProperty(SchemaConstants.MODEL_EXTENSION_INTENT); + + if(intent != null){ + existingTask.deleteExtensionProperty(intent); + } + } + return existingTask; } 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 fbd80a5a7c3..8db8d695086 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 @@ -31,6 +31,9 @@ pageTaskEdit.category=Category pageTaskEdit.parent=Parent task pageTaskEdit.handlerUri=Handler URI pageTaskEdit.execution=Execution status +pageTaskEdit.objectRef=Resource reference +pageTaskEdit.kind=Kind +pageTaskEdit.intent=Intent pageTaskEdit.suspendReq=For editing is necessary to suspend the task pageTaskEdit.scheduleTitle=Scheduling @@ -78,3 +81,4 @@ pageTaskEdit.dryRun=Dry run runUntilNodeDown.error1=Compatible data for 'Thread stop action' are: Close, Suspend runUntilNodeDown.error2=Compatible data for 'Thread stop action' are: Restart, Reschedule +nullValid=Choose one 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 365d665222c..316550a9aa9 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 @@ -20,6 +20,7 @@ import java.util.Date; 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; /** @@ -28,6 +29,21 @@ 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_RESOURCE = "resource"; + public static final String F_CATEGORY = "category"; + public static final String F_NAME = "name"; + public static final String F_RECURRING = "reccuring"; + public static final String F_BOUND = "bound"; + public static final String F_INTERVAL = "interval"; + public static final String F_CRON = "cron"; + public static final String F_NOT_START_BEFORE = "notStartBefore"; + public static final String F_NOT_START_AFTER = "notStartAfter"; + public static final String F_RUN_UNTIL_NODW_DOWN = "runUntilNodeDown"; + public static final String F_SUSPENDED_STATE = "suspendedState"; + public static final String F_THREAD_STOP = "threadStop"; + public static final String F_MISFIRE_ACTION = "misfireAction"; private String category; private TaskAddResourcesDto resource; @@ -49,6 +65,8 @@ public class TaskAddDto implements Serializable { private MisfireActionType misfireAction = MisfireActionType.EXECUTE_IMMEDIATELY; private boolean dryRun; + private ShadowKindType kind; + private String intent; public String getCategory() { return category; @@ -161,4 +179,20 @@ public boolean isDryRun() { public void setDryRun(boolean dryRun) { this.dryRun = dryRun; } + + public ShadowKindType getKind() { + return kind; + } + + public void setKind(ShadowKindType kind) { + this.kind = kind; + } + + public String getIntent() { + return intent; + } + + public void setIntent(String intent) { + this.intent = intent; + } } 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 c2889b821d9..e16a2b106e3 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 @@ -49,6 +49,7 @@ import com.evolveum.midpoint.web.component.util.Selectable; import com.evolveum.midpoint.web.component.wf.WfHistoryEventDto; import com.evolveum.midpoint.web.util.WebMiscUtil; +import com.evolveum.midpoint.web.util.WebModelUtils; import com.evolveum.midpoint.wf.api.WfTaskExtensionItemsNames; import com.evolveum.midpoint.wf.processors.primary.PcpTaskExtensionItemsNames; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -86,11 +87,17 @@ public class TaskDto extends Selectable { public static final String F_TASK_OPERATION_RESULT = "taskOperationResult"; public static final String F_PROGRESS_DESCRIPTION = "progressDescription"; 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_RESOURCE_REFERENCE = "resourceRef"; private List handlerUriList; private String parentTaskName; private String parentTaskOid; + //resource reference + private TaskAddResourcesDto resourceRef; + // scheduling information private Integer interval; private String cronSpecification; @@ -123,6 +130,8 @@ public class TaskDto extends Selectable { private List workflowHistory; private boolean dryRun; + private ShadowKindType kind; + private String intent; private TaskType taskType; @@ -141,6 +150,7 @@ public TaskDto(TaskType taskType, ModelService modelService, TaskService taskSer fillInTimestamps(taskType); fillInHandlerUriList(taskType); fillInScheduleAttributes(taskType); + fillInResourceReference(taskType, taskManager, thisOpResult, modelService); fillInObjectRefAttributes(taskType, modelService, taskManager, options, thisOpResult); fillInParentTaskAttributes(taskType, taskService, options, thisOpResult); fillInOperationResultAttributes(taskType); @@ -150,10 +160,19 @@ public TaskDto(TaskType taskType, ModelService modelService, TaskService taskSer fillInWorkflowAttributes(taskType); thisOpResult.computeStatusIfUnknown(); - fillDryRun(taskType); + //dryRun, intent and kind + fillFromExtension(taskType); } - private void fillDryRun(TaskType taskType) { + private void fillInResourceReference(TaskType task, TaskManager manager, OperationResult result, ModelService service){ + ObjectReferenceType ref = task.getObjectRef(); + + if(ref != null && ResourceType.COMPLEX_TYPE.equals(ref.getType())){ + resourceRef = new TaskAddResourcesDto(ref.getOid(), getTaskObjectName(task, manager, service, result)); + } + } + + private void fillFromExtension(TaskType taskType) { PrismObject task = taskType.asPrismObject(); if (task.getExtension() == null) { dryRun = false; @@ -163,10 +182,19 @@ private void fillDryRun(TaskType taskType) { PrismProperty item = task.getExtension().findProperty(SchemaConstants.MODEL_EXTENSION_DRY_RUN); if (item == null || item.getRealValue() == null) { dryRun = false; - return; + } else { + dryRun = item.getRealValue(); } - dryRun = item.getRealValue(); + PrismProperty kindItem = task.getExtension().findProperty(SchemaConstants.MODEL_EXTENSION_KIND); + if(kindItem != null && kindItem.getRealValue() != null){ + kind = kindItem.getRealValue(); + } + + PrismProperty intentItem = task.getExtension().findProperty(SchemaConstants.MODEL_EXTENSION_INTENT); + if(intentItem != null && intentItem.getRealValue() != null){ + intent = intentItem.getRealValue(); + } } private void fillInTimestamps(TaskType taskType) { @@ -687,4 +715,36 @@ public boolean isDryRun() { public void setDryRun(boolean dryRun) { this.dryRun = dryRun; } + + public TaskAddResourcesDto getResource() { + return resourceRef; + } + + public void setResource(TaskAddResourcesDto resource) { + this.resourceRef = resource; + } + + public String getIntent() { + return intent; + } + + public void setIntent(String intent) { + this.intent = intent; + } + + public TaskType getTaskType() { + return taskType; + } + + public void setTaskType(TaskType taskType) { + this.taskType = taskType; + } + + public ShadowKindType getKind() { + return kind; + } + + public void setKind(ShadowKindType kind) { + this.kind = kind; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageFindUsers.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageFindUsers.java index 763508c785e..124a2a63be8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageFindUsers.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageFindUsers.java @@ -25,7 +25,7 @@ /** * @author lazyman */ -@PageDescriptor(url = "/admin/users/find", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) +@PageDescriptor(url = "/admin/users/find", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageFindUsers extends PageAdminUsers { private static final Trace LOGGER = TraceManager.getTrace(PageFindUsers.class); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html index 5060958179b..31b6467df47 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html @@ -31,54 +31,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java index 2fd44cd72ad..0098a54b1f9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java @@ -86,9 +86,11 @@ public class PageOrgUnit extends PageAdminUsers { private static final String ID_DISPLAY_NAME = "displayName"; private static final String ID_DESCRIPTION = "description"; private static final String ID_REQUESTABLE = "requestable"; + private static final String ID_TENANT = "tenant"; private static final String ID_IDENTIFIER = "identifier"; private static final String ID_COST_CENTER = "costCenter"; private static final String ID_LOCALITY = "locality"; + private static final String ID_MAIL_DOMAIN = "mailDomain"; private static final String ID_ADMINISTRATIVE_STATUS = "administrativeStatus"; private static final String ID_VALID_FROM = "validFrom"; private static final String ID_VALID_TO = "validTo"; @@ -104,6 +106,7 @@ public class PageOrgUnit extends PageAdminUsers { private IModel> orgModel; private IModel> parentOrgUnitsModel; private IModel> orgTypeModel; + private IModel> orgMailDomainModel; public PageOrgUnit() { this(null); @@ -123,7 +126,7 @@ protected PrismObject load() { @Override protected List load() { - List values = new ArrayList(); + List values = new ArrayList<>(); PrismObject org = orgModel.getObject(); PrismProperty orgType = org.findProperty(OrgType.F_ORG_TYPE); @@ -137,6 +140,24 @@ protected List load() { } }; + orgMailDomainModel = new LoadableModel>(false) { + + @Override + protected List load() { + List values = new ArrayList<>(); + + PrismObject org = orgModel.getObject(); + PrismProperty orgMailDomain = org.findProperty(OrgType.F_MAIL_DOMAIN); + if(orgMailDomain == null || orgMailDomain.isEmpty()){ + values.add(new PrismPropertyValue(null, OriginType.USER_ACTION, null)); + } else { + values.addAll(orgMailDomain.getValues()); + } + + return values; + } + }; + parentOrgUnitsModel = new LoadableModel>(false) { @Override @@ -185,6 +206,10 @@ private void initLayout() { OrgType.F_REQUESTABLE), createStringResource("OrgType.requestable"), ID_LABEL_SIZE, ID_INPUT_SIZE); form.add(requestable); + CheckFormGroup tenant = new CheckFormGroup(ID_TENANT, new PrismPropertyModel(orgModel, + OrgType.F_TENANT), createStringResource("OrgType.tenant"), ID_LABEL_SIZE, ID_INPUT_SIZE); + form.add(tenant); + TextFormGroup identifier = new TextFormGroup(ID_IDENTIFIER, new PrismPropertyModel(orgModel, OrgType.F_IDENTIFIER), createStringResource("OrgType.identifier"), ID_LABEL_SIZE, ID_INPUT_SIZE, false); form.add(identifier); @@ -218,7 +243,7 @@ orgModel, new ItemPath(OrgType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STA @Override protected IModel createTextModel(IModel model) { - return new PropertyModel(model, "value"); + return new PropertyModel(model, "value"); } @Override @@ -228,6 +253,21 @@ protected Serializable createNewEmptyItem() { }; form.add(orgType); + MultiValueTextFormGroup mailDomain = new MultiValueTextFormGroup(ID_MAIL_DOMAIN, orgMailDomainModel, + createStringResource("OrgType.mailDomain"), ID_LABEL_SIZE, ID_INPUT_SIZE, false) { + + @Override + protected IModel createTextModel(IModel model) { + return new PropertyModel(model, "value"); + } + + @Override + protected Serializable createNewEmptyItem() { + return new PrismPropertyValue(null, OriginType.USER_ACTION, null); + } + }; + form.add(mailDomain); + MultiValueChoosePanel parentOrgType = new MultiValueChoosePanel(ID_PARENT_ORG_UNITS, parentOrgUnitsModel, createStringResource("ObjectType.parentOrgRef"), ID_LABEL_SIZE, ID_INPUT_SIZE, false, OrgType.class) { @@ -382,6 +422,17 @@ private PrismObject buildUnitFromModel(List parent } } + //update mailDomain values + List orgMailDomains = orgMailDomainModel.getObject(); + PrismProperty mailDomain = org.findOrCreateProperty(OrgType.F_MAIL_DOMAIN); + mailDomain.clear(); + + for(PrismPropertyValue mail: orgMailDomains){ + if(StringUtils.isNotEmpty((String)mail.getValue())){ + mailDomain.addValue(mail); + } + } + //We are creating new OrgUnit if(parentOrgList == null){ if(parentOrgUnitsModel != null && parentOrgUnitsModel.getObject() != null){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index 0525ae4d30b..19dfe28a33f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -743,7 +743,7 @@ private List loadAssignments() { } } - list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment)); + list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment, this)); } Collections.sort(list); @@ -1260,7 +1260,6 @@ private void savePerformed(AjaxRequestTarget target) { ExecuteChangeOptionsDto executeOptions = executeOptionsModel.getObject(); ModelExecuteOptions options = executeOptions.createOptions(); LOGGER.debug("Using options {}.", new Object[]{executeOptions}); - // try { try { reviveModels(); @@ -1598,7 +1597,7 @@ private void addSelectedResourceAssignPerformed(ResourceType resource) { List assignments = assignmentsModel.getObject(); AssignmentEditorDto dto = new AssignmentEditorDto(resource, AssignmentEditorDtoType.ACCOUNT_CONSTRUCTION, - UserDtoStatus.ADD, assignment); + UserDtoStatus.ADD, assignment, this); assignments.add(dto); dto.setMinimized(false); @@ -1632,7 +1631,7 @@ private void addSelectedAssignablePerformed(AjaxRequestTarget target, List + + + + + @@ -39,9 +44,10 @@ http://www.springframework.org/schema/security/spring-security-3.1.xsd"> - + + @@ -54,7 +60,7 @@ http://www.springframework.org/schema/security/spring-security-3.1.xsd"> - + diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java index 717cb7223ea..2d5e436ae0f 100644 --- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java +++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java @@ -1269,6 +1269,11 @@ private Date getDate(Attribute attr) { throw new IllegalArgumentException("Empty date attribute was provided"); } Object object = attr.getValue().get(0); + + if (object == null){ + return null; + } + if (!(object instanceof Long)) { throw new IllegalArgumentException("Date attribute was provided as "+object.getClass().getName()+" while expecting long"); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 5cc3d3b8db8..12517f5c97b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -768,15 +768,16 @@ public boolean matches(ShadowType shadowType) { return false; } } - if (shadowType.getIntent() == null) { - if (isDefault) { - return true; - } else { - return false; - } - } else { + if (shadowType.getIntent() != null) { +// if (isDefault) { +// return true; +// } else { +// return false; +// } +// } else { return MiscUtil.equals(intent, shadowType.getIntent()); - } + } + return true; } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 95a4b4e67e6..2c0180a1d4a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -445,7 +445,7 @@ public void merge(Item otherItem) throws SchemaException { public abstract Object find(ItemPath path); - public abstract PartiallyResolvedValue findPartial(ItemPath path); + public abstract PartiallyResolvedItem findPartial(ItemPath path); public Collection extends ItemDelta> diff(Item other) { return diff(other, true, false); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PartiallyResolvedValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PartiallyResolvedItem.java similarity index 85% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/PartiallyResolvedValue.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/PartiallyResolvedItem.java index 642320eadab..c8d426fbaf3 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PartiallyResolvedValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PartiallyResolvedItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2014 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,12 @@ * @author semancik * */ -public class PartiallyResolvedValue { +public class PartiallyResolvedItem { private Item item; private ItemPath residualPath; - public PartiallyResolvedValue(Item item, ItemPath residualPath) { + public PartiallyResolvedItem(Item item, ItemPath residualPath) { super(); this.item = item; this.residualPath = residualPath; @@ -65,7 +65,7 @@ public boolean equals(Object obj) { return false; if (getClass() != obj.getClass()) return false; - PartiallyResolvedValue other = (PartiallyResolvedValue) obj; + PartiallyResolvedItem other = (PartiallyResolvedItem) obj; if (item == null) { if (other.item != null) return false; @@ -81,7 +81,7 @@ public boolean equals(Object obj) { @Override public String toString() { - return "PartiallyResolvedValue(item=" + item + ", residualPath=" + residualPath + ")"; + return "PartiallyResolvedItem(item=" + item + ", residualPath=" + residualPath + ")"; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index d6fe8a1c7bd..a04f23eaa02 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -352,9 +352,9 @@ public Object find(ItemPath path) { } @Override - public PartiallyResolvedValue findPartial(ItemPath path) { + public PartiallyResolvedItem findPartial(ItemPath path) { if (path == null || path.isEmpty()) { - return new PartiallyResolvedValue((Item)this, null); + return new PartiallyResolvedItem((Item)this, null); } IdItemPathSegment idSegment = ItemPath.getFirstIdSegment(path); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index cecd3071711..6e90e7c0154 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -532,7 +532,7 @@ public Object find(ItemPath path) { } @Override - public PartiallyResolvedValue findPartial(ItemPath path) { + public PartiallyResolvedItem findPartial(ItemPath path) { if (path == null || path.isEmpty()) { // Incomplete path return null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 64c47fa59bf..e1618167e1d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -391,6 +391,11 @@ public T parseAnyValue(InputStream inputStream, String language) throws Sche return xnodeProcessor.parseAnyValue(xnode); } + public T parseAnyValue(String dataString, String language) throws SchemaException { + XNode xnode = parseToXNode(dataString, language); + return xnodeProcessor.parseAnyValue(xnode); + } + //endregion //region Parsing to XNode diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 5115b55fb3b..c1de1129170 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -22,6 +22,8 @@ import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -361,15 +363,17 @@ public Object find(ItemPath path) { } @Override - public PartiallyResolvedValue findPartial(ItemPath path) { + public PartiallyResolvedItem findPartial(ItemPath path) { if (path == null || path.isEmpty()) { - return new PartiallyResolvedValue((Item)this, null); + return new PartiallyResolvedItem((Item)this, null); } - if (!isSingleValue()) { - throw new IllegalStateException("Attempt to resolve sub-path '"+path+"' on multi-value property " + getElementName()); - } - PrismPropertyValue value = getValue(); - return value.findPartial(path); + for (PrismPropertyValue pvalue: getValues()) { + T value = pvalue.getValue(); + if (!(value instanceof Structured)) { + throw new IllegalArgumentException("Attempt to resolve sub-path '"+path+"' on non-structured property value "+pvalue); + } + } + return new PartiallyResolvedItem((Item)this, path); } public PropertyDelta diff(PrismProperty other) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index b7447603355..39322e49e47 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -209,16 +209,8 @@ public Object find(ItemPath path) { } @Override - public PartiallyResolvedValue findPartial(ItemPath path) { - if (path == null || path.isEmpty()) { - return new PartiallyResolvedValue((Item)getParent(), null); - } - T value = getValue(); - if (value instanceof Structured) { - return new PartiallyResolvedValue((Item)getParent(), path); - } else { - throw new IllegalArgumentException("Attempt to resolve sub-path '"+path+"' on non-structured property value "+value); - } + public PartiallyResolvedItem findPartial(ItemPath path) { + throw new UnsupportedOperationException("Attempt to invoke findPartialItem on a property value"); } void checkValue() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java index d598d31beab..3361507ab54 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java @@ -175,9 +175,9 @@ public Object find(ItemPath path) { @Override - public PartiallyResolvedValue findPartial(ItemPath path) { + public PartiallyResolvedItem findPartial(ItemPath path) { if (path == null || path.isEmpty()) { - return new PartiallyResolvedValue((Item)this, null); + return new PartiallyResolvedItem((Item)this, null); } if (!isSingleValue()) { throw new IllegalStateException("Attempt to resolve sub-path '"+path+"' on multi-value reference " + getElementName()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index 6c9f5ed9549..f597236c677 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -190,11 +190,11 @@ public Object find(ItemPath path) { } @Override - public PartiallyResolvedValue findPartial(ItemPath path) { + public PartiallyResolvedItem findPartial(ItemPath path) { if (path == null || path.isEmpty()) { - return new PartiallyResolvedValue((Item)getParent(), null); + return new PartiallyResolvedItem((Item)getParent(), null); } - return new PartiallyResolvedValue((Item)getParent(), path); + return new PartiallyResolvedItem((Item)getParent(), path); } private boolean compareLocalPart(QName a, QName b) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index bc1392ab609..2ef4a573f0c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -252,7 +252,7 @@ public static Collection resetParentCollection(Collect public abstract Object find(ItemPath path); - public abstract PartiallyResolvedValue findPartial(ItemPath path); + public abstract PartiallyResolvedItem findPartial(ItemPath path); @Override public int hashCode() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java index 8f2741f31bc..2112ec63c55 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java @@ -145,14 +145,12 @@ public Class getCompileTimeClass() { } @Override - public void applyTo(Item item) throws SchemaException { - if (!(item instanceof PrismContainer)) { - throw new SchemaException("Cannot apply container delta "+this+" to item "+item+" of type "+item.getClass()); - } - super.applyTo(item); + protected boolean isApplicableToType(Item item) { + return item instanceof PrismContainer; } - - public ItemDelta> findItemDelta(ItemPath path) { + + @Override + public ItemDelta> getSubDelta(ItemPath path) { if (path.isEmpty()) { return this; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaMapTriple.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaMapTriple.java new file mode 100644 index 00000000000..ccbbd5baeb0 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaMapTriple.java @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2010-2014 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.prism.delta; + +import com.evolveum.midpoint.prism.SimpleVisitable; +import com.evolveum.midpoint.prism.SimpleVisitor; +import com.evolveum.midpoint.prism.Visitable; +import com.evolveum.midpoint.prism.Visitor; +import com.evolveum.midpoint.util.Cloner; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.MiscUtil; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +/** + * + * @author Radovan Semancik + */ +public class DeltaMapTriple implements DebugDumpable, Serializable, SimpleVisitable> { + + /** + * Collection of values that were not changed. + */ + protected Map zeroMap; + + /** + * Collection of values that were added. + */ + protected Map plusMap; + + /** + * Collection of values that were deleted. + */ + protected Map minusMap; + + public DeltaMapTriple() { + zeroMap = createMap(); + plusMap = createMap(); + minusMap = createMap(); + } + + public DeltaMapTriple(Map zeroMap, Map plusMap, Map minusMap) { + this.zeroMap = zeroMap; + this.plusMap = plusMap; + this.minusMap = minusMap; + } + + protected Map createMap() { + return new HashMap<>(); + } + + public Map getZeroMap() { + return zeroMap; + } + + public Map getPlusMap() { + return plusMap; + } + + public Map getMinusMap() { + return minusMap; + } + + public Map getMap(PlusMinusZero plusMinusZero) { + if (plusMinusZero == null) { + return null; + } + switch (plusMinusZero) { + case PLUS: return plusMap; + case MINUS: return minusMap; + case ZERO: return zeroMap; + } + // notreached + throw new IllegalStateException(); + } + + public boolean hasPlusMap() { + return (plusMap != null && !plusMap.isEmpty()); + } + + public boolean hasZeroMap() { + return (zeroMap != null && !zeroMap.isEmpty()); + } + + public boolean hasMinusMap() { + return (minusMap != null && !minusMap.isEmpty()); + } + + public boolean isZeroOnly() { + return hasZeroMap() && !hasPlusMap() && !hasMinusMap(); + } + + public void addToPlusMap(K key, V value) { + addToMap(plusMap, key, value); + } + + public void addToMinusMap(K key, V value) { + addToMap(minusMap, key, value); + } + + public void addToZeroMap(K key, V value) { + addToMap(zeroMap, key, value); + } + + public void addAllToPlusMap(Map map) { + addAllToMap(plusMap, map); + } + + public void addAllToMinusMap(Map map) { + addAllToMap(minusMap, map); + } + + public void addAllToZeroMap(Map map) { + addAllToMap(zeroMap, map); + + } + + public void addAllToMap(PlusMinusZero destination, Map map) { + if (destination == null) { + return; + } else if (destination == PlusMinusZero.PLUS) { + addAllToMap(plusMap, map); + } else if (destination == PlusMinusZero.MINUS) { + addAllToMap(minusMap, map); + } else if (destination == PlusMinusZero.ZERO) { + addAllToMap(zeroMap, map); + } + } + + private void addAllToMap(Map set, Map items) { + if (items == null) { + return; + } + for (Entry item: items.entrySet()) { + addToMap(set, item.getKey(), item.getValue()); + } + } + + private void addToMap(Map set, K key, V value) { + if (set == null) { + set = createMap(); + } + set.put(key, value); + } + + public void clearPlusMap() { + clearMap(plusMap); + } + + public void clearMinusMap() { + clearMap(minusMap); + } + + public void clearZeroMap() { + clearMap(zeroMap); + } + + private void clearMap(Map set) { + if (set != null) { + set.clear(); + } + } + + public int size() { + return sizeMap(zeroMap) + sizeMap(plusMap) + sizeMap(minusMap); + } + + private int sizeMap(Map set) { + if (set == null) { + return 0; + } + return set.size(); + } + + public void merge(DeltaMapTriple triple) { + addAllToZeroMap(triple.zeroMap); + addAllToPlusMap(triple.plusMap); + addAllToMinusMap(triple.minusMap); + } + + /** + * Returns all values, regardless of the internal sets. + */ + public Collection unionKeySets() { + return MiscUtil.union(zeroMap.keySet(), plusMap.keySet(), minusMap.keySet()); + } + + public DeltaMapTriple clone(Cloner> cloner) { + DeltaMapTriple clone = new DeltaMapTriple(); + copyValues(clone, cloner); + return clone; + } + + protected void copyValues(DeltaMapTriple clone, Cloner> cloner) { + clone.zeroMap = cloneSet(this.zeroMap, cloner); + clone.plusMap = cloneSet(this.plusMap, cloner); + clone.minusMap = cloneSet(this.minusMap, cloner); + } + + private Map cloneSet(Map origSet, Cloner> cloner) { + if (origSet == null) { + return null; + } + Map clonedSet = createMap(); + for (Entry origVal: origSet.entrySet()) { + Entry clonedVal = cloner.clone(origVal); + clonedSet.put(clonedVal.getKey(), clonedVal.getValue()); + } + return clonedSet; + } + + public boolean isEmpty() { + return isEmpty(minusMap) && isEmpty(plusMap) && isEmpty(zeroMap); + } + + private boolean isEmpty(Map set) { + if (set == null) { + return true; + } + return set.isEmpty(); + } + + @Override + public void accept(SimpleVisitor> visitor) { + acceptMap(visitor, zeroMap); + acceptMap(visitor, plusMap); + acceptMap(visitor, minusMap); + } + + private void acceptMap(SimpleVisitor> visitor, Map set) { + if (set == null) { + return; + } + for (Entry element: set.entrySet()) { + visitor.visit(element); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(debugName()).append("("); + dumpMap(sb, "zero", zeroMap); + dumpMap(sb, "plus", plusMap); + dumpMap(sb, "minus", minusMap); + sb.append(")"); + return sb.toString(); + } + + protected String debugName() { + return "DeltaMapTriple"; + } + + private void dumpMap(StringBuilder sb, String label, Map set) { + sb.append(label).append(": ").append(set).append("; "); + } + + /* (non-Javadoc) + * @see com.evolveum.midpoint.util.DebugDumpable#debugDump() + */ + @Override + public String debugDump() { + return debugDump(0); + } + + /* (non-Javadoc) + * @see com.evolveum.midpoint.util.DebugDumpable#debugDump(int) + */ + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append("DeltaSetTriple:\n"); + debugDumpMap(sb, "zero", zeroMap, indent + 1); + sb.append("\n"); + debugDumpMap(sb, "plus", plusMap, indent + 1); + sb.append("\n"); + debugDumpMap(sb, "minus", minusMap, indent + 1); + return sb.toString(); + } + + private void debugDumpMap(StringBuilder sb, String label, Map set, int indent) { + DebugUtil.debugDumpLabel(sb, label, indent); + sb.append("\n"); + DebugUtil.debugDumpMapMultiLine(sb, set, indent + 1); + } + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaSetTriple.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaSetTriple.java index 6a5c2828d44..c96c6868b32 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaSetTriple.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/DeltaSetTriple.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.Transformer; import java.io.Serializable; import java.util.ArrayList; @@ -324,6 +325,21 @@ private void acceptSet(SimpleVisitor visitor, Collection set) { visitor.visit(element); } } + + public void transform(DeltaSetTriple transformTarget, Transformer transformer) { + for (T orig: getZeroSet()) { + X transformed = transformer.transform(orig); + transformTarget.addToZeroSet(transformed); + } + for (T orig: getPlusSet()) { + X transformed = transformer.transform(orig); + transformTarget.addToPlusSet(transformed); + } + for (T orig: getMinusSet()) { + X transformed = transformer.transform(orig); + transformTarget.addToMinusSet(transformed); + } + } @Override public String toString() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java index 522ae7fe575..8b7200d26d2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java @@ -34,6 +34,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.Visitable; import com.evolveum.midpoint.prism.Visitor; @@ -49,6 +50,7 @@ import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; + import org.apache.commons.lang.Validate; /** @@ -907,19 +909,6 @@ public void simplify() { valuesToDelete = null; } } - - /** - * Apply this delta (path) to a property container. - */ - public void applyTo(PrismContainer> propertyContainer) throws SchemaException { - ItemPath itemPath = getPath(); - Item> item = propertyContainer.findOrCreateItem(itemPath, getItemClass(), getDefinition()); - if (item == null) { - throw new IllegalStateException("Cannot apply delta because cannot find item "+itemPath+" in "+propertyContainer); - } - applyTo(item); - cleanupAllTheWayUp(item); - } private void cleanupAllTheWayUp(Item> item) { if (item.isEmpty()) { @@ -947,30 +936,51 @@ public static void applyTo(Collection extends ItemDelta> deltas, PrismContaine } } - /** - * Apply this delta (path) to a property container. - */ - public void applyTo(PrismContainerValue> propertyContainerVal) throws SchemaException { - ItemPath itemPath = getPath(); - Item> item = propertyContainerVal.findOrCreateItem(itemPath, getItemClass(), getDefinition()); - if (item == null) { - throw new IllegalStateException("Cannot apply delta because cannot find item "+itemPath+" in "+propertyContainerVal); + public static void applyToMatchingPath(Collection extends ItemDelta> deltas, PrismContainer propertyContainer) + throws SchemaException { + for (ItemDelta delta : deltas) { + delta.applyToMatchingPath(propertyContainer); } - applyTo(item); - if (item.isEmpty()) { - propertyContainerVal.remove(item); + } + + public void applyTo(Item item) throws SchemaException { + ItemPath itemPath = item.getPath(); + ItemPath deltaPath = getPath(); + CompareResult compareComplex = itemPath.compareComplex(deltaPath); + if (compareComplex == CompareResult.EQUIVALENT) { + applyToMatchingPath(item); + cleanupAllTheWayUp(item); + } else if (compareComplex == CompareResult.SUBPATH) { + if (item instanceof PrismContainer>) { + PrismContainer> container = (PrismContainer>)item; + ItemPath remainderPath = deltaPath.remainder(itemPath); + Item subItem = container.findOrCreateItem(remainderPath, getItemClass(), getDefinition()); + applyToMatchingPath(subItem); + } else { + throw new SchemaException("Cannot apply delta "+this+" to "+item+" as delta path is below the item path and the item is not a container"); + } + } else if (compareComplex == CompareResult.SUPERPATH) { + throw new SchemaException("Cannot apply delta "+this+" to "+item+" as delta path is above the item path"); + } else if (compareComplex == CompareResult.NO_RELATION) { + throw new SchemaException("Cannot apply delta "+this+" to "+item+" as paths do not match"); } } - + /** - * Apply this delta (path) to a property. + * Applies delta to item were path of the delta and path of the item matches (skips path checks). */ - public void applyTo(Item item) throws SchemaException { + public void applyToMatchingPath(Item item) throws SchemaException { if (item.getDefinition() == null && getDefinition() != null){ item.applyDefinition(getDefinition()); } + if (!getItemClass().isAssignableFrom(item.getClass())) { + throw new SchemaException("Cannot apply delta "+this+" to "+item+" because the deltas is applicable only to "+getItemClass().getSimpleName()); + } if (valuesToReplace != null) { item.replaceAll(PrismValue.cloneCollection(valuesToReplace)); + // Application of delta might have removed values therefore leaving empty items. + // Those needs to be cleaned-up (removed) as empty item is not a legal state. + cleanupAllTheWayUp(item); return; } if (valuesToAdd != null) { @@ -987,9 +997,28 @@ public void applyTo(Item item) throws SchemaException { if (valuesToDelete != null) { item.removeAll(valuesToDelete); } - + // Application of delta might have removed values therefore leaving empty items. + // Those needs to be cleaned-up (removed) as empty item is not a legal state. + cleanupAllTheWayUp(item); + } + + public ItemDelta> getSubDelta(ItemPath path) { + return this; + } + + public boolean isApplicableTo(Item item) { + if (item == null) { + return false; + } + if (!isApplicableToType(item)) { + return false; + } + // TODO: maybe check path? + return true; } + protected abstract boolean isApplicableToType(Item item); + public static void accept(Collection extends ItemDelta> modifications, Visitor visitor, ItemPath path, boolean recursive) { for (ItemDelta modification: modifications) { @@ -1003,19 +1032,6 @@ public static void accept(Collection extends ItemDelta> modifications, Visitor } } - - public I computeChangedItem(I oldItem) throws SchemaException { - if (isEmpty()) { - return oldItem; - } - if (oldItem == null) { - // Instantiate empty item - oldItem = (I) getDefinition().instantiate(); - } - applyTo(oldItem); - return oldItem; - } - /** * Returns the "new" state of the property - the state that would be after * the delta is applied. @@ -1032,17 +1048,36 @@ public Item getItemNew(Item itemOld) throws SchemaException { if (definition == null) { throw new IllegalStateException("No definition in "+this); } + Item itemNew; if (itemOld == null) { if (isEmpty()) { return null; } - itemOld = definition.instantiate(getElementName()); + itemNew = definition.instantiate(getElementName()); + } else { + itemNew = itemOld.clone(); } - Item itemNew = itemOld.clone(); applyTo(itemNew); return itemNew; } + public Item getItemNewMatchingPath(Item itemOld) throws SchemaException { + if (definition == null) { + throw new IllegalStateException("No definition in "+this); + } + Item itemNew; + if (itemOld == null) { + if (isEmpty()) { + return null; + } + itemNew = definition.instantiate(getElementName()); + } else { + itemNew = itemOld.clone(); + } + applyToMatchingPath(itemNew); + return itemNew; + } + /** * Returns true if the other delta is a complete subset of this delta. * I.e. if all the statements of the other delta are already contained @@ -1101,6 +1136,18 @@ private Collection cloneSet(ItemDelta clone, Collection thisSet) { } return clonedSet; } + + public static > Collection cloneCollection(Collection orig) { + if (orig == null) { + return null; + } + Collection clone = new ArrayList<>(orig.size()); + for (D delta: orig) { + clone.add((D)delta.clone()); + } + return clone; + } + @Deprecated public static PrismValueDeltaSetTriple toDeltaSetTriple(Item item, ItemDelta delta, diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java index 1b74698191f..ceafd01a723 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java @@ -19,7 +19,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PartiallyResolvedValue; +import com.evolveum.midpoint.prism.PartiallyResolvedItem; import com.evolveum.midpoint.prism.PathVisitable; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; @@ -269,7 +269,7 @@ private D findItemDelta(ItemPath propertyP public PartiallyResolvedDelta findPartial(ItemPath propertyPath) { if (changeType == ChangeType.ADD) { - PartiallyResolvedValue partialValue = objectToAdd.findPartial(propertyPath); + PartiallyResolvedItem partialValue = objectToAdd.findPartial(propertyPath); if (partialValue == null || partialValue.getItem() == null) { return null; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PlusMinusZero.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PlusMinusZero.java index e434e2e4c06..6473bdbb3cb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PlusMinusZero.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PlusMinusZero.java @@ -26,4 +26,28 @@ public enum PlusMinusZero { PLUS, MINUS, ZERO; + public static PlusMinusZero compute(PlusMinusZero mode1, PlusMinusZero mode2) { + if (mode1 == null || mode2 == null) { + return null; + } + switch (mode1) { + case PLUS: switch (mode2) { + case PLUS: return PlusMinusZero.PLUS; + case ZERO: return PlusMinusZero.PLUS; + case MINUS: return null; + } + case ZERO: switch (mode2) { + case PLUS: return PlusMinusZero.PLUS; + case ZERO: return PlusMinusZero.ZERO; + case MINUS: return PlusMinusZero.MINUS; + } + case MINUS: switch (mode2) { + case PLUS: return null; + case ZERO: return PlusMinusZero.MINUS; + case MINUS: return PlusMinusZero.MINUS; + } + } + // notreached + throw new IllegalStateException(); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java index 65fb196a8df..efae32351f2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java @@ -123,20 +123,8 @@ public P instantiateEmptyProperty() { } @Override - public void applyTo(Item item) throws SchemaException { - if (item instanceof PrismProperty) { - super.applyTo(item); - } else if (item instanceof PrismContainer>) { - PrismContainer> container = (PrismContainer>)item; - ItemPath remainderPath = getPath().remainder(item.getPath()); - PrismProperty> property = container.findProperty(remainderPath); - if (property == null) { - throw new SchemaException("Cannot apply property delta "+this+" to item "+item+" because there is no property with path "+remainderPath); - } - applyTo(property); - } else { - throw new SchemaException("Cannot apply property delta "+this+" to item "+item+" of type "+item.getClass()); - } + protected boolean isApplicableToType(Item item) { + return item instanceof PrismProperty; } @Override @@ -265,16 +253,16 @@ public boolean isRealValueToDelete(PrismPropertyValue> value) { * Returns the "new" state of the property - the state that would be after the delta * is applied. */ - public PrismProperty getPropertyNew() throws SchemaException { - return (PrismProperty) super.getItemNew(); + public PrismProperty getPropertyNewMatchingPath() throws SchemaException { + return (PrismProperty) super.getItemNewMatchingPath(null); } /** * Returns the "new" state of the property - the state that would be after the delta * is applied. */ - public PrismProperty getPropertyNew(PrismProperty propertyOld) throws SchemaException { - return (PrismProperty) super.getItemNew(propertyOld); + public PrismProperty getPropertyNewMatchingPath(PrismProperty propertyOld) throws SchemaException { + return (PrismProperty) super.getItemNewMatchingPath(propertyOld); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java index 0fa4e113d90..21842edc88b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; +import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; @@ -75,13 +76,10 @@ public void applyDefinition(ItemDefinition definition) throws SchemaException { } super.applyDefinition(definition); } - + @Override - public void applyTo(Item item) throws SchemaException { - if (!(item instanceof PrismReference)) { - throw new SchemaException("Cannot apply reference delta "+this+" to item "+item+" of type "+item.getClass()); - } - super.applyTo(item); + protected boolean isApplicableToType(Item item) { + return item instanceof PrismReference; } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java index 4d79edf6ba5..a80ba80cfc9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java @@ -77,7 +77,7 @@ public T normalize(T original) { } @Override - public boolean matches(T a, String regex) { + public boolean matchRegex(T a, String regex) { String valueToMatch = null; if (a instanceof Matchable){ return ((Matchable) a).matches(regex); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java index 23c4016e120..62545bf3182 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java @@ -48,7 +48,7 @@ public interface MatchingRule { /** * Matches value against given regex. */ - boolean matches(T a, String regex); + boolean matchRegex(T a, String regex); /** * Returns a normalized version of the value. diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java index 26c10c8db81..34188aad427 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java @@ -71,7 +71,7 @@ public PolyString normalize(PolyString original) { } @Override - public boolean matches(PolyString a, String regex) { + public boolean matchRegex(PolyString a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java index 0916349fc39..84b690f4184 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java @@ -71,7 +71,7 @@ public PolyString normalize(PolyString original) { } @Override - public boolean matches(PolyString a, String regex) { + public boolean matchRegex(PolyString a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java index 56a670a8e53..e6dd9a71222 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java @@ -71,7 +71,7 @@ public PolyString normalize(PolyString original) { } @Override - public boolean matches(PolyString a, String regex) { + public boolean matchRegex(PolyString a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java index 3088fbc694f..903dbeb8e6d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java @@ -68,7 +68,7 @@ public String normalize(String original) { } @Override - public boolean matches(String a, String regex) { + public boolean matchRegex(String a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java index 171dd81dade..943d643bcf4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java @@ -55,7 +55,7 @@ public static void parseProtectedType(ProtectedDataType protectedType, Ma // xmlCipherData.getSingleSubEntry(ProtectedDataType.F_XML_ENC_CIPHER_VALUE.getLocalPart()); - MapXNode xConvertedEncryptedData = (MapXNode) xLegacyEncryptedData.cloneTransformKeys(new Transformer() { + MapXNode xConvertedEncryptedData = (MapXNode) xLegacyEncryptedData.cloneTransformKeys(new Transformer() { @Override public QName transform(QName in) { String elementName = StringUtils.uncapitalize(in.getLocalPart()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java index b941d62ecf5..b5588417127 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java @@ -155,6 +155,10 @@ public PolyString getAt(int index) { public int length() { return orig.length(); } + + public PolyString trim() { + return new PolyString(orig.trim(), norm.trim()); + } @Override public int hashCode() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index 5fed3f8d7a8..d2b22960d6d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -247,7 +247,7 @@ public boolean match(PrismObject object, MatchingRuleR if (!anchorEnd) { sb.append(".*"); } - if (matching.matches(value, sb.toString())){ + if (matching.matchRegex(value, sb.toString())){ return true; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java index e7a4b47f607..e47b947df11 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java @@ -81,9 +81,15 @@ public static T convert(Class expectedType, Object rawValue) { if (expectedType == Boolean.class && rawValue instanceof String) { return (T) (Boolean)Boolean.parseBoolean(((String)rawValue)); } + if (expectedType == Boolean.class && rawValue instanceof PolyString) { + return (T) (Boolean)Boolean.parseBoolean(((PolyString)rawValue).toString()); + } if (expectedType == boolean.class && rawValue instanceof String) { return (T) (Boolean)Boolean.parseBoolean(((String)rawValue)); } + if (expectedType == boolean.class && rawValue instanceof PolyString) { + return (T) (Boolean)Boolean.parseBoolean(((PolyString)rawValue).toString()); + } if (expectedType == String.class && rawValue instanceof Boolean) { return (T) rawValue.toString(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java index 0756f279468..d85c11b35c2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java @@ -479,6 +479,9 @@ public static XMLGregorianCalendar createXMLGregorianCalendar(int year, int mont } public static long toMillis(XMLGregorianCalendar xmlCal) { + if (xmlCal == null){ + return 0; + } return xmlCal.toGregorianCalendar().getTimeInMillis(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java index d0cfa77bd25..31d608d57c4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java @@ -141,11 +141,11 @@ public XNode clone() { return cloneTransformKeys(null); } - public XNode cloneTransformKeys(Transformer
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java index b6a4911fdbc..aca2ab9d3f0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDialog.java @@ -27,7 +27,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.AjaxSubmitButton; +import com.evolveum.midpoint.web.component.BasicSearchPanel; import com.evolveum.midpoint.web.component.data.ObjectDataProvider; import com.evolveum.midpoint.web.component.data.TablePanel; import com.evolveum.midpoint.web.component.data.column.IconColumn; @@ -50,7 +50,6 @@ import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.*; @@ -62,6 +61,16 @@ */ public class UserBrowserDialog extends ModalWindow { + private static final String ID_SEARCH_FORM = "searchForm"; + private static final String ID_MAIN_FORM = "mainForm"; + private static final String ID_CHECK_NAME = "nameCheck"; + private static final String ID_CHECK_FULL_NAME = "fullNameCheck"; + private static final String ID_CHECK_GIVEN_NAME = "givenNameCheck"; + private static final String ID_CHECK_FAMILY_NAME = "familyNameCheck"; + private static final String ID_BASIC_SEARCH = "basicSearch"; + private static final String ID_BUTTON_CANCEL = "cancelButton"; + private static final String ID_TABLE = "table"; + private static final Trace LOGGER = TraceManager.getTrace(UserBrowserDialog.class); private IModel model; private boolean initialized; @@ -102,44 +111,51 @@ protected void onBeforeRender() { } private void initLayout(WebMarkupContainer content) { - Form mainForm = new Form("mainForm"); + Form mainForm = new Form(ID_MAIN_FORM); content.add(mainForm); - TextField search = new TextField("searchText", new PropertyModel(model, "searchText")); - mainForm.add(search); + Form searchForm = new Form(ID_SEARCH_FORM); + searchForm.setOutputMarkupId(true); + content.add(searchForm); - CheckBox nameCheck = new CheckBox("nameCheck", new PropertyModel(model, "name")); - mainForm.add(nameCheck); - CheckBox fullNameCheck = new CheckBox("fullNameCheck", new PropertyModel(model, "fullName")); - mainForm.add(fullNameCheck); - CheckBox givenNameCheck = new CheckBox("givenNameCheck", new PropertyModel(model, "givenName")); - mainForm.add(givenNameCheck); - CheckBox familyNameCheck = new CheckBox("familyNameCheck", new PropertyModel(model, "familyName")); - mainForm.add(familyNameCheck); +// TextField search = new TextField("searchText", new PropertyModel(model, "searchText")); +// mainForm.add(search); + CheckBox nameCheck = new CheckBox(ID_CHECK_NAME, new PropertyModel(model, UserBrowserDto.F_NAME)); + searchForm.add(nameCheck); + CheckBox fullNameCheck = new CheckBox(ID_CHECK_FULL_NAME, new PropertyModel(model, UserBrowserDto.F_FULL_NAME)); + searchForm.add(fullNameCheck); + CheckBox givenNameCheck = new CheckBox(ID_CHECK_GIVEN_NAME, new PropertyModel(model, UserBrowserDto.F_GIVEN_NAME)); + searchForm.add(givenNameCheck); + CheckBox familyNameCheck = new CheckBox(ID_CHECK_FAMILY_NAME, new PropertyModel(model, UserBrowserDto.F_FAMILY_NAME)); + searchForm.add(familyNameCheck); - List, String>> columns = initColumns(); - TablePanel table = new TablePanel>("table", - new ObjectDataProvider(getPageBase(), UserType.class), columns); - table.setOutputMarkupId(true); - mainForm.add(table); + BasicSearchPanel basicSearch = new BasicSearchPanel(ID_BASIC_SEARCH) { - AjaxSubmitButton searchButton = new AjaxSubmitButton("searchButton", - createStringResource("userBrowserDialog.button.searchButton")) { + @Override + protected IModel createSearchTextModel() { + return new PropertyModel<>(model, UserBrowserDto.F_SEARCH_TEXT); + } @Override - protected void onError(AjaxRequestTarget target, Form> form) { - target.add(getPageBase().getFeedbackPanel()); + protected void searchPerformed(AjaxRequestTarget target) { + UserBrowserDialog.this.searchPerformed(target); } @Override - protected void onSubmit(AjaxRequestTarget target, Form> form) { - searchPerformed(target); + protected void clearSearchPerformed(AjaxRequestTarget target) { + UserBrowserDialog.this.clearSearchPerformed(target); } }; - mainForm.add(searchButton); + searchForm.add(basicSearch); + + List, String>> columns = initColumns(); + TablePanel table = new TablePanel<>(ID_TABLE, + new ObjectDataProvider(getPageBase(), UserType.class), columns); + table.setOutputMarkupId(true); + mainForm.add(table); - AjaxButton cancelButton = new AjaxButton("cancelButton", + AjaxButton cancelButton = new AjaxButton(ID_BUTTON_CANCEL, createStringResource("userBrowserDialog.button.cancelButton")) { @Override @@ -176,7 +192,7 @@ public String getObject() { } }); - IColumn column = new LinkColumn>(createStringResource("userBrowserDialog.name"), "name", "value.name") { + IColumn column = new LinkColumn>(createStringResource("userBrowserDialog.name"), UserBrowserDto.F_NAME, "value.name") { @Override public void onClick(AjaxRequestTarget target, IModel> rowModel) { @@ -186,13 +202,13 @@ public void onClick(AjaxRequestTarget target, IModel> r }; columns.add(column); - column = new PropertyColumn(createStringResource("userBrowserDialog.givenName"), "givenName", "value.givenName"); + column = new PropertyColumn(createStringResource("userBrowserDialog.givenName"), UserBrowserDto.F_GIVEN_NAME, SelectableBean.F_VALUE + ".givenName"); columns.add(column); - column = new PropertyColumn(createStringResource("userBrowserDialog.familyName"), "familyName", "value.familyName"); + column = new PropertyColumn(createStringResource("userBrowserDialog.familyName"), UserBrowserDto.F_FAMILY_NAME, SelectableBean.F_VALUE + ".familyName"); columns.add(column); - column = new PropertyColumn(createStringResource("userBrowserDialog.fullName"), "fullName", "value.fullName.orig"); + column = new PropertyColumn(createStringResource("userBrowserDialog.fullName"), UserBrowserDto.F_FULL_NAME, SelectableBean.F_VALUE + ".fullName.orig"); columns.add(column); column = new AbstractColumn, String>(createStringResource("userBrowserDialog.email")) { @@ -275,6 +291,18 @@ private ObjectQuery createQuery() { return query; } + private void clearSearchPerformed(AjaxRequestTarget target){ + model.setObject(new UserBrowserDto()); + + TablePanel panel = getTable(); + DataTable table = panel.getDataTable(); + ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider(); + provider.setQuery(null); + + target.add(getContent().get(ID_SEARCH_FORM)); + target.add(panel); + } + private void cancelPerformed(AjaxRequestTarget target) { close(target); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java index 0f7a256553c..8295cd5337e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/UserBrowserDto.java @@ -23,6 +23,12 @@ */ public class UserBrowserDto implements Serializable { + public static final String F_SEARCH_TEXT = "searchText"; + public static final String F_NAME = "name"; + public static final String F_FULL_NAME = "fullName"; + public static final String F_GIVEN_NAME = "givenName"; + public static final String F_FAMILY_NAME = "familyName"; + private String searchText; private boolean name = true; private boolean fullName; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java index 669b82df92f..d1f22d2124f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java @@ -20,11 +20,7 @@ import com.evolveum.midpoint.common.validator.EventHandler; import com.evolveum.midpoint.common.validator.EventResult; import com.evolveum.midpoint.common.validator.Validator; -import com.evolveum.midpoint.model.api.ModelDiagnosticService; -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.WorkflowService; +import com.evolveum.midpoint.model.api.*; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; @@ -59,6 +55,8 @@ public abstract class PageBase extends PageTemplate { private static final Trace LOGGER = TraceManager.getTrace(PageBase.class); + @SpringBean(name = "modelController") + private ScriptingService scriptingService; @SpringBean(name = "modelController") private ModelService modelService; @SpringBean(name = "modelController") @@ -121,6 +119,10 @@ public ModelService getModelService() { return modelService; } + public ScriptingService getScriptingService(){ + return scriptingService; + } + public TaskService getTaskService() { return taskService; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java index cc0e429e592..6bfced82ed7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest.java @@ -31,7 +31,7 @@ /** * @author lazyman */ -@PageDescriptor(url = "/admin/test", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) +@PageDescriptor(url = "/admin/test", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageTest extends PageBase { public PageTest() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java index 001b17a520d..ab06869a7a7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageTest2.java @@ -33,7 +33,7 @@ * * @author shood */ -@PageDescriptor(url = "/capability", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL)}) +@PageDescriptor(url = "/capability", action = {@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL)}) public class PageTest2 extends PageBase { private static final String ID_CAPABILITY = "capability"; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java index 29009292c83..dcc1658a1ba 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java @@ -16,12 +16,23 @@ package com.evolveum.midpoint.web.page.admin.configuration; +import com.evolveum.midpoint.model.api.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionResult; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AceEditor; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.page.admin.configuration.dto.BulkActionDto; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; @@ -29,18 +40,24 @@ import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import javax.xml.bind.JAXBElement; + /** * @author lazyman */ @PageDescriptor(url = "/admin/config/bulk", action = { -// @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, -// label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), -// @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#bulkAction", -// label = "PageBulkAction.auth.bulkAction.label", description = "PageBulkAction.auth.bulkAction.description") - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_DEVEL_URL) + @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, + label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#bulkAction", + label = "PageBulkAction.auth.bulkAction.label", description = "PageBulkAction.auth.bulkAction.description") }) public class PageBulkAction extends PageAdminConfiguration { + private static final Trace LOGGER = TraceManager.getTrace(PageBulkAction.class); + + private static final String DOT_CLASS = PageBulkAction.class.getName() + "."; + private static final String OPERATION_PERFORM_BULK = "performBulkAction"; + private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_START = "start"; private static final String ID_EDITOR = "editor"; @@ -78,8 +95,50 @@ protected void onSubmit(AjaxRequestTarget target, Form> form) { } private void startPerformed(AjaxRequestTarget target) { - model.getObject(); + Task task = createSimpleTask(OPERATION_PERFORM_BULK); + OperationResult result = new OperationResult(OPERATION_PERFORM_BULK); + + BulkActionDto bulkActionDto = model.getObject(); + + ScriptingExpressionType expression = null; + try { + Object parsed = getPrismContext().parseAnyValue(bulkActionDto.getScript(), PrismContext.LANG_XML); + if (parsed == null) { + result.recordFatalError("No bulk action object was provided."); + } + if (parsed instanceof JAXBElement) { + parsed = ((JAXBElement) parsed).getValue(); + } + if (parsed instanceof ScriptingExpressionType) { + expression = (ScriptingExpressionType) parsed; + } else { + result.recordFatalError("Provided XML text is not a bulk action object. An instance of {scripting-3}ScriptingExpressionType is expected; you have provided " + parsed.getClass() + " instead."); + } + } catch (SchemaException|RuntimeException e) { + result.recordFatalError("Couldn't parse bulk action object", e); + } + + if (expression != null) { + if (bulkActionDto.isAsync()) { + try { + getScriptingService().evaluateExpressionInBackground(expression, task, result); + result.recordStatus(OperationResultStatus.IN_PROGRESS, task.getName() + " has been successfully submitted to execution"); + } catch (SchemaException|SecurityViolationException e) { + result.recordFatalError("Couldn't submit bulk action to execution", e); + } + } else { + try { + ScriptExecutionResult executionResult = getScriptingService().evaluateExpression(expression, task, result); + result.recordStatus(OperationResultStatus.SUCCESS, "Action executed. Returned " + executionResult.getDataOutput().size() + " item(s). Console and data output available via 'Export to XML' function."); + result.addReturn("console", executionResult.getConsoleOutput()); + result.addCollectionOfSerializablesAsReturn("data", executionResult.getDataOutput()); + } catch (ScriptExecutionException|SchemaException|SecurityViolationException e) { + result.recordFatalError("Couldn't execute bulk action", e); + } + } + } - //todo implement + showResult(result); + target.add(getFeedbackPanel()); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java index dc9e5f4c21a..973101b07a2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageSystemConfiguration.java @@ -112,7 +112,7 @@ private SystemConfigurationDto loadSystemConfiguration() { PrismObject systemConfig = getModelService().getObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), options, task, result); - dto = new SystemConfigurationDto(systemConfig, getMidpointApplication().getProtector()); + dto = new SystemConfigurationDto(systemConfig); result.recordSuccess(); } catch(Exception ex){ LoggingUtils.logException(LOGGER, "Couldn't load system configuration", ex); @@ -399,9 +399,11 @@ private SystemConfigurationType saveNotificationConfiguration(SystemConfiguratio mailServerConfig.setUsername(dto.getUsername()); mailServerConfig.setTransportSecurity(dto.getMailTransportSecurityType()); - ProtectedStringType pass = new ProtectedStringType(); - pass.setClearValue(dto.getPassword()); - mailServerConfig.setPassword(pass); + if(dto.getPassword() != null && StringUtils.isNotEmpty(dto.getPassword())){ + ProtectedStringType pass = new ProtectedStringType(); + pass.setClearValue(dto.getPassword()); + mailServerConfig.setPassword(pass); + } if(mailConfig.getServer().isEmpty()){ if(dto.isConfigured()) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java index 0a32e97652a..08396a46c15 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.web.page.admin.configuration.component; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.util.SimplePanel; @@ -94,11 +95,20 @@ private void initDialog(){ protected void chooseOperationPerformed(AjaxRequestTarget target, ObjectType object){ choosePerformed(target, object); } + + @Override + protected ObjectQuery getDataProviderQuery(){ + return getChooseQuery(); + } }; add(dialog); } + protected ObjectQuery getChooseQuery(){ + return null; + } + private void choosePerformed(AjaxRequestTarget target, ObjectType object){ ModalWindow window = (ModalWindow) get(MODAL_ID_SHOW_CHOOSE_OPTIONS); window.close(target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html index 0723db5670b..6075c9e1507 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/SystemConfigPanel.html @@ -153,8 +153,7 @@ - +
P instantiateEmptyProperty() { } @Override - public void applyTo(Item item) throws SchemaException { - if (item instanceof PrismProperty) { - super.applyTo(item); - } else if (item instanceof PrismContainer>) { - PrismContainer> container = (PrismContainer>)item; - ItemPath remainderPath = getPath().remainder(item.getPath()); - PrismProperty> property = container.findProperty(remainderPath); - if (property == null) { - throw new SchemaException("Cannot apply property delta "+this+" to item "+item+" because there is no property with path "+remainderPath); - } - applyTo(property); - } else { - throw new SchemaException("Cannot apply property delta "+this+" to item "+item+" of type "+item.getClass()); - } + protected boolean isApplicableToType(Item item) { + return item instanceof PrismProperty; } @Override @@ -265,16 +253,16 @@ public boolean isRealValueToDelete(PrismPropertyValue> value) { * Returns the "new" state of the property - the state that would be after the delta * is applied. */ - public PrismProperty getPropertyNew() throws SchemaException { - return (PrismProperty) super.getItemNew(); + public PrismProperty getPropertyNewMatchingPath() throws SchemaException { + return (PrismProperty) super.getItemNewMatchingPath(null); } /** * Returns the "new" state of the property - the state that would be after the delta * is applied. */ - public PrismProperty getPropertyNew(PrismProperty propertyOld) throws SchemaException { - return (PrismProperty) super.getItemNew(propertyOld); + public PrismProperty getPropertyNewMatchingPath(PrismProperty propertyOld) throws SchemaException { + return (PrismProperty) super.getItemNewMatchingPath(propertyOld); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java index 0fa4e113d90..21842edc88b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; +import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; @@ -75,13 +76,10 @@ public void applyDefinition(ItemDefinition definition) throws SchemaException { } super.applyDefinition(definition); } - + @Override - public void applyTo(Item item) throws SchemaException { - if (!(item instanceof PrismReference)) { - throw new SchemaException("Cannot apply reference delta "+this+" to item "+item+" of type "+item.getClass()); - } - super.applyTo(item); + protected boolean isApplicableToType(Item item) { + return item instanceof PrismReference; } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java index 4d79edf6ba5..a80ba80cfc9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/DefaultMatchingRule.java @@ -77,7 +77,7 @@ public T normalize(T original) { } @Override - public boolean matches(T a, String regex) { + public boolean matchRegex(T a, String regex) { String valueToMatch = null; if (a instanceof Matchable){ return ((Matchable) a).matches(regex); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java index 23c4016e120..62545bf3182 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/MatchingRule.java @@ -48,7 +48,7 @@ public interface MatchingRule { /** * Matches value against given regex. */ - boolean matches(T a, String regex); + boolean matchRegex(T a, String regex); /** * Returns a normalized version of the value. diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java index 26c10c8db81..34188aad427 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringNormMatchingRule.java @@ -71,7 +71,7 @@ public PolyString normalize(PolyString original) { } @Override - public boolean matches(PolyString a, String regex) { + public boolean matchRegex(PolyString a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java index 0916349fc39..84b690f4184 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringOrigMatchingRule.java @@ -71,7 +71,7 @@ public PolyString normalize(PolyString original) { } @Override - public boolean matches(PolyString a, String regex) { + public boolean matchRegex(PolyString a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java index 56a670a8e53..e6dd9a71222 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/PolyStringStrictMatchingRule.java @@ -71,7 +71,7 @@ public PolyString normalize(PolyString original) { } @Override - public boolean matches(PolyString a, String regex) { + public boolean matchRegex(PolyString a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java index 3088fbc694f..903dbeb8e6d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/match/StringIgnoreCaseMatchingRule.java @@ -68,7 +68,7 @@ public String normalize(String original) { } @Override - public boolean matches(String a, String regex) { + public boolean matchRegex(String a, String regex) { if (a == null){ return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java index 171dd81dade..943d643bcf4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java @@ -55,7 +55,7 @@ public static void parseProtectedType(ProtectedDataType protectedType, Ma // xmlCipherData.getSingleSubEntry(ProtectedDataType.F_XML_ENC_CIPHER_VALUE.getLocalPart()); - MapXNode xConvertedEncryptedData = (MapXNode) xLegacyEncryptedData.cloneTransformKeys(new Transformer() { + MapXNode xConvertedEncryptedData = (MapXNode) xLegacyEncryptedData.cloneTransformKeys(new Transformer() { @Override public QName transform(QName in) { String elementName = StringUtils.uncapitalize(in.getLocalPart()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java index b941d62ecf5..b5588417127 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/polystring/PolyString.java @@ -155,6 +155,10 @@ public PolyString getAt(int index) { public int length() { return orig.length(); } + + public PolyString trim() { + return new PolyString(orig.trim(), norm.trim()); + } @Override public int hashCode() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index 5fed3f8d7a8..d2b22960d6d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -247,7 +247,7 @@ public boolean match(PrismObject object, MatchingRuleR if (!anchorEnd) { sb.append(".*"); } - if (matching.matches(value, sb.toString())){ + if (matching.matchRegex(value, sb.toString())){ return true; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java index e7a4b47f607..e47b947df11 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java @@ -81,9 +81,15 @@ public static T convert(Class expectedType, Object rawValue) { if (expectedType == Boolean.class && rawValue instanceof String) { return (T) (Boolean)Boolean.parseBoolean(((String)rawValue)); } + if (expectedType == Boolean.class && rawValue instanceof PolyString) { + return (T) (Boolean)Boolean.parseBoolean(((PolyString)rawValue).toString()); + } if (expectedType == boolean.class && rawValue instanceof String) { return (T) (Boolean)Boolean.parseBoolean(((String)rawValue)); } + if (expectedType == boolean.class && rawValue instanceof PolyString) { + return (T) (Boolean)Boolean.parseBoolean(((PolyString)rawValue).toString()); + } if (expectedType == String.class && rawValue instanceof Boolean) { return (T) rawValue.toString(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java index 0756f279468..d85c11b35c2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java @@ -479,6 +479,9 @@ public static XMLGregorianCalendar createXMLGregorianCalendar(int year, int mont } public static long toMillis(XMLGregorianCalendar xmlCal) { + if (xmlCal == null){ + return 0; + } return xmlCal.toGregorianCalendar().getTimeInMillis(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java index d0cfa77bd25..31d608d57c4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java @@ -141,11 +141,11 @@ public XNode clone() { return cloneTransformKeys(null); } - public XNode cloneTransformKeys(Transformer