summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-07-09 21:42:26 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-07-09 21:42:26 +0530
commit7227b580b23d83b133cdce7becf344ef2c4361cc (patch)
treedf6f09447a854a9d5f15c45a346c75834c6b0e36 /src
parentc787d8d0a5defd2f24dd64dac256ce514481bd58 (diff)
Task#111 - Auto-refresh of data in views
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java43
-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.java2
-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.java13
-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.java21
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java40
11 files changed, 127 insertions, 96 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..8a684c57 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);
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..b9d57de7 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
@@ -100,7 +100,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..14f999e7 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();
}
@@ -91,7 +91,8 @@ public class NavigationView extends ViewPart implements ISelectionListener {
super.volumeChanged(volume, event);
selectEntity(volume); // this makes sure that the toolbar buttons get updated according to new status
}
- });
+ };
+ GlusterDataModelManager.getInstance().addClusterListener(clusterListener);
}
private void setupContextMenu() {
@@ -129,4 +130,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..e8db61dc 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,17 +140,15 @@ public abstract class AbstractTableViewerPage<T> extends Composite implements IS
}
});
- final ClusterListener clusterListener = createClusterListener();
-
- final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
- modelManager.addClusterListener(clusterListener);
-
- addDisposeListener(new DisposeListener() {
- public void widgetDisposed(DisposeEvent e) {
- toolkit.dispose();
- modelManager.removeClusterListener(clusterListener);
- }
- });
+ clusterListener = createClusterListener();
+ GlusterDataModelManager.getInstance().addClusterListener(clusterListener);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ toolkit.dispose();
+ GlusterDataModelManager.getInstance().removeClusterListener(clusterListener);
}
protected abstract ClusterListener createClusterListener();
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..2d1e7e98 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,22 @@ public class VolumeOptionsPage extends Composite {
private Button createAddButton() {
return toolkit.createButton(this, "&Add", SWT.FLAT);
}
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ 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());
+ }
- 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();
- }
- });
+ GlusterDataModelManager.getInstance().removeClusterListener(clusterListener);
+ }
+ private void registerListeners(final Composite parent) {
/**
* 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,19 +145,6 @@ 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) {