/*
* � Copyright IBM Corp. 2015, 2016
*
* 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.ibm.xsp.extlib.designer.bluemix.wizard;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.cloudfoundry.client.lib.CloudFoundryClient;
import org.cloudfoundry.client.lib.domain.CloudOrganization;
import org.cloudfoundry.client.lib.domain.CloudSpace;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import com.ibm.commons.util.StringUtil;
import com.ibm.designer.domino.preferences.DominoPreferenceManager;
import com.ibm.xsp.extlib.designer.bluemix.preference.PreferencePage;
import com.ibm.xsp.extlib.designer.bluemix.util.BluemixUtil;
import com.ibm.xsp.extlib.designer.tooling.utils.AbstractWizardPage;
import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils;
import static com.ibm.xsp.extlib.designer.bluemix.preference.PreferenceKeys.*;
/**
* @author Gary Marjoram
*
*/
public class CloudSpaceBluemixWizardPage extends AbstractWizardPage implements ControlListener, ISelectionChangedListener {
private TableViewer _orgViewer;
private TableViewer _spaceViewer;
private CloudFoundryClient _client;
private List<CloudOrganization> _orgs;
private List<CloudSpace> _spaces;
protected CloudSpaceBluemixWizardPage(String pageName) {
super(pageName);
}
@Override
protected String getPageTitle() {
return "Organization and Space"; // $NLX-CloudSpaceBluemixWizardPage.OrganizationSpace-1$
}
@Override
protected String getPageMsg() {
return "Choose the organization and space for deployment."; // $NLX-CloudSpaceBluemixWizardPage.ChoosetheOrganizationandSpaceford-1$
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(WizardUtils.createGridLayout(2, 5));
WizardUtils.createLabel(container, "Organizations:", 1, 0, true, GridData.FILL_HORIZONTAL); // $NLX-CloudSpaceBluemixWizardPage.Organizations-1$
WizardUtils.createLabel(container, "Spaces:", 1, 0, true, GridData.FILL_HORIZONTAL); // $NLX-CloudSpaceBluemixWizardPage.Spaces-1$
_orgViewer = WizardUtils.createTableViewer(container, 1, 1, null, SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL);
ColumnViewerToolTipSupport.enableFor(_orgViewer, ToolTip.NO_RECREATE);
_orgViewer.getTable().setToolTipText("Choose organization"); // $NLX-CloudSpaceBluemixWizardPage.ChooseOrganization-1$
_orgViewer.getTable().setHeaderVisible(false);
_orgViewer.getTable().setLinesVisible(false);
_orgViewer.getTable().addControlListener(this);
_orgViewer.setContentProvider(new ArrayContentProvider());
_orgViewer.addSelectionChangedListener(this);
// Create the only column
TableViewerColumn col = new TableViewerColumn(_orgViewer, SWT.LEFT);
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider());
_spaceViewer = WizardUtils.createTableViewer(container, 1, 1, null, SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL);
ColumnViewerToolTipSupport.enableFor(_spaceViewer, ToolTip.NO_RECREATE);
_spaceViewer.getTable().setToolTipText("Choose space"); // $NLX-CloudSpaceBluemixWizardPage.ChooseSpace-1$
_spaceViewer.getTable().setHeaderVisible(false);
_spaceViewer.getTable().setLinesVisible(false);
_spaceViewer.getTable().addControlListener(this);
_spaceViewer.setContentProvider(new ArrayContentProvider());
_spaceViewer.addSelectionChangedListener(this);
// Create the only column
col = new TableViewerColumn(_spaceViewer, SWT.LEFT);
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider());
setControl(container);
}
@Override
protected void initialisePageState() {
String savedOrg = DominoPreferenceManager.getInstance().getValue(KEY_BLUEMIX_CLOUDSPACE_ORG, false);
String savedSpace = DominoPreferenceManager.getInstance().getValue(KEY_BLUEMIX_CLOUDSPACE_SPACE, false);
String [] orgs = getOrgs();
_orgViewer.setInput(orgs);
int orgIdx = orgs.length > 0 ? 0 : -1;
for (int i=0; i < orgs.length; i++) {
if (StringUtil.equalsIgnoreCase(orgs[i], savedOrg)) {
orgIdx = i;
break;
}
}
_orgViewer.getTable().select(orgIdx);
updateSpaces(orgIdx, savedSpace);
}
@Override
public void controlResized(ControlEvent event) {
Table table = (Table) event.widget;
table.getColumn(0).setWidth(table.getClientArea().width);
};
@Override
public void controlMoved(ControlEvent event) {
}
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (event.getSource() == _orgViewer) {
updateSpaces(_orgViewer.getTable().getSelectionIndex(), null);
}
_hasChanged = true;
}
public void updateSpaces(int orgIdx, String space) {
if (orgIdx >= 0) {
String [] spaces = getSpaces(_orgs.get(orgIdx).getName());
int spaceIdx = 0;
for (int i=0; i < spaces.length; i++) {
if (StringUtil.equalsIgnoreCase(spaces[i], space)) {
spaceIdx = i;
break;
}
}
_spaceViewer.setInput(spaces);
_spaceViewer.refresh();
_spaceViewer.getTable().select(spaceIdx);
} else {
_spaceViewer.setInput(null);
_spaceViewer.refresh();
}
validatePage();
}
private String[] getOrgs() {
ArrayList <String> list = new ArrayList<String>();
for (CloudOrganization org : _orgs) {
list.add(org.getName());
}
return list.toArray(new String[list.size()]);
}
private String[] getSpaces(String org) {
ArrayList <String> list = new ArrayList<String>();
for (CloudSpace space : _spaces) {
if (StringUtil.equalsIgnoreCase(org, space.getOrganization().getName())) {
list.add(space.getName());
}
}
return list.toArray(new String[list.size()]);
}
public String getOrg() {
if (!_orgViewer.getTable().isDisposed()) {
return _orgs.get(_orgViewer.getTable().getSelectionIndex()).getName();
}
return "";
}
public String getSpace() {
if (!_spaceViewer.getTable().isDisposed()) {
return(getSpaces(getOrg())[_spaceViewer.getTable().getSelectionIndex()]);
}
return "";
}
@Override
protected void validatePage() {
if (_spaceViewer.getTable().getSelectionIndex() >= 0) {
showError(null);
} else {
showError("You must select a Cloud Space"); // $NLX-CloudSpaceBluemixWizardPage.YoumustselectaCloudSpace-1$
}
}
@Override
protected void savePageState() {
DominoPreferenceManager.getInstance().setValue(KEY_BLUEMIX_CLOUDSPACE_ORG, getOrg());
DominoPreferenceManager.getInstance().setValue(KEY_BLUEMIX_CLOUDSPACE_SPACE, getSpace());
}
public IRunnableWithProgress getOrgsAndSpaces = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
try {
monitor.beginTask(BluemixUtil.productizeString("%BM_PRODUCT%"), IProgressMonitor.UNKNOWN); // $NON-NLS-1$
if (_client == null) {
try {
monitor.subTask("Connecting to Server..."); // $NLX-CloudSpaceBluemixWizardPage.ConnectingtoServer-1$
String target = PreferencePage.getSecurePreference(KEY_BLUEMIX_SERVER_URL, "");
_client = new CloudFoundryClient(((AbstractBluemixWizard)_wiz)._credentials, URI.create(target).toURL());
_client.login();
} catch (Exception e) {
throw new Exception("Error connecting to Server", e); // $NLX-CloudSpaceBluemixWizardPage.ErrorconnectingtoServer-1$
}
}
try {
monitor.subTask("Retrieving organizations..."); // $NLX-CloudSpaceBluemixWizardPage.Retrievingorganizations-1$
_orgs = _client.getOrganizations();
} catch (Exception e) {
throw new Exception("Error retrieving organizations", e); // $NLX-CloudSpaceBluemixWizardPage.Errorretrievingorganizations-1$
}
try {
monitor.subTask("Retrieving spaces..."); // $NLX-CloudSpaceBluemixWizardPage.Retrievingspaces-1$
_spaces = _client.getSpaces();
} catch (Exception e) {
throw new Exception("Error retrieving spaces", e); // $NLX-CloudSpaceBluemixWizardPage.Errorretrievingspaces-1$
}
monitor.done();
} catch (Exception e) {
((AbstractBluemixWizard)_wiz).setJobException(e);
_client = null;
}
}
};
}