/******************************************************************************* * Copyright (c) 2016 Eurotech and/or its affiliates and others * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech * Red Hat Inc *******************************************************************************/ package org.eclipse.kura.web.client.ui.CloudServices; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.eclipse.kura.web.client.ui.EntryClassUi; import org.eclipse.kura.web.client.util.FailureHandler; import org.eclipse.kura.web.shared.model.GwtCloudConnectionEntry; import org.eclipse.kura.web.shared.model.GwtConfigComponent; import org.eclipse.kura.web.shared.model.GwtXSRFToken; import org.eclipse.kura.web.shared.service.GwtCloudService; import org.eclipse.kura.web.shared.service.GwtCloudServiceAsync; import org.eclipse.kura.web.shared.service.GwtComponentService; import org.eclipse.kura.web.shared.service.GwtComponentServiceAsync; import org.eclipse.kura.web.shared.service.GwtSecurityTokenService; import org.eclipse.kura.web.shared.service.GwtSecurityTokenServiceAsync; import org.gwtbootstrap3.client.ui.Anchor; import org.gwtbootstrap3.client.ui.NavTabs; import org.gwtbootstrap3.client.ui.TabContent; import org.gwtbootstrap3.client.ui.TabListItem; import org.gwtbootstrap3.client.ui.TabPane; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; public class CloudServiceConfigurationsUi extends Composite { private static final Logger logger = Logger.getLogger(CloudServiceConfigurationsUi.class.getSimpleName()); private static CloudServiceConfigurationsUiUiBinder uiBinder = GWT .create(CloudServiceConfigurationsUiUiBinder.class); private final GwtSecurityTokenServiceAsync gwtXSRFService = GWT.create(GwtSecurityTokenService.class); private final GwtCloudServiceAsync gwtCloudService = GWT.create(GwtCloudService.class); private final GwtComponentServiceAsync gwtComponentService = GWT.create(GwtComponentService.class); private TabListItem currentlySelectedTab; interface CloudServiceConfigurationsUiUiBinder extends UiBinder<Widget, CloudServiceConfigurationsUi> { } private boolean dirty; private final CloudServicesUi cloudServicesUi; @UiField TabContent connectionTabContent; @UiField NavTabs connectionNavtabs; public CloudServiceConfigurationsUi(CloudServicesUi cloudServicesUi) { initWidget(uiBinder.createAndBindUi(this)); this.cloudServicesUi = cloudServicesUi; } public void setDirty(boolean dirty) { this.dirty = dirty; for (int connectionTabIndex = 0; connectionTabIndex < this.connectionTabContent .getWidgetCount(); connectionTabIndex++) { TabPane pane = (TabPane) this.connectionTabContent.getWidget(connectionTabIndex); for (int paneIndex = 0; paneIndex < pane.getWidgetCount(); paneIndex++) { CloudServiceConfigurationUi serviceConfigUi = (CloudServiceConfigurationUi) pane.getWidget(paneIndex); serviceConfigUi.setDirty(dirty); } } } public boolean isDirty() { for (int connectionTabIndex = 0; connectionTabIndex < this.connectionTabContent .getWidgetCount(); connectionTabIndex++) { TabPane pane = (TabPane) this.connectionTabContent.getWidget(connectionTabIndex); for (int paneIndex = 0; paneIndex < pane.getWidgetCount(); paneIndex++) { CloudServiceConfigurationUi serviceConfigUi = (CloudServiceConfigurationUi) pane.getWidget(paneIndex); this.dirty = this.dirty || serviceConfigUi.isDirty(); } } return this.dirty; } public CloudServiceConfigurationUi getDirtyCloudConfiguration() { for (int connectionTabIndex = 0; connectionTabIndex < this.connectionTabContent .getWidgetCount(); connectionTabIndex++) { TabPane pane = (TabPane) this.connectionTabContent.getWidget(connectionTabIndex); for (int paneIndex = 0; paneIndex < pane.getWidgetCount(); paneIndex++) { CloudServiceConfigurationUi serviceConfigUi = (CloudServiceConfigurationUi) pane.getWidget(paneIndex); if (serviceConfigUi.isDirty()) { return serviceConfigUi; } } } return null; } public void setVisibility(boolean isVisible) { this.connectionNavtabs.setVisible(isVisible); this.connectionTabContent.setVisible(isVisible); } public void selectConnection(GwtCloudConnectionEntry selection) { this.connectionNavtabs.clear(); this.connectionTabContent.clear(); getCloudStackConfigurations(selection.getCloudFactoryPid(), selection.getCloudServicePid()); } public TabListItem getSelectedTab() { return this.currentlySelectedTab; } public void setSelectedTab(TabListItem tabListItem) { this.currentlySelectedTab = tabListItem; } private void getCloudStackConfigurations(String factoryPid, String cloudServicePid) { this.gwtCloudService.findStackPidsByFactory(factoryPid, cloudServicePid, new AsyncCallback<List<String>>() { @Override public void onFailure(Throwable ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); FailureHandler.handle(ex, EntryClassUi.class.getName()); } @Override public void onSuccess(List<String> result) { final List<String> pidsResult = result; CloudServiceConfigurationsUi.this.gwtXSRFService .generateSecurityToken(new AsyncCallback<GwtXSRFToken>() { @Override public void onFailure(Throwable ex) { FailureHandler.handle(ex, EntryClassUi.class.getName()); } @Override public void onSuccess(GwtXSRFToken token) { CloudServiceConfigurationsUi.this.gwtComponentService .findFilteredComponentConfigurations(token, new AsyncCallback<List<GwtConfigComponent>>() { @Override public void onFailure(Throwable ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); FailureHandler.handle(ex, EntryClassUi.class.getName()); } @Override public void onSuccess(List<GwtConfigComponent> result) { boolean isFirstEntry = true; for (GwtConfigComponent pair : result) { if (pidsResult.contains(pair.getComponentId())) { renderTabs(pair, isFirstEntry); isFirstEntry = false; } } } }); } }); } }); } private void renderTabs(GwtConfigComponent config, boolean isFirstEntry) { final String simplifiedComponentName = getSimplifiedComponentName(config); TabListItem item = new TabListItem(simplifiedComponentName); item.setDataTarget("#" + simplifiedComponentName); item.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Anchor anchor = (Anchor) event.getSource(); CloudServiceConfigurationsUi.this.cloudServicesUi .onTabSelectionChange((TabListItem) anchor.getParent()); } }); this.connectionNavtabs.add(item); TabPane tabPane = new TabPane(); tabPane.setId(simplifiedComponentName); CloudServiceConfigurationUi serviceConfigurationBinder = new CloudServiceConfigurationUi(config); tabPane.add(serviceConfigurationBinder); this.connectionTabContent.add(tabPane); if (isFirstEntry) { this.currentlySelectedTab = item; item.setActive(true); tabPane.setActive(true); } serviceConfigurationBinder.renderForm(); } private String getSimplifiedComponentName(GwtConfigComponent config) { String selectedCloudServicePid = config.getComponentId(); String tempName; int start = selectedCloudServicePid.lastIndexOf('.'); int substringIndex = start + 1; if (start != -1 && substringIndex < selectedCloudServicePid.length()) { tempName = selectedCloudServicePid.substring(substringIndex); } else { tempName = selectedCloudServicePid; } return tempName; } }