diff --git a/dist/src/main/bin/ninja.sh b/dist/src/main/bin/ninja.sh index f5159f6d31f..a5c8e5b935b 100755 --- a/dist/src/main/bin/ninja.sh +++ b/dist/src/main/bin/ninja.sh @@ -37,15 +37,17 @@ cd "$PRGDIR/.." >/dev/null cd "$SCRIPT_PATH/.." -if [ ! -d var ] ; then - echo "ERROR: midpoint.home directory desn't exist" - exit 1 -else - MIDPOINT_HOME=$(cd "$SCRIPT_PATH../var"; pwd) +# honor MIDPOINT_HOME variable if it exists! +if [ -z "$MIDPOINT_HOME" ]; then + if [ ! -d var ] ; then + echo "ERROR: midpoint.home directory desn't exist" + exit 1 + else + MIDPOINT_HOME=$(cd "$SCRIPT_PATH../var"; pwd) + fi + + [ -z "$MIDPOINT_HOME" ] && MIDPOINT_HOME=`cd "$SCRIPT_PATH../var" >/dev/null; pwd` fi - -[ -z "$MIDPOINT_HOME" ] && MIDPOINT_HOME=`cd "$SCRIPT_PATH../var" >/dev/null; pwd` - #cd "$SCRIPT_PATH../lib" if [ ! -f lib/ninja.jar ] ; then diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java index 65430a1cb48..2bcaace9721 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.security.SecurityUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -40,15 +41,13 @@ /** * Created by honchar. */ -public abstract class AbstractAssignmentPopupTabPanel extends BasePanel { +public abstract class AbstractAssignmentPopupTabPanel extends BasePanel { private static final long serialVersionUID = 1L; private static final String ID_OBJECT_LIST_PANEL = "objectListPanel"; private static final String DOT_CLASS = AbstractAssignmentPopupTabPanel.class.getName(); - private static final Trace LOGGER = TraceManager.getTrace(AbstractAssignmentPopupTabPanel.class); - private static final String OPERATION_LOAD_ASSIGNABLE_ROLES = DOT_CLASS + "loadAssignableRoles"; private ObjectTypes type; protected List selectedObjects; @@ -90,31 +89,7 @@ protected IModel getCheckBoxEnableModel(IModel> rowMo @Override protected ObjectQuery addFilterToContentQuery(ObjectQuery query) { - if (type.equals(RoleType.COMPLEX_TYPE)) { - LOGGER.debug("Loading roles which the current user has right to assign"); - Task task = AbstractAssignmentPopupTabPanel.this.getPageBase().createSimpleTask(OPERATION_LOAD_ASSIGNABLE_ROLES); - OperationResult result = task.getResult(); - ObjectFilter filter = null; - try { - ModelInteractionService mis = AbstractAssignmentPopupTabPanel.this.getPageBase().getModelInteractionService(); - RoleSelectionSpecification roleSpec = - mis.getAssignableRoleSpecification(SecurityUtils.getPrincipalUser().getUser().asPrismObject(), task, result); - filter = roleSpec.getFilter(); - } catch (Exception ex) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load available roles", ex); - result.recordFatalError("Couldn't load available roles", ex); - } finally { - result.recomputeStatus(); - } - if (!result.isSuccess() && !result.isHandledError()) { - AbstractAssignmentPopupTabPanel.this.getPageBase().showResult(result); - } - if (query == null){ - query = new ObjectQuery(); - } - query.addFilter(filter); - } - return query; + return AbstractAssignmentPopupTabPanel.this.addFilterToContentQuery(query); } }; @@ -129,9 +104,7 @@ public boolean isVisible(){ return listPanel; } - protected PopupObjectListPanel getObjectListPanel(){ - return (PopupObjectListPanel)get(ID_OBJECT_LIST_PANEL); - } + protected abstract void initParametersPanel(); protected List getSelectedObjectsList(){ PopupObjectListPanel objectListPanel = getObjectListPanel(); @@ -141,15 +114,23 @@ protected List getSelectedObjectsList(){ return objectListPanel.getSelectedObjects(); } + protected PopupObjectListPanel getObjectListPanel(){ + return (PopupObjectListPanel)get(ID_OBJECT_LIST_PANEL); + } + + protected void onSelectionPerformed(AjaxRequestTarget target){} + protected IModel getObjectSelectCheckBoxEnableModel(IModel> rowModel){ return Model.of(true); } - protected boolean isObjectListPanelVisible(){ - return true; + protected ObjectQuery addFilterToContentQuery(ObjectQuery query){ + return query; } - protected abstract void initParametersPanel(); + protected abstract List getSelectedAssignmentsList(); - protected void onSelectionPerformed(AjaxRequestTarget target){} + protected boolean isObjectListPanelVisible(){ + return true; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java index 1e9a2c1dd72..df5ecefbc0c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java @@ -3,8 +3,6 @@ import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.schema.constants.ObjectTypes; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.component.dialog.Popupable; @@ -15,17 +13,15 @@ import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.model.IModel; import org.apache.wicket.model.StringResourceModel; -import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List; /** * Created by honchar. */ -public class AssignmentPopup extends BasePanel implements Popupable{ +public class AssignmentPopup extends BasePanel implements Popupable{ private static final long serialVersionUID = 1L; private static final String ID_TABS_PANEL = "tabsPanel"; @@ -33,15 +29,7 @@ public class AssignmentPopup extends BasePanel implements private static final String ID_ASSIGN_BUTTON = "assignButton"; private static final String ID_FORM = "form"; - private FocusTypeAssignmentPopupTabPanel rolesTabPanel; - private OrgTypeAssignmentPopupTabPanel orgsTabPanel; - private OrgTypeAssignmentPopupTabPanel orgTreeViewTabPanel; - private FocusTypeAssignmentPopupTabPanel servicesTabPanel; - private FocusTypeAssignmentPopupTabPanel usersTabPanel; - private ResourceTypeAssignmentPopupTabPanel resourcesTabPanel; - private List selectedOrgsList = new ArrayList<>(); - private boolean isOrgTreeView; public AssignmentPopup(String id){ super(id); @@ -67,7 +55,7 @@ protected void onInitialize(){ @Override public void onClick(AjaxRequestTarget target) { -// TypedAssignablePanel.this.assignButtonClicked(target, new ArrayList<>()); + AssignmentPopup.this.getPageBase().hideMainPopup(target); } }; cancelButton.setOutputMarkupId(true); @@ -81,55 +69,25 @@ public void onClick(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { List newAssignmentsList = new ArrayList<>(); - if (rolesTabPanel != null){ - List selectedRoles = rolesTabPanel.getSelectedObjectsList(); - QName relation = rolesTabPanel.getRelationValue(); - selectedRoles.forEach(selectedRole -> { - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(selectedRole, relation); - AssignmentType newAssignment = new AssignmentType(); - newAssignment.setTargetRef(ref); - newAssignmentsList.add(newAssignment); - }); - } - //todo synchronize relation drop down between 2 org tabs - if (orgsTabPanel != null || orgTreeViewTabPanel != null){ - QName relation = orgsTabPanel != null ? orgsTabPanel.getRelationValue() : - (orgTreeViewTabPanel != null ? orgTreeViewTabPanel.getRelationValue() : SchemaConstants.ORG_DEFAULT); - selectedOrgsList.forEach(selectedOrg -> { - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(selectedOrg, relation); - AssignmentType newAssignment = new AssignmentType(); - newAssignment.setTargetRef(ref); - newAssignmentsList.add(newAssignment); - }); - } - if (servicesTabPanel != null){ - List selectedServices = servicesTabPanel.getSelectedObjectsList(); - QName relation = servicesTabPanel.getRelationValue(); - selectedServices.forEach(selectedService -> { - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(selectedService, relation); - AssignmentType newAssignment = new AssignmentType(); - newAssignment.setTargetRef(ref); - newAssignmentsList.add(newAssignment); - }); - } - if (resourcesTabPanel != null){ - List selectedResourcces = resourcesTabPanel.getSelectedObjectsList(); - String intent = resourcesTabPanel.getIntentValue(); - ShadowKindType kind = resourcesTabPanel.getKindValue(); - selectedResourcces.forEach(selectedResource -> { - ConstructionType constructionType = new ConstructionType(); - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(selectedResource); - constructionType.setResourceRef(ref); - constructionType.setKind(kind); - constructionType.setIntent(intent); - - AssignmentType newAssignment = new AssignmentType(); - newAssignment.setConstruction(constructionType); - newAssignmentsList.add(newAssignment); - }); - } - addPerformed(target, newAssignmentsList); + List newOrgTypeAssignmentsList = new ArrayList<>(); + tabs.forEach(panelTab -> { + WebMarkupContainer assignmentPanel = ((CountablePanelTab)panelTab).getPanel(); + if (assignmentPanel == null){ + return; + } + if (assignmentPanel instanceof OrgTypeAssignmentPopupTabPanel){ + if (newOrgTypeAssignmentsList.isEmpty()) { + newOrgTypeAssignmentsList.addAll(((AbstractAssignmentPopupTabPanel) assignmentPanel).getSelectedAssignmentsList()); + return; + } else { + return; + } + } + newAssignmentsList.addAll(((AbstractAssignmentPopupTabPanel)assignmentPanel).getSelectedAssignmentsList()); + }); + newAssignmentsList.addAll(newOrgTypeAssignmentsList); + addPerformed(target, newAssignmentsList); } }; addButton.setOutputMarkupId(true); @@ -148,7 +106,7 @@ private List createAssignmentTabs() { @Override public WebMarkupContainer createPanel(String panelId) { - rolesTabPanel = new FocusTypeAssignmentPopupTabPanel(panelId, ObjectTypes.ROLE){ + return new FocusTypeAssignmentPopupTabPanel(panelId, ObjectTypes.ROLE){ private static final long serialVersionUID = 1L; @Override @@ -156,19 +114,14 @@ protected void onSelectionPerformed(AjaxRequestTarget target){ tabLabelPanelUpdate(target); } }; - return rolesTabPanel; } @Override public String getCount() { - if (rolesTabPanel == null){ - return "0"; - } - return Integer.toString(rolesTabPanel.getObjectListPanel().getSelectedObjectsCount()); + return Integer.toString(getTabPanelSelectedCount(getPanel())); } }); - IModel isOrgTreeViewModel = getOrgTreeViewModel(); tabs.add( new CountablePanelTab(getPageBase().createStringResource("ObjectTypes.ORG"), authorization) { @@ -176,7 +129,7 @@ public String getCount() { @Override public WebMarkupContainer createPanel(String panelId) { - orgsTabPanel = new OrgTypeAssignmentPopupTabPanel(panelId, isOrgTreeViewModel, selectedOrgsList){ + return new OrgTypeAssignmentPopupTabPanel(panelId, false, selectedOrgsList){ private static final long serialVersionUID = 1L; @Override @@ -185,8 +138,6 @@ protected void onSelectionPerformed(AjaxRequestTarget target){ } }; - orgsTabPanel.setOutputMarkupId(true); - return orgsTabPanel; } @Override @@ -196,13 +147,13 @@ public String getCount() { }); - tabs.add(new CountablePanelTab(getPageBase().createStringResource("TypedAssignablePanel.orgTreeView"), authorization) { + tabs.add(new CountablePanelTab(createStringResource("TypedAssignablePanel.orgTreeView"), authorization) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { - orgTreeViewTabPanel = new OrgTypeAssignmentPopupTabPanel(panelId, isOrgTreeViewModel, selectedOrgsList){ + return new OrgTypeAssignmentPopupTabPanel(panelId, true, selectedOrgsList){ private static final long serialVersionUID = 1L; @Override @@ -211,8 +162,6 @@ protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target){ } }; - orgTreeViewTabPanel.setOutputMarkupId(true); - return orgTreeViewTabPanel; } @Override @@ -228,7 +177,7 @@ public String getCount() { @Override public WebMarkupContainer createPanel(String panelId) { - servicesTabPanel = new FocusTypeAssignmentPopupTabPanel(panelId, ObjectTypes.SERVICE){ + return new FocusTypeAssignmentPopupTabPanel(panelId, ObjectTypes.SERVICE){ private static final long serialVersionUID = 1L; @Override @@ -237,15 +186,11 @@ protected void onSelectionPerformed(AjaxRequestTarget target){ } }; - return servicesTabPanel; } @Override public String getCount() { - if (servicesTabPanel == null){ - return "0"; - } - return Integer.toString(servicesTabPanel.getObjectListPanel().getSelectedObjectsCount()); + return Integer.toString(getTabPanelSelectedCount(getPanel())); } }); @@ -256,7 +201,7 @@ public String getCount() { @Override public WebMarkupContainer createPanel(String panelId) { - resourcesTabPanel = new ResourceTypeAssignmentPopupTabPanel(panelId){ + return new ResourceTypeAssignmentPopupTabPanel(panelId){ private static final long serialVersionUID = 1L; @Override @@ -265,53 +210,32 @@ protected void onSelectionPerformed(AjaxRequestTarget target){ tabLabelPanelUpdate(target); } }; - return resourcesTabPanel; } @Override public String getCount() { - if (resourcesTabPanel == null){ - return "0"; - } - return Integer.toString(resourcesTabPanel.getObjectListPanel().getSelectedObjectsCount()); + return Integer.toString(getTabPanelSelectedCount(getPanel())); } }); return tabs; } - private IModel getOrgTreeViewModel(){ - //the index of the Org Tree panel is 2 - int orgTreeViewTabIndex = 2; - return new IModel() { - private static final long serialVersionUID = 1L; - - @Override - public Boolean getObject() { - isOrgTreeView = getTabbedPanel() != null && getTabbedPanel().getSelectedTab() == orgTreeViewTabIndex; - return isOrgTreeView; - } - - @Override - public void setObject(Boolean object) { - isOrgTreeView = object; - } - - @Override - public void detach() { + private int getTabPanelSelectedCount(WebMarkupContainer panel){ + if (panel != null && panel instanceof FocusTypeAssignmentPopupTabPanel){ + return ((FocusTypeAssignmentPopupTabPanel) panel).getSelectedObjectsList().size(); + } + return 0; + } - } - }; + private void tabLabelPanelUpdate(AjaxRequestTarget target){ + target.add(getTabbedPanel()); } private TabbedPanel getTabbedPanel(){ return (TabbedPanel) get(ID_FORM).get(ID_TABS_PANEL); } - private void tabLabelPanelUpdate(AjaxRequestTarget target){ - target.add(getTabbedPanel()); - } - protected void addPerformed(AjaxRequestTarget target, List newAssignmentsList) { getPageBase().hideMainPopup(target); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java index e50d9d83d3e..f299301c6b0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java @@ -16,16 +16,25 @@ package com.evolveum.midpoint.gui.api.component; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.model.api.ModelInteractionService; +import com.evolveum.midpoint.model.api.RoleSelectionSpecification; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.assignment.RelationTypes; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; +import com.evolveum.midpoint.web.security.SecurityUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import javax.xml.namespace.QName; @@ -44,6 +53,7 @@ public class FocusTypeAssignmentPopupTabPanel extends Abstr private static final String DOT_CLASS = FocusTypeAssignmentPopupTabPanel.class.getName(); private static final Trace LOGGER = TraceManager.getTrace(FocusTypeAssignmentPopupTabPanel.class); + private static final String OPERATION_LOAD_ASSIGNABLE_ROLES = DOT_CLASS + "loadAssignableRoles"; public FocusTypeAssignmentPopupTabPanel(String id, ObjectTypes type){ this(id, type, new ArrayList<>()); @@ -68,8 +78,16 @@ protected void initParametersPanel(){ relationContainer.add(relationSelector); } - private DropDownChoicePanel getRelationDropDown(){ - return (DropDownChoicePanel)get(ID_RELATION_CONTAINER).get(ID_RELATION); + @Override + protected List getSelectedAssignmentsList(){ + List assignmentList = new ArrayList<>(); + + List selectedObjects = getSelectedObjectsList(); + QName relation = getRelationValue(); + selectedObjects.forEach(selectedObject -> { + assignmentList.add(ObjectTypeUtil.createAssignmentTo(selectedObject, relation)); + }); + return assignmentList; } public QName getRelationValue(){ @@ -80,4 +98,35 @@ public QName getRelationValue(){ } return relation.getRelation(); } + + private DropDownChoicePanel getRelationDropDown(){ + return (DropDownChoicePanel)get(ID_RELATION_CONTAINER).get(ID_RELATION); + } + + @Override + protected ObjectQuery addFilterToContentQuery(ObjectQuery query){ + LOGGER.debug("Loading roles which the current user has right to assign"); + Task task = getPageBase().createSimpleTask(OPERATION_LOAD_ASSIGNABLE_ROLES); + OperationResult result = task.getResult(); + ObjectFilter filter = null; + try { + ModelInteractionService mis = getPageBase().getModelInteractionService(); + RoleSelectionSpecification roleSpec = + mis.getAssignableRoleSpecification(SecurityUtils.getPrincipalUser().getUser().asPrismObject(), task, result); + filter = roleSpec.getFilter(); + } catch (Exception ex) { + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load available roles", ex); + result.recordFatalError("Couldn't load available roles", ex); + } finally { + result.recomputeStatus(); + } + if (!result.isSuccess() && !result.isHandledError()) { + getPageBase().showResult(result); + } + if (query == null){ + query = new ObjectQuery(); + } + query.addFilter(filter); + return query; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java index 47198a138be..739578628b8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java @@ -19,10 +19,10 @@ import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.orgs.OrgTreeAssignablePanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; import java.util.ArrayList; import java.util.Iterator; @@ -37,36 +37,18 @@ public class OrgTypeAssignmentPopupTabPanel extends FocusTypeAssignmentPopupTabP private static final String ID_ORG_TREE_VIEW_PANEL = "orgTreeViewPanel"; - private IModel isOrgTreeViewModel; + private boolean isOrgTreeView; - public OrgTypeAssignmentPopupTabPanel(String id, IModel isOrgTreeViewModel, List selectedOrgs){ + public OrgTypeAssignmentPopupTabPanel(String id, boolean isOrgTreeView, List selectedOrgs){ super(id, ObjectTypes.ORG, selectedOrgs); - this.isOrgTreeViewModel = isOrgTreeViewModel; + this.isOrgTreeView = isOrgTreeView; } @Override protected void onInitialize() { super.onInitialize(); - IModel> selectedOrgsModel = new IModel>() { - private static final long serialVersionUID = 1L; - - @Override - public List getObject() { - return selectedObjects; - } - - @Override - public void setObject(List orgTypes) { - selectedObjects = orgTypes; - } - - @Override - public void detach() { - - } - }; OrgTreeAssignablePanel orgTreePanel = new OrgTreeAssignablePanel( - ID_ORG_TREE_VIEW_PANEL, true, getPageBase(), selectedOrgsModel) { + ID_ORG_TREE_VIEW_PANEL, true, getPageBase(), selectedObjects) { private static final long serialVersionUID = 1L; @Override @@ -102,7 +84,7 @@ protected boolean isAssignButtonVisible(){ @Override public boolean isVisible(){ - return isOrgTreeViewModel != null && isOrgTreeViewModel.getObject(); + return isOrgTreeView; } }); add(orgTreePanel); @@ -111,8 +93,26 @@ public boolean isVisible(){ @Override protected boolean isObjectListPanelVisible(){ - return isOrgTreeViewModel == null || !isOrgTreeViewModel.getObject(); + return !isOrgTreeView; + } + + protected List getSelectedObjectsList(){ + if (isOrgTreeView){ + return selectedObjects; + } else { + return super.getSelectedObjectsList(); + } + } + + @Override + protected List getSelectedAssignmentsList(){ + isOrgTreeView = true; + return super.getSelectedAssignmentsList(); } protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target){} + + public boolean isOrgTreeView(){ + return isOrgTreeView; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java index abcc72dd577..27fee2f8aaf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -29,6 +30,8 @@ import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; +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.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -54,7 +57,8 @@ public class ResourceTypeAssignmentPopupTabPanel extends AbstractAssignmentPopup private static final String ID_INTENT = "intent"; private LoadableModel> intentValues; - private String intentValue = ""; + private String intentValue; + private ShadowKindType kindValue; private static final String DOT_CLASS = ResourceTypeAssignmentPopupTabPanel.class.getName(); private static final Trace LOGGER = TraceManager.getTrace(ResourceTypeAssignmentPopupTabPanel.class); @@ -72,8 +76,8 @@ protected void initParametersPanel(){ add(kindContainer); DropDownChoicePanel kindSelector = WebComponentUtil.createEnumPanel(ShadowKindType.class, ID_KIND, - WebComponentUtil.createReadonlyModelFromEnum(ShadowKindType.class), Model.of(ShadowKindType.ACCOUNT), - ResourceTypeAssignmentPopupTabPanel.this, false); + WebComponentUtil.createReadonlyModelFromEnum(ShadowKindType.class), Model.of(), + ResourceTypeAssignmentPopupTabPanel.this, true); kindSelector.setOutputMarkupId(true); kindSelector.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change") { private static final long serialVersionUID = 1L; @@ -100,24 +104,7 @@ public boolean isEnabled(){ add(intentContainer); DropDownChoicePanel intentSelector = new DropDownChoicePanel(ID_INTENT, - new IModel() { - private static final long serialVersionUID = 1L; - - @Override - public String getObject() { - return intentValue; - } - - @Override - public void setObject(String s) { - intentValue = s; - } - - @Override - public void detach() { - - } - }, intentValues); + Model.of(), intentValues, true); intentSelector.getBaseFormComponent().add(new VisibleEnableBehaviour(){ private static final long serialVersionUID = 1L; @@ -133,14 +120,6 @@ public boolean isEnabled(){ } - private DropDownChoicePanel getIntentDropDown(){ - return (DropDownChoicePanel)get(ID_INTENT_CONTAINER).get(ID_INTENT); - } - - private DropDownChoicePanel getKindDropDown(){ - return (DropDownChoicePanel)get(ID_KIND_CONTAINER).get(ID_KIND); - } - private void initModels(){ intentValues = new LoadableModel>(true) { private static final long serialVersionUID = 1L; @@ -175,32 +154,37 @@ protected List load() { return availableIntentValues; } }; -// intentValueModel = new IModel() { -// @Override -// public String getObject() { -// return intent != null ? intent : -// (intentValues.getObject().size() > 0 ? -// intentValues.getObject().get(0) : "default"); -// } -// -// @Override -// public void setObject(String s) { -// intent = s; -// } -// -// @Override -// public void detach() { -// -// } -// }; } - public String getIntentValue(){ - return intentValue; + @Override + protected List getSelectedAssignmentsList(){ + List assignmentList = new ArrayList<>(); + + List selectedObjects = getSelectedObjectsList(); + ShadowKindType kind = getKindValue(); + String intent = getIntentValue(); + selectedObjects.forEach(selectedObject -> { + assignmentList.add(ObjectTypeUtil.createAssignmentWithConstruction(selectedObject.asPrismObject(), kind, intent)); + }); + return assignmentList; } public ShadowKindType getKindValue(){ - return getKindDropDown().getModel().getObject(); + DropDownChoicePanel kindDropDown = getKindDropDown(); + return kindDropDown.getModel() != null ? kindDropDown.getModel().getObject() : null; + } + + public String getIntentValue(){ + DropDownChoicePanel intentDropDown = getIntentDropDown(); + return intentDropDown.getModel() != null ? intentDropDown.getModel().getObject() : null; + } + + private DropDownChoicePanel getIntentDropDown(){ + return (DropDownChoicePanel)get(ID_INTENT_CONTAINER).get(ID_INTENT); + } + + private DropDownChoicePanel getKindDropDown(){ + return (DropDownChoicePanel)get(ID_KIND_CONTAINER).get(ID_KIND); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java index 5c9b4230c15..1da164fc3dc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/column/InlineMenuButtonColumn.java @@ -87,7 +87,7 @@ protected AjaxIconButton createButton(int index, String componentId, IModel m AjaxIconButton btn = buildDefaultButton(componentId, new Model<>(getButtonIconCss(index, menuItems)), new Model<>(getButtonTitle(index, menuItems)), - new Model<>(getButtonCssClass(index, menuItems) + getButtonColorCssClass(index, menuItems)), + new Model<>(getButtonCssClass(index, menuItems)), target -> { setRowModelToAction(rowModel, menuItems); menuItemClickPerformed(index, target, model, menuItems); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java index 37fe07966d1..5fa6185032e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java @@ -49,16 +49,16 @@ public class OrgTreeAssignablePanel extends BasePanel implements Popupa private static final String ID_ORG_TABS = "orgTabs"; private static final String ID_ASSIGN = "assign"; private boolean selectable; - private IModel> selectedOrgsListModel; + private List selectedOrgsList; public OrgTreeAssignablePanel(String id, boolean selectable, PageBase parentPage) { this(id, selectable, parentPage, null); } - public OrgTreeAssignablePanel(String id, boolean selectable, PageBase parentPage, IModel> selectedOrgsListModel){ + public OrgTreeAssignablePanel(String id, boolean selectable, PageBase parentPage, List selectedOrgsList){ super(id); this.selectable = selectable; - this.selectedOrgsListModel = selectedOrgsListModel; + this.selectedOrgsList = selectedOrgsList; setParent(parentPage); initLayout(); } @@ -81,8 +81,8 @@ protected IModel getCheckBoxValueModel(IModel> @Override public Boolean load() { boolean isSelected = false; - if (selectedOrgsListModel != null && selectedOrgsListModel.getObject() != null) { - for (OrgType org : selectedOrgsListModel.getObject()) + if (selectedOrgsList != null) { + for (OrgType org : selectedOrgsList) if (rowModel.getObject().getValue().getOid().equals(org.getOid())){ isSelected = true; break; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java index e8fbd9f2250..57ccc573bd0 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java @@ -15,8 +15,12 @@ */ package com.evolveum.midpoint.schema.util; +import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.schema.SchemaProcessorUtil; +import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -57,8 +61,8 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi if (adminGuiConfiguration == null) { return; } - composite.getAdditionalMenuLink().addAll(adminGuiConfiguration.getAdditionalMenuLink()); - composite.getUserDashboardLink().addAll(adminGuiConfiguration.getUserDashboardLink()); + adminGuiConfiguration.getAdditionalMenuLink().stream().forEach(additionalMenuLink -> composite.getAdditionalMenuLink().add(additionalMenuLink.clone())); + adminGuiConfiguration.getUserDashboardLink().stream().forEach(userDashboardLink -> composite.getUserDashboardLink().add(userDashboardLink.clone())); if (adminGuiConfiguration.getDefaultTimezone() != null) { composite.setDefaultTimezone(adminGuiConfiguration.getDefaultTimezone()); } @@ -69,14 +73,14 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi composite.setEnableExperimentalFeatures(adminGuiConfiguration.isEnableExperimentalFeatures()); } if (adminGuiConfiguration.getDefaultExportSettings() != null) { - composite.setDefaultExportSettings(adminGuiConfiguration.getDefaultExportSettings()); + composite.setDefaultExportSettings(adminGuiConfiguration.getDefaultExportSettings().clone()); } if (adminGuiConfiguration.getObjectLists() != null) { if (composite.getObjectLists() == null) { composite.setObjectLists(adminGuiConfiguration.getObjectLists().clone()); } else { for (GuiObjectListViewType objectList: adminGuiConfiguration.getObjectLists().getObjectList()) { - mergeList(composite.getObjectLists(), objectList); + mergeList(composite.getObjectLists(), objectList.clone()); } } } @@ -85,7 +89,7 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi composite.setObjectForms(adminGuiConfiguration.getObjectForms().clone()); } else { for (ObjectFormType objectForm: adminGuiConfiguration.getObjectForms().getObjectForm()) { - joinForms(composite.getObjectForms(), objectForm); + joinForms(composite.getObjectForms(), objectForm.clone()); } } } @@ -108,7 +112,7 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi } } for (UserInterfaceFeatureType feature: adminGuiConfiguration.getFeature()) { - mergeFeature(composite.getFeature(), feature); + mergeFeature(composite.getFeature(), feature.clone()); } if (composite.getObjectLists() != null && composite.getObjectLists().getObjectList() != null){ for (GuiObjectListViewType objectListType : composite.getObjectLists().getObjectList()){ diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java index 05cbc4b4624..9eaaf0f0dd0 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java @@ -251,6 +251,17 @@ public static AssignmentType createAssignmentTo(@NotNull return assignment; } + @NotNull + public static AssignmentType createAssignmentWithConstruction(@NotNull PrismObject object, ShadowKindType kind, String intent) { + AssignmentType assignment = new AssignmentType(object.getPrismContext()); + ConstructionType construction = new ConstructionType(object.getPrismContext()); + construction.setResourceRef(createObjectRef(object)); + construction.setKind(kind); + construction.setIntent(intent); + assignment.setConstruction(construction); + return assignment; + } + @NotNull public static AssignmentType createAssignmentTo(@NotNull T objectType, QName relation) { return createAssignmentTo((PrismObject) objectType.asPrismObject(), relation); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 88eec469dcf..26aa42379a4 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -13725,7 +13725,6 @@ DEPRECATED. Use defaultObjectPolicyConfiguration instead. - true @@ -13739,9 +13738,6 @@ "universally" during all operations with specified object types - unless it is overridden in other definitions (e.g. in resource or org). - - - @@ -13909,6 +13905,7 @@ 3.6 + @@ -14012,6 +14009,9 @@ Various internals configuration elements. + + + @@ -14060,6 +14060,9 @@ Administration GUI configuration. Note: This complexType is NOT a container. We need to guarantee ordering of some sub-items (e.g. links) + + + @@ -14378,6 +14381,9 @@ where a link is used. Which parameter will be used depends on where exactly is the link used and how it is rendered (as an menu item, application launch button, etc.) + + + @@ -14790,6 +14796,9 @@ Specification of the way how projections are handled on the resource. This defines the ways how assignments are enforced and so on. + + + @@ -14934,6 +14943,9 @@ Configuration of logging levels, categories, log files, etc. + + + - - - - - Configuration of the logger: the facility that + + + + + Configuration of the logger: the facility that collects log messages from the code. - - - - + + + + Logger level - - - - TODO: packages are OR-ed - TODO: string, wildcards - allowed (* as in java) - - - @@ -15023,7 +15026,31 @@ - + + + + + + + Configuration of the logger: the facility that + collects log messages from the code. + + + + + + + + + TODO: packages are OR-ed + TODO: string, wildcards + allowed (* as in java) + + + + + + @@ -15033,32 +15060,21 @@ collects log messages from subsystem code. - - - - - Logger level - - - - - - - TODO: components are OR-ed - TODO: string, but there should be a way how to determine - list of valid categories. Maybe switch to enum later. - - - - - - - Appender name defined in appenders section in - logging configuration - - - - + + + + + + + TODO: components are OR-ed + TODO: string, but there should be a way how to determine + list of valid categories. Maybe switch to enum later. + + + + + + @@ -16976,6 +16992,9 @@ Configuration of cleanup intervals and policies for various midPoint subsystems. + + + @@ -16991,6 +17010,9 @@ Configuration of cleanup intervals and policies for a specific subsystem or feature. + + + @@ -17788,6 +17810,9 @@ A configuration for profiling features of midPoint. + + + diff --git a/repo/repo-sql-impl-test/sql-procedures/mysql.sql b/repo/repo-sql-impl-test/sql-procedures/mysql.sql index 3572dbaf1c8..4770917fd5a 100644 --- a/repo/repo-sql-impl-test/sql-procedures/mysql.sql +++ b/repo/repo-sql-impl-test/sql-procedures/mysql.sql @@ -77,6 +77,7 @@ DETERMINISTIC DELETE FROM m_function_library; DELETE FROM m_ext_item; DELETE FROM m_object_subtype; + DELETE FROM m_object_collection; DELETE FROM m_object; RETURN run; diff --git a/repo/repo-sql-impl-test/sql-procedures/postgresql.sql b/repo/repo-sql-impl-test/sql-procedures/postgresql.sql index c208373124b..cd758450437 100644 --- a/repo/repo-sql-impl-test/sql-procedures/postgresql.sql +++ b/repo/repo-sql-impl-test/sql-procedures/postgresql.sql @@ -70,6 +70,7 @@ BEGIN TRUNCATE TABLE m_function_library RESTART IDENTITY CASCADE; TRUNCATE TABLE m_ext_item RESTART IDENTITY CASCADE; TRUNCATE TABLE m_object_subtype RESTART IDENTITY CASCADE; + TRUNCATE TABLE m_object_collection RESTART IDENTITY CASCADE; TRUNCATE TABLE m_object RESTART IDENTITY CASCADE; RETURN 0; END; diff --git a/repo/repo-sql-impl-test/sql-procedures/sqlserver.sql b/repo/repo-sql-impl-test/sql-procedures/sqlserver.sql index ab1a28f4bbc..ad217561680 100644 --- a/repo/repo-sql-impl-test/sql-procedures/sqlserver.sql +++ b/repo/repo-sql-impl-test/sql-procedures/sqlserver.sql @@ -81,6 +81,7 @@ AS DELETE FROM m_function_library; DELETE FROM m_ext_item; DELETE FROM m_object_subtype; + DELETE FROM m_object_collection; DELETE FROM m_object; END GO