summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java50
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java4
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java10
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java1
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java18
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java23
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java32
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java42
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java7
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java33
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java4
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java27
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java5
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java13
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java20
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/GlusterServersPage.java7
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java20
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java26
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java62
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java22
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterExceptionMapper.java39
21 files changed, 294 insertions, 171 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java
index 6db98ed4..e6c08da7 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java
@@ -25,6 +25,7 @@ import java.util.Map.Entry;
import java.util.Set;
import org.apache.log4j.Logger;
+import org.eclipse.core.runtime.IProgressMonitor;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Brick;
@@ -92,7 +93,7 @@ public class GlusterDataModelManager {
model = fetchData(clusterName);
}
- public GlusterDataModel fetchData(String clusterName) {
+ private GlusterDataModel fetchData(String clusterName) {
GlusterDataModel model = new GlusterDataModel("Gluster Data Model");
Cluster cluster = new Cluster(clusterName, model);
@@ -100,7 +101,6 @@ public class GlusterDataModelManager {
initializeVolumes(cluster);
initializeAutoDiscoveredServers(cluster);
- // initializeDisks();
initializeTasks(cluster);
initializeAlerts(cluster);
initializeVolumeOptionsDefaults();
@@ -109,27 +109,50 @@ public class GlusterDataModelManager {
return model;
}
- public void refreshModel() {
+ public GlusterDataModel fetchModel(IProgressMonitor monitor) {
synchronized (syncInProgress) {
if(syncInProgress) {
logger.info("Previous data sync is still running. Skipping this one.");
- return;
+ return null;
}
syncInProgress = true;
}
-
- logger.info("Starting data sync");
+
try {
- updateModel(fetchData(clusterName));
- } catch(Exception e) {
+ logger.info("Starting data sync");
+ GlusterDataModel model = new GlusterDataModel("Gluster Data Model");
+ Cluster cluster = new Cluster(clusterName, model);
+ model.addCluster(cluster);
+
+ monitor.beginTask("Data Sync", 4);
+
+ monitor.setTaskName("Syncing servers...");
+ initializeGlusterServers(cluster);
+ monitor.worked(1);
+
+ monitor.setTaskName("Syncing volumes...");
+ initializeVolumes(cluster);
+ monitor.worked(1);
+
+ monitor.setTaskName("Syncing discovered servers...");
+ initializeAutoDiscoveredServers(cluster);
+ monitor.worked(1);
+
+ monitor.setTaskName("Syncing tasks...");
+ initializeTasks(cluster);
+ monitor.worked(1);
+
+ monitor.done();
+ return model;
+ } catch(RuntimeException e) {
logger.error("Error in data sync!", e);
+ return null;
} finally {
syncInProgress = false;
}
}
-
- private void updateModel(GlusterDataModel model) {
+ public void updateModel(GlusterDataModel model) {
updateVolumes(model);
updateGlusterServers(model);
updateDiscoveredServers(model);
@@ -620,13 +643,6 @@ public class GlusterDataModelManager {
}
}
- public void updateVolumeBricks(Volume volume, List<Brick> bricks) {
- model.getCluster().updateVolume( volume.getName(), bricks );
- for (ClusterListener listener : listeners) {
- listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICK_REPLACED , bricks));
- }
- }
-
public void addTask(TaskInfo taskInfo) {
Cluster cluster = model.getCluster();
cluster.addTaskInfo(taskInfo);
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java
index 350c9102..b6c9db34 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java
@@ -35,10 +35,6 @@ public interface ClusterListener {
public void serverChanged(GlusterServer server, Event event);
- public void volumeAdded(Volume volume);
-
- public void volumeRemoved(Volume volume);
-
public void volumeChanged(Volume volume, Event event);
public void volumeCreated(Volume volume);
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java
index c530fde4..ce66a8f4 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java
@@ -40,16 +40,6 @@ public class DefaultClusterListener implements ClusterListener {
}
@Override
- public void volumeAdded(Volume volume) {
- modelChanged();
- }
-
- @Override
- public void volumeRemoved(Volume volume) {
- modelChanged();
- }
-
- @Override
public void volumeChanged(Volume volume, Event event) {
modelChanged();
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java
index 62f70040..7378116a 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java
@@ -23,7 +23,6 @@ public class Event {
BRICKS_ADDED,
BRICKS_REMOVED,
BRICKS_CHANGED,
- BRICK_REPLACED,
VOLUME_STATUS_CHANGED,
VOLUME_OPTIONS_RESET,
VOLUME_OPTION_SET,
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
index 7a53b88f..250d05c3 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
@@ -24,6 +24,7 @@ import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -274,8 +275,8 @@ public class Volume extends Entity {
if (!(getName().equals(volume.getName()) && getVolumeType() == volume.getVolumeType()
&& getTransportType() == volume.getTransportType() && getStatus() == volume.getStatus()
- && getReplicaCount() == volume.getReplicaCount() && getStripeCount() == volume.getStripeCount())
- && getOptions().equals(volume.getOptions())) {
+ && getReplicaCount() == volume.getReplicaCount() && getStripeCount() == volume.getStripeCount()
+ && getOptions().equals(volume.getOptions()))) {
return false;
}
@@ -285,10 +286,15 @@ public class Volume extends Entity {
}
}
- for (Brick brick : getBricks()) {
- if (!(brick.equals(GlusterCoreUtil.getEntity(volume.getBricks(), brick.getName(), false)))) {
- return false;
- }
+ List<Brick> oldBricks = getBricks();
+ List<Brick> newBricks = volume.getBricks();
+ if(oldBricks.size() != newBricks.size()) {
+ return false;
+ }
+
+ Map<Brick, Brick> modifiedBricks = GlusterCoreUtil.getModifiedEntities(oldBricks, newBricks);
+ if(modifiedBricks.size() > 0) {
+ return false;
}
return true;
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java
index 2c49a1e2..43287c62 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java
@@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.List;
import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
@@ -51,7 +52,6 @@ public class Application implements IApplication {
private static Application instance;
private List<IEntityListener> entityListeners = Collections.synchronizedList(new ArrayList<IEntityListener>());
private IStatusLineManager statusLineManager;
- private Job syncJob;
public Application() {
instance = this;
@@ -95,8 +95,6 @@ public class Application implements IApplication {
return IApplication.EXIT_OK;
}
try {
- setupBackgroundJobs();
-
int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART) {
return IApplication.EXIT_RESTART;
@@ -108,24 +106,6 @@ public class Application implements IApplication {
}
}
- private void setupBackgroundJobs() {
- // 1 minute delay for first run
- final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
- final long JOB_INTERVAL = preferenceStore.getLong(PreferenceConstants.P_DATA_SYNC_INTERVAL) * 1000;
-
- syncJob = new DataSyncJob("Syncing cluster data in background");
- syncJob.setPriority(Job.DECORATE);
- syncJob.schedule(JOB_INTERVAL);
- syncJob.addJobChangeListener(new JobChangeAdapter() {
- @Override
- public void done(IJobChangeEvent event) {
- super.done(event);
- // job done. schedule again after the pre-defined interval
- syncJob.schedule(JOB_INTERVAL);
- }
- });
- }
-
private void setSystemProperties() {
// TODO: Trying this to avoid the webstart authentication dialog
// to be tested, and removed if this doesn't work.
@@ -144,7 +124,6 @@ public class Application implements IApplication {
final Display display = workbench.getDisplay();
display.syncExec(new Runnable() {
public void run() {
- syncJob.cancel();
if (!display.isDisposed())
workbench.close();
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java
index 07e20466..73a10b01 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java
@@ -18,16 +18,25 @@
*******************************************************************************/
package com.gluster.storage.management.gui;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.application.IWorkbenchConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+import com.gluster.storage.management.gui.jobs.DataSyncJob;
+import com.gluster.storage.management.gui.preferences.PreferenceConstants;
+
/**
* This workbench advisor creates the window advisor, and specifies
* the perspective id for the initial window.
*/
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
+ private Job syncJob;
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
return new ApplicationWorkbenchWindowAdvisor(configurer);
@@ -42,4 +51,27 @@ public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
super.initialize(configurer);
configurer.setSaveAndRestore(false); // we don't need save/restore as of now
}
+
+ @Override
+ public void postStartup() {
+ super.postStartup();
+ setupBackgroundJobs();
+ }
+
+ private void setupBackgroundJobs() {
+ final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
+ final long JOB_INTERVAL = preferenceStore.getLong(PreferenceConstants.P_DATA_SYNC_INTERVAL) * 1000;
+
+ syncJob = new DataSyncJob("Cluster Data Sync");
+ syncJob.schedule(JOB_INTERVAL);
+ syncJob.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ super.done(event);
+
+ // job done. schedule again after the pre-defined interval
+ syncJob.schedule(JOB_INTERVAL);
+ }
+ });
+ }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
index 6498d902..0f8121e6 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
@@ -18,14 +18,18 @@
*******************************************************************************/
package com.gluster.storage.management.gui.actions;
+import org.apache.log4j.Logger;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.UIPlugin;
import com.gluster.storage.management.core.model.Entity;
@@ -38,20 +42,40 @@ import com.gluster.storage.management.core.model.Entity;
@SuppressWarnings("restriction")
public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDelegate {
protected IWorkbenchWindow window;
+ protected Logger logger = Logger.getLogger(this.getClass());
// the latest selected entity
protected Entity selectedEntity;
@Override
public void run(final IAction action) {
- // Real action code must be executed using Display#asyncExec. Otherwise the system can hang when opening new
- // dialog boxes on linux platform
- Display.getDefault().asyncExec(new Runnable() {
- @Override
- public void run() {
- performAction(action);
- }
- });
+ // Real action code must be executed using Display#asyncExec.
+ // Otherwise the system can hang when opening new dialog boxes on linux platform
+ try {
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ monitor.beginTask(action.getDescription(), 1);
+ performAction(action);
+ monitor.worked(1);
+ monitor.done();
+ }
+ });
+ }
+ });
+ } catch (final Exception e) {
+ final String actionDesc = action.getDescription();
+ logger.error("Exception while running action [" + actionDesc + "]", e);
+
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ showErrorDialog(actionDesc, e.getMessage());
+ }
+ });
+ }
}
abstract protected void performAction(final IAction action);
@@ -100,7 +124,7 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe
MessageDialog.openError(getShell(), title, message);
}
- protected synchronized boolean showConfirmDialog(final String title, final String message) {
+ protected boolean showConfirmDialog(final String title, final String message) {
return MessageDialog.openQuestion(getShell(), title, message);
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java
index fe358caa..6bcbc066 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java
@@ -20,20 +20,17 @@ package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
-import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.gui.jobs.DataSyncJob;
/**
*
*/
public class RefreshDataAction extends AbstractActionDelegate {
-
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
@Override
public void dispose() {
- // TODO Auto-generated method stub
-
}
/* (non-Javadoc)
@@ -41,6 +38,6 @@ public class RefreshDataAction extends AbstractActionDelegate {
*/
@Override
protected void performAction(IAction action) {
- GlusterDataModelManager.getInstance().refreshModel();
+ new DataSyncJob("Cluster Data Sync").schedule();
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java
index f6fd1ba4..aff62a92 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java
@@ -18,6 +18,7 @@
*******************************************************************************/
package com.gluster.storage.management.gui.jobs;
+import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
@@ -25,31 +26,43 @@ import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
-import com.gluster.storage.management.gui.utils.GUIHelper;
+import com.gluster.storage.management.core.model.GlusterDataModel;
/**
*
*/
public class DataSyncJob extends Job {
+ private static final Logger logger = Logger.getLogger(DataSyncJob.class);
+
public DataSyncJob(String name) {
- super(name);
+ super(name);
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
- protected IStatus run(IProgressMonitor monitor) {
+ protected IStatus run(final IProgressMonitor monitor) {
+ final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
+
+ // fetch the latest model
+ final GlusterDataModel model = modelManager.fetchModel(monitor);
+ if(model == null) {
+ return Status.CANCEL_STATUS;
+ }
+
+ monitor.beginTask("Notify views", 1);
Display.getDefault().asyncExec(new Runnable() {
-
@Override
public void run() {
- GUIHelper.getInstance().setStatusMessage("Data sync in progress...");
- GlusterDataModelManager.getInstance().refreshModel();
- GUIHelper.getInstance().setStatusMessage(null);
+ modelManager.updateModel(model);
}
});
-
+ monitor.worked(1);
+ monitor.done();
+
return Status.OK_STATUS;
}
-}
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java
index f9526ef9..30072b97 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java
@@ -92,8 +92,6 @@ public class GlusterServerSummaryView extends ViewPart {
}
private void updateServerDetails() {
- // TODO Auto-generated method stub
-
}
@Override
@@ -108,7 +106,7 @@ public class GlusterServerSummaryView extends ViewPart {
createServerSummarySection(server, toolkit, form);
if (server.getStatus() == SERVER_STATUS.ONLINE) {
- Composite section = createNetworkInterfacesSection(server, toolkit, form);
+ createNetworkInterfacesSection(server, toolkit, form);
}
parent.layout(); // IMP: lays out the form properly
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java
index 8acb4a75..f684a0f7 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java
@@ -50,6 +50,7 @@ public class NavigationView extends ViewPart implements ISelectionListener {
private GlusterToolbarManager toolbarManager;
private Entity entity;
private GlusterViewsManager viewsManager;
+ private DefaultClusterListener clusterListener;
@Override
public void createPartControl(Composite parent) {
@@ -80,8 +81,7 @@ public class NavigationView extends ViewPart implements ISelectionListener {
// register as selection provider so that other views can listen to any selection events on the tree
getSite().setSelectionProvider(treeViewer);
- // Refresh the navigation tree whenever there is a change to the data model
- GlusterDataModelManager.getInstance().addClusterListener(new DefaultClusterListener() {
+ clusterListener = new DefaultClusterListener() {
public void modelChanged() {
treeViewer.refresh();
}
@@ -89,9 +89,22 @@ public class NavigationView extends ViewPart implements ISelectionListener {
@Override
public void volumeChanged(Volume volume, Event event) {
super.volumeChanged(volume, event);
- selectEntity(volume); // this makes sure that the toolbar buttons get updated according to new status
+ if (volume == entity) {
+ // this makes sure that the toolbar buttons get updated according to new status
+ selectEntity(volume);
+ }
}
- });
+
+ public void volumeDeleted(Volume volume) {
+ super.volumeDeleted(volume);
+ if(volume == entity) {
+ // volume deleted was deleted. selected the root element in the tree.
+ treeViewer.setSelection(new StructuredSelection(GlusterDataModelManager.getInstance().getModel()
+ .getCluster()));
+ }
+ };
+ };
+ GlusterDataModelManager.getInstance().addClusterListener(clusterListener);
}
private void setupContextMenu() {
@@ -129,4 +142,10 @@ public class NavigationView extends ViewPart implements ISelectionListener {
}
}
}
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ GlusterDataModelManager.getInstance().removeClusterListener(clusterListener);
+ }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java
index e0df170b..d3eb7f6c 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java
@@ -93,11 +93,6 @@ public class VolumeSummaryView extends ViewPart {
GlusterDataModelManager.getInstance().addClusterListener(volumeChangedListener);
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.part.WorkbenchPart#dispose()
- */
@Override
public void dispose() {
super.dispose();
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java
index 5aaf7094..1e2c888d 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java
@@ -64,6 +64,7 @@ public abstract class AbstractTableViewerPage<T> extends Composite implements IS
protected IWorkbenchSite site;
private Hyperlink linkAll, linkNone;
+ private ClusterListener clusterListener;
public AbstractTableViewerPage(IWorkbenchSite site, final Composite parent, int style, boolean useChechboxes, boolean multiSelection, Object model) {
super(parent, style);
@@ -139,19 +140,19 @@ public abstract class AbstractTableViewerPage<T> extends Composite implements IS
}
});
- final ClusterListener clusterListener = createClusterListener();
+ clusterListener = createClusterListener();
+ GlusterDataModelManager.getInstance().addClusterListener(clusterListener);
- final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
- modelManager.addClusterListener(clusterListener);
-
addDisposeListener(new DisposeListener() {
+
+ @Override
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
- modelManager.removeClusterListener(clusterListener);
+ GlusterDataModelManager.getInstance().removeClusterListener(clusterListener);
}
});
}
-
+
protected abstract ClusterListener createClusterListener();
protected abstract String[] getColumnNames();
protected abstract void setColumnProperties(Table table);
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java
index 9805daec..c9e63889 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java
@@ -18,6 +18,7 @@
*******************************************************************************/
package com.gluster.storage.management.gui.views.pages;
+import java.util.Collection;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
@@ -54,13 +55,26 @@ public class BricksPage extends AbstractTableViewerPage<Brick> {
@Override
protected ClusterListener createClusterListener() {
return new DefaultClusterListener() {
+ @SuppressWarnings("unchecked")
@Override
public void volumeChanged(Volume volume, Event event) {
- if (event.getEventType() == EVENT_TYPE.BRICKS_ADDED || event.getEventType() == EVENT_TYPE.BRICKS_REMOVED) {
- tableViewer.refresh();
+ switch (event.getEventType()) {
+ case BRICKS_ADDED:
+ tableViewer.add(((Collection<Brick>) event.getEventData()).toArray());
parent.update();
+ break;
+
+ case BRICKS_REMOVED:
+ tableViewer.remove(((Collection<Brick>) event.getEventData()).toArray());
+ parent.update();
+ break;
+
+ case BRICKS_CHANGED:
+ tableViewer.update(((Collection<Brick>) event.getEventData()).toArray(), null);
+ parent.update();
+ default:
+ break;
}
-
}
};
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/GlusterServersPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/GlusterServersPage.java
index be4df7ad..8dc58ff1 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/GlusterServersPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/GlusterServersPage.java
@@ -59,17 +59,20 @@ public class GlusterServersPage extends AbstractTableViewerPage<GlusterServer> {
@Override
public void serverAdded(GlusterServer server) {
- tableViewer.refresh();
+ tableViewer.add(server);
+ parent.update();
}
@Override
public void serverRemoved(GlusterServer server) {
- tableViewer.refresh();
+ tableViewer.remove(server);
+ parent.update();
}
@Override
public void serverChanged(GlusterServer server, Event event) {
tableViewer.update(server, null);
+ parent.update();
}
};
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
index f285dd9f..5c659268 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
@@ -33,6 +33,7 @@ import org.eclipse.ui.IWorkbenchSite;
import com.gluster.storage.management.core.model.ClusterListener;
import com.gluster.storage.management.core.model.DefaultClusterListener;
import com.gluster.storage.management.core.model.EntityGroup;
+import com.gluster.storage.management.core.model.Event;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.gui.EntityGroupContentProvider;
import com.gluster.storage.management.gui.ServerTableLabelProvider;
@@ -46,14 +47,6 @@ public class ServersPage extends AbstractTableViewerPage<Server> {
private static final String[] SERVER_TABLE_COLUMN_NAMES = new String[] { "Name", "IP Address(es)", "Number of Disks", "Total Disk Space (GB)" };
- // public enum SERVER_DISK_TABLE_COLUMN_INDICES {
- // NAME, NUM_OF_CPUS, CPU_USAGE, TOTAL_MEMORY, MEMORY_IN_USE, TOTAL_DISK_SPACE, DISK_SPACE_IN_USE
- // };
- //
- // private static final String[] SERVER_TABLE_COLUMN_NAMES = new String[] { "Name",
- // "Number\nof CPUs", "CPU\nUsage (%)", "Total\nMemory (GB)", "Memory\nIn Use (GB)",
- // "Total Disk\n Space (GB)", "Disk Space\nin Use (GB)"};
-
public ServersPage(final Composite parent, IWorkbenchSite site, EntityGroup<Server> serversGroup) {
super(site, parent, SWT.NONE, true, true, serversGroup);
this.servers = serversGroup.getEntities();
@@ -64,16 +57,19 @@ public class ServersPage extends AbstractTableViewerPage<Server> {
return new DefaultClusterListener() {
@Override
public void discoveredServerRemoved(Server server) {
- refreshViewer();
+ tableViewer.remove(server);
+ parent.update();
}
@Override
public void discoveredServerAdded(Server server) {
- refreshViewer();
+ tableViewer.add(server);
+ parent.update();
}
- private void refreshViewer() {
- tableViewer.refresh();
+ @Override
+ public void discoveredServerChanged(Server server, Event event) {
+ tableViewer.update(server, null);
parent.update();
}
};
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java
index 8fbeb891..106984da 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java
@@ -67,40 +67,26 @@ public class TasksPage extends AbstractTableViewerPage<TaskInfo> {
return new DefaultClusterListener() {
@Override
public void taskAdded(TaskInfo taskInfo) {
- refreshViewer();
+ tableViewer.add(taskInfo);
+ parent.update();
}
@Override
public void taskRemoved(TaskInfo taskInfo) {
- refreshViewer();
+ tableViewer.remove(taskInfo);
+ parent.update();
// hide the task related actionset as no task is selected
// site.getPage().hideActionSet(IActionConstants.ACTION_SET_TASK);
- tableViewer.setSelection(new StructuredSelection(taskInfo));
}
@Override
public void taskUpdated(TaskInfo taskInfo) {
- refreshViewer();
+ tableViewer.update(taskInfo, null);
+ parent.update();
// fire selection event so that toolbar gets updated
// (the action class listens to selection and enables/disables automatically)
tableViewer.setSelection(new StructuredSelection(taskInfo));
}
-
- private void refreshViewer() {
- tableViewer.refresh();
- parent.update();
- }
-
- @Override
- public void volumeChanged(Volume volume, Event event) {
- super.volumeChanged(volume, event);
- if (event.getEventType() == EVENT_TYPE.BRICK_REPLACED) {
- if (!tableViewer.getControl().isDisposed()) {
- tableViewer.refresh();
- }
- }
- }
-
};
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java
index ff94d7e0..34829fef 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java
@@ -117,21 +117,8 @@ public class VolumeOptionsPage extends Composite {
private Button createAddButton() {
return toolkit.createButton(this, "&Add", SWT.FLAT);
}
-
+
private void registerListeners(final Composite parent) {
- addDisposeListener(new DisposeListener() {
- public void widgetDisposed(DisposeEvent e) {
- if (!(addTopButton.isEnabled() || addBottomButton.isEnabled())) {
- // user has selected key, but not added value. Since this is not a valid entry,
- // remove the last option (without value) from the volume
- volume.getOptions().remove(keyEditingSupport.getEntryBeingAdded().getKey());
- }
-
- GlusterDataModelManager.getInstance().removeClusterListener(clusterListener);
- toolkit.dispose();
- }
- });
-
/**
* Ideally not required. However the table viewer is not getting laid out properly on performing
* "maximize + restore" So this is a hack to make sure that the table is laid out again on re-size of the window
@@ -144,31 +131,20 @@ public class VolumeOptionsPage extends Composite {
}
});
- parent.addDisposeListener(new DisposeListener() {
-
- @Override
- public void widgetDisposed(DisposeEvent e) {
- if (!(addTopButton.isEnabled() || addBottomButton.isEnabled())) {
- // user has selected key, but not added value. Since this is not a valid entry,
- // remove the last option (without value) from the volume
- VolumeOption entryBeingAdded = keyEditingSupport.getEntryBeingAdded();
- volume.getOptions().remove(entryBeingAdded.getKey());
- }
- }
- });
-
clusterListener = new DefaultClusterListener() {
@Override
public void volumeChanged(Volume volume, Event event) {
super.volumeChanged(volume, event);
- if (event.getEventType() == EVENT_TYPE.VOLUME_OPTIONS_RESET) {
+
+ switch (event.getEventType()) {
+ case VOLUME_OPTIONS_RESET:
if (!tableViewer.getControl().isDisposed()) {
tableViewer.refresh();
setAddButtonsEnabled(true);
}
- }
+ break;
- if (event.getEventType() == EVENT_TYPE.VOLUME_OPTION_SET) {
+ case VOLUME_OPTION_SET:
String key = (String)event.getEventData();
if (isNewOption(volume, key)) {
// option has been set successfully by the user. re-enable the add button and search filter
@@ -188,6 +164,16 @@ public class VolumeOptionsPage extends Composite {
// existing volume option value changed. update that element.
tableViewer.update(volume.getOptions().get(key), null);
}
+ break;
+ case VOLUME_CHANGED:
+ tableViewer.refresh();
+ if(volume.getOptions().size() == defaultVolumeOptions.size()) {
+ setAddButtonsEnabled(false);
+ } else {
+ setAddButtonsEnabled(true);
+ }
+ default:
+ break;
}
}
@@ -247,6 +233,22 @@ public class VolumeOptionsPage extends Composite {
});
GlusterDataModelManager.getInstance().addClusterListener(clusterListener);
+
+ addDisposeListener(new DisposeListener() {
+
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ toolkit.dispose();
+
+ if (!(addTopButton.isEnabled() || addBottomButton.isEnabled())) {
+ // user has selected key, but not added value. Since this is not a valid entry,
+ // remove the last option (without value) from the volume
+ volume.getOptions().remove(keyEditingSupport.getEntryBeingAdded().getKey());
+ }
+
+ GlusterDataModelManager.getInstance().removeClusterListener(clusterListener);
+ }
+ });
}
private void setupPageLayout() {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java
index 33eb6da7..f1e3a2ef 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumesPage.java
@@ -33,6 +33,7 @@ import org.eclipse.ui.IWorkbenchSite;
import com.gluster.storage.management.core.model.ClusterListener;
import com.gluster.storage.management.core.model.DefaultClusterListener;
import com.gluster.storage.management.core.model.EntityGroup;
+import com.gluster.storage.management.core.model.Event;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.gui.EntityGroupContentProvider;
import com.gluster.storage.management.gui.VolumeTableLabelProvider;
@@ -75,8 +76,25 @@ public class VolumesPage extends AbstractTableViewerPage<Volume> {
@Override
protected ClusterListener createClusterListener() {
- // TODO: Override methods to handle volume related events
- return new DefaultClusterListener();
+ return new DefaultClusterListener() {
+ @Override
+ public void volumeCreated(Volume volume) {
+ tableViewer.add(volume);
+ parent.update();
+ }
+
+ @Override
+ public void volumeDeleted(Volume volume) {
+ tableViewer.remove(volume);
+ parent.update();
+ }
+
+ @Override
+ public void volumeChanged(Volume volume, Event event) {
+ tableViewer.update(volume, null);
+ parent.update();
+ }
+ };
}
/**
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterExceptionMapper.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterExceptionMapper.java
new file mode 100644
index 00000000..99089eb7
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterExceptionMapper.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.server.resources.v1_0;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+
+@Provider
+public class GlusterExceptionMapper implements ExceptionMapper<GlusterRuntimeException> {
+
+ /* (non-Javadoc)
+ * @see javax.ws.rs.ext.ExceptionMapper#toResponse(java.lang.Throwable)
+ */
+ @Override
+ public Response toResponse(GlusterRuntimeException exception) {
+ return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception.getMessage())
+ .type(MediaType.TEXT_PLAIN).build();
+ }
+}