package fr.opensagres.mongodb.ide.ui.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.osgi.util.NLS;
import fr.opensagres.mongodb.ide.core.Platform;
import fr.opensagres.mongodb.ide.core.model.Collection;
import fr.opensagres.mongodb.ide.core.model.Database;
import fr.opensagres.mongodb.ide.core.model.Server;
import fr.opensagres.mongodb.ide.ui.dialogs.StackTraceErrorDialog;
import fr.opensagres.mongodb.ide.ui.internal.ImageResources;
import fr.opensagres.mongodb.ide.ui.internal.Messages;
public class DeleteAction extends Action {
private final TreeViewer viewer;
public DeleteAction(TreeViewer viewer) {
super.setText(Messages.DeleteAction_text);
super.setToolTipText(Messages.DeleteAction_toolTipText);
super.setImageDescriptor(ImageResources
.getImageDescriptor(ImageResources.IMG_DELETE_16));
this.viewer = viewer;
}
public void run() {
ITreeSelection selection = (ITreeSelection) viewer.getSelection();
if (selection != null && !selection.isEmpty()) {
List<Server> serversToRemove = null;
List<Database> databasesToRemove = null;
List<Collection> collectionsToRemove = null;
List elementsToRemove = selection.toList();
for (Object element : elementsToRemove) {
if (element instanceof Server) {
if (serversToRemove == null) {
serversToRemove = new ArrayList<Server>();
}
serversToRemove.add((Server) element);
} else if (element instanceof Database) {
if (databasesToRemove == null) {
databasesToRemove = new ArrayList<Database>();
}
databasesToRemove.add((Database) element);
} else if (element instanceof Collection) {
if (collectionsToRemove == null) {
collectionsToRemove = new ArrayList<Collection>();
}
collectionsToRemove.add((Collection) element);
}
}
// Delete servers
try {
deleteServers(serversToRemove);
} catch (Throwable e) {
StackTraceErrorDialog.openError(viewer.getControl().getShell(),
"dialogTitle", "title", e);
}
// Delete databases
try {
deleteDatabases(databasesToRemove);
} catch (Throwable e) {
StackTraceErrorDialog.openError(viewer.getControl().getShell(),
"dialogTitle", "title", e);
}
// Delete collections
try {
deleteCollections(collectionsToRemove);
} catch (Throwable e) {
StackTraceErrorDialog.openError(viewer.getControl().getShell(),
"dialogTitle", "title", e);
}
}
}
/**
* Delete servers list.
*
* @param serversToRemove
* @throws Exception
*/
private void deleteServers(List<Server> serversToRemove) throws Exception {
int nbServers = serversToRemove == null ? 0 : serversToRemove.size();
if (nbServers > 0) {
StringBuilder names = new StringBuilder();
for (Server server : serversToRemove) {
if (names.length() > 0) {
names.append(",");
}
names.append(server.getName());
}
if (MessageDialog.openConfirm(
viewer.getControl().getShell(),
Messages.DeleteAction_serverTitle,
NLS.bind(Messages.DeleteAction_serverMessage,
names.toString()))) {
for (Server server : serversToRemove) {
Platform.getServerManager().removeServer(server);
}
}
}
}
/**
* Delete databases.
*
* @param databasesToRemove
*/
private void deleteDatabases(List<Database> databasesToRemove)
throws Exception {
int nbDatabases = databasesToRemove == null ? 0 : databasesToRemove
.size();
if (nbDatabases > 0) {
StringBuilder names = new StringBuilder();
for (Database database : databasesToRemove) {
if (names.length() > 0) {
names.append(",");
}
names.append(database.getName());
}
if (MessageDialog.openConfirm(
viewer.getControl().getShell(),
Messages.DeleteAction_databaseTitle,
NLS.bind(Messages.DeleteAction_databaseMessage,
names.toString()))) {
for (Database database : databasesToRemove) {
database.getParent().dropDatabase(database);
}
}
}
}
/**
* Delete collections.
*
* @param collectionsToRemove
*/
private void deleteCollections(List<Collection> collectionsToRemove) {
int nbCollections = collectionsToRemove == null ? 0
: collectionsToRemove.size();
if (nbCollections > 0) {
StringBuilder names = new StringBuilder();
for (Collection collection : collectionsToRemove) {
if (names.length() > 0) {
names.append(",");
}
names.append(collection.getName());
}
if (MessageDialog.openConfirm(
viewer.getControl().getShell(),
Messages.DeleteAction_collectionTitle,
NLS.bind(Messages.DeleteAction_collectionMessage,
names.toString()))) {
for (Collection collection : collectionsToRemove) {
collection.getDatabase().getParent()
.deleteCollection(collection);
}
}
}
}
}