/* * 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.web.page.admin.resources; import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.util.ResourceUtils; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; 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.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.application.Url; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxTabbedPanel; import com.evolveum.midpoint.web.page.admin.configuration.PageDebugView; import com.evolveum.midpoint.web.page.admin.resources.component.TestConnectionResultPanel; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; 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.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.request.mapper.parameter.PageParameters; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author katkav */ @PageDescriptor( urls = { @Url(mountUrl = "/admin/resource", matchUrlForSecurity = "/admin/resource") }, action = { @AuthorizationAction(actionUri = PageAdminResources.AUTH_RESOURCE_ALL, label = PageAdminResources.AUTH_RESOURCE_ALL_LABEL, description = PageAdminResources.AUTH_RESOURCE_ALL_DESCRIPTION), @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_RESOURCE_URL, label = "PageResource.auth.resource.label", description = "PageResource.auth.resource.description") }) public class PageResource extends PageAdminResources { private static final long serialVersionUID = 1L; private static final Trace LOGGER = TraceManager.getTrace(PageResource.class); private static final String DOT_CLASS = PageResource.class.getName() + "."; private static final String OPERATION_LOAD_RESOURCE = DOT_CLASS + "loadResource"; private static final String OPERATION_REFRESH_SCHEMA = DOT_CLASS + "refreshSchema"; private static final String ID_TAB_PANEL = "tabPanel"; private static final String PANEL_RESOURCE_SUMMARY = "summary"; private static final String BUTTON_TEST_CONNECTION_ID = "testConnection"; private static final String BUTTON_REFRESH_SCHEMA_ID = "refreshSchema"; private static final String BUTTON_EDIT_XML_ID = "editXml"; private static final String BUTTON_CONFIGURATION_EDIT_ID = "configurationEdit"; private static final String BUTTON_WIZARD_EDIT_ID = "wizardEdit"; private static final String BUTTON_WIZARD_SHOW_ID = "wizardShow"; private static final String ID_BUTTON_BACK = "back"; public static final String TABLE_TEST_CONNECTION_RESULT_ID = "testConnectionResults"; public static final String PARAMETER_SELECTED_TAB = "tab"; LoadableModel<PrismObject<ResourceType>> resourceModel; private String resourceOid; public PageResource(PageParameters parameters) { resourceOid = parameters.get(OnePageParameterEncoder.PARAMETER).toString(); initialize(); } public PageResource() { initialize(); } private void initialize() { resourceModel = new LoadableModel<PrismObject<ResourceType>>() { private static final long serialVersionUID = 1L; @Override protected PrismObject<ResourceType> load() { return loadResource(); } }; initLayout(); } @Override protected void onConfigure() { super.onConfigure(); AjaxTabbedPanel tabbedPanel = (AjaxTabbedPanel) get(ID_TAB_PANEL); WebComponentUtil.setSelectedTabFromPageParameters(tabbedPanel, getPageParameters(), PARAMETER_SELECTED_TAB); } protected String getResourceOid() { return resourceOid; } private PrismObject<ResourceType> loadResource() { String resourceOid = getResourceOid(); LOGGER.trace("Loading resource with oid: {}", resourceOid); Task task = createSimpleTask(OPERATION_LOAD_RESOURCE); OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCE); Collection<SelectorOptions<GetOperationOptions>> resolveConnectorOption = SelectorOptions .createCollection(ResourceType.F_CONNECTOR, GetOperationOptions.createResolve()); resolveConnectorOption.add(SelectorOptions.create(GetOperationOptions.createNoFetch())); PrismObject<ResourceType> resource = WebModelServiceUtils.loadObject(ResourceType.class, resourceOid, resolveConnectorOption, this, task, result); result.recomputeStatus(); showResult(result, "pageAdminResources.message.cantLoadResource", false); return resource; } private void initLayout() { if (resourceModel == null || resourceModel.getObject() == null) { return; } addOrReplace(createResourceSummaryPanel()); addOrReplace(createTabsPanel()); AjaxButton test = new AjaxButton(BUTTON_TEST_CONNECTION_ID, createStringResource("pageResource.button.test")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { testConnectionPerformed(target); } }; add(test); AjaxButton refreshSchema = new AjaxButton(BUTTON_REFRESH_SCHEMA_ID, createStringResource("pageResource.button.refreshSchema")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { refreshSchemaPerformed(target); } }; add(refreshSchema); AjaxButton editXml = new AjaxButton(BUTTON_EDIT_XML_ID, createStringResource("pageResource.button.editXml")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { PageParameters parameters = new PageParameters(); parameters.add(PageDebugView.PARAM_OBJECT_ID, resourceModel.getObject().getOid()); parameters.add(PageDebugView.PARAM_OBJECT_TYPE, "ResourceType"); navigateToNext(PageDebugView.class, parameters); } }; add(editXml); AjaxButton configurationEdit = new AjaxButton(BUTTON_CONFIGURATION_EDIT_ID, createStringResource("pageResource.button.configurationEdit")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { startWizard(true, false); } }; add(configurationEdit); AjaxButton wizardShow = new AjaxButton(BUTTON_WIZARD_SHOW_ID, createStringResource("pageResource.button.wizardShow")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { startWizard(false, true); } }; add(wizardShow); AjaxButton wizardEdit = new AjaxButton(BUTTON_WIZARD_EDIT_ID, createStringResource("pageResource.button.wizardEdit")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { startWizard(false, false); } }; add(wizardEdit); AjaxButton back = new AjaxButton(ID_BUTTON_BACK, createStringResource("pageResource.button.back")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { redirectBack(); } }; add(back); } private void startWizard(boolean configOnly, boolean readOnly) { PageParameters parameters = new PageParameters(); parameters.add(OnePageParameterEncoder.PARAMETER, resourceModel.getObject().getOid()); // compatibility with PageAdminResources parameters.add(PageResourceWizard.PARAM_CONFIG_ONLY, configOnly); parameters.add(PageResourceWizard.PARAM_READ_ONLY, readOnly); setResponsePage(new PageResourceWizard(parameters)); } private ResourceSummaryPanel createResourceSummaryPanel(){ ResourceSummaryPanel resourceSummaryPanel = new ResourceSummaryPanel(PANEL_RESOURCE_SUMMARY, resourceModel); resourceSummaryPanel.setOutputMarkupId(true); return resourceSummaryPanel; } private AjaxTabbedPanel<ITab> createTabsPanel(){ List<ITab> tabs = new ArrayList<ITab>(); tabs.add(new PanelTab(createStringResource("PageResource.tab.details")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceDetailsTabPanel(panelId, resourceModel, PageResource.this); } }); tabs.add(new PanelTab(createStringResource("PageResource.tab.content.tasks")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceTasksPanel(panelId, true, resourceModel, PageResource.this); } }); tabs.add(new PanelTab(createStringResource("PageResource.tab.content.account")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceContentTabPanel(panelId, ShadowKindType.ACCOUNT, resourceModel, PageResource.this); } }); tabs.add(new PanelTab(createStringResource("PageResource.tab.content.entitlement")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceContentTabPanel(panelId, ShadowKindType.ENTITLEMENT, resourceModel, PageResource.this); } }); tabs.add(new PanelTab(createStringResource("PageResource.tab.content.generic")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceContentTabPanel(panelId, ShadowKindType.GENERIC, resourceModel, PageResource.this); } }); tabs.add(new PanelTab(createStringResource("PageResource.tab.content.others")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceContentTabPanel(panelId, null, resourceModel, PageResource.this); } }); tabs.add(new PanelTab(createStringResource("PageResource.tab.connector")) { private static final long serialVersionUID = 1L; @Override public WebMarkupContainer createPanel(String panelId) { return new ResourceConnectorPanel(panelId, null, resourceModel, PageResource.this); } }); AjaxTabbedPanel<ITab> resourceTabs = new AjaxTabbedPanel<ITab>(ID_TAB_PANEL, tabs) { private static final long serialVersionUID = 1L; @Override protected void onTabChange(int index) { updateBreadcrumbParameters(PARAMETER_SELECTED_TAB, index); } }; resourceTabs.setOutputMarkupId(true); return resourceTabs; } private void refreshSchemaPerformed(AjaxRequestTarget target) { Task task = createSimpleTask(OPERATION_REFRESH_SCHEMA); OperationResult parentResult = new OperationResult(OPERATION_REFRESH_SCHEMA); try { ResourceUtils.deleteSchema(resourceModel.getObject(), getModelService(), getPrismContext(), task, parentResult); getModelService().testResource(resourceModel.getObject().getOid(), task); // try to load fresh scehma } catch (ObjectAlreadyExistsException | ObjectNotFoundException | SchemaException | ExpressionEvaluationException | CommunicationException | ConfigurationException | PolicyViolationException | SecurityViolationException e) { LoggingUtils.logUnexpectedException(LOGGER, "Error refreshing resource schema", e); parentResult.recordFatalError("Error refreshing resource schema", e); } parentResult.computeStatus(); showResult(parentResult, "pageResource.refreshSchema.failed"); target.add(getFeedbackPanel()); } private void testConnectionPerformed(AjaxRequestTarget target) { final PrismObject<ResourceType> dto = resourceModel.getObject(); if (dto == null || StringUtils.isEmpty(dto.getOid())) { error(getString("pageResource.message.oidNotDefined")); target.add(getFeedbackPanel()); return; } final TestConnectionResultPanel testConnectionPanel = new TestConnectionResultPanel(getMainPopupBodyId(), dto.getOid(), getPage()) { private static final long serialVersionUID = 1L; @Override protected void okPerformed(AjaxRequestTarget target) { refreshStatus(target); } // @Override // protected void initOnFocusBehavior() { // setOnFocusBehavior(new AjaxEventBehavior("focus") { // // private static final long serialVersionUID = 1L; // // @Override // protected void onEvent(AjaxRequestTarget target) { // removeOnFocusBehavior(getOkButton()); // OperationResult result = new OperationResult(OPERATION_TEST_CONNECTION); // List<OpResult> resultsDto = new ArrayList<>(); // try { // Task task = createSimpleTask(OPERATION_TEST_CONNECTION); // result = getModelService().testResource(dto.getOid(), task); // resultsDto = WebComponentUtil.getTestConnectionResults(result,(PageBase) getPage()); // // getModelService().getObject(ResourceType.class, dto.getOid(), null, task, result); // } catch (ObjectNotFoundException | SchemaException | SecurityViolationException // | CommunicationException | ConfigurationException e) { // result.recordFatalError("Failed to test resource connection", e); // } // // if (result.isSuccess()) { // result.recomputeStatus(); // } // setModelObject(resultsDto); // initResultsPanel((RepeatingView) getResultsComponent(), getPage()); // setWaitForResults(false); // target.add(getContentPanel()); // } // }); // } }; testConnectionPanel.setOutputMarkupId(true); getMainPopup().setCloseButtonCallback(new ModalWindow.CloseButtonCallback() { private static final long serialVersionUID = 1L; @Override public boolean onCloseButtonClicked(AjaxRequestTarget target) { return false; } }); showMainPopup(testConnectionPanel, target); // if (!testConnectionPanel.isFocusSet()) { // testConnectionPanel.setFocusSet(true); // testConnectionPanel.setFocusOnComponent(testConnectionPanel.getOkButton(), target); // } } private void refreshStatus(AjaxRequestTarget target) { target.add(addOrReplace(createResourceSummaryPanel())); target.add(addOrReplace(createTabsPanel())); } }