/* * 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.List; import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel; import com.evolveum.midpoint.web.component.search.*; 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.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.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.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.UserProfileStorage; 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<Search> 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<Search>(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<ConnectorHostType> connectorHosts = new BoxedTablePanel<ConnectorHostType>( ID_CONNECTOR_TABLE, new ObjectDataProvider<ConnectorHostType, ConnectorHostType>(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<IColumn<ConnectorHostType, String>> initConnectorHostsColumns() { List<IColumn<ConnectorHostType, String>> columns = new ArrayList<>(); IColumn column = new CheckBoxHeaderColumn<ConnectorHostType>(); columns.add(column); column = new LinkColumn<SelectableBean<ConnectorHostType>>( createStringResource("pageResources.connector.name"), "name", "value.name") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target, IModel<SelectableBean<ConnectorHostType>> 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<InlineMenuItem> initInlineHostsMenu() { List<InlineMenuItem> 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<SelectableBean<ConnectorHostType>> 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<String> createDeleteConfirmString(final String oneDeleteKey, final String moreDeleteKey, final boolean resources) { return new AbstractReadOnlyModel<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { List<SelectableBean<ConnectorHostType>> selected = WebComponentUtil.getSelectedData(getConnectorHostTable()); switch (selected.size()) { case 1: Object first = selected.get(0); String name = WebComponentUtil .getName(((SelectableBean<ConnectorHostType>) first).getValue()); return createStringResource(oneDeleteKey, name).getString(); default: return createStringResource(moreDeleteKey, selected.size()).getString(); } } }; } private void deleteHostConfirmedPerformed(AjaxRequestTarget target) { Table hostTable = getConnectorHostTable(); List<SelectableBean<ConnectorHostType>> selected = WebComponentUtil.getSelectedData(hostTable); OperationResult result = new OperationResult(OPERATION_DELETE_HOSTS); for (SelectableBean<ConnectorHostType> selectable : selected) { try { Task task = createSimpleTask(OPERATION_DELETE_HOSTS); if (selectable.getValue() != null) { ObjectDelta<ConnectorHostType> 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<SelectableBean<ConnectorHostType>> selected = WebComponentUtil .getSelectedData(getConnectorHostTable()); if (selected.isEmpty()) { warn(getString("pageResources.message.noHostSelected")); return; } for (SelectableBean<ConnectorHostType> bean : selected) { if (bean.getValue() != null) { 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()); navigateToNext(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()); navigateToNext(PageDebugView.class, parameters); } }