diff --git a/.travis.yml b/.travis.yml
index a0ab263f7fc..a743e1fc463 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,13 +22,13 @@ script: mvn clean install
addons:
hostname: localhost # workaround for short hostname
- #apt:
- # packages:
- # - oracle-java8-installer # install newest JDK8
+ apt:
+ packages:
+ - oracle-java8-installer # install newest JDK8
#- openjdk-8-jdk
jdk:
- openjdk7
- oraclejdk7
#- openjdk8
- #- oraclejdk8
+ - oraclejdk8
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java
index 74907eee338..0bfd8b36e6d 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java
@@ -141,6 +141,7 @@
import com.evolveum.midpoint.web.page.admin.reports.PageNewReport;
import com.evolveum.midpoint.web.page.admin.reports.PageReport;
import com.evolveum.midpoint.web.page.admin.reports.PageReports;
+import com.evolveum.midpoint.web.page.admin.resources.PageConnectorHosts;
import com.evolveum.midpoint.web.page.admin.resources.PageImportResource;
import com.evolveum.midpoint.web.page.admin.resources.PageResource;
import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard;
@@ -1082,6 +1083,9 @@ private MainMenuItem createResourcesItems() {
PageImportResource.class);
submenu.add(n);
+ MenuItem connectorHostsList = new MenuItem(createStringResource("PageAdmin.menu.top.connectorHosts.list"),
+ PageConnectorHosts.class);
+ submenu.add(connectorHostsList);
return item;
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java
index feac34cd2ba..60e21bbba66 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java
@@ -62,6 +62,10 @@ public class PageAdminResources extends PageAdmin {
private static final String OPERATION_SAVE_SYNC_TASK = DOT_CLASS + "saveSyncTask";
protected static final Trace LOGGER = TraceManager.getTrace(PageAdminResources.class);
+
+ public static final String AUTH_CONNECTOR_HOSTS_ALL = AuthorizationConstants.AUTZ_UI_CONNECTOR_HOSTS_ALL_URL;
+ public static final String AUTH_CONNECTOR_HOSTS_ALL_LABEL = "PageAdminResources.auth.connectorHostsAll.label";
+ public static final String AUTH_CONNECTOR_HOSTS_ALL_DESCRIPTION = "PageAdminResources.auth.connectorHostsAll.description";
public static final String AUTH_RESOURCE_ALL = AuthorizationConstants.AUTZ_UI_RESOURCES_ALL_URL;
public static final String AUTH_RESOURCE_ALL_LABEL = "PageAdminResources.auth.resourcesAll.label";
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageConnectorHosts.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageConnectorHosts.html
new file mode 100644
index 00000000000..0add8a6be3f
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageConnectorHosts.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageConnectorHosts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageConnectorHosts.java
new file mode 100644
index 00000000000..cb04c8510e8
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageConnectorHosts.java
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2010-2015 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.web.page.admin.resources;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
+import com.evolveum.midpoint.web.component.search.*;
+import com.evolveum.midpoint.web.session.PageStorage;
+import com.evolveum.midpoint.web.session.SessionStorage;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
+import org.apache.commons.lang.StringUtils;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+import com.evolveum.midpoint.gui.api.GuiStyleConstants;
+import com.evolveum.midpoint.gui.api.component.MainObjectListPanel;
+import com.evolveum.midpoint.gui.api.model.LoadableModel;
+import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
+import com.evolveum.midpoint.prism.delta.ObjectDelta;
+import com.evolveum.midpoint.prism.query.ObjectQuery;
+import com.evolveum.midpoint.schema.GetOperationOptions;
+import com.evolveum.midpoint.schema.RetrieveOption;
+import com.evolveum.midpoint.schema.SelectorOptions;
+import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.schema.result.OperationResultStatus;
+import com.evolveum.midpoint.security.api.AuthorizationConstants;
+import com.evolveum.midpoint.task.api.Task;
+import com.evolveum.midpoint.util.logging.LoggingUtils;
+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.data.BaseSortableDataProvider;
+import com.evolveum.midpoint.web.component.data.BoxedTablePanel;
+import com.evolveum.midpoint.web.component.data.ObjectDataProvider;
+import com.evolveum.midpoint.web.component.data.Table;
+import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn;
+import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
+import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction;
+import com.evolveum.midpoint.web.component.data.column.InlineMenuHeaderColumn;
+import com.evolveum.midpoint.web.component.data.column.LinkColumn;
+import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
+import com.evolveum.midpoint.web.component.util.SelectableBean;
+import com.evolveum.midpoint.web.page.admin.configuration.PageDebugView;
+import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
+import com.evolveum.midpoint.web.session.ResourcesStorage;
+import com.evolveum.midpoint.web.session.UserProfileStorage;
+import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
+import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
+
+/**
+ * @author lazyman
+ */
+@PageDescriptor(url = "/admin/connectorHosts", action = {
+ @AuthorizationAction(actionUri = PageAdminResources.AUTH_CONNECTOR_HOSTS_ALL, label = PageAdminResources.AUTH_CONNECTOR_HOSTS_ALL_LABEL, description = PageAdminResources.AUTH_CONNECTOR_HOSTS_ALL_DESCRIPTION),
+ @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CONNECTOR_HOSTS_ALL_URL, label = "PageResources.auth.connectorHosts.label", description = "PageResources.auth.connectorHosts.description") })
+public class PageConnectorHosts extends PageAdminResources {
+ private static final long serialVersionUID = 1L;
+
+ private static final Trace LOGGER = TraceManager.getTrace(PageConnectorHosts.class);
+ private static final String DOT_CLASS = PageConnectorHosts.class.getName() + ".";
+ private static final String OPERATION_DELETE_HOSTS = DOT_CLASS + "deleteHosts";
+ private static final String OPERATION_CONNECTOR_DISCOVERY = DOT_CLASS + "connectorDiscovery";
+
+ private static final String ID_MAIN_FORM = "mainForm";
+ private static final String ID_CONNECTOR_TABLE = "connectorTable";
+
+ private IModel searchModel;
+
+ public PageConnectorHosts() {
+ this(true);
+ }
+
+ public PageConnectorHosts(boolean clearSessionPaging) {
+ this(clearSessionPaging, "");
+ }
+
+ public PageConnectorHosts(String searchText) {
+ this(true, searchText);
+ }
+
+ public PageConnectorHosts(boolean clearSessionPaging, String searchText) {
+
+ searchModel = new LoadableModel(false) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected Search load() {
+ return SearchFactory.createSearch(ConnectorHostType.class, getPrismContext(),
+ getModelInteractionService());
+ }
+ };
+
+ initLayout();
+ }
+
+ private void initLayout() {
+ Form> mainForm = new Form<>(ID_MAIN_FORM);
+ add(mainForm);
+
+ BoxedTablePanel connectorHosts = new BoxedTablePanel(
+ ID_CONNECTOR_TABLE,
+ new ObjectDataProvider(PageConnectorHosts.this,
+ ConnectorHostType.class),
+ initConnectorHostsColumns(), UserProfileStorage.TableId.PAGE_RESOURCES_CONNECTOR_HOSTS,
+ (int) getItemsPerPage(UserProfileStorage.TableId.PAGE_RESOURCES_CONNECTOR_HOSTS)) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected WebMarkupContainer createHeader(String headerId) {
+ return new SearchFormPanel(headerId, searchModel) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {
+ PageConnectorHosts.this.searchHostPerformed(query, target);
+ }
+ };
+ }
+ };
+ connectorHosts.setOutputMarkupId(true);
+ mainForm.add(connectorHosts);
+ }
+
+ private List> initConnectorHostsColumns() {
+ List> columns = new ArrayList<>();
+
+ IColumn column = new CheckBoxHeaderColumn();
+ columns.add(column);
+
+ column = new LinkColumn>(
+ createStringResource("pageResources.connector.name"), "name", "value.name") {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onClick(AjaxRequestTarget target,
+ IModel> rowModel) {
+ ConnectorHostType host = rowModel.getObject().getValue();
+ // resourceDetailsPerformed(target, host.getOid());
+ }
+ };
+ columns.add(column);
+
+ columns.add(new PropertyColumn(createStringResource("pageResources.connector.hostname"),
+ "value.hostname"));
+ columns.add(new PropertyColumn(createStringResource("pageResources.connector.port"), "value.port"));
+ columns.add(
+ new PropertyColumn(createStringResource("pageResources.connector.timeout"), "value.timeout"));
+ columns.add(new CheckBoxColumn(createStringResource("pageResources.connector.protectConnection"),
+ "value.protectConnection"));
+
+ InlineMenuHeaderColumn menu = new InlineMenuHeaderColumn(initInlineHostsMenu());
+ columns.add(menu);
+
+ return columns;
+ }
+
+ private List initInlineHostsMenu() {
+ List headerMenuItems = new ArrayList<>();
+ headerMenuItems.add(new InlineMenuItem(createStringResource("PageBase.button.delete"),
+ new HeaderMenuAction(this) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+ deleteHostPerformed(target);
+ }
+ }));
+ headerMenuItems.add(new InlineMenuItem(createStringResource("pageResources.button.discoveryRemote"),
+ new HeaderMenuAction(this) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+ discoveryRemotePerformed(target);
+ }
+ }));
+
+ return headerMenuItems;
+ }
+
+ private void deleteHostPerformed(AjaxRequestTarget target) {
+ List> selected = WebComponentUtil
+ .getSelectedData(getConnectorHostTable());
+ if (selected.isEmpty()) {
+ warn(getString("pageResources.message.noHostSelected"));
+ target.add(getFeedbackPanel());
+ return;
+ }
+
+ ConfirmationPanel dialog = new ConfirmationPanel(((PageBase) getPage()).getMainPopupBodyId(),
+ createDeleteConfirmString("pageResources.message.deleteHostConfirm",
+ "pageResources.message.deleteHostsConfirm", false)) {
+ private static final long serialVersionUID = 1L;
+ @Override
+ public void yesPerformed(AjaxRequestTarget target) {
+ ((PageBase) getPage()).hideMainPopup(target);
+ deleteHostConfirmedPerformed(target);
+ }
+ };
+ ((PageBase) getPage()).showMainPopup(dialog, target);
+
+ }
+
+ private Table getConnectorHostTable() {
+ return (Table) get(createComponentPath(ID_MAIN_FORM, ID_CONNECTOR_TABLE));
+ }
+
+ /**
+ * @param oneDeleteKey
+ * message if deleting one item
+ * @param moreDeleteKey
+ * message if deleting more items
+ * @param resources
+ * if true selecting resources if false selecting from hosts
+ */
+ private IModel createDeleteConfirmString(final String oneDeleteKey, final String moreDeleteKey,
+ final boolean resources) {
+ return new AbstractReadOnlyModel() {
+ private static final long serialVersionUID = 1L;
+ @Override
+ public String getObject() {
+ List> selected = WebComponentUtil.getSelectedData(getConnectorHostTable());
+
+ switch (selected.size()) {
+ case 1:
+ Object first = selected.get(0);
+ String name = WebComponentUtil
+ .getName(((SelectableBean) first).getValue());
+ return createStringResource(oneDeleteKey, name).getString();
+ default:
+ return createStringResource(moreDeleteKey, selected.size()).getString();
+ }
+ }
+ };
+ }
+
+ private void deleteHostConfirmedPerformed(AjaxRequestTarget target) {
+ Table hostTable = getConnectorHostTable();
+ List> selected = WebComponentUtil.getSelectedData(hostTable);
+
+ OperationResult result = new OperationResult(OPERATION_DELETE_HOSTS);
+ for (SelectableBean selectable : selected) {
+ try {
+ Task task = createSimpleTask(OPERATION_DELETE_HOSTS);
+
+ ObjectDelta delta = ObjectDelta.createDeleteDelta(ConnectorHostType.class,
+ selectable.getValue().getOid(), getPrismContext());
+ getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), null, task,
+ result);
+ } catch (Exception ex) {
+ result.recordPartialError("Couldn't delete host.", ex);
+ LoggingUtils.logUnexpectedException(LOGGER, "Couldn't delete host", ex);
+ }
+ }
+
+ result.recomputeStatus();
+ if (result.isSuccess()) {
+ result.recordStatus(OperationResultStatus.SUCCESS,
+ "The resource(s) have been successfully deleted.");
+ }
+
+ BaseSortableDataProvider provider = (BaseSortableDataProvider) hostTable.getDataTable()
+ .getDataProvider();
+ provider.clearCache();
+
+ showResult(result);
+ target.add(getFeedbackPanel(), (Component) hostTable);
+ }
+
+ private void discoveryRemotePerformed(AjaxRequestTarget target) {
+ target.add(getFeedbackPanel());
+
+ PageBase page = (PageBase) getPage();
+ Task task = page.createSimpleTask(OPERATION_CONNECTOR_DISCOVERY);
+ OperationResult result = task.getResult();
+ List> selected = WebComponentUtil
+ .getSelectedData(getConnectorHostTable());
+ if (selected.isEmpty()) {
+ warn(getString("pageResources.message.noHostSelected"));
+ return;
+ }
+
+ for (SelectableBean bean : selected) {
+ ConnectorHostType host = bean.getValue();
+ try {
+ getModelService().discoverConnectors(host, task, result);
+ } catch (Exception ex) {
+ result.recordFatalError("Fail to discover connectors on host '" + host.getHostname() + ":"
+ + host.getPort() + "'", ex);
+ }
+ }
+
+ result.recomputeStatus();
+ showResult(result);
+ }
+
+ private void searchHostPerformed(ObjectQuery query, AjaxRequestTarget target) {
+ target.add(getFeedbackPanel());
+
+ Table panel = getConnectorHostTable();
+ DataTable table = panel.getDataTable();
+ ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider();
+ provider.setQuery(query);
+ provider.setOptions(SelectorOptions.createCollection(GetOperationOptions.createNoFetch()));
+
+ target.add((Component) panel);
+ }
+
+ private void deleteResourceSyncTokenPerformed(AjaxRequestTarget target, ResourceType resourceType) {
+ deleteSyncTokenPerformed(target, resourceType);
+ }
+
+ private void editResourcePerformed(ResourceType resourceType) {
+ PageParameters parameters = new PageParameters();
+ parameters.add(OnePageParameterEncoder.PARAMETER, resourceType.getOid());
+ setResponsePage(new PageResourceWizard(parameters));
+ }
+
+ private void editAsXmlPerformed(ResourceType resourceType) {
+ PageParameters parameters = new PageParameters();
+ parameters.add(PageDebugView.PARAM_OBJECT_ID, resourceType.getOid());
+ parameters.add(PageDebugView.PARAM_OBJECT_TYPE, ResourceType.class.getSimpleName());
+ setResponsePage(PageDebugView.class, parameters);
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.html
index 35fc2f62bc2..9cffaf6736c 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.html
@@ -19,11 +19,7 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.java
index e413bc7b65e..76a4f00fe94 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResources.java
@@ -84,20 +84,17 @@
@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_RESOURCES_URL, label = "PageResources.auth.resources.label", description = "PageResources.auth.resources.description") })
public class PageResources extends PageAdminResources {
+ private static final long serialVersionUID = 1L;
private static final Trace LOGGER = TraceManager.getTrace(PageResources.class);
private static final String DOT_CLASS = PageResources.class.getName() + ".";
private static final String OPERATION_TEST_RESOURCE = DOT_CLASS + "testResource";
- private static final String OPERATION_SYNC_STATUS = DOT_CLASS + "syncStatus";
private static final String OPERATION_DELETE_RESOURCES = DOT_CLASS + "deleteResources";
- private static final String OPERATION_DELETE_HOSTS = DOT_CLASS + "deleteHosts";
- private static final String OPERATION_CONNECTOR_DISCOVERY = DOT_CLASS + "connectorDiscovery";
private static final String ID_MAIN_FORM = "mainForm";
private static final String ID_TABLE = "table";
private static final String ID_CONNECTOR_TABLE = "connectorTable";
private IModel searchModel;
- private IModel chSearchModel;
private ResourceType singleDelete;
public PageResources() {
@@ -115,6 +112,7 @@ public PageResources(String searchText) {
public PageResources(boolean clearSessionPaging, String searchText) {
searchModel = new LoadableModel(false) {
+ private static final long serialVersionUID = 1L;
@Override
protected Search load() {
ResourcesStorage storage = getSessionStorage().getResources();
@@ -129,15 +127,6 @@ protected Search load() {
}
};
- chSearchModel = new LoadableModel(false) {
-
- @Override
- protected Search load() {
- return SearchFactory.createSearch(ConnectorHostType.class, getPrismContext(),
- getModelInteractionService());
- }
- };
-
if (StringUtils.isNotEmpty(searchText)){
initSearch(searchText);
}
@@ -198,26 +187,6 @@ protected void newObjectPerformed(AjaxRequestTarget target) {
resourceListPanel.setAdditionalBoxCssClasses(GuiStyleConstants.CLASS_OBJECT_RESOURCE_BOX_CSS_CLASSES);
mainForm.add(resourceListPanel);
- BoxedTablePanel connectorHosts = new BoxedTablePanel(ID_CONNECTOR_TABLE,
- new ObjectDataProvider(PageResources.this, ConnectorHostType.class),
- initConnectorHostsColumns(), UserProfileStorage.TableId.PAGE_RESOURCES_CONNECTOR_HOSTS,
- (int) getItemsPerPage(UserProfileStorage.TableId.PAGE_RESOURCES_CONNECTOR_HOSTS)) {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected WebMarkupContainer createHeader(String headerId) {
- return new SearchFormPanel(headerId, chSearchModel) {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {
- PageResources.this.searchHostPerformed(query, target);
- }
- };
- }
- };
- connectorHosts.setOutputMarkupId(true);
- mainForm.add(connectorHosts);
}
private List createRowMenuItems() {
@@ -305,88 +274,12 @@ public void onClick(AjaxRequestTarget target) {
return headerMenuItems;
}
- private List> initConnectorHostsColumns() {
- List> columns = new ArrayList<>();
-
- IColumn column = new CheckBoxHeaderColumn();
- columns.add(column);
-
- column = new LinkColumn>(
- createStringResource("pageResources.connector.name"), "name", "value.name") {
-
- @Override
- public void onClick(AjaxRequestTarget target,
- IModel> rowModel) {
- ConnectorHostType host = rowModel.getObject().getValue();
- // resourceDetailsPerformed(target, host.getOid());
- }
- };
- columns.add(column);
-
- columns.add(new PropertyColumn(createStringResource("pageResources.connector.hostname"),
- "value.hostname"));
- columns.add(new PropertyColumn(createStringResource("pageResources.connector.port"), "value.port"));
- columns.add(
- new PropertyColumn(createStringResource("pageResources.connector.timeout"), "value.timeout"));
- columns.add(new CheckBoxColumn(createStringResource("pageResources.connector.protectConnection"),
- "value.protectConnection"));
-
- InlineMenuHeaderColumn menu = new InlineMenuHeaderColumn(initInlineHostsMenu());
- columns.add(menu);
-
- return columns;
- }
-
- private List initInlineHostsMenu() {
- List headerMenuItems = new ArrayList<>();
- headerMenuItems.add(new InlineMenuItem(createStringResource("PageBase.button.delete"),
- new HeaderMenuAction(this) {
-
- @Override
- public void onClick(AjaxRequestTarget target) {
- deleteHostPerformed(target);
- }
- }));
- headerMenuItems.add(new InlineMenuItem(createStringResource("pageResources.button.discoveryRemote"),
- new HeaderMenuAction(this) {
-
- @Override
- public void onClick(AjaxRequestTarget target) {
- discoveryRemotePerformed(target);
- }
- }));
-
- return headerMenuItems;
- }
-
private void resourceDetailsPerformed(AjaxRequestTarget target, String oid) {
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, oid);
setResponsePage(PageResource.class, parameters);
}
- private void deleteHostPerformed(AjaxRequestTarget target) {
- List> selected = WebComponentUtil
- .getSelectedData(getConnectorHostTable());
- if (selected.isEmpty()) {
- warn(getString("pageResources.message.noHostSelected"));
- target.add(getFeedbackPanel());
- return;
- }
-
- ConfirmationPanel dialog = new ConfirmationPanel(((PageBase)getPage()).getMainPopupBodyId(),
- createDeleteConfirmString("pageResources.message.deleteHostConfirm",
- "pageResources.message.deleteHostsConfirm", false)){
- @Override
- public void yesPerformed(AjaxRequestTarget target) {
- ((PageBase)getPage()).hideMainPopup(target);
- deleteHostConfirmedPerformed(target);
- }
- };
- ((PageBase)getPage()).showMainPopup(dialog, target);
-
- }
-
private List isAnyResourceSelected(AjaxRequestTarget target, ResourceType single) {
List selected = null;
if (single != null) {
@@ -445,22 +338,16 @@ private IModel createDeleteConfirmString(final String oneDeleteKey, fina
@Override
public String getObject() {
List selected = new ArrayList();
- if (resources) {
if (singleDelete != null) {
selected.add(singleDelete);
} else {
selected = getResourceTable().getSelectedObjects();
}
- } else {
- selected = WebComponentUtil.getSelectedData(getConnectorHostTable());
- }
-
+
switch (selected.size()) {
case 1:
Object first = selected.get(0);
- String name = resources ? WebComponentUtil.getName(((ResourceType) first))
- : WebComponentUtil
- .getName(((SelectableBean) first).getValue());
+ String name = WebComponentUtil.getName(((ResourceType) first));
return createStringResource(oneDeleteKey, name).getString();
default:
return createStringResource(moreDeleteKey, selected.size()).getString();
@@ -469,39 +356,6 @@ public String getObject() {
};
}
- private void deleteHostConfirmedPerformed(AjaxRequestTarget target) {
- Table hostTable = getConnectorHostTable();
- List> selected = WebComponentUtil.getSelectedData(hostTable);
-
- OperationResult result = new OperationResult(OPERATION_DELETE_HOSTS);
- for (SelectableBean selectable : selected) {
- try {
- Task task = createSimpleTask(OPERATION_DELETE_HOSTS);
-
- ObjectDelta delta = ObjectDelta.createDeleteDelta(ConnectorHostType.class,
- selectable.getValue().getOid(), getPrismContext());
- getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), null, task,
- result);
- } catch (Exception ex) {
- result.recordPartialError("Couldn't delete host.", ex);
- LoggingUtils.logUnexpectedException(LOGGER, "Couldn't delete host", ex);
- }
- }
-
- result.recomputeStatus();
- if (result.isSuccess()) {
- result.recordStatus(OperationResultStatus.SUCCESS,
- "The resource(s) have been successfully deleted.");
- }
-
- BaseSortableDataProvider provider = (BaseSortableDataProvider) hostTable.getDataTable()
- .getDataProvider();
- provider.clearCache();
-
- showResult(result);
- target.add(getFeedbackPanel(), (Component) hostTable);
- }
-
private void deleteResourceConfirmedPerformed(AjaxRequestTarget target) {
List selected = new ArrayList<>();
@@ -538,33 +392,6 @@ private void deleteResourceConfirmedPerformed(AjaxRequestTarget target) {
target.add(getFeedbackPanel(), (Component) getResourceTable());
}
- private void discoveryRemotePerformed(AjaxRequestTarget target) {
- target.add(getFeedbackPanel());
-
- PageBase page = (PageBase) getPage();
- Task task = page.createSimpleTask(OPERATION_CONNECTOR_DISCOVERY);
- OperationResult result = task.getResult();
- List> selected = WebComponentUtil
- .getSelectedData(getConnectorHostTable());
- if (selected.isEmpty()) {
- warn(getString("pageResources.message.noHostSelected"));
- return;
- }
-
- for (SelectableBean bean : selected) {
- ConnectorHostType host = bean.getValue();
- try {
- getModelService().discoverConnectors(host, task, result);
- } catch (Exception ex) {
- result.recordFatalError("Fail to discover connectors on host '" + host.getHostname() + ":"
- + host.getPort() + "'", ex);
- }
- }
-
- result.recomputeStatus();
- showResult(result);
- }
-
private void testResourcePerformed(AjaxRequestTarget target, ResourceType resourceType) {
OperationResult result = new OperationResult(OPERATION_TEST_RESOURCE);
@@ -604,17 +431,6 @@ private void testResourcePerformed(AjaxRequestTarget target, ResourceType resour
target.add(getResourceTable());
}
- private void searchHostPerformed(ObjectQuery query, AjaxRequestTarget target) {
- target.add(getFeedbackPanel());
-
- Table panel = getConnectorHostTable();
- DataTable table = panel.getDataTable();
- ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider();
- provider.setQuery(query);
- provider.setOptions(SelectorOptions.createCollection(GetOperationOptions.createNoFetch()));
-
- target.add((Component) panel);
- }
private void deleteResourceSyncTokenPerformed(AjaxRequestTarget target, ResourceType resourceType) {
deleteSyncTokenPerformed(target, resourceType);
diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties
index 41a648faa4e..d115f96e22d 100644
--- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties
+++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties
@@ -988,6 +988,7 @@ PageAdmin.menu.top.resources.new=New resource
PageAdmin.menu.top.resources.view=View resource
PageAdmin.menu.top.resources.edit=Edit resource
PageAdmin.menu.top.resources=Resources
+PageAdmin.menu.top.connectorHosts.list=List connector hosts
PageAdmin.menu.top.roles.list=List roles
PageAdmin.menu.top.roles.new=New role
PageAdmin.menu.top.roles=Roles
@@ -3255,3 +3256,5 @@ operation.com.evolveum.midpoint.web.page.admin.services.PageServices.reconcileOb
operation.com.evolveum.midpoint.web.page.admin.services.PageServices.reconcileObject=Reconcile service (GUI)
operation.com.evolveum.midpoint.web.page.admin.services.PageServices.deleteObjects=Delete services (GUI)
operation.com.evolveum.midpoint.web.page.admin.services.PageServices.deleteObject=Delete service (GUI)
+operation.com.evolveum.midpoint.web.page.admin.resources.ResourceContentTabPanel.importObject=Import object (GUI)
+PageConnectorHosts.title=Connector hosts
\ No newline at end of file
diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java
index 451975ae297..620de1ef4e5 100644
--- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java
+++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java
@@ -104,6 +104,9 @@ private void executeChange(PrismObject focalObject, Task coordinatorT
ObjectDelta delta = createDeltaFromTask(coordinatorTask);
delta.setOid(focalObject.getOid());
+ if (focalObject.getCompileTimeClass() != null) {
+ delta.setObjectTypeClass(focalObject.getCompileTimeClass());
+ }
prismContext.adopt(delta);
Collection> deltas = new ArrayList<>();
diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/MidPointDataSource.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/MidPointDataSource.java
index 18ab11cc10f..cb61edefd6f 100644
--- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/MidPointDataSource.java
+++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/MidPointDataSource.java
@@ -23,10 +23,12 @@
import com.evolveum.midpoint.prism.PrismReference;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.Referencable;
+import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectListType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
+import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
public class MidPointDataSource implements JRDataSource{
@@ -76,7 +78,9 @@ public Object getFieldValue(JRField jrField) throws JRException {
return ((PrismContainer) parent1).getParent();
}
- Item i = currentObject.findItem(new QName(fieldName));
+ ItemPathType itemPathType = new ItemPathType(fieldName);
+ ItemPath path = itemPathType.getItemPath();
+ Item i = currentObject.findItem(path);
if (i == null) {
return null;
}
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 b3e91eafa2d..55234de4d2f 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
@@ -110,6 +110,10 @@ public class AuthorizationConstants {
public static final QName AUTZ_UI_RESOURCES_QNAME = new QName(NS_AUTHORIZATION_UI, "resources");
public static final String AUTZ_UI_RESOURCES_URL = NS_AUTHORIZATION_UI + "#resources";
+
+ public static final QName AUTZ_UI_CONNECTOR_HOSTS_ALL_QNAME = new QName(NS_AUTHORIZATION_UI, "connectorHostsAll");
+ public static final String AUTZ_UI_CONNECTOR_HOSTS_ALL_URL = NS_AUTHORIZATION_UI + "#connectorHostsAll";
+
// Resource XML editor
public static final QName AUTZ_UI_RESOURCE_QNAME = new QName(NS_AUTHORIZATION_UI, "resource");
diff --git a/samples/stories/multitenant-idm-saas/readme.txt b/samples/stories/multitenant-idm-saas/readme.txt
index d1e6ed895f5..2462644698c 100644
--- a/samples/stories/multitenant-idm-saas/readme.txt
+++ b/samples/stories/multitenant-idm-saas/readme.txt
@@ -148,7 +148,8 @@ your CSV file with customer info!
- Import password policies
- Import object templates
- Import resources
-- Import roles
+- Import roles (Please do not import/use "role-meta-ldap-customer-group.xml",
+it's work in progress.)
- System Configuration: Object Policies: UserType = "User Template"
- System Configuration: Object Policies: OrgType = "Organization Object Template"
- Resource "CRM Simulation" - click Content, and import any of the entries by