From 64767f08bcb044ba5ca7b3e8b5cc114f0128e32f Mon Sep 17 00:00:00 2001 From: honchar Date: Fri, 23 Sep 2016 16:05:26 +0200 Subject: [PATCH 1/8] role catalog draft --- .../AssignmentShoppingCartPanel.html | 30 ++++ .../AssignmentShoppingCartPanel.java | 155 ++++++++++++++++++ .../web/component/data/MultiButtonTable.html | 12 ++ .../web/component/data/MultiButtonTable.java | 110 +++++++++++++ .../page/self/PageAssignmentShoppingKart.html | 29 ++++ .../page/self/PageAssignmentShoppingKart.java | 53 ++++++ .../localization/Midpoint.properties | 1 + .../localization/Midpoint_en.properties | 1 + .../security/api/AuthorizationConstants.java | 3 + 9 files changed, 394 insertions(+) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.html new file mode 100644 index 00000000000..ae871fe9e99 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.html @@ -0,0 +1,30 @@ + + + + + + +
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java new file mode 100644 index 00000000000..0052920ad65 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java @@ -0,0 +1,155 @@ +package com.evolveum.midpoint.web.component.assignment; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; +import com.evolveum.midpoint.web.component.data.MultiButtonTable; +import com.evolveum.midpoint.web.component.data.ObjectDataProvider; +import com.evolveum.midpoint.web.component.data.SelectableBeanObjectDataProvider; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.search.Search; +import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.page.admin.orgs.OrgTreePanel; +import com.evolveum.midpoint.web.page.admin.users.component.TreeTablePanel; +import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; +import com.evolveum.midpoint.web.session.PageStorage; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.DropDownChoice; +import org.apache.wicket.model.IModel; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Kate on 20.09.2016. + */ +public class AssignmentShoppingCartPanel extends BasePanel { + private static String ID_TREE_PANEL = "treePanel"; + private static String ID_ASSIGNMENTS_PANEL = "assignmentsPanel"; + + public AssignmentShoppingCartPanel(String id) { + super(id); + } + + public AssignmentShoppingCartPanel(String id, IModel rootOidModel) { + super(id, rootOidModel); + initLayout(); + } + + private void initLayout() { + setOutputMarkupId(true); + OrgTreePanel treePanel = new OrgTreePanel(ID_TREE_PANEL, getModel(), false) { + private static final long serialVersionUID = 1L; + + @Override + protected void selectTreeItemPerformed(SelectableBean selected, + AjaxRequestTarget target) { + AssignmentShoppingCartPanel.this.selectTreeItemPerformed(selected, target); + } + + protected List createTreeMenu() { + return new ArrayList<>(); + } + + @Override + protected List createTreeChildrenMenu() { + return new ArrayList<>(); + } + + }; + treePanel.setOutputMarkupId(true); + add(treePanel); + + + WebMarkupContainer initAssignmentsPanel = new WebMarkupContainer(ID_ASSIGNMENTS_PANEL); + initAssignmentsPanel.setOutputMarkupId(true); + add(initAssignmentsPanel); + + } + + private void selectTreeItemPerformed(SelectableBean selected, AjaxRequestTarget target){ + final OrgType selectedOgr = selected.getValue(); + final ObjectDataProvider provider = initProvider(selectedOgr.getOid()); +if (provider != null){ + long s = provider.size(); + provider.internalIterator(0, s); +} + MultiButtonTable assignmentsTable = new MultiButtonTable(ID_ASSIGNMENTS_PANEL, 3, new IModel>() { + @Override + public List getObject() { + return provider.getAvailableData(); + } + + @Override + public void setObject(List assignmentTypeList) { + + } + + @Override + public void detach() { + + } + }); + assignmentsTable.setOutputMarkupId(true); + replace(assignmentsTable); + target.add(this); + } + + protected ObjectDataProvider initProvider(final String oid) { + + ObjectDataProvider provider = new ObjectDataProvider(getPageBase(), FocusType.class) { + private static final long serialVersionUID = 1L; + + @Override + public AssignmentEditorDto createDataObjectWrapper(PrismObject obj) { + return AssignmentEditorDto.createDtoFromObject(obj.asObjectable(), UserDtoStatus.MODIFY, getPageBase()); + } + + @Override + public void setQuery(ObjectQuery query) { + super.setQuery(query); + } + + @Override + public ObjectQuery getQuery() { + + return createContentQuery(oid); + } + }; + provider.setQuery(createContentQuery(oid)); + + return provider; + } + + protected ObjectQuery createContentQuery(String oid) { +// Search search = searchModel.getObject(); +// ObjectQuery query = search.createObjectQuery(parentPage.getPrismContext()); +// query = addFilterToContentQuery(query); +// return query; + return createMemberQuery(oid); + } + + protected ObjectQuery createMemberQuery(String oid) { + ObjectQuery query = null; + ObjectFilter filter = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL); + query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filter)); + +// TypeFilter roleTypeFilter = TypeFilter.createType(RoleType.COMPLEX_TYPE, filter); +// TypeFilter orgTypeFilter = TypeFilter.createType(OrgType.COMPLEX_TYPE, filter); +// TypeFilter serviceTypeFilter = TypeFilter.createType(ServiceType.COMPLEX_TYPE, filter); +// query = ObjectQuery.createObjectQuery(OrFilter.createOr(roleTypeFilter, orgTypeFilter, serviceTypeFilter)); + return ObjectQuery.createObjectQuery(TypeFilter.createType(RoleType.COMPLEX_TYPE, query.getFilter())); + + } + + +} + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html new file mode 100644 index 00000000000..20c338a0fda --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html @@ -0,0 +1,12 @@ + + + +
+
+
+
+
+ + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java new file mode 100644 index 00000000000..6d3958adc18 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java @@ -0,0 +1,110 @@ +package com.evolveum.midpoint.web.component.data; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.repeater.RepeatingView; +import org.apache.wicket.model.IModel; + +import java.util.List; + +/** + * Created honchar. + */ +public class MultiButtonTable extends BasePanel> { + private static final String ID_ROW = "row"; + private static final String ID_CELL = "cell"; + private static final String ID_BUTTON = "button"; + + private int itemsCount = 0; + private int itemsPerRow = 0; + + public MultiButtonTable (String id){ + super(id); + } + public MultiButtonTable (String id, int itemsPerRow, IModel> model){ + super(id, model); + this.itemsPerRow = itemsPerRow; + initLayout(); + } + + private void initLayout(){ + itemsCount = getModel() != null ? (getModel().getObject() != null ? getModel().getObject().size() : 0) : 0; + if (itemsCount > 0){ + RepeatingView rows = new RepeatingView(ID_ROW); + rows.setOutputMarkupId(true); + add(rows); + int index = 0; + List assignmentsList = getModelObject(); + for (int rowNumber = 0; rowNumber <= itemsCount / itemsPerRow; rowNumber++){ + WebMarkupContainer rowContainer = new WebMarkupContainer(rows.newChildId()); + rows.add(rowContainer); + RepeatingView columns = new RepeatingView(ID_CELL); + columns.setOutputMarkupId(true); + rowContainer.add(columns); + for (int colNumber = 0; colNumber < itemsPerRow; colNumber++){ + WebMarkupContainer colContainer = new WebMarkupContainer(columns.newChildId()); + columns.add(colContainer); + ObjectReferenceType targetRef = assignmentsList.get(index).getTargetRef(); + + colContainer.add(populateCell(Integer.toString(index))); + index++; + if (index >= assignmentsList.size()){ + break; + } + + } + } + } + } + + protected Component populateCell(final String caption){ + IModel captionModel = new IModel() { + @Override + public String getObject() { + return caption; + } + + @Override + public void setObject(String s) { + } + + @Override + public void detach() { + } + }; + AjaxButton button = new AjaxButton(ID_BUTTON, captionModel) { + @Override + public void onClick(AjaxRequestTarget target) { + clickPerformed(target); + } + @Override + public boolean isEnabled(){ + return true; + } + @Override + public boolean isVisible(){ + return true; + } + }; + button.add(new AttributeAppender("class", getButtonCssClass())); + return button; + } + + + + protected String getButtonCssClass(){ + return "col-sm-3 small-box bg-yellow"; + } + + protected void clickPerformed(AjaxRequestTarget target){ + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.html new file mode 100644 index 00000000000..ff16f7825a8 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.html @@ -0,0 +1,29 @@ + + + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java new file mode 100644 index 00000000000..eaf505d9c8e --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java @@ -0,0 +1,53 @@ +package com.evolveum.midpoint.web.page.self; + +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.web.application.AuthorizationAction; +import com.evolveum.midpoint.web.application.PageDescriptor; +import com.evolveum.midpoint.web.component.assignment.AssignmentShoppingCartPanel; +import com.evolveum.midpoint.web.component.assignment.MultipleAssignmentSelectorPanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.model.IModel; + +/** + * Created by honchar. + */ +@PageDescriptor(url = {"/self/assignmentShoppingCart"}, action = { + @AuthorizationAction(actionUri = PageSelf.AUTH_SELF_ALL_URI, + label = PageSelf.AUTH_SELF_ALL_LABEL, + description = PageSelf.AUTH_SELF_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_SELF_ASSIGNMENT_SHOP_KART_URL, + label = "PageAssignmentShoppingKart.auth.requestAssignment.label", + description = "PageAssignmentShoppingKart.auth.requestAssignment.description")}) +public class PageAssignmentShoppingKart extends PageSelf{ + private static final String ID_MAIN_PANEL = "mainPanel"; + private static final String ID_MAIN_FORM = "mainForm"; + + public PageAssignmentShoppingKart(){ + initLayout(); + } + private void initLayout(){ + Form mainForm = new org.apache.wicket.markup.html.form.Form(ID_MAIN_FORM); + add(mainForm); +//TODO get oid of the catalog OrgType object + AssignmentShoppingCartPanel panel = new AssignmentShoppingCartPanel(ID_MAIN_PANEL, new IModel() { + @Override + public String getObject() { + return "3ecc0a04-358a-4a83-9182-d7e4bcf71781"; + } + + @Override + public void setObject(String s) { + + } + + @Override + public void detach() { + + } + }); + mainForm.add(panel); + + } +} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 4a8009c0816..f03ee4408ef 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -3320,3 +3320,4 @@ PageEvaluateMapping.sample.FullName_Delta=Full name mapping (change in givenName PageEvaluateMapping.sample.FullName_Delta_Ref=Full name mapping (change in givenName); source from repository PageEvaluateMapping.sample.FullName_Delta_Cond=Full name mapping with condition (change in givenName) PageEvaluateMapping.sample.OrgName=Deriving attribute from parent org's name +PageAssignmentShoppingKart.title=Assignment request \ No newline at end of file diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties index 2f22ae18bce..53d4a9fd9ba 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties @@ -3279,3 +3279,4 @@ PageEvaluateMapping.sample.FullName_Delta=Full name mapping (change in givenName PageEvaluateMapping.sample.FullName_Delta_Ref=Full name mapping (change in givenName); source from repository PageEvaluateMapping.sample.FullName_Delta_Cond=Full name mapping with condition (change in givenName) PageEvaluateMapping.sample.OrgName=Deriving attribute from parent org's name +PageAssignmentShoppingKart.title=Assignment request \ No newline at end of file diff --git a/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java b/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java index 5d41783af4e..b5e31441d57 100644 --- a/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java +++ b/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java @@ -279,6 +279,9 @@ public class AuthorizationConstants { public static final QName AUTZ_UI_SELF_REQUEST_ROLE_QNAME = new QName(NS_AUTHORIZATION_UI, "selfRequestRole"); public static final String AUTZ_UI_SELF_REQUEST_ROLE_URL = NS_AUTHORIZATION_UI + "#selfRequestRole"; + public static final QName AUTZ_UI_SELF_ASSIGNMENT_SHOP_KART_QNAME = new QName(NS_AUTHORIZATION_UI, "selfRequestAssignment"); + public static final String AUTZ_UI_SELF_ASSIGNMENT_SHOP_KART_URL = NS_AUTHORIZATION_UI + "#selfRequestAssignment"; + public static final QName AUTZ_UI_SELF_DASHBOARD_QNAME = new QName(NS_AUTHORIZATION_UI, "selfDashboard"); public static final String AUTZ_UI_SELF_DASHBOARD_URL = NS_AUTHORIZATION_UI + "#selfDashboard"; From d05dd283366c9a3cf1d8bb080d664f1062a408e6 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Fri, 23 Sep 2016 18:48:45 +0200 Subject: [PATCH 2/8] REST API call samples - story unix ldap advanced --- .../unix-ldap-advanced/ldif/create-user.ldif | 9 ++++ .../rest/create-new-machine.xml | 41 +++++++++++++++++++ ...modify-assign-parametric-role-valid-to.xml | 16 ++++++++ .../rest/modify-assign-parametric-role.xml | 13 ++++++ .../rest/modify-unassign-parametric-role.xml | 13 ++++++ 5 files changed, 92 insertions(+) create mode 100644 samples/stories/unix-ldap-advanced/ldif/create-user.ldif create mode 100644 samples/stories/unix-ldap-advanced/rest/create-new-machine.xml create mode 100644 samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role-valid-to.xml create mode 100644 samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role.xml create mode 100644 samples/stories/unix-ldap-advanced/rest/modify-unassign-parametric-role.xml diff --git a/samples/stories/unix-ldap-advanced/ldif/create-user.ldif b/samples/stories/unix-ldap-advanced/ldif/create-user.ldif new file mode 100644 index 00000000000..70f8072941c --- /dev/null +++ b/samples/stories/unix-ldap-advanced/ldif/create-user.ldif @@ -0,0 +1,9 @@ +dn: uid=syncUser,ou=People,dc=example,dc=com +uid: syncUser +cn: Sync User +sn: User +givenname: Sync +objectclass: top +objectclass: person +objectclass: organizationalPerson +objectclass: inetOrgPerson diff --git a/samples/stories/unix-ldap-advanced/rest/create-new-machine.xml b/samples/stories/unix-ldap-advanced/rest/create-new-machine.xml new file mode 100644 index 00000000000..9d2dfaa5263 --- /dev/null +++ b/samples/stories/unix-ldap-advanced/rest/create-new-machine.xml @@ -0,0 +1,41 @@ + + m1011 + Members will be user dn's who have access to this machine. + + + + name + m1set + + + + + 5 + + + + + + name + m1set + + + + + + + + + name + Metarole for Services + + + + + Set 1 Machine 001 + m1 + diff --git a/samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role-valid-to.xml b/samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role-valid-to.xml new file mode 100644 index 00000000000..aefe9731524 --- /dev/null +++ b/samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role-valid-to.xml @@ -0,0 +1,16 @@ + + + add + assignment + + + + + 2016-12-31T00:00:00.000Z + + + + diff --git a/samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role.xml b/samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role.xml new file mode 100644 index 00000000000..4d074377920 --- /dev/null +++ b/samples/stories/unix-ldap-advanced/rest/modify-assign-parametric-role.xml @@ -0,0 +1,13 @@ + + + add + assignment + + + + + + diff --git a/samples/stories/unix-ldap-advanced/rest/modify-unassign-parametric-role.xml b/samples/stories/unix-ldap-advanced/rest/modify-unassign-parametric-role.xml new file mode 100644 index 00000000000..12c8a34cba8 --- /dev/null +++ b/samples/stories/unix-ldap-advanced/rest/modify-unassign-parametric-role.xml @@ -0,0 +1,13 @@ + + + delete + c:assignment + + + + + + From 02dc198ed7592371cf09fa1036787dcb7c5e51ec Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 23 Sep 2016 23:52:27 +0200 Subject: [PATCH 3/8] MID-2422: Sending custom events via bulk actions --- .../schema/constants/SchemaConstants.java | 1 + .../public/common/common-notifications-3.xsd | 8 +- model/model-impl/pom.xml | 5 + .../midpoint/model/impl/ModelRestService.java | 1 + .../midpoint/model/impl/scripting/Data.java | 4 + .../impl/scripting/ExecutionContext.java | 11 +- .../scripting/actions/NotifyExecutor.java | 103 +++++++++++++++++ .../scripting/helpers/ExpressionHelper.java | 15 +-- .../intest/scripting/TestScriptingBasic.java | 66 ++++++++++- .../resources/common/system-configuration.xml | 27 +++++ .../notification-about-jack-type2.xml | 67 +++++++++++ .../scripting/notification-about-jack.xml | 51 +++++++++ .../notifications/api/events/BaseEvent.java | 19 +++- .../notifications/api/events/CustomEvent.java | 106 ++++++++++++++++++ .../notifications/api/events/Event.java | 6 + .../impl/NotificationManagerImpl.java | 6 +- .../send-notifications-about-all-users.xml | 59 ++++++++++ 17 files changed, 535 insertions(+), 20 deletions(-) create mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/NotifyExecutor.java create mode 100644 model/model-intest/src/test/resources/scripting/notification-about-jack-type2.xml create mode 100644 model/model-intest/src/test/resources/scripting/notification-about-jack.xml create mode 100644 model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/CustomEvent.java create mode 100644 samples/tasks/bulk-actions/send-notifications-about-all-users.xml diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 846b4301894..0f1b7abadd3 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -278,6 +278,7 @@ public abstract class SchemaConstants { public static final QName SE_EXECUTE_SCRIPT = new QName(SCRIPTING_EXTENSION_NS, "executeScript"); public static final QName C_EVENT = new QName(NS_C, "event"); + public static final QName C_EVENT_HANDLER = new QName(NS_C, "eventHandler"); // TODO: no such element in common-3 - is it OK? public static final QName C_TEXT_FORMATTER = new QName(NS_C, "textFormatter"); public static final QName C_TRANSPORT_NAME = new QName(NS_C, "transportName"); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-notifications-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-notifications-3.xsd index 21cc687a4e7..e8549275878 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-notifications-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-notifications-3.xsd @@ -539,6 +539,13 @@ + + + + + + + @@ -822,7 +829,6 @@ - diff --git a/model/model-impl/pom.xml b/model/model-impl/pom.xml index 371c21c1a12..c2b56a66e3d 100644 --- a/model/model-impl/pom.xml +++ b/model/model-impl/pom.xml @@ -127,6 +127,11 @@ security-api 3.5-SNAPSHOT + + com.evolveum.midpoint.model + notifications-api + 3.5-SNAPSHOT + commons-io diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java index 4204b068934..8cf634aaaf2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java @@ -707,6 +707,7 @@ public Response executeScript(ScriptingExpressionType scr response = builder.build(); } catch (Exception ex) { response = RestServiceUtil.handleException(ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't execute script.", ex); } result.computeStatus(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java index 37c23aa3521..d9a5f2ce2fa 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.EventHandlerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import org.jetbrains.annotations.NotNull; @@ -120,6 +121,9 @@ public static Data createProperty(List objects, Class clazz, PrismCon } else if (ObjectDeltaType.class.isAssignableFrom(clazz)) { elementName = SchemaConstants.T_OBJECT_DELTA; typeName = SchemaConstants.T_OBJECT_DELTA_TYPE; + } else if (EventHandlerType.class.isAssignableFrom(clazz)) { + elementName = SchemaConstants.C_EVENT_HANDLER; + typeName = EventHandlerType.COMPLEX_TYPE; } else { throw new IllegalStateException("Unsupported data class (to be put into scripting data as property): " + clazz); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ExecutionContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ExecutionContext.java index d4cd0024912..35810380c2e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ExecutionContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ExecutionContext.java @@ -34,7 +34,7 @@ public class ExecutionContext { private static final Trace LOGGER = TraceManager.getTrace(ExecutionContext.class); - private Task task; + private final Task task; private StringBuilder consoleOutput = new StringBuilder(); private Map variables = new HashMap<>(); private Data finalOutput; // used only when passing result to external clients (TODO do this more cleanly) @@ -47,11 +47,6 @@ public Task getTask() { return task; } - public void setTask(Task task) { - this.task = task; - } - - public Data getVariable(String variableName) { return variables.get(variableName); } @@ -91,4 +86,8 @@ public ScriptExecutionResult toExecutionResult() { ScriptExecutionResult result = new ScriptExecutionResult(getConsoleOutput(), items); return result; } + + public String getChannel() { + return task != null ? task.getChannel() : null; + } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/NotifyExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/NotifyExecutor.java new file mode 100644 index 00000000000..eefc009c228 --- /dev/null +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/NotifyExecutor.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2010-2016 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.model.impl.scripting.actions; + +import com.evolveum.midpoint.model.api.ScriptExecutionException; +import com.evolveum.midpoint.model.impl.scripting.Data; +import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; +import com.evolveum.midpoint.notifications.api.NotificationManager; +import com.evolveum.midpoint.notifications.api.events.CustomEvent; +import com.evolveum.midpoint.notifications.api.events.Event; +import com.evolveum.midpoint.prism.Item; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.LightweightIdentifierGenerator; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.EventHandlerType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.EventOperationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.EventStatusType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @author mederly + */ +@Component +public class NotifyExecutor extends BaseActionExecutor { + + @Autowired + private LightweightIdentifierGenerator lightweightIdentifierGenerator; + + @Autowired(required = false) // During some tests this might be unavailable + private NotificationManager notificationManager; + + private static final Trace LOGGER = TraceManager.getTrace(NotifyExecutor.class); + + private static final String NAME = "notify"; + private static final String PARAM_SUBTYPE = "subtype"; + private static final String PARAM_HANDLER = "handler"; + private static final String PARAM_STATUS = "status"; + private static final String PARAM_OPEARATION = "operation"; + private static final String PARAM_FOR_WHOLE_INPUT = "forWholeInput"; + + @PostConstruct + public void init() { + scriptingExpressionEvaluator.registerActionExecutor(NAME, this); + } + + @Override + public Data execute(ActionExpressionType expression, Data input, ExecutionContext context, OperationResult result) throws ScriptExecutionException { + + String subtype = expressionHelper.getArgumentAsString(expression.getParameter(), PARAM_SUBTYPE, input, context, null, PARAM_SUBTYPE, result); + EventHandlerType handler = expressionHelper.getSingleArgumentValue(expression.getParameter(), PARAM_HANDLER, false, false, + PARAM_HANDLER, input, context, EventHandlerType.class, result); + EventStatusType status = expressionHelper.getSingleArgumentValue(expression.getParameter(), PARAM_STATUS, false, false, + PARAM_STATUS, input, context, EventStatusType.class, result); + EventOperationType operation = expressionHelper.getSingleArgumentValue(expression.getParameter(), PARAM_OPEARATION, false, false, + PARAM_OPEARATION, input, context, EventOperationType.class, result); + boolean forWholeInput = expressionHelper.getArgumentAsBoolean(expression.getParameter(), PARAM_FOR_WHOLE_INPUT, input, context, false, PARAM_SUBTYPE, result); + + if (status == null) { + status = EventStatusType.SUCCESS; + } + if (operation == null) { + operation = EventOperationType.ADD; + } + + if (notificationManager == null) { + throw new IllegalStateException("Notification manager is unavailable"); + } + + int eventCount = 0; + if (forWholeInput) { + Event event = new CustomEvent(lightweightIdentifierGenerator, subtype, handler, input.getData(), operation, status, context.getChannel()); + notificationManager.processEvent(event, context.getTask(), result); + eventCount++; + } else { + for (Item item : input.getData()) { + Event event = new CustomEvent(lightweightIdentifierGenerator, subtype, handler, item, operation, status, context.getChannel()); + notificationManager.processEvent(event, context.getTask(), result); + eventCount++; + } + } + context.println("Produced " + eventCount + " event(s)"); + return Data.createEmpty(); + } +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java index 2a96d2f34ff..7e4c8c563a0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java @@ -16,16 +16,16 @@ package com.evolveum.midpoint.model.impl.scripting.helpers; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.util.JavaTypeConverter; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionParameterValueType; - import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; @@ -140,13 +140,10 @@ public T getSingleArgumentValue(List arguments, St throw new ScriptExecutionException("A prism property value was expected in '" + parameterName + "' parameter. Got " + prismValue.getClass().getName() + " instead."); } Object value = ((PrismPropertyValue) prismValue).getValue(); - if (clazz.isAssignableFrom(value.getClass())) { - @SuppressWarnings("unchecked") - T rv = (T) value; - return rv; - } else { - throw new ScriptExecutionException("A value of " + clazz.getName() + " was expected in '" + parameterName - + "' parameter. Got " + value.getClass().getName() + " instead."); + try { + return JavaTypeConverter.convert(clazz, value); + } catch (Throwable t) { + throw new ScriptExecutionException("Couldn't retrieve value of parameter '" + parameterName + "': " + t.getMessage(), t); } } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index 68f7b23170a..9094be0426f 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest; +import com.evolveum.midpoint.notifications.api.transports.Message; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; @@ -78,6 +79,8 @@ public class TestScriptingBasic extends AbstractInitializedModelIntegrationTest private static final File ASSIGN_TO_JACK_2_FILE = new File(TEST_DIR, "assign-to-jack-2.xml"); private static final File PURGE_DUMMY_BLACK_SCHEMA_FILE = new File(TEST_DIR, "purge-dummy-black-schema.xml"); private static final File TEST_DUMMY_RESOURCE_FILE = new File(TEST_DIR, "test-dummy-resource.xml"); + private static final File NOTIFICATION_ABOUT_JACK_FILE = new File(TEST_DIR, "notification-about-jack.xml"); + private static final File NOTIFICATION_ABOUT_JACK_TYPE2_FILE = new File(TEST_DIR, "notification-about-jack-type2.xml"); private static final File SCRIPTING_USERS_FILE = new File(TEST_DIR, "scripting-users.xml"); @Autowired @@ -556,7 +559,68 @@ public void test410TestResource() throws Exception { assertEquals("Tested resource:10000000-0000-0000-0000-000000000004(Dummy Resource): SUCCESS\n", output.getConsoleOutput()); } - @Test + @Test + public void test420NotificationAboutJack() throws Exception { + final String TEST_NAME = "test420NotificationAboutJack"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(NOTIFICATION_ABOUT_JACK_FILE); + prepareNotifications(); + + // WHEN + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); + + // THEN + IntegrationTestTools.display("output", output.getFinalOutput()); + IntegrationTestTools.display("stdout", output.getConsoleOutput()); + result.computeStatus(); + TestUtil.assertSuccess(result); + assertEquals(0, output.getFinalOutput().getData().size()); + assertEquals("Produced 1 event(s)\n", output.getConsoleOutput()); + + IntegrationTestTools.display("Dummy transport", dummyTransport); + checkDummyTransportMessages("Custom", 1); + Message m = dummyTransport.getMessages("dummy:Custom").get(0); + assertEquals("Wrong message body", "jack/" + USER_JACK_OID, m.getBody()); + assertEquals("Wrong message subject", "Ad hoc notification", m.getSubject()); + } + + @Test + public void test430NotificationAboutJackType2() throws Exception { + final String TEST_NAME = "test430NotificationAboutJackType2"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(NOTIFICATION_ABOUT_JACK_TYPE2_FILE); + prepareNotifications(); + + // WHEN + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); + + // THEN + IntegrationTestTools.display("output", output.getFinalOutput()); + IntegrationTestTools.display("stdout", output.getConsoleOutput()); + result.computeStatus(); + TestUtil.assertSuccess(result); + assertEquals(0, output.getFinalOutput().getData().size()); + assertEquals("Produced 1 event(s)\n", output.getConsoleOutput()); + + IntegrationTestTools.display("Dummy transport", dummyTransport); + checkDummyTransportMessages("Custom", 1); + Message m = dummyTransport.getMessages("dummy:Custom").get(0); + assertEquals("Wrong message body", "1", m.getBody()); + assertEquals("Wrong message subject", "Ad hoc notification 2", m.getSubject()); + + checkDummyTransportMessages("CustomType2", 1); + m = dummyTransport.getMessages("dummy:CustomType2").get(0); + assertEquals("Wrong message body", "[user:c0c010c0-d34d-b33f-f00d-111111111111(jack)]", m.getBody()); + assertEquals("Wrong message subject", "Failure notification of type 2", m.getSubject()); + } + + @Test public void test500ScriptingUsers() throws Exception { final String TEST_NAME = "test500ScriptingUsers"; TestUtil.displayTestTile(this, TEST_NAME); diff --git a/model/model-intest/src/test/resources/common/system-configuration.xml b/model/model-intest/src/test/resources/common/system-configuration.xml index 321153eec79..f1fd9694190 100644 --- a/model/model-intest/src/test/resources/common/system-configuration.xml +++ b/model/model-intest/src/test/resources/common/system-configuration.xml @@ -135,6 +135,33 @@ dummy:simpleUserNotifier-FAILURE + + customEvent + delete + failure + + + + + + recipient@evolveum.com + + + Failure notification of type 2 + + + + + dummy:CustomType2 + + target/mail-notifications.log diff --git a/model/model-intest/src/test/resources/scripting/notification-about-jack-type2.xml b/model/model-intest/src/test/resources/scripting/notification-about-jack-type2.xml new file mode 100644 index 00000000000..4350bdcc7c4 --- /dev/null +++ b/model/model-intest/src/test/resources/scripting/notification-about-jack-type2.xml @@ -0,0 +1,67 @@ + + + + + c:UserType + + + c:name + jack + + + + notify + + subtype + type2 + + + operation + delete + + + status + failure + + + forWholeInput + true + + + handler + + + + recipient@evolveum.com + + + Ad hoc notification 2 + + + + + dummy:Custom + + + + + \ No newline at end of file diff --git a/model/model-intest/src/test/resources/scripting/notification-about-jack.xml b/model/model-intest/src/test/resources/scripting/notification-about-jack.xml new file mode 100644 index 00000000000..d87a4a3ef91 --- /dev/null +++ b/model/model-intest/src/test/resources/scripting/notification-about-jack.xml @@ -0,0 +1,51 @@ + + + + + c:UserType + + + c:name + jack + + + + notify + + handler + + + + recipient@evolveum.com + + + Ad hoc notification + + + + + dummy:Custom + + + + + \ No newline at end of file diff --git a/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/BaseEvent.java b/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/BaseEvent.java index 86bf09aad4b..402d939d0b8 100644 --- a/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/BaseEvent.java +++ b/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/BaseEvent.java @@ -44,6 +44,12 @@ public abstract class BaseEvent implements Event { private LightweightIdentifier id; // randomly generated event ID private SimpleObjectRef requester; // who requested this operation (null if unknown) + /** + * If needed, we can prescribe the handler that should process this event. It is recommended only for ad-hoc situations. + * A better is to define handlers in system configuration. + */ + protected final EventHandlerType adHocHandler; + private transient NotificationFunctions notificationFunctions; // needs not be set when creating an event ... it is set in NotificationManager // about who is this operation (null if unknown); @@ -57,10 +63,15 @@ public abstract class BaseEvent implements Event { private String channel; public BaseEvent(LightweightIdentifierGenerator lightweightIdentifierGenerator) { - id = lightweightIdentifierGenerator.generate(); + this(lightweightIdentifierGenerator, null); } - public LightweightIdentifier getId() { + public BaseEvent(LightweightIdentifierGenerator lightweightIdentifierGenerator, EventHandlerType adHocHandler) { + id = lightweightIdentifierGenerator.generate(); + this.adHocHandler = adHocHandler; + } + + public LightweightIdentifier getId() { return id; } @@ -350,4 +361,8 @@ public String getStatusAsText() { } } + @Override + public EventHandlerType getAdHocHandler() { + return adHocHandler; + } } diff --git a/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/CustomEvent.java b/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/CustomEvent.java new file mode 100644 index 00000000000..533492d7b03 --- /dev/null +++ b/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/CustomEvent.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2010-2016 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.notifications.api.events; + +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.task.api.LightweightIdentifierGenerator; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author mederly + */ +public class CustomEvent extends BaseEvent { + + private static final Trace LOGGER = TraceManager.getTrace(CustomEvent.class); + + private final String subtype; + /** + * Any object, e.g. PrismObject, any Item, any PrismValue, any real value. It can be even null. + */ + private final Object object; + @NotNull private final EventStatusType status; + @NotNull private final EventOperationType operationType; + + public CustomEvent(LightweightIdentifierGenerator lightweightIdentifierGenerator, @Nullable String subtype, @Nullable EventHandlerType adHocHandler, + @Nullable Object object, @NotNull EventOperationType operationType, @NotNull EventStatusType status, String channel) { + super(lightweightIdentifierGenerator, adHocHandler); + this.subtype = subtype; + this.object = object; + this.status = status; + this.operationType = operationType; + setChannel(channel); + } + + @NotNull + public EventOperationType getOperationType() { + return operationType; + } + + @NotNull + public EventStatusType getStatus() { + return status; + } + + @Override + public boolean isStatusType(EventStatusType eventStatusType) { + return status == eventStatusType; + } + + @Override + public boolean isOperationType(EventOperationType eventOperationType) { + return this.operationType == eventOperationType; + } + + @Override + public boolean isCategoryType(EventCategoryType eventCategoryType) { + return eventCategoryType == EventCategoryType.CUSTOM_EVENT; + } + + @Nullable + public String getSubtype() { + return subtype; + } + + @Nullable + public Object getObject() { + return object; + } + + @Override + public boolean isRelatedToItem(ItemPath itemPath) { + // TODO implement if needed + return false; + } + + @Override + public boolean isUserRelated() { + if (object instanceof UserType) { + return true; + } else if (object instanceof PrismObject) { + PrismObject prismObject = (PrismObject) object; + return prismObject.getCompileTimeClass() != null && UserType.class.isAssignableFrom(prismObject.getCompileTimeClass()); + } else { + return false; + } + } + +} diff --git a/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/Event.java b/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/Event.java index 47276c67ee0..e6f0d3939a6 100644 --- a/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/Event.java +++ b/model/notifications-api/src/main/java/com/evolveum/midpoint/notifications/api/events/Event.java @@ -103,4 +103,10 @@ public interface Event { boolean isRelatedToItem(ItemPath itemPath); String getChannel(); + + /** + * If needed, we can prescribe the handler that should process this event. It is recommended only for ad-hoc situations. + * A better is to define handlers in system configuration. + */ + EventHandlerType getAdHocHandler(); } diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/NotificationManagerImpl.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/NotificationManagerImpl.java index 38d80339652..314a8ab6f51 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/NotificationManagerImpl.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/NotificationManagerImpl.java @@ -124,12 +124,16 @@ public void processEvent(@Nullable Event event, Task task, OperationResult resul LOGGER.trace("NotificationManager processing event {}", event); + if (event.getAdHocHandler() != null) { + processEvent(event, event.getAdHocHandler(), task, result); + } + SystemConfigurationType systemConfigurationType = NotificationFuctionsImpl.getSystemConfiguration(cacheRepositoryService, result); if (systemConfigurationType == null) { // something really wrong happened (or we are doing initial import of objects) return; } if (systemConfigurationType.getNotificationConfiguration() == null) { - LOGGER.trace("No notification configuration in repository, exiting the change listener."); + LOGGER.trace("No notification configuration in repository, finished event processing."); return; } diff --git a/samples/tasks/bulk-actions/send-notifications-about-all-users.xml b/samples/tasks/bulk-actions/send-notifications-about-all-users.xml new file mode 100644 index 00000000000..4656b0ebfc5 --- /dev/null +++ b/samples/tasks/bulk-actions/send-notifications-about-all-users.xml @@ -0,0 +1,59 @@ + + + + Execute send notifications on objects 1 to 0 + + + + + UserType + + + notify + + subtype + type1 + + + handler + + + + recipient@evolveum.com + + + + http://midpoint.evolveum.com/xml/ns/public/expression/language#velocity + event.object is '$event.object.name' with OID of $event.object.oid + + + mail + + + + + + + + + 1474665896757:987750751 + + runnable + BulkActions + http://midpoint.evolveum.com/xml/ns/public/model/scripting/handler-3 + single + From 963e0917094f9206cc9815d491fc4bdb61d9bea2 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Mon, 26 Sep 2016 15:14:18 +0200 Subject: [PATCH 4/8] Prism monitoring (object clone operations). Refactoring: internals config and monitor are in schema component now. --- .../web/component/prism/ObjectWrapper.java | 2 +- .../admin/configuration/PageInternals.java | 2 +- .../configuration/dto/InternalsConfigDto.java | 2 +- .../midpoint/web/TestCleanStartup.java | 2 +- .../common/LoggingConfigurationManager.java | 1 + .../refinery/RefinedResourceSchema.java | 2 +- .../evolveum/midpoint/prism/PrismContext.java | 15 +- .../evolveum/midpoint/prism/PrismObject.java | 9 + .../midpoint/prism/util/PrismMonitor.java | 35 + .../schema/MidPointPrismContextFactory.java | 8 + .../schema/internals}/CachingStatistics.java | 2 +- .../schema/internals}/InternalMonitor.java | 42 +- .../schema/internals}/InternalsConfig.java | 17 +- .../model/common/expression/Expression.java | 2 +- ...gnmentTargetSearchExpressionEvaluator.java | 2 +- ...iationTargetSearchExpressionEvaluator.java | 2 +- .../script/jsr223/Jsr223ScriptEvaluator.java | 2 +- .../velocity/VelocityScriptEvaluator.java | 2 +- .../model/common/mapping/Mapping.java | 2 +- .../common/expression/TestExpression.java | 2 +- .../expression/script/TestScriptCaching.java | 2 +- .../impl/controller/SchemaTransformer.java | 2 +- .../model/impl/lens/ChangeExecutor.java | 4 +- .../midpoint/model/impl/lens/Clockwork.java | 2 +- .../model/impl/lens/ContextFactory.java | 2 +- .../projector/ConsolidationProcessor.java | 4 +- .../impl/lens/projector/ContextLoader.java | 4 +- .../lens/projector/DependencyProcessor.java | 2 +- .../impl/lens/projector/FocusProcessor.java | 2 +- .../projector/ProjectionValuesProcessor.java | 2 +- .../model/impl/lens/projector/Projector.java | 2 +- .../impl/sync/SynchronizationServiceImpl.java | 4 +- .../model/impl/TestRefinedSchema.java | 2 +- .../model/impl/lens/TestClockwork.java | 2 +- .../model/impl/lens/TestProjector.java | 2 +- .../midpoint/model/intest/TestCaseIgnore.java | 2 +- .../intest/TestModelServiceContract.java | 2 +- .../TestModelServiceContractDeprecated.java | 2 +- .../model/intest/TestNotifications.java | 2 +- .../midpoint/model/intest/TestResources.java | 36 +- .../model/intest/importer/ImportTest.java | 2 +- .../intest/scripting/TestScriptingBasic.java | 2 +- .../model/intest/sync/TestImportRecon.java | 2 +- .../sync/TestImportReconDeprecated.java | 2 +- .../midpoint/model/intest/sync/TestUuid.java | 2 +- .../test/AbstractModelIntegrationTest.java | 2 +- .../ChangeNotificationDispatcherImpl.java | 2 +- .../provisioning/impl/ConnectorManager.java | 2 +- .../impl/ProvisioningServiceImpl.java | 2 +- .../provisioning/impl/ResourceManager.java | 2 +- .../impl/ResourceObjectConverter.java | 2 +- .../provisioning/impl/ShadowCache.java | 4 +- .../ucf/impl/ConnectorInstanceIcfImpl.java | 2 +- .../provisioning/impl/TestDBTable.java | 2 +- .../impl/dummy/AbstractDummyTest.java | 6 +- .../impl/dummy/TestDummyLegacy.java | 2 +- .../TestDummyPrioritiesAndReadReplace.java | 2 +- .../TestDummyResourceAndSchemaCaching.java | 4 +- .../impl/dummy/TestDummySchemaless.java | 2 +- .../impl/opendj/AbstractOpenDjTest.java | 2 +- .../impl/opendj/TestSynchronization.java | 2 +- .../repo/sql/SqlRepositoryServiceImpl.java | 2 +- .../repo/sql/helpers/ObjectRetriever.java | 2 +- .../test/AbstractIntegrationTest.java | 32 +- .../testing/longtest/TestLdapUniversity.java | 2 +- .../testing/rest/TestRestService.java | 4 +- .../midpoint/testing/story/TestVillage.java | 93 +- .../resources/village/resource-opendj.xml | 857 ++++++++++++++++++ 68 files changed, 1197 insertions(+), 80 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismMonitor.java rename infra/{common/src/main/java/com/evolveum/midpoint/common/monitor => schema/src/main/java/com/evolveum/midpoint/schema/internals}/CachingStatistics.java (97%) rename infra/{common/src/main/java/com/evolveum/midpoint/common/monitor => schema/src/main/java/com/evolveum/midpoint/schema/internals}/InternalMonitor.java (83%) rename infra/{common/src/main/java/com/evolveum/midpoint/common => schema/src/main/java/com/evolveum/midpoint/schema/internals}/InternalsConfig.java (78%) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java index 45af5beb931..8cc37566655 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.web.component.prism; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; @@ -26,6 +25,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.util.DebugDumpable; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageInternals.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageInternals.java index c8cd6056ce8..c597c1005b9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageInternals.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageInternals.java @@ -17,8 +17,8 @@ package com.evolveum.midpoint.web.page.admin.configuration; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.util.DebugUtil; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/InternalsConfigDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/InternalsConfigDto.java index daae9b656ec..2011de17627 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/InternalsConfigDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/InternalsConfigDto.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.web.page.admin.configuration.dto; -import com.evolveum.midpoint.common.InternalsConfig; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.QNameUtil; diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestCleanStartup.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestCleanStartup.java index 970156502b7..61bec79eaba 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestCleanStartup.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestCleanStartup.java @@ -27,12 +27,12 @@ import org.testng.AssertJUnit; import org.testng.annotations.Test; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.LoggingConfigurationManager; import com.evolveum.midpoint.init.InfraInitialSetup; import com.evolveum.midpoint.init.InitialDataImport; import com.evolveum.midpoint.init.ModelInitialSetup; import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.LogfileTestTailer; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/LoggingConfigurationManager.java b/infra/common/src/main/java/com/evolveum/midpoint/common/LoggingConfigurationManager.java index 2ca1f92adab..92181c4466a 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/LoggingConfigurationManager.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/LoggingConfigurationManager.java @@ -32,6 +32,7 @@ import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.util.StatusPrinter; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java index 20bade58bb6..74b293784c9 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java @@ -29,12 +29,12 @@ import org.apache.commons.lang.Validate; import org.w3c.dom.Element; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; 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 405161f89da..acfc196b77a 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 @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DebugUtil; @@ -64,6 +65,8 @@ public class PrismContext { private SchemaDefinitionFactory definitionFactory; private PolyStringNormalizer defaultPolyStringNormalizer; private Map parserMap; + private PrismMonitor monitor = null; + @Autowired private Protector defaultProtector; @@ -187,10 +190,18 @@ public Protector getDefaultProtector() { public void setDefaultProtector(Protector defaultProtector) { this.defaultProtector = defaultProtector; } - + + public PrismMonitor getMonitor() { + return monitor; + } + + public void setMonitor(PrismMonitor monitor) { + this.monitor = monitor; + } + //endregion - //region Parsing Prism objects + //region Parsing Prism objects /** * Parses a file and creates a prism from it. Autodetect language. * @throws IOException diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java index 562677ec829..b056c102378 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java @@ -208,8 +208,17 @@ public void addReplaceExisting(Item item) throws SchemaException { @Override public PrismObject clone() { + if (prismContext != null && prismContext.getMonitor() != null) { + prismContext.getMonitor().beforeObjectClone(this); + } + PrismObject clone = new PrismObject(getElementName(), getDefinition(), prismContext); copyValues(clone); + + if (prismContext != null && prismContext.getMonitor() != null) { + prismContext.getMonitor().afterObjectClone(this, clone); + } + return clone; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismMonitor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismMonitor.java new file mode 100644 index 00000000000..ac52bd50a7e --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismMonitor.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2016 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.util; + +import com.evolveum.midpoint.prism.Objectable; +import com.evolveum.midpoint.prism.PrismObject; + +/** + * Interface to plug in a monitoring code to prism. Implementation of this + * interface are called when selected important (usually expensive) operations + * take place in prism. This can be used for gathering stats, making assertions + * in the test code, etc. + * + * @author semancik + */ +public interface PrismMonitor { + + void beforeObjectClone(PrismObject orig); + + void afterObjectClone(PrismObject orig, PrismObject clone); + +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java index cbf0a6b4146..6cf2c103a5f 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java @@ -23,6 +23,9 @@ import java.util.Arrays; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.internals.InternalsConfig; + import org.xml.sax.SAXException; import com.evolveum.midpoint.prism.PrismContext; @@ -60,6 +63,11 @@ public PrismContext createPrismContext() throws SchemaException, FileNotFoundExc SchemaRegistry schemaRegistry = createSchemaRegistry(); PrismContext context = PrismContext.create(schemaRegistry); context.setDefinitionFactory(createDefinitionFactory()); + + if (InternalsConfig.isPrismMonitoring()) { + context.setMonitor(new InternalMonitor()); + } + return context; } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/monitor/CachingStatistics.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/CachingStatistics.java similarity index 97% rename from infra/common/src/main/java/com/evolveum/midpoint/common/monitor/CachingStatistics.java rename to infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/CachingStatistics.java index ddf83b1375e..570ec145f36 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/monitor/CachingStatistics.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/CachingStatistics.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.monitor; +package com.evolveum.midpoint.schema.internals; /** * @author semancik diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/monitor/InternalMonitor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java similarity index 83% rename from infra/common/src/main/java/com/evolveum/midpoint/common/monitor/InternalMonitor.java rename to infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java index d6c6a8ea1ad..b01c1d823b7 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/monitor/InternalMonitor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,8 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.monitor; +package com.evolveum.midpoint.schema.internals; +import com.evolveum.midpoint.prism.Objectable; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -26,9 +29,11 @@ * @author Radovan Semancik * */ -public class InternalMonitor { +public class InternalMonitor implements PrismMonitor { private static final Trace LOGGER = TraceManager.getTrace(InternalMonitor.class); + + private static final String CLONE_START_TIMESTAMP_KEY = InternalMonitor.class.getName()+".cloneStartTimestamp"; private static long resourceSchemaParseCount = 0; private static long resourceSchemaFetchCount = 0; @@ -56,6 +61,9 @@ public class InternalMonitor { */ private static long provisioningAllExtOperationCount = 0; + private static long prismObjectCloneCount = 0; + private static long prismObjectCloneDurationMillis = 0; + public static long getResourceSchemaParseCount() { return resourceSchemaParseCount; } @@ -215,6 +223,33 @@ public static void recordShadowOtherOperation() { provisioningAllExtOperationCount++; } + @Override + public synchronized void beforeObjectClone(PrismObject orig) { + LOGGER.trace("MONITOR prism object clone start: {}", orig); + prismObjectCloneCount++; + orig.setUserData(CLONE_START_TIMESTAMP_KEY, System.currentTimeMillis()); + } + + @Override + public synchronized void afterObjectClone(PrismObject orig, PrismObject clone) { + Object cloneStartObject = orig.getUserData(CLONE_START_TIMESTAMP_KEY); + if (cloneStartObject != null && cloneStartObject instanceof Long) { + long cloneDurationMillis = System.currentTimeMillis() - (Long)cloneStartObject; + prismObjectCloneDurationMillis += cloneDurationMillis; + LOGGER.debug("MONITOR prism object clone end: {} (duration {} ms)", orig, cloneDurationMillis); + } else { + LOGGER.debug("MONITOR prism object clone end: {}", orig); + } + } + + public static long getPrismObjectCloneCount() { + return prismObjectCloneCount; + } + + public static void setPrismObjectCloneCount(long prismObjectCloneCount) { + InternalMonitor.prismObjectCloneCount = prismObjectCloneCount; + } + public static void reset() { LOGGER.info("MONITOR reset"); resourceSchemaParseCount = 0; @@ -257,4 +292,5 @@ private static void traceOperation(String opName, long counter) { LOGGER.trace("MONITOR {} ({}):\n{}", new Object[]{opName, counter, sb}); } } + } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/InternalsConfig.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalsConfig.java similarity index 78% rename from infra/common/src/main/java/com/evolveum/midpoint/common/InternalsConfig.java rename to infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalsConfig.java index fa19349ccef..cae85b2a493 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/InternalsConfig.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalsConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common; +package com.evolveum.midpoint.schema.internals; /** * @author semancik @@ -33,21 +33,34 @@ public class InternalsConfig { // inside midpoint (e.g. change of SystemConfiguration object) will be ignored. // DO NOT USE IN PRODUCTION CODE public static boolean avoidLoggingChange = false; + + private static boolean prismMonitoring = false; + + public static boolean isPrismMonitoring() { + return prismMonitoring; + } + + public static void setPrismMonitoring(boolean prismMonitoring) { + InternalsConfig.prismMonitoring = prismMonitoring; + } public static void setDevelopmentMode() { consistencyChecks = true; encryptionChecks = true; + prismMonitoring = true; } public static void turnOffAllChecks() { consistencyChecks = false; encryptionChecks = false; readEncryptionChecks = false; + prismMonitoring = false; } public static void turnOnAllChecks() { consistencyChecks = true; encryptionChecks = true; encryptionChecks = true; + prismMonitoring = true; } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java index 28bdcb449b3..ba53afc6d66 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java @@ -30,12 +30,12 @@ import org.apache.commons.lang.Validate; import org.w3c.dom.Element; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.util.MiscUtil; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluator.java index c2efa80609c..3be8468a33e 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluator.java @@ -17,7 +17,6 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.prism.PrismContainerDefinition; @@ -25,6 +24,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.security.api.SecurityEnforcer; import com.evolveum.midpoint.util.exception.SchemaException; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java index 161459e7b63..9b2c70e058c 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluator.java @@ -17,7 +17,6 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; @@ -32,6 +31,7 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.constants.ExpressionConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.security.api.SecurityEnforcer; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java index c82a31bc354..9b7530154d9 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java @@ -30,7 +30,6 @@ import javax.script.ScriptException; import javax.xml.namespace.QName; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.common.expression.ExpressionSyntaxException; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; @@ -51,6 +50,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java index 714613f9546..82c8ff0cf08 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java @@ -15,7 +15,6 @@ */ package com.evolveum.midpoint.model.common.expression.script.velocity; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.common.expression.ExpressionSyntaxException; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; @@ -27,6 +26,7 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java index 23570469d87..fc5fd312158 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java @@ -36,7 +36,6 @@ import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.filter.Filter; import com.evolveum.midpoint.common.filter.FilterManager; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -54,6 +53,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.schema.util.ObjectResolver; diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java index ed80273577d..bb53e51952c 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java @@ -25,7 +25,6 @@ import org.testng.annotations.Test; import org.xml.sax.SAXException; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -36,6 +35,7 @@ import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.test.util.DirectoryFileObjectResolver; diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java index bcf03385d37..f07f0c19347 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java @@ -15,7 +15,6 @@ */ package com.evolveum.midpoint.model.common.expression.script; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; @@ -29,6 +28,7 @@ import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.test.util.DirectoryFileObjectResolver; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java index 0557dac8741..a174b5b9019 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import org.apache.commons.lang.Validate; @@ -27,7 +28,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.model.impl.util.Utils; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java index d6e555a49c0..7bf433b1538 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java @@ -16,13 +16,12 @@ package com.evolveum.midpoint.model.impl.lens; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; import static com.evolveum.midpoint.model.api.ProgressInformation.ActivityType.FOCUS_OPERATION; import static com.evolveum.midpoint.model.api.ProgressInformation.ActivityType.RESOURCE_OBJECT_OPERATION; import static com.evolveum.midpoint.model.api.ProgressInformation.StateType.ENTERING; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.SynchronizationUtils; import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.model.api.ModelExecuteOptions; @@ -64,6 +63,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.ShadowUtil; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index bc0381c0eac..aee0de1443d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -20,7 +20,6 @@ import com.evolveum.midpoint.audit.api.AuditEventType; import com.evolveum.midpoint.audit.api.AuditService; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.PolicyViolationException; @@ -67,6 +66,7 @@ import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.SystemConfigurationTypeUtil; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ContextFactory.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ContextFactory.java index 5838f6e25b0..9695471e4ae 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ContextFactory.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ContextFactory.java @@ -23,7 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta; import com.evolveum.midpoint.model.api.ModelExecuteOptions; @@ -36,6 +35,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; import com.evolveum.midpoint.repo.cache.RepositoryCache; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.QNameUtil; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java index 47c2e1dff95..ce186f906b0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java @@ -16,8 +16,6 @@ package com.evolveum.midpoint.model.impl.lens.projector; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; - import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -75,6 +73,8 @@ import javax.xml.namespace.QName; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; + import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java index cedb7e57b4a..f9aa38476b0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java @@ -15,13 +15,14 @@ */ package com.evolveum.midpoint.model.impl.lens.projector; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import java.util.Collection; import java.util.Iterator; import java.util.List; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; @@ -29,7 +30,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.PolicyViolationException; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/DependencyProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/DependencyProcessor.java index ee16bf86026..a9c5daf819e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/DependencyProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/DependencyProcessor.java @@ -15,7 +15,7 @@ */ package com.evolveum.midpoint.model.impl.lens.projector; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import java.util.ArrayList; import java.util.Collection; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java index a17008f0838..a2554ac345a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java @@ -15,7 +15,7 @@ */ package com.evolveum.midpoint.model.impl.lens.projector; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import java.util.Collection; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java index 0405e87508f..075b5a561af 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java @@ -15,7 +15,7 @@ */ package com.evolveum.midpoint.model.impl.lens.projector; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import java.util.Collection; import java.util.Iterator; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java index ad1c2195a56..3c03664360a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java @@ -15,9 +15,9 @@ */ package com.evolveum.midpoint.model.impl.lens.projector; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; import static com.evolveum.midpoint.model.api.ProgressInformation.ActivityType.PROJECTOR; import static com.evolveum.midpoint.model.api.ProgressInformation.StateType.ENTERING; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import java.util.List; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java index 5165d52ad3f..1efd18d502f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.model.impl.sync; -import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; +import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; import java.util.ArrayList; import java.util.Collection; @@ -33,7 +33,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.SynchronizationUtils; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.PolicyViolationException; @@ -61,6 +60,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.statistics.StatisticsUtil; diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java index e25a9f646b3..c8b749b9092 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java @@ -31,12 +31,12 @@ import org.testng.AssertJUnit; import org.testng.annotations.Test; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.LayerRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.LayerRefinedResourceSchema; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.impl.util.Utils; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java index 34210dfe47f..549fb11e42a 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -45,7 +46,6 @@ import org.testng.AssertJUnit; import org.testng.annotations.Test; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.model.api.context.ModelState; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestProjector.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestProjector.java index 91b14de09ff..4a5d5b0fae0 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestProjector.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestProjector.java @@ -39,7 +39,6 @@ import org.testng.annotations.Test; import com.evolveum.icf.dummy.resource.DummyAccount; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; @@ -67,6 +66,7 @@ import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.schema.util.SchemaTestConstants; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestCaseIgnore.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestCaseIgnore.java index 8956a914062..17db4b94aa3 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestCaseIgnore.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestCaseIgnore.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.model.intest; import com.evolveum.icf.dummy.resource.DummyGroup; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.match.MatchingRule; @@ -28,6 +27,7 @@ import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java index ee8ca2636cf..cf320f11e89 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java @@ -60,7 +60,6 @@ import com.evolveum.icf.dummy.resource.DummyAccount; import com.evolveum.midpoint.audit.api.AuditEventStage; import com.evolveum.midpoint.common.StaticExpressionUtil; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta; @@ -77,6 +76,7 @@ import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContractDeprecated.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContractDeprecated.java index 96eb531149e..0c49765669c 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContractDeprecated.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContractDeprecated.java @@ -49,7 +49,6 @@ import org.w3c.dom.Element; import com.evolveum.icf.dummy.resource.DummyAccount; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta; @@ -76,6 +75,7 @@ import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java index 742ad731183..631982c96ae 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java @@ -15,7 +15,6 @@ */ package com.evolveum.midpoint.model.intest; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.notifications.api.transports.Message; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; @@ -23,6 +22,7 @@ import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java index 67057537c73..505adb95fe0 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java @@ -38,8 +38,6 @@ import com.evolveum.icf.dummy.connector.DummyConnector; import com.evolveum.icf.dummy.resource.DummyResource; -import com.evolveum.midpoint.common.InternalsConfig; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.prism.Containerable; @@ -63,6 +61,8 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -153,6 +153,9 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti InternalsConfig.encryptionChecks = false; } + /** + * MID-3424 + */ @Test public void test050GetResourceRaw() throws Exception { final String TEST_NAME = "test050GetResourceRaw"; @@ -169,6 +172,7 @@ public void test050GetResourceRaw() throws Exception { assertConnectorCapabilitiesFetchIncrement(0); assertConnectorInitializationCountIncrement(0); assertConnectorSchemaParseIncrement(0); + rememberPrismObjectCloneCount(); Collection> options = SelectorOptions.createCollection(GetOperationOptions.createRaw()); @@ -181,6 +185,8 @@ public void test050GetResourceRaw() throws Exception { display("Resource", resource); + assertPrismObjectCloneIncrement(4); + assertResourceDummy(resource, false); assertNull("Schema sneaked in", ResourceTypeUtil.getResourceXsdSchema(resource)); @@ -192,6 +198,9 @@ public void test050GetResourceRaw() throws Exception { assertConnectorSchemaParseIncrement(1); } + /** + * MID-3424 + */ @Test public void test052GetResourceNoFetch() throws Exception { final String TEST_NAME = "test052GetResourceNoFetch"; @@ -208,6 +217,7 @@ public void test052GetResourceNoFetch() throws Exception { assertConnectorCapabilitiesFetchIncrement(0); assertConnectorInitializationCountIncrement(0); assertConnectorSchemaParseIncrement(0); + rememberPrismObjectCloneCount(); Collection> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch()); @@ -220,6 +230,8 @@ public void test052GetResourceNoFetch() throws Exception { display("Resource", resource); + assertPrismObjectCloneIncrement(2); + assertResourceDummy(resource, false); assertNull("Schema sneaked in", ResourceTypeUtil.getResourceXsdSchema(resource)); @@ -231,6 +243,9 @@ public void test052GetResourceNoFetch() throws Exception { assertConnectorSchemaParseIncrement(0); } + /** + * MID-3424 + */ @Test public void test100SearchResourcesNoFetch() throws Exception { final String TEST_NAME = "test100SearchResourcesNoFetch"; @@ -243,6 +258,7 @@ public void test100SearchResourcesNoFetch() throws Exception { // precondition assertSteadyResources(); + rememberPrismObjectCloneCount(); Collection> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch()); @@ -258,6 +274,8 @@ public void test100SearchResourcesNoFetch() throws Exception { result.computeStatus(); TestUtil.assertSuccess("searchObjects result", result); + + assertPrismObjectCloneIncrement(4); for (PrismObject resource: resources) { assertResource(resource, false); @@ -272,6 +290,9 @@ public void test100SearchResourcesNoFetch() throws Exception { assertSteadyResources(); } + /** + * MID-3424 + */ @Test public void test105SearchResourcesIterativeNoFetch() throws Exception { final String TEST_NAME = "test105SearchResourcesIterativeNoFetch"; @@ -284,6 +305,7 @@ public void test105SearchResourcesIterativeNoFetch() throws Exception { // precondition assertSteadyResources(); + rememberPrismObjectCloneCount(); final List> resources = new ArrayList>(); @@ -308,6 +330,8 @@ public boolean handle(PrismObject resource, OperationResult parent assertFalse("Empty search return", resources.isEmpty()); assertEquals("Unexpected number of resources found", 2, resources.size()); + assertPrismObjectCloneIncrement(4); + assertResourceSchemaFetchIncrement(0); assertResourceSchemaParseCountIncrement(0); assertConnectorCapabilitiesFetchIncrement(0); @@ -327,14 +351,18 @@ public void test110GetResourceDummy() throws Exception { OperationResult result = task.getResult(); preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); + rememberPrismObjectCloneCount(); + // WHEN PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null , task, result); // THEN - assertResourceDummy(resource, true); - result.computeStatus(); TestUtil.assertSuccess("getObject result", result); + + assertPrismObjectCloneIncrement(6); + + assertResourceDummy(resource, true); assertResourceSchemaFetchIncrement(1); assertResourceSchemaParseCountIncrement(1); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/ImportTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/ImportTest.java index 7fb2881a259..1af38e477d5 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/ImportTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/ImportTest.java @@ -17,7 +17,6 @@ import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.model.intest.AbstractConfiguredModelIntegrationTest; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ChangeType; @@ -28,6 +27,7 @@ import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index 9094be0426f..963cf8412c5 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.model.intest.scripting; import com.evolveum.midpoint.common.LoggingConfigurationManager; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; @@ -25,6 +24,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java index 4fd5bb7b083..71dee65c06c 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java @@ -46,7 +46,6 @@ import com.evolveum.midpoint.audit.api.AuditEventStage; import com.evolveum.midpoint.audit.api.AuditEventType; import com.evolveum.midpoint.common.crypto.CryptoUtil; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.policy.PasswordPolicyUtils; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.ModelService; @@ -74,6 +73,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportReconDeprecated.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportReconDeprecated.java index 110904b44c8..d118e2576d7 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportReconDeprecated.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportReconDeprecated.java @@ -42,7 +42,6 @@ import com.evolveum.midpoint.audit.api.AuditEventRecord; import com.evolveum.midpoint.audit.api.AuditEventStage; import com.evolveum.midpoint.audit.api.AuditEventType; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskHandler; import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskResultListener; import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest; @@ -50,6 +49,7 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestUuid.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestUuid.java index 1c90adb2ed4..3acae9905df 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestUuid.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestUuid.java @@ -44,7 +44,6 @@ import com.evolveum.midpoint.audit.api.AuditEventRecord; import com.evolveum.midpoint.audit.api.AuditEventStage; import com.evolveum.midpoint.audit.api.AuditEventType; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskHandler; import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskResultListener; import com.evolveum.midpoint.model.impl.util.DebugReconciliationTaskResultListener; @@ -55,6 +54,7 @@ import com.evolveum.midpoint.schema.ObjectDeltaOperation; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.Task; diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index 3c75beacb9a..a6bce30f7ee 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -20,7 +20,6 @@ import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.icf.dummy.resource.SchemaViolationException; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; @@ -75,6 +74,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java index 764ffb20b65..a690783bd36 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java @@ -21,7 +21,6 @@ import org.apache.commons.lang.Validate; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher; import com.evolveum.midpoint.provisioning.api.GenericConnectorException; import com.evolveum.midpoint.provisioning.api.ResourceEventDescription; @@ -30,6 +29,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; import com.evolveum.midpoint.provisioning.api.ResourceOperationDescription; import com.evolveum.midpoint.provisioning.api.ResourceOperationListener; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.CommunicationException; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java index 571d8b502aa..d30356a48aa 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java @@ -31,7 +31,6 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContext; @@ -45,6 +44,7 @@ import com.evolveum.midpoint.provisioning.ucf.api.GenericFrameworkException; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.statistics.ConnectorOperationalStatus; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java index d1fef2e1177..f23fd097a72 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java @@ -29,7 +29,6 @@ import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.prism.Objectable; @@ -64,6 +63,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.statistics.ConnectorOperationalStatus; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java index 9356986702a..ef52697a259 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java @@ -32,7 +32,6 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.ComplexTypeDefinition; import com.evolveum.midpoint.prism.Definition; @@ -66,6 +65,7 @@ import com.evolveum.midpoint.schema.CapabilityUtil; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index 6f0fd6d6ebc..9e92ce0b1cb 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -17,7 +17,6 @@ package com.evolveum.midpoint.provisioning.impl; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -44,6 +43,7 @@ import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.SearchResultMetadata; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 6236dafef97..6d10203c6f9 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -30,8 +30,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import com.evolveum.midpoint.common.InternalsConfig; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -92,6 +90,8 @@ import com.evolveum.midpoint.schema.SearchResultMetadata; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java index 5f2edc36aa1..7e6209aa437 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java @@ -24,7 +24,6 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.OrderDirection; import com.evolveum.midpoint.provisioning.impl.StateReporter; @@ -134,6 +133,7 @@ import com.evolveum.midpoint.schema.CapabilityUtil; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestDBTable.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestDBTable.java index 26a2cbd7976..db38e5a7fc4 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestDBTable.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestDBTable.java @@ -19,7 +19,6 @@ */ package com.evolveum.midpoint.provisioning.impl; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -28,6 +27,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceObjectChangeListener; import com.evolveum.midpoint.provisioning.impl.mock.SynchornizationServiceMock; import com.evolveum.midpoint.schema.CapabilityUtil; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.task.api.Task; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java index b88729805ab..02d1549c830 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java @@ -45,9 +45,6 @@ import com.evolveum.icf.dummy.resource.DummyPrivilege; import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.icf.dummy.resource.SchemaViolationException; -import com.evolveum.midpoint.common.InternalsConfig; -import com.evolveum.midpoint.common.monitor.CachingStatistics; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; @@ -69,6 +66,9 @@ import com.evolveum.midpoint.provisioning.impl.mock.SynchornizationServiceMock; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; +import com.evolveum.midpoint.schema.internals.CachingStatistics; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java index 682bf62a8c9..6b68f31bf45 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java @@ -32,11 +32,11 @@ import org.w3c.dom.Element; import com.evolveum.icf.dummy.resource.DummyResource; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyPrioritiesAndReadReplace.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyPrioritiesAndReadReplace.java index 90349756079..2d1add60c59 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyPrioritiesAndReadReplace.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyPrioritiesAndReadReplace.java @@ -20,7 +20,6 @@ package com.evolveum.midpoint.provisioning.impl.dummy; import com.evolveum.icf.dummy.resource.DummyAccount; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -29,6 +28,7 @@ import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.provisioning.impl.ProvisioningTestUtil; import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.task.api.Task; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java index 5335359bfdb..a31d2f9db86 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java @@ -44,8 +44,6 @@ import org.w3c.dom.Element; import com.evolveum.icf.dummy.resource.DummyAccount; -import com.evolveum.midpoint.common.monitor.CachingStatistics; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; @@ -68,6 +66,8 @@ import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; import com.evolveum.midpoint.schema.CapabilityUtil; +import com.evolveum.midpoint.schema.internals.CachingStatistics; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ConnectorTypeUtil; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java index d9783c00a78..972c728dc42 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java @@ -43,7 +43,6 @@ import com.evolveum.icf.dummy.resource.DummyAccount; import com.evolveum.icf.dummy.resource.DummyResource; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -53,6 +52,7 @@ import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; import com.evolveum.midpoint.schema.CapabilityUtil; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ShadowUtil; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/AbstractOpenDjTest.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/AbstractOpenDjTest.java index d51c7fbadd9..59b5322cc04 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/AbstractOpenDjTest.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/AbstractOpenDjTest.java @@ -21,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.match.DistinguishedNameMatchingRule; import com.evolveum.midpoint.prism.match.MatchingRule; @@ -30,6 +29,7 @@ import com.evolveum.midpoint.provisioning.impl.ConnectorManager; import com.evolveum.midpoint.provisioning.impl.ProvisioningTestUtil; import com.evolveum.midpoint.provisioning.impl.mock.SynchornizationServiceMock; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.task.api.Task; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java index df5d72f9c3c..efac2cb5dd3 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java @@ -35,7 +35,6 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.provisioning.api.ProvisioningService; @@ -45,6 +44,7 @@ import com.evolveum.midpoint.provisioning.impl.mock.SynchornizationServiceMock; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorFactory; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.AbstractIntegrationTest; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index ffa177f7985..8f694fdec65 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.repo.sql; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.prism.ConsistencyCheckScope; import com.evolveum.midpoint.prism.Containerable; @@ -37,6 +36,7 @@ import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sql.helpers.*; import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java index 109a4738340..db77c5dd86a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.repo.sql.helpers; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; @@ -43,6 +42,7 @@ import com.evolveum.midpoint.repo.sql.query2.hqm.QueryParameterValue; import com.evolveum.midpoint.repo.sql.util.*; import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.Holder; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java index 6f746750bc9..c319fedd8bb 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java @@ -23,8 +23,6 @@ import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.midpoint.common.Clock; import com.evolveum.midpoint.common.crypto.CryptoUtil; -import com.evolveum.midpoint.common.monitor.CachingStatistics; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; @@ -58,6 +56,9 @@ import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.CachingStatistics; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; @@ -144,6 +145,7 @@ public abstract class AbstractIntegrationTest extends AbstractTestNGSpringContex private long lastConnectorOperationCount = 0; private long lastConnectorSimulatedPagingSearchCount = 0; private long lastDummyResourceGroupMembersReadCount = 0; + private long lastPrismObjectCloneCount = 0; @Autowired(required = true) @Qualifier("cacheRepositoryService") @@ -186,11 +188,17 @@ public void initSystemConditional() throws Exception { LOGGER.trace("initSystemConditional: invoking initSystem"); Task initTask = taskManager.createTaskInstance(this.getClass().getName() + ".initSystem"); OperationResult result = initTask.getResult(); + InternalMonitor.reset(); + InternalsConfig.setPrismMonitoring(true); + prismContext.setMonitor(new InternalMonitor()); + initSystem(initTask, result); + result.computeStatus(); IntegrationTestTools.display("initSystem result", result); TestUtil.assertSuccessOrWarning("initSystem failed (result)", result, 1); + setSystemInitialized(); } } @@ -829,6 +837,26 @@ protected void assertCacheMisses(CachingStatistics lastStats, CachingStatistics lastStats.setMisses(currentStats.getMisses()); } + protected void rememberPrismObjectCloneCount() { + lastPrismObjectCloneCount = InternalMonitor.getPrismObjectCloneCount(); + } + + protected void assertPrismObjectCloneIncrement(int expectedIncrement) { + long currentCount = InternalMonitor.getPrismObjectCloneCount(); + long actualIncrement = currentCount - lastPrismObjectCloneCount; + assertEquals("Unexpected increment in prism object clone count", (long)expectedIncrement, actualIncrement); + lastPrismObjectCloneCount = currentCount; + } + + protected void assertPrismObjectCloneIncrement(int expectedIncrementMin, int expectedIncrementMax) { + long currentCount = InternalMonitor.getPrismObjectCloneCount(); + long actualIncrement = currentCount - lastPrismObjectCloneCount; + assertTrue("Unexpected increment in prism object clone count. Expected " + +expectedIncrementMin+"-"+expectedIncrementMax+" but was "+actualIncrement, + actualIncrement >= expectedIncrementMin && actualIncrement <= expectedIncrementMax); + lastPrismObjectCloneCount = currentCount; + } + protected void assertSteadyResources() { assertResourceSchemaFetchIncrement(0); assertResourceSchemaParseCountIncrement(0); diff --git a/testing/longtest/src/test/java/com/evolveum/midpoint/testing/longtest/TestLdapUniversity.java b/testing/longtest/src/test/java/com/evolveum/midpoint/testing/longtest/TestLdapUniversity.java index da83aa5419e..daf475a34a7 100644 --- a/testing/longtest/src/test/java/com/evolveum/midpoint/testing/longtest/TestLdapUniversity.java +++ b/testing/longtest/src/test/java/com/evolveum/midpoint/testing/longtest/TestLdapUniversity.java @@ -17,7 +17,6 @@ package com.evolveum.midpoint.testing.longtest; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.LoggingConfigurationManager; import com.evolveum.midpoint.common.ProfilingConfigurationManager; import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskHandler; @@ -26,6 +25,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.MidPointTestConstants; diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestService.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestService.java index 881cdf1136f..6d674625ba8 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestService.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestService.java @@ -43,8 +43,6 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import com.evolveum.midpoint.common.InternalsConfig; -import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; @@ -56,6 +54,8 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.Task; diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java index 593a98aa66e..9ec5f1e83ce 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java @@ -51,7 +51,6 @@ import com.evolveum.icf.dummy.resource.DummyObjectClass; import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.icf.dummy.resource.DummySyncStyle; -import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta; @@ -83,9 +82,11 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; @@ -344,6 +345,96 @@ public void test000Sanity() throws Exception { waitForTaskStart(TASK_LIVE_SYNC_DUMMY_SOURCE_OID, false); } + /** + * MID-3424 + */ + @Test + public void test020ResourceOpenDjGet() throws Exception { + final String TEST_NAME = "test020ResourceOpenDjGet"; + TestUtil.displayTestTile(this, TEST_NAME); + Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + rememberResourceSchemaFetchCount(); + rememberResourceSchemaParseCount(); + rememberConnectorCapabilitiesFetchCount(); + rememberConnectorInitializationCount(); + rememberConnectorSchemaParseCount(); + rememberPrismObjectCloneCount(); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + modelService.getObject(ResourceType.class, RESOURCE_OPENDJ_OID, null, task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess(result); + + // variable number of clones because of trigger scanner task + assertPrismObjectCloneIncrement(4, 5); + + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + } + + /** + * MID-3424 + */ + @Test + public void test022ResourceOpenDjRefinedSchema() throws Exception { + final String TEST_NAME = "test022ResourceOpenDjRefinedSchema"; + TestUtil.displayTestTile(this, TEST_NAME); + Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + PrismObject resourceBefore = modelService.getObject(ResourceType.class, RESOURCE_OPENDJ_OID, null, task, result); + ResourceSchema resourceSchemaBefore = RefinedResourceSchema.getResourceSchema(resourceBefore, prismContext); + RefinedResourceSchema refinedSchemaBefore = RefinedResourceSchema.getRefinedSchema(resourceBefore); + + rememberResourceSchemaFetchCount(); + rememberResourceSchemaParseCount(); + rememberConnectorCapabilitiesFetchCount(); + rememberConnectorInitializationCount(); + rememberConnectorSchemaParseCount(); + rememberPrismObjectCloneCount(); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + long t0 = System.currentTimeMillis(); + PrismObject resourceAfter = modelService.getObject(ResourceType.class, RESOURCE_OPENDJ_OID, null, task, result); + long t1 = System.currentTimeMillis(); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess(result); + + long t2 = System.currentTimeMillis(); + ResourceSchema resourceSchemaAfter = RefinedResourceSchema.getResourceSchema(resourceAfter, prismContext); + long t3 = System.currentTimeMillis(); + RefinedResourceSchema refinedSchemaAfter = RefinedResourceSchema.getRefinedSchema(resourceAfter); + long t4 = System.currentTimeMillis(); + + display("Times", "getObject(RESOURCE_OPENDJ_OID): "+(t1-t0)+"ms\ngetResourceSchema: "+(t3-t2) + +"ms\ngetRefinedSchema: "+(t4-t3)+"ms"); + + // variable number of clones: 3 or 4 because of trigger scanner task + assertPrismObjectCloneIncrement(3,4); + + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + + assertTrue("Resource schema has changed", resourceSchemaBefore == resourceSchemaAfter ); + assertTrue("Refined schema has changed", refinedSchemaBefore == refinedSchemaAfter ); + } + @Test public void test100AddSrcAccountHerman() throws Exception { final String TEST_NAME = "test100AddSrcAccountHerman"; diff --git a/testing/story/src/test/resources/village/resource-opendj.xml b/testing/story/src/test/resources/village/resource-opendj.xml index 519628f9f96..ffa33a8754a 100644 --- a/testing/story/src/test/resources/village/resource-opendj.xml +++ b/testing/story/src/test/resources/village/resource-opendj.xml @@ -312,6 +312,863 @@ + + + + + + account + fake01 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + + account + fake02 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake03 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake04 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake05 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake06 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake07 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake08 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake09 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + + + account + fake10 + Fake Account + false + ri:inetOrgPerson + + ri:dn + Distinguished Name + mr:stringIgnoreCase + + + + $user/name + + + + + + + + ri:cn + Common Name + + + $user/fullName + + + + + ri:sn + + + familyName + + + + + ri:givenName + + + givenName + + + + + ri:uid + mr:stringIgnoreCase + + weak + + $user/name + + + + + ri:group + LDAP Group Membership + entitlement + ldapGroup + objectToSubject + ri:uniqueMember + ri:dn + + + + + + + + + + + + + From 7d58552cf480912427ace861dd0d2cee96438871 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Mon, 26 Sep 2016 17:42:49 +0200 Subject: [PATCH 5/8] Fixing GetOperationOptions clone and toString --- .../midpoint/schema/GetOperationOptions.java | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java index 841e11f380b..2c6ec6a451f 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java @@ -32,7 +32,8 @@ * */ public class GetOperationOptions implements Serializable, Cloneable { - + private static final long serialVersionUID = 1L; + /** * Specifies whether to return specific items. It is used for optimizations. * Some requests only needs a subset of items therefore fetching them all is a waste @@ -106,6 +107,14 @@ public class GetOperationOptions implements Serializable, Cloneable { * information.. */ Boolean allowNotFound; + + /** + * Return read-only object. The returned object will be only read by the client. The client will not modify it. + * Immutable object is returned if it is possible. + * This option allows to turn on internal optimization (e.g. avoid cloning the values). It should be used + * at all times when the client do not plan to modify the returned object. + */ + private Boolean readOnly; public RetrieveOption getRetrieve() { return retrieve; @@ -331,6 +340,12 @@ public static boolean isDoNotDiscovery(GetOperationOptions options) { return options.doNotDiscovery; } + public static GetOperationOptions createDoNotDiscovery() { + GetOperationOptions opts = new GetOperationOptions(); + opts.setDoNotDiscovery(true); + return opts; + } + public static GetOperationOptions createAllowNotFound() { GetOperationOptions opts = new GetOperationOptions(); opts.setAllowNotFound(true); @@ -355,12 +370,30 @@ public static boolean isAllowNotFound(GetOperationOptions options) { return options.allowNotFound; } - public static GetOperationOptions createDoNotDiscovery() { + public static GetOperationOptions createReadOnly() { GetOperationOptions opts = new GetOperationOptions(); - opts.setDoNotDiscovery(true); + opts.setReadOnly(true); return opts; } + + public Boolean getReadOnly() { + return readOnly; + } + public void setReadOnly(Boolean readOnly) { + this.readOnly = readOnly; + } + + public static boolean isReadOnly(GetOperationOptions options) { + if (options == null) { + return false; + } + if (options.readOnly == null) { + return false; + } + return options.readOnly; + } + public RelationalValueSearchQuery getRelationalValueSearchQuery() { return relationalValueSearchQuery; } @@ -443,6 +476,7 @@ public GetOperationOptions clone() { clone.resolveNames = this.resolveNames; clone.retrieve = this.retrieve; clone.allowNotFound = this.allowNotFound; + clone.readOnly = this.readOnly; if (this.relationalValueSearchQuery != null) { clone.relationalValueSearchQuery = this.relationalValueSearchQuery.clone(); } @@ -459,6 +493,7 @@ public String toString() { appendFlag(sb, "doNotDiscovery", doNotDiscovery); appendVal(sb, "retrieve", retrieve); appendFlag(sb, "allowNotFound", allowNotFound); + appendFlag(sb, "readOnly", readOnly); appendVal(sb, "relationalValueSearchQuery", relationalValueSearchQuery); if (sb.charAt(sb.length() - 1) == ',') { sb.deleteCharAt(sb.length() - 1); From eb5570948cf7d6c8d3e385453a6ff320b4f4ae2b Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Mon, 26 Sep 2016 18:01:21 +0200 Subject: [PATCH 6/8] Introduction of readOnly option. Significant reduction of many unnecessary clone() operations (MID-3424) --- .../web/page/admin/PageAdminFocus.java | 4 +- .../schema/internals/InternalMonitor.java | 24 +- .../impl/controller/ModelController.java | 7 + .../impl/controller/SchemaTransformer.java | 4 +- .../ShadowIntegrityCheckResultHandler.java | 2 +- .../model/impl/lens/AssignmentEvaluator.java | 2 +- .../midpoint/model/impl/lens/Clockwork.java | 4 +- .../model/impl/lens/Construction.java | 2 +- .../midpoint/model/impl/lens/LensUtil.java | 18 +- .../lens/projector/AssignmentProcessor.java | 2 +- .../impl/lens/projector/ContextLoader.java | 12 +- .../impl/sync/SynchronizationServiceImpl.java | 2 +- .../midpoint/model/impl/util/Utils.java | 10 +- .../intest/TestModelServiceContract.java | 4 + .../midpoint/model/intest/TestResources.java | 215 +++++++++++++++++- .../src/test/resources/logback-test.xml | 3 +- .../impl/formatters/TextFormatter.java | 5 +- .../processors/BaseConfigurationHelper.java | 2 +- .../provisioning/impl/ConnectorManager.java | 13 +- .../impl/ProvisioningContext.java | 4 +- .../impl/ProvisioningServiceImpl.java | 12 +- .../provisioning/impl/ResourceCache.java | 14 +- .../provisioning/impl/ResourceManager.java | 13 +- .../midpoint/repo/cache/RepositoryCache.java | 42 +++- .../midpoint/testing/story/TestVillage.java | 3 + .../story/src/test/resources/logback-test.xml | 1 + 26 files changed, 358 insertions(+), 66 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java index 41bd3051282..ca99fef6993 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java @@ -299,8 +299,10 @@ private FocusSubwrapperDto loadSubWrapperDto(Class try { Collection> loadOptions = null; if (ShadowType.class.equals(type)) { + GetOperationOptions resourceOption = GetOperationOptions.createResolve(); + resourceOption.setReadOnly(true); loadOptions = SelectorOptions.createCollection(ShadowType.F_RESOURCE, - GetOperationOptions.createResolve()); + resourceOption); } if (noFetch) { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java index b01c1d823b7..1a126af1146 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/internals/InternalMonitor.java @@ -63,6 +63,7 @@ public class InternalMonitor implements PrismMonitor { private static long prismObjectCloneCount = 0; private static long prismObjectCloneDurationMillis = 0; + private static boolean tracePrismObjectClone = false; public static long getResourceSchemaParseCount() { return resourceSchemaParseCount; @@ -223,15 +224,31 @@ public static void recordShadowOtherOperation() { provisioningAllExtOperationCount++; } + public static long getPrismObjectCloneDurationMillis() { + return prismObjectCloneDurationMillis; + } + + public static void setPrismObjectCloneDurationMillis(long prismObjectCloneDurationMillis) { + InternalMonitor.prismObjectCloneDurationMillis = prismObjectCloneDurationMillis; + } + + public static boolean isTracePrismObjectClone() { + return tracePrismObjectClone; + } + + public static void setTracePrismObjectClone(boolean tracePrismObjectClone) { + InternalMonitor.tracePrismObjectClone = tracePrismObjectClone; + } + @Override - public synchronized void beforeObjectClone(PrismObject orig) { + public void beforeObjectClone(PrismObject orig) { LOGGER.trace("MONITOR prism object clone start: {}", orig); - prismObjectCloneCount++; orig.setUserData(CLONE_START_TIMESTAMP_KEY, System.currentTimeMillis()); } @Override public synchronized void afterObjectClone(PrismObject orig, PrismObject clone) { + prismObjectCloneCount++; Object cloneStartObject = orig.getUserData(CLONE_START_TIMESTAMP_KEY); if (cloneStartObject != null && cloneStartObject instanceof Long) { long cloneDurationMillis = System.currentTimeMillis() - (Long)cloneStartObject; @@ -240,6 +257,9 @@ public synchronized void afterObjectClone(PrismObject } else { LOGGER.debug("MONITOR prism object clone end: {}", orig); } + if (tracePrismObjectClone) { + traceOperation("prism object clone", prismObjectCloneCount); + } } public static long getPrismObjectCloneCount() { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index 038dced9880..5e8e1be648d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -237,6 +237,13 @@ public PrismObject getObject(Class clazz, String oi ref.setType(ObjectTypes.getObjectType(clazz).getTypeQName()); Utils.clearRequestee(task); +// Specal-purpose code to hunt down read-write resource fetch from GUI. +// Normally the code is not active. It is too brutal. Just for MID-3424. +// if (ResourceType.class == clazz && !GetOperationOptions.isRaw(rootOptions) && !GetOperationOptions.isReadOnly(rootOptions)) { +// LOGGER.info("READWRITE resource get: {} {}:\n{}", oid, options, +// LoggingUtils.dumpStackTrace()); +// } + object = objectResolver.getObject(clazz, oid, options, task, result).asPrismObject(); schemaTransformer.applySchemasAndSecurity(object, rootOptions, null, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java index a174b5b9019..b5ac99b7db7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java @@ -383,7 +383,7 @@ public AuthorizationDecisionType computeItemDecision(ObjectSecurityConstraints s } public ObjectTemplateType determineObjectTemplate(PrismObject object, AuthorizationPhaseType phase, OperationResult result) throws SchemaException, ConfigurationException, ObjectNotFoundException { - PrismObject systemConfiguration = Utils.getSystemConfiguration(cacheRepositoryService, result); + PrismObject systemConfiguration = Utils.getSystemConfigurationReadOnly(cacheRepositoryService, result); if (systemConfiguration == null) { return null; } @@ -400,7 +400,7 @@ public ObjectTemplateType determineObjectTemplate(PrismOb } public ObjectTemplateType determineObjectTemplate(Class objectClass, AuthorizationPhaseType phase, OperationResult result) throws SchemaException, ConfigurationException, ObjectNotFoundException { - PrismObject systemConfiguration = Utils.getSystemConfiguration(cacheRepositoryService, result); + PrismObject systemConfiguration = Utils.getSystemConfigurationReadOnly(cacheRepositoryService, result); if (systemConfiguration == null) { return null; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java index e3c46b66337..e3a94a63a2e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java @@ -225,7 +225,7 @@ public ShadowIntegrityCheckResultHandler(Task coordinatorTask, String taskOperat } try { - configuration = Utils.getSystemConfiguration(repositoryService, result); + configuration = Utils.getSystemConfigurationReadOnly(repositoryService, result); } catch (SchemaException e) { throw new SystemException("Couldn't get system configuration", e); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index f5ff743d8e0..49357996e3d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -459,7 +459,7 @@ private List> resolveTargetsFromFilter(Cla ModelExpressionThreadLocalHolder.pushCurrentResult(result); ModelExpressionThreadLocalHolder.pushCurrentTask(task); try { - ExpressionVariables variables = Utils.getDefaultExpressionVariables(source, null, null, LensUtil.getSystemConfiguration(lensContext, repository, result).asObjectable()); + ExpressionVariables variables = Utils.getDefaultExpressionVariables(source, null, null, LensUtil.getSystemConfigurationReadOnly(lensContext, repository, result).asObjectable()); variables.addVariableDefinition(ExpressionConstants.VAR_SOURCE, assignmentPathSegment.getOrderOneObject()); Utils.addAssignmentPathVariables(LensUtil.computeAssignmentPathVariables(assignmentPath), variables); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index aee0de1443d..3510eb58864 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -251,7 +251,7 @@ private void exitAssociationSearchExpressionEvaluatorCache() { } private int getMaxClicks(LensContext context, OperationResult result) throws SchemaException, ObjectNotFoundException { - PrismObject sysconfigObject = LensUtil.getSystemConfiguration(context, repositoryService, result); + PrismObject sysconfigObject = LensUtil.getSystemConfigurationReadOnly(context, repositoryService, result); Integer maxClicks = SystemConfigurationTypeUtil.getMaxModelClicks(sysconfigObject); if (maxClicks == null) { return DEFAULT_MAX_CLICKS; @@ -388,7 +388,7 @@ private HookOperationMode invokeHooks(LensContext context, Task task, OperationR // TODO: following two parts should be merged together in later versions // Execute configured scripting hooks - PrismObject systemConfiguration = LensUtil.getSystemConfiguration(context, repositoryService, result); + PrismObject systemConfiguration = LensUtil.getSystemConfigurationReadOnly(context, repositoryService, result); // systemConfiguration may be null in some tests if (systemConfiguration != null) { ModelHooksType modelHooks = systemConfiguration.asObjectable().getModelHooks(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index c868aa580a8..9679b7510ae 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -410,7 +410,7 @@ public ResourceType getResource(Task task, OperationResult result) if (constructionType.getResourceRef().getOid() == null) { resource = resolveTarget(" resolving resource ", task, result); } else { - resource = LensUtil.getResource(lensContext, + resource = LensUtil.getResourceReadOnly(lensContext, constructionType.getResourceRef().getOid(), objectResolver, task, result); } } catch (ObjectNotFoundException e) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 56325feba72..d3073672741 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -61,7 +61,9 @@ import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -92,21 +94,22 @@ public static void traceContext(Trace logger, String acti } } - public static ResourceType getResource(LensContext context, + public static ResourceType getResourceReadOnly(LensContext context, String resourceOid, ProvisioningService provisioningService, Task task, OperationResult result) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException { ResourceType resourceType = context.getResource(resourceOid); if (resourceType == null) { // Fetching from provisioning to take advantage of caching and // pre-parsed schema - resourceType = provisioningService.getObject(ResourceType.class, resourceOid, null, task, result) + Collection> options = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + resourceType = provisioningService.getObject(ResourceType.class, resourceOid, options, task, result) .asObjectable(); context.rememberResource(resourceType); } return resourceType; } - public static ResourceType getResource(LensContext context, String resourceOid, ObjectResolver objectResolver, + public static ResourceType getResourceReadOnly(LensContext context, String resourceOid, ObjectResolver objectResolver, Task task, OperationResult result) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException { ResourceType resourceType = context.getResource(resourceOid); @@ -114,7 +117,8 @@ public static ResourceType getResource(LensContext con ObjectReferenceType ref = new ObjectReferenceType(); ref.setType(ResourceType.COMPLEX_TYPE); ref.setOid(resourceOid); - resourceType = objectResolver.resolve(ref, ResourceType.class, null, "resource fetch in lens", task, result); + Collection> options = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + resourceType = objectResolver.resolve(ref, ResourceType.class, options, "resource fetch in lens", task, result); context.rememberResource(resourceType); } return resourceType; @@ -145,7 +149,7 @@ public static LensProjectionContext getProjectionContext(L ProvisioningService provisioningService, PrismContext prismContext, Task task, OperationResult result) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException { - ResourceType resource = getResource(context, resourceOid, provisioningService, task, result); + ResourceType resource = getResourceReadOnly(context, resourceOid, provisioningService, task, result); String refinedIntent = refineProjectionIntent(kind, intent, resource, prismContext); ResourceShadowDiscriminator rsd = new ResourceShadowDiscriminator(resourceOid, kind, refinedIntent); return context.findProjectionContext(rsd); @@ -729,10 +733,10 @@ public static void setContextOid(Le } } - public static PrismObject getSystemConfiguration(LensContext context, RepositoryService repositoryService, OperationResult result) throws ObjectNotFoundException, SchemaException { + public static PrismObject getSystemConfigurationReadOnly(LensContext context, RepositoryService repositoryService, OperationResult result) throws ObjectNotFoundException, SchemaException { PrismObject systemConfiguration = context.getSystemConfiguration(); if (systemConfiguration == null) { - systemConfiguration = Utils.getSystemConfiguration(repositoryService, result); + systemConfiguration = Utils.getSystemConfigurationReadOnly(repositoryService, result); context.setSystemConfiguration(systemConfiguration); } return systemConfiguration; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java index 293dce7f11e..7db7e84dd30 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java @@ -1008,7 +1008,7 @@ private void collectToConstructionMapFromEvaluatedConstruc String resourceOid = construction.getResource(task, result).getOid(); String intent = construction.getIntent(); ShadowKindType kind = construction.getKind(); - ResourceType resource = LensUtil.getResource(context, resourceOid, provisioningService, task, result); + ResourceType resource = LensUtil.getResourceReadOnly(context, resourceOid, provisioningService, task, result); intent = LensUtil.refineProjectionIntent(kind, intent, resource, prismContext); ResourceShadowDiscriminator rat = new ResourceShadowDiscriminator(resourceOid, kind, intent); ConstructionPack constructionPack = null; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java index f9aa38476b0..265d73e50ca 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java @@ -262,7 +262,7 @@ private void preprocessProjectionContext(LensContext c } ResourceType resource = projectionContext.getResource(); if (resource == null) { - resource = LensUtil.getResource(context, resourceOid, provisioningService, task, result); + resource = LensUtil.getResourceReadOnly(context, resourceOid, provisioningService, task, result); projectionContext.setResource(resource); } String refinedIntent = LensUtil.refineProjectionIntent(kind, intent, resource, prismContext); @@ -371,7 +371,7 @@ private void setPrimaryDeltaOldValue(LensElementContext void loadFromSystemConfig(LensContext context, OperationResult result) throws ObjectNotFoundException, SchemaException, ConfigurationException { - PrismObject systemConfiguration = LensUtil.getSystemConfiguration(context, cacheRepositoryService, result); + PrismObject systemConfiguration = LensUtil.getSystemConfigurationReadOnly(context, cacheRepositoryService, result); if (systemConfiguration == null) { // This happens in some tests. And also during first startup. return; @@ -790,7 +790,7 @@ private void loadProjectionContextsSync(LensContext co if (resourceOid == null) { throw new IllegalArgumentException("No resource OID in " + shadow); } - ResourceType resourceType = LensUtil.getResource(context, resourceOid, provisioningService, task, result); + ResourceType resourceType = LensUtil.getResourceReadOnly(context, resourceOid, provisioningService, task, result); projCtx.setResource(resourceType); } projCtx.setFresh(true); @@ -822,7 +822,7 @@ private LensProjectionContext getOrCreateAccountContext(Le if (projectionContext == null) { String intent = ShadowUtil.getIntent(accountType); ShadowKindType kind = ShadowUtil.getKind(accountType); - ResourceType resource = LensUtil.getResource(context, resourceOid, provisioningService, task, result); + ResourceType resource = LensUtil.getResourceReadOnly(context, resourceOid, provisioningService, task, result); intent = LensUtil.refineProjectionIntent(kind, intent, resource, prismContext); ResourceShadowDiscriminator rsd = new ResourceShadowDiscriminator(resourceOid, kind, intent); projectionContext = LensUtil.getOrCreateProjectionContext(context, rsd); @@ -899,7 +899,7 @@ private LensProjectionContext createProjectionContext(Lens } String intent = ShadowUtil.getIntent(shadowType); ShadowKindType kind = ShadowUtil.getKind(shadowType); - ResourceType resource = LensUtil.getResource(context, resourceOid, provisioningService, task, result); + ResourceType resource = LensUtil.getResourceReadOnly(context, resourceOid, provisioningService, task, result); String accountIntent = LensUtil.refineProjectionIntent(kind, intent, resource, prismContext); ResourceShadowDiscriminator rsd = new ResourceShadowDiscriminator(resourceOid, kind, accountIntent); LensProjectionContext accountSyncContext = context.findProjectionContext(rsd); @@ -1092,7 +1092,7 @@ private void finishLoadOfProjectionContext(LensContext // Load resource if (resourceType == null && resourceOid != null) { - resourceType = LensUtil.getResource(context, resourceOid, provisioningService, task, result); + resourceType = LensUtil.getResourceReadOnly(context, resourceOid, provisioningService, task, result); projContext.setResource(resourceType); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java index 1efd18d502f..ac134b4152e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java @@ -153,7 +153,7 @@ public void notifyChange(ResourceObjectShadowChangeDescription change, Task task ResourceType resourceType = change.getResource().asObjectable(); PrismObject configuration = Utils - .getSystemConfiguration(repositoryService, subResult); + .getSystemConfigurationReadOnly(repositoryService, subResult); ObjectSynchronizationType synchronizationPolicy = determineSynchronizationPolicy(resourceType, applicableShadow, configuration, task, subResult); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java index e64e24c18dc..45253c33c40 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java @@ -550,7 +550,7 @@ public static String getPolicyDesc(ObjectSynchronizationType synchronizationPoli private static final long CACHED_SYSTEM_CONFIGURATION_TTL = 120000L; // just to avoid stalled data if version is not incremented for any reason private static final String NO_SYSTEM_CONFIG_MSG = "System configuration object was not found (should not happen in production except for initial repository loading)"; - public static PrismObject getSystemConfiguration(RepositoryService repositoryService, OperationResult result) throws SchemaException { + public static PrismObject getSystemConfigurationReadOnly(RepositoryService repositoryService, OperationResult result) throws SchemaException { PrismObject systemConfiguration = null; if (cachedSystemConfiguration != null && cachedSystemConfigurationRetrieveTimestamp + CACHED_SYSTEM_CONFIGURATION_TTL >= System.currentTimeMillis()) { String currentVersion; @@ -563,13 +563,15 @@ public static PrismObject getSystemConfiguration(Reposi } if (currentVersion != null && currentVersion.equals(cachedSystemConfiguration.getVersion())) { LOGGER.trace("Using cached system configuration object; version = {}", currentVersion); - return cachedSystemConfiguration.clone(); + return cachedSystemConfiguration; } } try { LOGGER.trace("Cache miss: reading system configuration from the repository"); + GetOperationOptions option = GetOperationOptions.createAllowNotFound(); + option.setReadOnly(true); systemConfiguration = repositoryService.getObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), - SelectorOptions.createCollection(GetOperationOptions.createAllowNotFound()), result); + SelectorOptions.createCollection(option), result); } catch (ObjectNotFoundException e) { // just go on ... we will return and continue // This is needed e.g. to set up new system configuration is the old one gets deleted @@ -580,7 +582,7 @@ public static PrismObject getSystemConfiguration(Reposi LOGGER.warn(NO_SYSTEM_CONFIG_MSG); return null; } - cachedSystemConfiguration = systemConfiguration.clone(); + cachedSystemConfiguration = systemConfiguration; cachedSystemConfigurationRetrieveTimestamp = System.currentTimeMillis(); return systemConfiguration; } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java index cf320f11e89..1a19576100f 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java @@ -130,6 +130,7 @@ public void initSystem(Task initTask, OperationResult initResult) InternalMonitor.reset(); // InternalMonitor.setTraceShadowFetchOperation(true); // InternalMonitor.setTraceResourceSchemaOperations(true); + InternalMonitor.setTracePrismObjectClone(true); } @Test @@ -1123,6 +1124,8 @@ public void test131ModifyUserJackAssignAccount() throws Exception { OperationResult result = task.getResult(); preTestCleanup(AssignmentPolicyEnforcementType.FULL); + rememberPrismObjectCloneCount(); + XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // WHEN @@ -1135,6 +1138,7 @@ public void test131ModifyUserJackAssignAccount() throws Exception { TestUtil.assertSuccess("executeChanges result", result); XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); assertShadowFetchOperationCountIncrement(0); + assertPrismObjectCloneIncrement(55); PrismObject userJack = getUser(USER_JACK_OID); display("User after change execution", userJack); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java index 505adb95fe0..bfbaad5051c 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java @@ -151,6 +151,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti InternalMonitor.setTraceShadowFetchOperation(true); InternalMonitor.setTraceResourceSchemaOperations(true); InternalsConfig.encryptionChecks = false; + + InternalMonitor.setTracePrismObjectClone(true); } /** @@ -177,15 +179,17 @@ public void test050GetResourceRaw() throws Exception { Collection> options = SelectorOptions.createCollection(GetOperationOptions.createRaw()); // WHEN + TestUtil.displayWhen(TEST_NAME); PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options , task, result); // THEN + TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess("getObject result", result); display("Resource", resource); - assertPrismObjectCloneIncrement(4); + assertPrismObjectCloneIncrement(1); assertResourceDummy(resource, false); @@ -219,18 +223,72 @@ public void test052GetResourceNoFetch() throws Exception { assertConnectorSchemaParseIncrement(0); rememberPrismObjectCloneCount(); - Collection> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch()); + Collection> options = SelectorOptions.createCollection( + GetOperationOptions.createNoFetch()); // WHEN - PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options , task, result); + TestUtil.displayWhen(TEST_NAME); + PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options, + task, result); // THEN + TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess("getObject result", result); display("Resource", resource); - assertPrismObjectCloneIncrement(2); + assertPrismObjectCloneIncrement(1); + + assertResourceDummy(resource, false); + + assertNull("Schema sneaked in", ResourceTypeUtil.getResourceXsdSchema(resource)); + + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + } + + /** + * MID-3424 + */ + @Test + public void test053GetResourceNoFetchReadOnly() throws Exception { + final String TEST_NAME = "test053GetResourceNoFetchReadOnly"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); + + // precondition + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + rememberPrismObjectCloneCount(); + + GetOperationOptions option = GetOperationOptions.createNoFetch(); + option.setReadOnly(true); + Collection> options = SelectorOptions.createCollection(option); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options, + task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess("getObject result", result); + + display("Resource", resource); + + assertPrismObjectCloneIncrement(0); assertResourceDummy(resource, false); @@ -275,7 +333,56 @@ public void test100SearchResourcesNoFetch() throws Exception { result.computeStatus(); TestUtil.assertSuccess("searchObjects result", result); - assertPrismObjectCloneIncrement(4); + assertPrismObjectCloneIncrement(2); + + for (PrismObject resource: resources) { + assertResource(resource, false); + } + + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + + assertSteadyResources(); + } + + /** + * MID-3424 + */ + @Test + public void test102SearchResourcesNoFetchReadOnly() throws Exception { + final String TEST_NAME = "test102SearchResourcesNoFetchReadOnly"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); + + // precondition + assertSteadyResources(); + rememberPrismObjectCloneCount(); + + GetOperationOptions option = GetOperationOptions.createNoFetch(); + option.setReadOnly(true); + Collection> options = SelectorOptions.createCollection(option); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + List> resources = modelService.searchObjects(ResourceType.class, null, options, task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + assertNotNull("null search return", resources); + assertFalse("Empty search return", resources.isEmpty()); + assertEquals("Unexpected number of resources found", 2, resources.size()); + + result.computeStatus(); + TestUtil.assertSuccess("searchObjects result", result); + + assertPrismObjectCloneIncrement(0); for (PrismObject resource: resources) { assertResource(resource, false); @@ -330,7 +437,62 @@ public boolean handle(PrismObject resource, OperationResult parent assertFalse("Empty search return", resources.isEmpty()); assertEquals("Unexpected number of resources found", 2, resources.size()); - assertPrismObjectCloneIncrement(4); + assertPrismObjectCloneIncrement(2); + + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + + assertSteadyResources(); + } + + /** + * MID-3424 + */ + @Test + public void test107SearchResourcesIterativeNoFetchReadOnly() throws Exception { + final String TEST_NAME = "test107SearchResourcesIterativeNoFetchReadOnly"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); + + // precondition + assertSteadyResources(); + rememberPrismObjectCloneCount(); + + final List> resources = new ArrayList>(); + + ResultHandler handler = new ResultHandler() { + @Override + public boolean handle(PrismObject resource, OperationResult parentResult) { + assertResource(resource, false); + resources.add(resource); + return true; + } + }; + + GetOperationOptions option = GetOperationOptions.createNoFetch(); + option.setReadOnly(true); + Collection> options = SelectorOptions.createCollection(option); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + modelService.searchObjectsIterative(ResourceType.class, null, handler, options, task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess("searchObjects result", result); + + assertFalse("Empty search return", resources.isEmpty()); + assertEquals("Unexpected number of resources found", 2, resources.size()); + + assertPrismObjectCloneIncrement(0); assertResourceSchemaFetchIncrement(0); assertResourceSchemaParseCountIncrement(0); @@ -354,13 +516,15 @@ public void test110GetResourceDummy() throws Exception { rememberPrismObjectCloneCount(); // WHEN + TestUtil.displayWhen(TEST_NAME); PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null , task, result); // THEN + TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess("getObject result", result); - assertPrismObjectCloneIncrement(6); + assertPrismObjectCloneIncrement(5); assertResourceDummy(resource, true); @@ -373,6 +537,43 @@ public void test110GetResourceDummy() throws Exception { IntegrationTestTools.displayXml("Initialized dummy resource", resource); } + @Test + public void test112GetResourceDummyReadOnly() throws Exception { + final String TEST_NAME = "test112GetResourceDummyReadOnly"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); + + rememberPrismObjectCloneCount(); + + Collection> options = SelectorOptions.createCollection( + GetOperationOptions.createReadOnly()); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + PrismObject resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, + options , task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess("getObject result", result); + + assertPrismObjectCloneIncrement(0); + + assertResourceDummy(resource, true); + + assertResourceSchemaFetchIncrement(0); + assertResourceSchemaParseCountIncrement(0); + assertConnectorCapabilitiesFetchIncrement(0); + assertConnectorInitializationCountIncrement(0); + assertConnectorSchemaParseIncrement(0); + + IntegrationTestTools.displayXml("Initialized dummy resource", resource); + } @Test diff --git a/model/model-intest/src/test/resources/logback-test.xml b/model/model-intest/src/test/resources/logback-test.xml index 2f09a617f43..f6e1a180806 100644 --- a/model/model-intest/src/test/resources/logback-test.xml +++ b/model/model-intest/src/test/resources/logback-test.xml @@ -79,7 +79,7 @@ - + @@ -95,6 +95,7 @@ + diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java index de3b0caab4b..13740a0b33a 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java @@ -26,6 +26,8 @@ import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.repo.api.RepositoryService; +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.ValueDisplayUtil; @@ -339,7 +341,8 @@ private String formatReferenceValue(PrismReferenceValue value, boolean mightBeRe private PrismObject getPrismObject(String oid, boolean mightBeRemoved, OperationResult result) { try { - return cacheRepositoryService.getObject(ObjectType.class, oid, null, result); + Collection> options = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + return cacheRepositoryService.getObject(ObjectType.class, oid, options, result); } catch (ObjectNotFoundException e) { if (!mightBeRemoved) { LoggingUtils.logException(LOGGER, "Couldn't resolve reference when displaying object name within a notification (it might be already removed)", e); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseConfigurationHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseConfigurationHelper.java index b70c7a23e6b..dc830c32aca 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseConfigurationHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseConfigurationHelper.java @@ -79,7 +79,7 @@ public WfConfigurationType getWorkflowConfiguration(ModelContext systemConfigurationTypePrismObject = null; try { - systemConfigurationTypePrismObject = Utils.getSystemConfiguration(repositoryService, result); + systemConfigurationTypePrismObject = Utils.getSystemConfigurationReadOnly(repositoryService, result); } catch (SchemaException e) { throw new SystemException("Couldn't get system configuration because of schema exception - cannot continue", e); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java index d30356a48aa..a8a29078b99 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java @@ -43,6 +43,8 @@ import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.ucf.api.GenericFrameworkException; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ResourceSchema; @@ -144,7 +146,7 @@ private ConnectorInstance createConfiguredConnectorInstance(PrismObject repoConnector = repositoryService.getObject(ConnectorType.class, connOid, null, result); + Collection> options = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + PrismObject repoConnector = repositoryService.getObject(ConnectorType.class, connOid, + options, result); connectorType = repoConnector.asObjectable(); connectorTypeCache.put(connOid, connectorType); } else { String currentConnectorVersion = repositoryService.getVersion(ConnectorType.class, connOid, result); if (!currentConnectorVersion.equals(connectorType.getVersion())) { - PrismObject repoConnector = repositoryService.getObject(ConnectorType.class, connOid, null, result); + Collection> options = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + PrismObject repoConnector = repositoryService.getObject(ConnectorType.class, connOid, options, result); connectorType = repoConnector.asObjectable(); connectorTypeCache.put(connOid, connectorType); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java index 457f72f3cd6..a20e5d3d68c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; +import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; @@ -109,7 +110,8 @@ public ResourceType getResource() throws ObjectNotFoundException, SchemaExceptio if (getResourceOid() == null) { throw new SchemaException("Null resource OID "+getDesc()); } - resource = resourceManager.getResource(getResourceOid(), null, parentResult).asObjectable(); + GetOperationOptions options = GetOperationOptions.createReadOnly(); + resource = resourceManager.getResource(getResourceOid(), options, parentResult).asObjectable(); updateResourceName(); } return resource; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java index f23fd097a72..2d6502f29ba 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java @@ -558,7 +558,11 @@ private SearchResultList> searchRepoObject // TODO: should searching connectors trigger rediscovery? - repoObjects = getCacheRepositoryService().searchObjects(type, query, null, result); + Collection> repoOptions = null; + if (GetOperationOptions.isReadOnly(SelectorOptions.findRootOptions(options))) { + repoOptions = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + } + repoObjects = getCacheRepositoryService().searchObjects(type, query, repoOptions, result); SearchResultList> newObjListType = new SearchResultList(new ArrayList>()); for (PrismObject repoObject : repoObjects) { @@ -1132,11 +1136,15 @@ public boolean handle(PrismObject object, OperationResult objResult) { } }; + Collection> repoOptions = null; + if (GetOperationOptions.isReadOnly(rootOptions)) { + repoOptions = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + } SearchResultMetadata metadata = null; try { - metadata = getCacheRepositoryService().searchObjectsIterative(type, query, internalHandler, null, false, result); // TODO think about strictSequential flag + metadata = getCacheRepositoryService().searchObjectsIterative(type, query, internalHandler, repoOptions, false, result); // TODO think about strictSequential flag result.computeStatus(); result.recordSuccessIfUnknown(); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceCache.java index b7920abdd9c..c3ef80e59b7 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceCache.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -85,11 +86,11 @@ private boolean compareVersion(String version1, String version2) { return version1.equals(version2); } - public synchronized PrismObject get(PrismObject resource) throws SchemaException { - return get(resource.getOid(), resource.getVersion()); + public synchronized PrismObject get(PrismObject resource, GetOperationOptions options) throws SchemaException { + return get(resource.getOid(), resource.getVersion(), options); } - public synchronized PrismObject get(String oid, String version) throws SchemaException { + public synchronized PrismObject get(String oid, String version, GetOperationOptions options) throws SchemaException { if (oid == null) { return null; } @@ -103,7 +104,12 @@ public synchronized PrismObject get(String oid, String version) th return null; } - return cachedResource.clone(); + if (GetOperationOptions.isReadOnly(options)) { + // TODO: make sure it is immutable + return cachedResource; + } else { + return cachedResource.clone(); + } } /** diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java index ef52697a259..6ba5afb84ae 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java @@ -64,6 +64,7 @@ import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.CapabilityUtil; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; @@ -119,7 +120,7 @@ public class ResourceManager { public PrismObject getResource(PrismObject repositoryObject, GetOperationOptions options, OperationResult parentResult) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException{ InternalMonitor.getResourceCacheStats().recordRequest(); - PrismObject cachedResource = resourceCache.get(repositoryObject); + PrismObject cachedResource = resourceCache.get(repositoryObject, options); if (cachedResource != null) { InternalMonitor.getResourceCacheStats().recordHit(); return cachedResource; @@ -135,7 +136,7 @@ public PrismObject getResource(String oid, GetOperationOptions opt InternalMonitor.getResourceCacheStats().recordRequest(); String version = repositoryService.getVersion(ResourceType.class, oid, parentResult); - PrismObject cachedResource = resourceCache.get(oid, version); + PrismObject cachedResource = resourceCache.get(oid, version, options); if (cachedResource != null) { InternalMonitor.getResourceCacheStats().recordHit(); if (LOGGER.isTraceEnabled()){ @@ -149,7 +150,11 @@ public PrismObject getResource(String oid, GetOperationOptions opt new Object[]{oid, version, resourceCache.getVersion(oid)}); } - PrismObject repositoryObject = repositoryService.getObject(ResourceType.class, oid, null, parentResult); + Collection> repoOptions = null; + if (GetOperationOptions.isReadOnly(options)) { + repoOptions = SelectorOptions.createCollection(GetOperationOptions.createReadOnly()); + } + PrismObject repositoryObject = repositoryService.getObject(ResourceType.class, oid, repoOptions, parentResult); return loadAndCacheResource(repositoryObject, options, parentResult); } @@ -523,7 +528,7 @@ private ContainerDelta createSchemaUpdateDelta(PrismObject resource, OperationResult result) throws SchemaException, ObjectNotFoundException { - ConnectorType connectorType = connectorTypeManager.getConnectorType(resource.asObjectable(), result); + ConnectorType connectorType = connectorTypeManager.getConnectorTypeReadOnly(resource.asObjectable(), result); PrismSchema connectorSchema = connectorTypeManager.getConnectorSchema(connectorType); if (connectorSchema == null) { throw new SchemaException("No connector schema in "+connectorType); diff --git a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java index 6ffe7ec468d..523cc1649ec 100644 --- a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java +++ b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -107,19 +107,25 @@ public PrismObject getObject(Class type, String oid return repository.getObject(type, oid, options, parentResult); } Cache cache = getCache(); + boolean readOnly = GetOperationOptions.isReadOnly(SelectorOptions.findRootOptions(options)); if (cache == null) { log("Cache: NULL {} ({})", oid, type.getSimpleName()); } else { PrismObject object = (PrismObject) cache.getObject(oid); if (object != null) { // TODO: result? - log("Cache: HIT {} ({})", oid, type.getSimpleName()); - return object.clone(); + if (readOnly) { + log("Cache: HIT {} ({})", oid, type.getSimpleName()); + return object; + } else { + log("Cache: HIT(clone) {} ({})", oid, type.getSimpleName()); + return object.clone(); + } } log("Cache: MISS {} ({})", oid, type.getSimpleName()); } PrismObject object = repository.getObject(type, oid, null, parentResult); - cacheObject(cache, object); + cacheObject(cache, object, readOnly); return object; } @@ -157,13 +163,19 @@ public SearchResultList> searchObjects(Cla return repository.searchObjects(type, query, options, parentResult); } Cache cache = getCache(); + boolean readOnly = GetOperationOptions.isReadOnly(SelectorOptions.findRootOptions(options)); if (cache == null) { log("Cache: NULL ({})", type.getSimpleName()); } else { SearchResultList queryResult = cache.getQueryResult(type, query, prismContext); if (queryResult != null) { - log("Cache: HIT {} ({})", query, type.getSimpleName()); - return queryResult.clone(); + if (readOnly) { + log("Cache: HIT {} ({})", query, type.getSimpleName()); + return queryResult; + } else { + log("Cache: HIT(clone) {} ({})", query, type.getSimpleName()); + return queryResult.clone(); + } } log("Cache: MISS {} ({})", query, type.getSimpleName()); } @@ -172,7 +184,7 @@ public SearchResultList> searchObjects(Cla SearchResultList> objects = repository.searchObjects(type, query, options, parentResult); if (cache != null && options == null) { for (PrismObject object : objects) { - cacheObject(cache, object); + cacheObject(cache, object, readOnly); } // TODO cloning before storing into cache? cache.putQueryResult(type, query, objects, prismContext); @@ -190,7 +202,7 @@ public SearchResultList searchContainers(Class t */ @Override public SearchResultMetadata searchObjectsIterative(Class type, ObjectQuery query, - final ResultHandler handler, Collection> options, + final ResultHandler handler, final Collection> options, boolean strictlySequential, OperationResult parentResult) throws SchemaException { // TODO use cached query result if applicable log("Cache: PASS searchObjectsIterative ({})", type.getSimpleName()); @@ -198,7 +210,7 @@ public SearchResultMetadata searchObjectsIterative(Class< ResultHandler myHandler = new ResultHandler() { @Override public boolean handle(PrismObject object, OperationResult parentResult) { - cacheObject(cache, object); + cacheObject(cache, object, GetOperationOptions.isReadOnly(SelectorOptions.findRootOptions(options))); return handler.handle(object, parentResult); } }; @@ -254,7 +266,7 @@ public PrismObject searchShadowOwner( // TODO cache the search operation? PrismObject ownerObject = repository.searchShadowOwner(shadowOid, options, parentResult); if (ownerObject != null && nullOrHarmlessOptions(options)) { - cacheObject(getCache(), ownerObject); + cacheObject(getCache(), ownerObject, GetOperationOptions.isReadOnly(SelectorOptions.findRootOptions(options))); } return ownerObject; } @@ -338,9 +350,15 @@ public void testOrgClosureConsistency(boolean repairIfNecessary, OperationResult repository.testOrgClosureConsistency(repairIfNecessary, testResult); } - private void cacheObject(Cache cache, PrismObject object) { + private void cacheObject(Cache cache, PrismObject object, boolean readOnly) { if (cache != null) { - cache.putObject(object.getOid(), (PrismObject) object.clone()); + PrismObject objectToCache; + if (readOnly) { + objectToCache = (PrismObject) object; + } else { + objectToCache = (PrismObject) object.clone(); + } + cache.putObject(object.getOid(), objectToCache); } } diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java index 9ec5f1e83ce..39d81a51a08 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java @@ -82,6 +82,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; @@ -317,6 +318,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti // Tasks importObjectFromFile(TASK_LIVE_SYNC_DUMMY_SOURCE_FILE, initResult); + InternalMonitor.setTracePrismObjectClone(true); + } @Override diff --git a/testing/story/src/test/resources/logback-test.xml b/testing/story/src/test/resources/logback-test.xml index 436e9467a45..2c8e2cef7a2 100644 --- a/testing/story/src/test/resources/logback-test.xml +++ b/testing/story/src/test/resources/logback-test.xml @@ -34,6 +34,7 @@ + + + + + + Log information on users starting with 'b' + + + + c:UserType + + + + polyStringNorm + c:name + b + true + + + + name + + + + log + + + + + + runnable + + BulkActions + http://midpoint.evolveum.com/xml/ns/public/model/scripting/handler-3 + single + + + From 94988351dca6c9c081dec4a4ec71d9c984d6970f Mon Sep 17 00:00:00 2001 From: honchar Date: Tue, 27 Sep 2016 10:57:02 +0200 Subject: [PATCH 8/8] applied roleManagement system configuration for role catalog displaying --- .../assignment/AssignmentDetailsPanel.html | 23 +++++ .../assignment/AssignmentDetailsPanel.java | 54 +++++++++++ .../AssignmentShoppingCartPanel.java | 10 +- .../web/component/data/MultiButtonTable.html | 21 +++- .../web/component/data/MultiButtonTable.java | 97 ++++++++++++------- .../page/self/PageAssignmentShoppingKart.java | 36 ++++++- .../localization/Midpoint.properties | 4 +- .../localization/Midpoint_en.properties | 4 +- 8 files changed, 202 insertions(+), 47 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.html new file mode 100644 index 00000000000..d5a2adbfdf9 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.html @@ -0,0 +1,23 @@ + + + + +
+ + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.java new file mode 100644 index 00000000000..d27708c48f2 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDetailsPanel.java @@ -0,0 +1,54 @@ +package com.evolveum.midpoint.web.component.assignment; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.web.component.dialog.Popupable; +import org.apache.wicket.Component; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.StringResourceModel; + +/** + * Created by honchar + */ +public class AssignmentDetailsPanel extends BasePanel { + private static final String ID_DETAILS_PANEL = "detailsPanel"; + + public AssignmentDetailsPanel(String id) { + super(id); + } + + public AssignmentDetailsPanel(String id, IModel model) { + super(id, model); + initLayout(); + } + + private void initLayout() { + setOutputMarkupId(true); + +// AssignmentEditorDto aa = assignmentModel.getObject(); +// if (aa == null){} + AssignmentEditorPanel assignmentDetailsPanel = new AssignmentEditorPanel(ID_DETAILS_PANEL, getModel()) { + + }; + assignmentDetailsPanel.setOutputMarkupId(true); + add(assignmentDetailsPanel); + + } + + public int getWidth() { + return 900; + } + + public int getHeight() { + return 600; + } + + public StringResourceModel getTitle() { + return createStringResource("MultiButtonPanel.assignmentDetailsPopupTitle"); + } + + public Component getComponent() { + return this; + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java index 0052920ad65..3abdeacf436 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentShoppingCartPanel.java @@ -75,13 +75,13 @@ protected List createTreeChildrenMenu() { } - private void selectTreeItemPerformed(SelectableBean selected, AjaxRequestTarget target){ + private void selectTreeItemPerformed(SelectableBean selected, AjaxRequestTarget target) { final OrgType selectedOgr = selected.getValue(); final ObjectDataProvider provider = initProvider(selectedOgr.getOid()); -if (provider != null){ - long s = provider.size(); - provider.internalIterator(0, s); -} + if (provider != null) { + long s = provider.size(); + provider.internalIterator(0, s); + } MultiButtonTable assignmentsTable = new MultiButtonTable(ID_ASSIGNMENTS_PANEL, 3, new IModel>() { @Override public List getObject() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html index 20c338a0fda..6d3e94eb6d0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.html @@ -1,10 +1,29 @@ +
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java index 6d3958adc18..b051486fb2e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java @@ -2,14 +2,21 @@ import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.assignment.AssignmentDetailsPanel; import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; +import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDtoType; +import com.evolveum.midpoint.web.component.assignment.AssignmentEditorPanel; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; 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.repeater.RepeatingView; import org.apache.wicket.model.IModel; @@ -21,7 +28,10 @@ public class MultiButtonTable extends BasePanel> { private static final String ID_ROW = "row"; private static final String ID_CELL = "cell"; - private static final String ID_BUTTON = "button"; + private static final String ID_BUTTON_TYPE_ICON = "typeIcon"; + private static final String ID_BUTTON_LABEL = "buttonLabel"; + private static final String ID_BUTTON_PLUS_ICON = "plusIcon"; + private static final String ID_BUTTON = "assignmentButton"; private int itemsCount = 0; private int itemsPerRow = 0; @@ -29,6 +39,7 @@ public class MultiButtonTable extends BasePanel> { public MultiButtonTable (String id){ super(id); } + public MultiButtonTable (String id, int itemsPerRow, IModel> model){ super(id, model); this.itemsPerRow = itemsPerRow; @@ -52,9 +63,8 @@ private void initLayout(){ for (int colNumber = 0; colNumber < itemsPerRow; colNumber++){ WebMarkupContainer colContainer = new WebMarkupContainer(columns.newChildId()); columns.add(colContainer); - ObjectReferenceType targetRef = assignmentsList.get(index).getTargetRef(); - colContainer.add(populateCell(Integer.toString(index))); + populateCell(colContainer, assignmentsList.get(index)); index++; if (index >= assignmentsList.size()){ break; @@ -65,46 +75,63 @@ private void initLayout(){ } } - protected Component populateCell(final String caption){ - IModel captionModel = new IModel() { - @Override - public String getObject() { - return caption; - } + protected void populateCell(WebMarkupContainer cellContainer, final AssignmentEditorDto assignment){ + AjaxLink assignmentButton = new AjaxLink(ID_BUTTON) { + private static final long serialVersionUID = 1L; @Override - public void setObject(String s) { - } + public void onClick(AjaxRequestTarget ajaxRequestTarget) { + IModel assignmentModel = new IModel() { + @Override + public AssignmentEditorDto getObject() { + return null; + } - @Override - public void detach() { - } - }; - AjaxButton button = new AjaxButton(ID_BUTTON, captionModel) { - @Override - public void onClick(AjaxRequestTarget target) { - clickPerformed(target); - } - @Override - public boolean isEnabled(){ - return true; - } - @Override - public boolean isVisible(){ - return true; - } - }; - button.add(new AttributeAppender("class", getButtonCssClass())); - return button; - } + @Override + public void setObject(AssignmentEditorDto assignmentEditorDto) { + } + @Override + public void detach() { - protected String getButtonCssClass(){ - return "col-sm-3 small-box bg-yellow"; + } + }; +// getPageBase().showMainPopup(new AssignmentDetailsPanel(getPageBase().getMainPopupBodyId(), assignmentModel), ajaxRequestTarget); + } + }; + Label plusLabel = new Label(ID_BUTTON_PLUS_ICON, "+"); +// plusLabel.add(new AttributeAppender("title", getPageBase().createStringResource("MultiButtonPanel.plusIconTitle"))); + assignmentButton.add(plusLabel); + + WebMarkupContainer icon = new WebMarkupContainer(ID_BUTTON_TYPE_ICON); + icon.add(new AttributeAppender("class", getIconClass(assignment.getType()))); + assignmentButton.add(icon); + + Label nameLabel = new Label(ID_BUTTON_LABEL, assignment.getName()); +// nameLabel.add(new AjaxEventBehavior("click") { +// private static final long serialVersionUID = 1L; +// @Override +// protected void onEvent(AjaxRequestTarget ajaxRequestTarget) { +// +// } +// }); + assignmentButton.add(nameLabel); + cellContainer.add(assignmentButton); } - protected void clickPerformed(AjaxRequestTarget target){ + protected void assignmentDetailsPerformed(AjaxRequestTarget target){ } + private String getIconClass(AssignmentEditorDtoType type){ + if (AssignmentEditorDtoType.ROLE.equals(type)){ + return "fa fa-street-view object-role-color"; + }else if (AssignmentEditorDtoType.SERVICE.equals(type)){ + return "fa fa-cloud object-service-color"; + }else if (AssignmentEditorDtoType.ORG_UNIT.equals(type)){ + return "fa fa-building object-org-color"; + } else { + return ""; + } + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java index eaf505d9c8e..bde74de64c7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentShoppingKart.java @@ -1,12 +1,18 @@ package com.evolveum.midpoint.web.page.self; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.*; +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.assignment.AssignmentShoppingCartPanel; import com.evolveum.midpoint.web.component.assignment.MultipleAssignmentSelectorPanel; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.IModel; @@ -23,6 +29,9 @@ public class PageAssignmentShoppingKart extends PageSelf{ private static final String ID_MAIN_PANEL = "mainPanel"; private static final String ID_MAIN_FORM = "mainForm"; + private static final String DOT_CLASS = PageAssignmentShoppingKart.class.getName() + "."; + private static final String OPERATION_LOAD_QUESTION_POLICY = DOT_CLASS + "loadRoleCatalogReference"; + private static final Trace LOGGER = TraceManager.getTrace(PageAssignmentShoppingKart.class); public PageAssignmentShoppingKart(){ initLayout(); @@ -30,11 +39,26 @@ public PageAssignmentShoppingKart(){ private void initLayout(){ Form mainForm = new org.apache.wicket.markup.html.form.Form(ID_MAIN_FORM); add(mainForm); -//TODO get oid of the catalog OrgType object AssignmentShoppingCartPanel panel = new AssignmentShoppingCartPanel(ID_MAIN_PANEL, new IModel() { @Override public String getObject() { - return "3ecc0a04-358a-4a83-9182-d7e4bcf71781"; + Task task = getPageBase().createAnonymousTask(OPERATION_LOAD_QUESTION_POLICY); + OperationResult result = task.getResult(); + + PrismObject config; + try { + config = getPageBase().getModelService().getObject(SystemConfigurationType.class, + SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, task, result); + } catch (ObjectNotFoundException | SchemaException | SecurityViolationException + | CommunicationException | ConfigurationException e) { + LOGGER.error("Error getting system configuration: {}", e.getMessage(), e); + return null; + } + if (config != null && config.asObjectable().getRoleManagement() != null && + config.asObjectable().getRoleManagement().getRoleCatalogRef() != null){ + return config.asObjectable().getRoleManagement().getRoleCatalogRef().getOid(); + } + return ""; } @Override @@ -50,4 +74,8 @@ public void detach() { mainForm.add(panel); } + + private PageBase getPageBase(){ + return (PageBase) getPage(); + } } diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index f03ee4408ef..c601b76c39e 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -3320,4 +3320,6 @@ PageEvaluateMapping.sample.FullName_Delta=Full name mapping (change in givenName PageEvaluateMapping.sample.FullName_Delta_Ref=Full name mapping (change in givenName); source from repository PageEvaluateMapping.sample.FullName_Delta_Cond=Full name mapping with condition (change in givenName) PageEvaluateMapping.sample.OrgName=Deriving attribute from parent org's name -PageAssignmentShoppingKart.title=Assignment request \ No newline at end of file +PageAssignmentShoppingKart.title=Assignment request +MultiButtonPanel.plusIconTitle=Add item to shopping cart +MultiButtonPanel.assignmentDetailsPopupTitle=Assignment details \ No newline at end of file diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties index 53d4a9fd9ba..1a55b373381 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties @@ -3279,4 +3279,6 @@ PageEvaluateMapping.sample.FullName_Delta=Full name mapping (change in givenName PageEvaluateMapping.sample.FullName_Delta_Ref=Full name mapping (change in givenName); source from repository PageEvaluateMapping.sample.FullName_Delta_Cond=Full name mapping with condition (change in givenName) PageEvaluateMapping.sample.OrgName=Deriving attribute from parent org's name -PageAssignmentShoppingKart.title=Assignment request \ No newline at end of file +PageAssignmentShoppingKart.title=Assignment request +MultiButtonPanel.plusIconTitle=Add item to shopping cart +MultiButtonPanel.assignmentDetailsPopupTitle=Assignment details \ No newline at end of file