/* * Copyright 2013 Amazon Technologies, Inc. * * 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://aws.amazon.com/apache2.0 * * This file 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.amazonaws.eclipse.explorer.dynamodb; import org.eclipse.core.databinding.AggregateValidationStatus; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.PojoObservables; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import com.amazonaws.eclipse.core.AwsToolkitCore; import com.amazonaws.eclipse.core.ui.WebLinkListener; import com.amazonaws.eclipse.databinding.ChainValidator; import com.amazonaws.eclipse.databinding.NotEmptyValidator; import com.amazonaws.eclipse.databinding.RangeValidator; public class CreateTableFirstPage extends WizardPage { private final String OK_MESSAGE = "Configure new DynamoDB table"; private boolean usesRangeKey = false; private Font italicFont; private IObservableValue tableName; private IObservableValue hashKeyName; private IObservableValue hashKeyType; private IObservableValue enableRangeKey; private IObservableValue rangeKeyName; private IObservableValue rangeKeyType; private IObservableValue readCapacity; private IObservableValue writeCapacity; private final DataBindingContext bindingContext = new DataBindingContext(); @Override public void dispose() { if (italicFont != null) italicFont.dispose(); super.dispose(); } private static final long CAPACITY_UNIT_MINIMUM = 1; private static final String[] DATA_TYPE_STRINGS = new String[] { "String", "Number", "Binary" }; CreateTableFirstPage(CreateTableWizard wizard) { super("Configure table"); setMessage(OK_MESSAGE); setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_AWS_LOGO)); tableName = PojoObservables.observeValue(wizard.getDataModel(), "tableName"); hashKeyName = PojoObservables.observeValue(wizard.getDataModel(), "hashKeyName"); hashKeyType = PojoObservables.observeValue(wizard.getDataModel(), "hashKeyType"); enableRangeKey = PojoObservables.observeValue(wizard.getDataModel(), "enableRangeKey"); rangeKeyName = PojoObservables.observeValue(wizard.getDataModel(), "rangeKeyName"); rangeKeyType = PojoObservables.observeValue(wizard.getDataModel(), "rangeKeyType"); readCapacity = PojoObservables.observeValue(wizard.getDataModel(), "readCapacity"); writeCapacity = PojoObservables.observeValue(wizard.getDataModel(), "writeCapacity"); } public void createControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); GridDataFactory.fillDefaults().grab(true, true).applyTo(comp); GridLayoutFactory.fillDefaults().numColumns(2).applyTo(comp); // Table name Label tableNameLabel = new Label(comp, SWT.READ_ONLY); tableNameLabel.setText("Table Name:"); final Text tableNameText = CreateTablePageUtil.newTextField(comp); bindingContext.bindValue(SWTObservables.observeText(tableNameText, SWT.Modify), tableName); ChainValidator<String> tableNameValidationStatusProvider = new ChainValidator<String>(tableName, new NotEmptyValidator("Please provide a table name")); bindingContext.addValidationStatusProvider(tableNameValidationStatusProvider); // Hash key Group hashKeyGroup = CreateTablePageUtil.newGroup(comp, "Hash Key", 2); new Label(hashKeyGroup, SWT.READ_ONLY).setText("Hash Key Name:"); final Text hashKeyText = CreateTablePageUtil.newTextField(hashKeyGroup); bindingContext.bindValue(SWTObservables.observeText(hashKeyText, SWT.Modify), hashKeyName); ChainValidator<String> hashKeyNameValidationStatusProvider = new ChainValidator<String>(hashKeyName, new NotEmptyValidator("Please provide an attribute name for the hash key")); bindingContext.addValidationStatusProvider(hashKeyNameValidationStatusProvider); new Label(hashKeyGroup, SWT.READ_ONLY).setText("Hash Key Type:"); final Combo hashKeyTypeCombo = new Combo(hashKeyGroup, SWT.DROP_DOWN | SWT.READ_ONLY); hashKeyTypeCombo.setItems(DATA_TYPE_STRINGS); bindingContext.bindValue(SWTObservables.observeSelection(hashKeyTypeCombo), hashKeyType); hashKeyTypeCombo.select(0); // Range key Group rangeKeyGroup = CreateTablePageUtil.newGroup(comp, "Range Key", 2); final Button enableRangeKeyButton = new Button(rangeKeyGroup, SWT.CHECK); enableRangeKeyButton.setText("Enable Range Key"); GridDataFactory.fillDefaults().span(2, 1).applyTo(enableRangeKeyButton); bindingContext.bindValue(SWTObservables.observeSelection(enableRangeKeyButton), enableRangeKey); final Label rangeKeyAttributeLabel = new Label(rangeKeyGroup, SWT.READ_ONLY); rangeKeyAttributeLabel.setText("Range Key Name:"); final Text rangeKeyText = CreateTablePageUtil.newTextField(rangeKeyGroup); bindingContext.bindValue(SWTObservables.observeText(rangeKeyText, SWT.Modify), rangeKeyName); ChainValidator<String> rangeKeyNameValidationStatusProvider = new ChainValidator<String>(rangeKeyName, enableRangeKey, new NotEmptyValidator( "Please provide an attribute name for the range key")); bindingContext.addValidationStatusProvider(rangeKeyNameValidationStatusProvider); final Label rangeKeyTypeLabel = new Label(rangeKeyGroup, SWT.READ_ONLY); rangeKeyTypeLabel.setText("Range Key Type:"); final Combo rangeKeyTypeCombo = new Combo(rangeKeyGroup, SWT.DROP_DOWN | SWT.READ_ONLY); rangeKeyTypeCombo.setItems(DATA_TYPE_STRINGS); bindingContext.bindValue(SWTObservables.observeSelection(rangeKeyTypeCombo), rangeKeyType); rangeKeyTypeCombo.select(0); enableRangeKeyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { usesRangeKey = enableRangeKeyButton.getSelection(); rangeKeyAttributeLabel.setEnabled(usesRangeKey); rangeKeyText.setEnabled(usesRangeKey); rangeKeyTypeLabel.setEnabled(usesRangeKey); rangeKeyTypeCombo.setEnabled(usesRangeKey); } }); enableRangeKeyButton.setSelection(false); rangeKeyAttributeLabel.setEnabled(usesRangeKey); rangeKeyText.setEnabled(usesRangeKey); rangeKeyTypeLabel.setEnabled(usesRangeKey); rangeKeyTypeCombo.setEnabled(usesRangeKey); FontData[] fontData = tableNameLabel.getFont().getFontData(); for (FontData fd : fontData) { fd.setStyle(SWT.ITALIC); } italicFont = new Font(Display.getDefault(), fontData); // Table throughput Group throughputGroup = CreateTablePageUtil.newGroup(comp, "Table Throughput", 3); new Label(throughputGroup, SWT.READ_ONLY).setText("Read Capacity Units:"); final Text readCapacityText = CreateTablePageUtil.newTextField(throughputGroup); readCapacityText.setText("" + CAPACITY_UNIT_MINIMUM); bindingContext.bindValue(SWTObservables.observeText(readCapacityText, SWT.Modify), readCapacity); ChainValidator<Long> readCapacityValidationStatusProvider = new ChainValidator<Long>( readCapacity, new RangeValidator( "Please enter a read capacity of " + CAPACITY_UNIT_MINIMUM + " or more.", CAPACITY_UNIT_MINIMUM, Long.MAX_VALUE)); bindingContext.addValidationStatusProvider(readCapacityValidationStatusProvider); Label minimumReadCapacityLabel = new Label(throughputGroup, SWT.READ_ONLY); minimumReadCapacityLabel.setText("(Minimum capacity " + CAPACITY_UNIT_MINIMUM + ")"); minimumReadCapacityLabel.setFont(italicFont); new Label(throughputGroup, SWT.READ_ONLY).setText("Write Capacity Units:"); final Text writeCapacityText = CreateTablePageUtil.newTextField(throughputGroup); writeCapacityText.setText("" + CAPACITY_UNIT_MINIMUM); Label minimumWriteCapacityLabel = new Label(throughputGroup, SWT.READ_ONLY); minimumWriteCapacityLabel.setText("(Minimum capacity " + CAPACITY_UNIT_MINIMUM + ")"); minimumWriteCapacityLabel.setFont(italicFont); bindingContext.bindValue(SWTObservables.observeText(writeCapacityText, SWT.Modify), writeCapacity); ChainValidator<Long> writeCapacityValidationStatusProvider = new ChainValidator<Long>( writeCapacity, new RangeValidator( "Please enter a write capacity of " + CAPACITY_UNIT_MINIMUM + " or more.", CAPACITY_UNIT_MINIMUM, Long.MAX_VALUE)); bindingContext.addValidationStatusProvider(writeCapacityValidationStatusProvider); final Label throughputCapacityLabel = new Label(throughputGroup, SWT.WRAP); throughputCapacityLabel .setText("Amazon DynamoDB will reserve the necessary machine resources to meet your throughput needs based on the read and write capacity specified with consistent, low-latency performance. You pay a flat, hourly rate based on the capacity you reserve."); GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false); gridData.horizontalSpan = 3; gridData.widthHint = 200; throughputCapacityLabel.setLayoutData(gridData); throughputCapacityLabel.setFont(italicFont); // Help info String pricingLinkText = "<a href=\"" + "http://aws.amazon.com/dynamodb/#pricing" + "\">" + "More information on Amazon DynamoDB pricing</a>. "; CreateTablePageUtil.newLink(new WebLinkListener(), pricingLinkText, throughputGroup); // Finally provide aggregate status reporting for the entire wizard page final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(bindingContext, AggregateValidationStatus.MAX_SEVERITY); aggregateValidationStatus.addChangeListener(new IChangeListener() { public void handleChange(ChangeEvent event) { Object value = aggregateValidationStatus.getValue(); if (value instanceof IStatus == false) return; IStatus status = (IStatus) value; if (status.isOK()) { setErrorMessage(null); setMessage(OK_MESSAGE, Status.OK); } else if (status.getSeverity() == Status.WARNING) { setErrorMessage(null); setMessage(status.getMessage(), Status.WARNING); } else if (status.getSeverity() == Status.ERROR) { setErrorMessage(status.getMessage()); } setPageComplete(status.isOK()); } }); setPageComplete(false); setControl(comp); } }