/*
* Copyright 2011-2012 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.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.eclipse.core.AwsToolkitCore;
import com.amazonaws.eclipse.dynamodb.DynamoDBPlugin;
import com.amazonaws.eclipse.dynamodb.editor.OpenTableEditorAction;
import com.amazonaws.eclipse.explorer.ExplorerNode;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.TableStatus;
public class DynamoDBTableNode extends ExplorerNode {
private final String tableName;
private TableStatus tableStatus;
public String getTableName() {
return tableName;
}
public TableStatus getTableStatus() {
return tableStatus;
}
/**
* Sets the status of the table that this node represents, and changes to
* the corresponding open action.
*/
public void setTableStatus(final TableStatus tableStatus) {
this.tableStatus = tableStatus;
if ( tableStatus == null ) {
setOpenAction(new Action() {
@Override
public void run() {
/*
* Update the table status immediately when the node is
* being opened, but has not been set with table status.
*/
AmazonDynamoDB dynamoDBClient = AwsToolkitCore.getClientFactory().getDynamoDBV2Client();
boolean describeTableError = false;
TableStatus updatedStatus = null;
try {
updatedStatus = TableStatus.valueOf(dynamoDBClient
.describeTable(
new DescribeTableRequest()
.withTableName(tableName)).getTable()
.getTableStatus());
} catch ( AmazonServiceException ase ) {
if (ase.getErrorCode().equalsIgnoreCase(
"ResourceNotFoundException") == true) {
/* Show warning that the table has already been deleted */
MessageDialog dialog = new MessageDialog(
Display.getCurrent().getActiveShell(),
"Cannot open this table",
AwsToolkitCore.getDefault().getImageRegistry().get(AwsToolkitCore.IMAGE_AWS_ICON),
"Table has been deleted.",
MessageDialog.ERROR,
new String[] { "OK" }, 0);
dialog.open();
/*
* We need to explicitly refresh the tree view if a
* table node has already been deleted in DynamoDB
*/
DynamoDBContentProvider.getInstance().refresh();
return;
} else {
describeTableError = true;
}
} catch ( IllegalArgumentException iae ) {
/* Unrecognized table status */
describeTableError = true;
}
if ( describeTableError ) {
/*
* Still allow the user to open the table editor if we
* cannot get the table status now. (But the background
* job will still keep trying to update the table
* status).
*/
setOpenAction(new OpenTableEditorAction(tableName));
return;
}
/* assert: updatedStatus != null */
setTableStatus(updatedStatus);
DynamoDBTableNode.this.getOpenAction().run();
}
});
} else if ( tableStatus == TableStatus.ACTIVE ) {
/*
* Open the table editor only when the node is in ACTIVE status.
*/
setOpenAction(new OpenTableEditorAction(tableName));
} else {
/*
* For CREATING/DELETING/UPDATING, suppress opening the table editor.
* Show a warning on the table status instead.
*/
setOpenAction(new Action() {
@Override
public void run() {
/* Show the warning that the table is CREATING/DELETING/UPDATING */
MessageDialog dialog = new MessageDialog(
Display.getCurrent().getActiveShell(),
"Cannot open this table",
AwsToolkitCore.getDefault()
.getImageRegistry()
.get(AwsToolkitCore.IMAGE_AWS_ICON),
"Cannot open this table(" + tableName + "), since it is in the status of " + tableStatus + ".",
MessageDialog.ERROR,
new String[] { "OK" }, 0);
dialog.open();
}
});
}
}
public DynamoDBTableNode(String tableName) {
this(tableName, null);
}
public DynamoDBTableNode(String tableName, TableStatus tableStatus) {
super(tableName, 0, DynamoDBPlugin.getDefault().getImageRegistry()
.get(DynamoDBPlugin.IMAGE_TABLE), null);
this.tableName = tableName;
setTableStatus(tableStatus);
}
}