diff options
| author | Tim <timothyasir@gluster.com> | 2011-07-11 14:39:13 +0530 |
|---|---|---|
| committer | Tim <timothyasir@gluster.com> | 2011-07-11 14:39:13 +0530 |
| commit | 3e10145c363971d75181348886672fffa62ef3c9 (patch) | |
| tree | 337a19be25611a0af48d7b65db95fef41541f6b7 /src | |
| parent | 6be4e159af3a14a80250626ac405076e458b921f (diff) | |
| parent | efe32527e41e28b30b0393f9963daad608ec5c2c (diff) | |
Merge remote branch 'upstream/master'
Diffstat (limited to 'src')
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(); + } +} |
