From 4e4accb98eff487ba1f6781cac39611e7161cb65 Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Wed, 10 Sep 2014 16:34:48 +0000 Subject: [PATCH] Updated Background Monitor git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-monitor-widget@99734 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 1 + .../monitorwidget/client/MonitorUpdater.java | 8 + .../client/MonitorWidgetEntry.java | 140 ++++-- .../background/MonitorBackgroundDialog.java | 76 ++-- .../MonitorBackgroundInfoDialog.java | 79 ++++ .../MonitorBackgroundInfoPanel.java | 399 ++++++++++++++++++ .../background/MonitorBackgroundPanel.java | 259 ++++++------ .../client/details/tree/MonitorFolderDto.java | 21 +- .../tree/MonitorTreeDataGenerator.java | 27 +- .../td/monitorwidget/MonitorWidgetTD.gwt.xml | 4 +- 10 files changed, 808 insertions(+), 206 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoPanel.java diff --git a/pom.xml b/pom.xml index 88f8115..f90cd6c 100644 --- a/pom.xml +++ b/pom.xml @@ -289,4 +289,5 @@ + war diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorUpdater.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorUpdater.java index aed1fc9..c9a0fba 100644 --- a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorUpdater.java +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorUpdater.java @@ -53,11 +53,19 @@ public class MonitorUpdater extends Timer implements MonitorDialogEventUIListene + result); if(result.isInBackground()){ + Log.debug("Operation is in background"); cancel(); fireMonitorPutInBackground(); return; } + if(result.isAbort()){ + Log.debug("Operation is aborted"); + cancel(); + fireMonitorAborted(); + + } + switch (result.getTask().getState()) { case INITIALIZING: Log.info("Initializing..."); diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorWidgetEntry.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorWidgetEntry.java index 1b647ac..ef9bf7a 100644 --- a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorWidgetEntry.java +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/MonitorWidgetEntry.java @@ -10,6 +10,8 @@ import org.gcube.portlets.user.td.gwtservice.shared.task.State; import org.gcube.portlets.user.td.gwtservice.shared.task.TaskS; import org.gcube.portlets.user.td.gwtservice.shared.task.ValidationsJobS; import org.gcube.portlets.user.td.gwtservice.shared.task.WorkerState; +import org.gcube.portlets.user.td.monitorwidget.client.background.MonitorBackgroundDialog; +import org.gcube.portlets.user.td.monitorwidget.client.background.MonitorBackgroundInfoDialog; import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.EntryPoint; @@ -26,37 +28,95 @@ import com.google.web.bindery.event.shared.SimpleEventBus; public class MonitorWidgetEntry implements EntryPoint { private MonitorDialog monitorWidget; + private MonitorBackgroundDialog monitorBackgroundWidget; + private MonitorBackgroundInfoDialog monitorBackgroundInfoWidget; + private SimpleEventBus eventBus; + protected enum TestShow { + MONITORWIDGET, MONITORBACKGROUNDWIDGET, MONITORBACKGROUNDINFOWIDGET + }; public void onModuleLoad() { - Log.debug("Test MonitorWidget"); - SimpleEventBus eventBus = new SimpleEventBus(); - monitorWidget = new MonitorDialog("1", eventBus); - monitorWidget.show(); - - Timer elapsedTimer = new Timer () { - public void run() { - showElapsed(); - } - }; - - Log.debug("Start Time:"+System.currentTimeMillis()); + TestShow testShow = TestShow.MONITORBACKGROUNDWIDGET; + Timer elapsedTimer; - // Schedule the timer for every 1/2 second (500 milliseconds) - elapsedTimer.scheduleRepeating(3000); + switch (testShow) { + case MONITORWIDGET: + Log.debug("Test MonitorWidget"); + eventBus = new SimpleEventBus(); + monitorWidget = new MonitorDialog("1", eventBus); + monitorWidget.show(); + elapsedTimer = new Timer() { + public void run() { + showElapsed(); + } + }; + + Log.debug("Start Time:" + System.currentTimeMillis()); + + // Schedule the timer for every 1/2 second (500 milliseconds) + elapsedTimer.scheduleRepeating(3000); + break; + case MONITORBACKGROUNDWIDGET: + Log.debug("Test MonitorBackgroundWidget"); + eventBus = new SimpleEventBus(); + monitorBackgroundWidget = new MonitorBackgroundDialog(eventBus); + monitorBackgroundWidget.show(); + + elapsedTimer = new Timer() { + public void run() { + showBackgroundElapsed(); + } + }; + + Log.debug("Start Time:" + System.currentTimeMillis()); + + // Schedule the timer for every 1/2 second (500 milliseconds) + elapsedTimer.scheduleRepeating(3000); + break; + case MONITORBACKGROUNDINFOWIDGET: + eventBus = new SimpleEventBus(); + showBackgroundInfoWidget(); + break; + + } } - - private void showElapsed(){ + + private void showElapsed() { OperationMonitor operationMonitor = new OperationMonitor("1", UIOperationsId.EditRow); - operationMonitor.setTask(createTaskForTest()); + operationMonitor.setTask(createTaskForTest("1")); monitorWidget.updateOperationMonitor(operationMonitor); } - - - private TaskS createTaskForTest() { - + + private void showBackgroundElapsed() { + ArrayList backgroundOperationMonitorList = new ArrayList(); + + for (int i = 0; i < 20; i++) { + + OperationMonitor operationMonitor = new OperationMonitor(String.valueOf(i), + UIOperationsId.EditRow); + operationMonitor.setTask(createTaskForTest(String.valueOf(i))); + + backgroundOperationMonitorList.add(operationMonitor); + } + + monitorBackgroundWidget + .updateBackgroundOperationMonitor(backgroundOperationMonitorList); + } + + private void showBackgroundInfoWidget() { + OperationMonitor operationMonitor = new OperationMonitor("1", + UIOperationsId.EditRow); + operationMonitor.setTask(createTaskForTest("1")); + monitorBackgroundInfoWidget = new MonitorBackgroundInfoDialog( + operationMonitor, eventBus); + monitorBackgroundInfoWidget.show(); + } + + private TaskS createTaskForTest(String taskId) { + ArrayList validationsJobs = new ArrayList(); ValidationsJobS validationJobS = new ValidationsJobS("1", WorkerState.IN_PROGRESS, genProgress(), "Row Validate", null, @@ -71,28 +131,42 @@ public class MonitorWidgetEntry implements EntryPoint { JobS job2 = new JobS("2", genProgress(), "Add Row Job for Human", "Add Row Job", WorkerState.IN_PROGRESS, null, validationsJobs); jobs.add(job2); - + JobS job3 = new JobS("3", genProgress(), "Delete Job for Human", - "Delete Row Job", WorkerState.IN_PROGRESS, null, validationsJobs); + "Delete Row Job", WorkerState.IN_PROGRESS, null, + validationsJobs); jobs.add(job3); - TaskS task = new TaskS("1", genProgress(), State.IN_PROGRESS, null, "default", - new Date(), null, jobs); + JobS job4 = new JobS("4", genProgress(), "Edit Row Job for Human", + "Edit Row Job", WorkerState.IN_PROGRESS, null, validationsJobs); + jobs.add(job4); + + JobS job5 = new JobS("5", genProgress(), "Add Row Job for Human", + "Add Row Job", WorkerState.IN_PROGRESS, null, validationsJobs); + jobs.add(job5); + + JobS job6 = new JobS("6", genProgress(), "Delete Job for Human", + "Delete Row Job", WorkerState.IN_PROGRESS, null, + validationsJobs); + jobs.add(job6); + + TaskS task = new TaskS(taskId, genProgress(), State.IN_PROGRESS, null, + "default", new Date(), null, jobs); return task; } - - private float genProgress(){ + + private float genProgress() { float fperc; - int perc=Random.nextInt(100); - if(perc==0){ - fperc=0f; + int perc = Random.nextInt(100); + if (perc == 0) { + fperc = 0f; } else { - fperc= new Float(perc)/100; + fperc = new Float(perc) / 100; } - Log.debug("ProgressSet: "+fperc); + // Log.debug("ProgressSet: " + fperc); return fperc; } - + } diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundDialog.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundDialog.java index 01ec5ea..8ed7432 100644 --- a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundDialog.java +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundDialog.java @@ -1,7 +1,14 @@ package org.gcube.portlets.user.td.monitorwidget.client.background; +import java.util.ArrayList; + +import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitor; + +import com.allen_sauer.gwt.log.client.Log; import com.google.web.bindery.event.shared.EventBus; import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; /** * Background Operations Monitor @@ -11,23 +18,22 @@ import com.sencha.gxt.widget.core.client.Window; * */ public class MonitorBackgroundDialog extends Window { - - private static final String WIDTH = "400px"; - private static final String HEIGHT = "520px"; - + + protected static final String WIDTH = "400px"; + protected static final String HEIGHT = "520px"; + protected EventBus eventBus; protected MonitorBackgroundPanel monitorBackgroundPanel; - + public MonitorBackgroundDialog(EventBus eventBus) { + super(); + Log.debug("MonitorBackgroundDialog"); this.eventBus = eventBus; - initWindow(); create(); - - } - - protected void initWindow(){ + + protected void initWindow() { setWidth(WIDTH); setHeight(HEIGHT); setBodyBorder(false); @@ -36,42 +42,38 @@ public class MonitorBackgroundDialog extends Window { setClosable(true); setHeadingText("Background Operations Monitor"); } - - protected void create(){ - monitorBackgroundPanel = new MonitorBackgroundPanel(eventBus); + + protected void create() { + monitorBackgroundPanel = new MonitorBackgroundPanel(this, eventBus); add(monitorBackgroundPanel); - show(); } - + /** * {@inheritDoc} */ @Override protected void initTools() { - /*if (backgroundBtnEnabled) { - backgroundBtn = new ToolButton(ToolButton.CLOSE); - backgroundBtn.setToolTip("Put in the background"); - backgroundBtn.addSelectHandler(new SelectHandler() { - - @Override - public void onSelect(SelectEvent event) { - hide(); - } - }); - - header.addTool(backgroundBtn); - }*/ - - super.initTools(); - - closeBtn.setVisible(false); /* + * if (backgroundBtnEnabled) { backgroundBtn = new + * ToolButton(ToolButton.CLOSE); + * backgroundBtn.setToolTip("Put in the background"); + * backgroundBtn.addSelectHandler(new SelectHandler() { + * + * @Override public void onSelect(SelectEvent event) { hide(); } }); + * + * header.addTool(backgroundBtn); } + */ + + super.initTools(); + + closeBtn.setVisible(true); + closeBtn.addSelectHandler(new SelectHandler() { public void onSelect(SelectEvent event) { close(); } - });*/ + }); } @@ -79,6 +81,12 @@ public class MonitorBackgroundDialog extends Window { hide(); } - + public void updateBackgroundOperationMonitor(ArrayList operationMonitorList) { + if (monitorBackgroundPanel != null) { + monitorBackgroundPanel.operationMonitorListUpdated(operationMonitorList); + } + forceLayout(); + } + } diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoDialog.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoDialog.java new file mode 100644 index 0000000..962e38e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoDialog.java @@ -0,0 +1,79 @@ +package org.gcube.portlets.user.td.monitorwidget.client.background; + + +import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitor; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + +/** + * Background Operations Monitor + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class MonitorBackgroundInfoDialog extends Window { + + private static final String WIDTH = "640px"; + private static final String HEIGHT = "378px"; + + protected EventBus eventBus; + protected MonitorBackgroundInfoPanel monitorBackgroundInfoPanel; + protected OperationMonitor operationMonitor; + + public MonitorBackgroundInfoDialog(OperationMonitor operationMonitor, EventBus eventBus) { + super(); + Log.debug("MonitorBackgroundInfoDialog"); + this.eventBus = eventBus; + this.operationMonitor =operationMonitor; + initWindow(); + create(); + } + + protected void initWindow() { + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(false); + setModal(false); + setClosable(true); + setHeadingText("Info Operation"); + } + + protected void create() { + monitorBackgroundInfoPanel = new MonitorBackgroundInfoPanel(this, operationMonitor,eventBus); + add(monitorBackgroundInfoPanel); + + } + + /** + * {@inheritDoc} + */ + @Override + protected void initTools() { + + super.initTools(); + + closeBtn.setVisible(true); + + closeBtn.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + close(); + } + }); + + } + + protected void close() { + hide(); + + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoPanel.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoPanel.java new file mode 100644 index 0000000..b50dc83 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundInfoPanel.java @@ -0,0 +1,399 @@ +package org.gcube.portlets.user.td.monitorwidget.client.background; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitor; +import org.gcube.portlets.user.td.gwtservice.shared.task.ValidationsTasksMetadata; +import org.gcube.portlets.user.td.gwtservice.shared.task.WorkerState; +import org.gcube.portlets.user.td.gwtservice.shared.task.WorkerStateParser; +import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorBaseDto; +import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorFolderDto; +import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorTreeDataGenerator; +import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorValidationJobSDto; +import org.gcube.portlets.user.td.monitorwidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.core.client.ToStringValueProvider; +import com.sencha.gxt.core.client.ValueProvider; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.IconProvider; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.TreeStore; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.CollapseItemEvent; +import com.sencha.gxt.widget.core.client.event.CollapseItemEvent.CollapseItemHandler; +import com.sencha.gxt.widget.core.client.event.ExpandItemEvent; +import com.sencha.gxt.widget.core.client.event.ExpandItemEvent.ExpandItemHandler; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; +import com.sencha.gxt.widget.core.client.treegrid.TreeGrid; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class MonitorBackgroundInfoPanel extends FramedPanel { + protected static final String WIDTH = "618px"; + protected static final String HEIGHT = "370px"; + protected static final String HEIGHTGRID ="300px"; + + protected static final int CC1WIDTH = 168; + protected static final int CC2WIDTH = 100; + protected static final int CC3WIDTH = 140; + protected static final int CC4WIDTH = 100; + + protected MonitorBackgroundInfoDialog parent; + protected MonitorBackgroundInfoPanel thisPanel; + + + + protected TRId trId; + protected VerticalLayoutContainer con; + protected ValidationsTasksMetadata validationsTasksMetadata; + + protected MonitorTreeDataGenerator gen; + protected TreeStore store; + protected TreeGrid tree; + protected OperationMonitor operationMonitor; + + protected EventBus eventBus; + protected MonitorBackgroundUpdater monitorBackgroundUpdater; + + class KeyProvider implements ModelKeyProvider { + @Override + public String getKey(MonitorBaseDto item) { + return (item instanceof MonitorFolderDto ? "f-" : "v-") + + item.getId(); + } + } + + + public MonitorBackgroundInfoPanel(MonitorBackgroundInfoDialog parent, + OperationMonitor operationMonitor, EventBus eventBus) { + super(); + this.parent = parent; + this.operationMonitor=operationMonitor; + this.eventBus = eventBus; + forceLayoutOnResize = true; + init(); + create(); + } + + protected void init() { + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + setResize(true); + + } + + protected void create() { + con = new VerticalLayoutContainer(); + // con.setScrollMode(ScrollMode.AUTO); + + store = new TreeStore(new KeyProvider()); + + addChildrensToStore(); + + + ColumnConfig cc1 = new ColumnConfig( + new ToStringValueProvider("task"), CC1WIDTH, + "Task"); + cc1.setHeader("Task"); + cc1.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + sb.appendHtmlConstant("" + value + + ""); + + } + }); + + ColumnConfig cc2 = new ColumnConfig( + new ValueProvider() { + + @Override + public String getValue(MonitorBaseDto object) { + String state = null; + if (object instanceof MonitorValidationJobSDto) { + state = ((MonitorValidationJobSDto) object) + .getWorkerState().toString(); + + } + if (object instanceof MonitorFolderDto) { + state = ((MonitorFolderDto) object).getState(); + } + return state; + } + + @Override + public void setValue(MonitorBaseDto object, String value) { + if (object instanceof MonitorValidationJobSDto) { + WorkerState workerState = WorkerStateParser.parse(value); + ((MonitorValidationJobSDto) object) + .setWorkerState(workerState); + + } + if (object instanceof MonitorFolderDto) { + ((MonitorFolderDto) object).setState(value); + } + } + + @Override + public String getPath() { + return "status"; + } + }, CC2WIDTH, "Status"); + cc2.setHeader("Status"); + + ColumnConfig cc3 = new ColumnConfig( + new ValueProvider() { + + @Override + public String getValue(MonitorBaseDto object) { + String state = null; + if (object instanceof MonitorValidationJobSDto) { + state = ((MonitorValidationJobSDto) object).getHumanReadableStatus(); + } + if (object instanceof MonitorFolderDto) { + state = ((MonitorFolderDto) object) + .getHumanReadableStatus(); + } + return state; + } + + @Override + public void setValue(MonitorBaseDto object, String value) { + if (object instanceof MonitorValidationJobSDto) { + ((MonitorValidationJobSDto) object) + .setHumanReadableStatus(value); + + } + if (object instanceof MonitorFolderDto) { + ((MonitorFolderDto) object) + .setHumanReadableStatus(value); + } + } + + @Override + public String getPath() { + return "humanreadablestatus"; + } + }, CC3WIDTH, "Human Readble"); + cc3.setHeader("Human Readble"); + + ColumnConfig cc4 = new ColumnConfig( + new ValueProvider() { + + @Override + public Double getValue(MonitorBaseDto object) { + Double d = null; + if (object instanceof MonitorValidationJobSDto) { + Float f = ((MonitorValidationJobSDto) object).getProgress(); + d = new Double(f); + } + if (object instanceof MonitorFolderDto) { + Float f = ((MonitorFolderDto) object).getProgress(); + d = new Double(f); + } + + return d; + } + + @Override + public void setValue(MonitorBaseDto object, Double value) { + if (object instanceof MonitorValidationJobSDto) { + ((MonitorValidationJobSDto) object) + .setProgress(value.floatValue()); + } + if (object instanceof MonitorFolderDto) { + ((MonitorFolderDto) object).setProgress(value + .floatValue()); + } + } + + @Override + public String getPath() { + return "progress"; + } + }, CC4WIDTH, "Progress"); + cc4.setHeader("Progress"); + + ProgressBarCell progress = new ProgressBarCell() { + @Override + public boolean handlesSelection() { + return true; + } + }; + progress.setProgressText("{0}% Complete"); + progress.setWidth(110); + + cc4.setCell(progress); + + List> l = new ArrayList>(); + l.add(cc1); + l.add(cc2); + l.add(cc3); + l.add(cc4); + ColumnModel cm = new ColumnModel(l); + + tree = new TreeGrid(store, cm, cc1); + tree.getView().setAutoFill(true); + tree.setBorders(false); + tree.setLoadMask(true); + tree.setColumnResize(true); + tree.getView().setAutoExpandColumn(cc1); + tree.setHeight(HEIGHTGRID); + tree.setAutoExpand(true); + + IconProvider iconProvider = new IconProvider() { + + @Override + public ImageResource getIcon(MonitorBaseDto model) { + ImageResource img = null; + if (model instanceof MonitorFolderDto) { + String type = ((MonitorFolderDto) model).getType(); + if (type.compareTo("job") == 0) { + img = ResourceBundle.INSTANCE.cog(); + } else { + if (type.compareTo("task") == 0) { + img = ResourceBundle.INSTANCE.basket(); + } else { + + } + } + } else { + img = ResourceBundle.INSTANCE.tableValidation(); + } + return img; + } + }; + tree.setIconProvider(iconProvider); + + tree.addExpandHandler(new ExpandItemHandler() { + + @Override + public void onExpand(ExpandItemEvent event) { + forceLayout(); + + } + }); + + tree.addCollapseHandler(new CollapseItemHandler() { + + @Override + public void onCollapse(CollapseItemEvent event) { + forceLayout(); + + } + }); + + + ToolBar toolBar = new ToolBar(); + + TextButton btnExpandAll = new TextButton(); + btnExpandAll.setIcon(ResourceBundle.INSTANCE.magnifierZoomIn()); + btnExpandAll.setToolTip("Expand All"); + btnExpandAll.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + tree.expandAll(); + forceLayout(); + } + }); + toolBar.add(btnExpandAll); + + TextButton btnCollapseAll = new TextButton(); + btnCollapseAll.setIcon(ResourceBundle.INSTANCE.magnifierZoomOut()); + btnCollapseAll.setToolTip("Collapse All"); + btnCollapseAll.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + tree.collapseAll(); + forceLayout(); + } + }); + toolBar.add(btnCollapseAll); + + con.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + con.add(tree, new VerticalLayoutData(1, -1, new Margins(0))); + + add(con, new MarginData(0)); + + forceLayout(); + tree.expandAll(); + + } + + + + + + protected void close() { + if (parent != null) { + parent.close(); + } + + } + + + private void addChildrensToStore() { + gen = new MonitorTreeDataGenerator(); + try { + MonitorFolderDto root = gen.getRoot(operationMonitor); + Log.debug("root childrens " + root.getChildrens().size()); + for (MonitorBaseDto base : root.getChildrens()) { + Log.debug("Check children: " + base); + + store.add(base); + if (base instanceof MonitorFolderDto) { + processFolder((MonitorFolderDto) base); + } + + } + } catch (Throwable e) { + Log.error("Error adding childrens to store :" + + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void processFolder(MonitorFolderDto folder) { + for (MonitorBaseDto child : folder.getChildrens()) { + store.add(folder, child); + if (child instanceof MonitorFolderDto) { + processFolder((MonitorFolderDto) child); + } + + } + } + + + + + + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundPanel.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundPanel.java index 06b1bcc..9568589 100644 --- a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundPanel.java +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/background/MonitorBackgroundPanel.java @@ -3,6 +3,7 @@ package org.gcube.portlets.user.td.monitorwidget.client.background; import java.util.ArrayList; import java.util.List; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException; import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitor; import org.gcube.portlets.user.td.gwtservice.shared.task.ValidationsTasksMetadata; import org.gcube.portlets.user.td.gwtservice.shared.task.WorkerState; @@ -12,10 +13,16 @@ import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorFolde import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorTreeDataGenerator; import org.gcube.portlets.user.td.monitorwidget.client.details.tree.MonitorValidationJobSDto; import org.gcube.portlets.user.td.monitorwidget.client.resources.ResourceBundle; +import org.gcube.portlets.user.td.monitorwidget.client.utils.UtilsGXT3; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType; import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; +import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.Cell.Context; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; @@ -23,12 +30,12 @@ import com.google.web.bindery.event.shared.EventBus; import com.sencha.gxt.cell.core.client.ProgressBarCell; import com.sencha.gxt.core.client.ToStringValueProvider; import com.sencha.gxt.core.client.ValueProvider; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; import com.sencha.gxt.core.client.util.Margins; import com.sencha.gxt.data.shared.IconProvider; import com.sencha.gxt.data.shared.ModelKeyProvider; import com.sencha.gxt.data.shared.TreeStore; import com.sencha.gxt.widget.core.client.FramedPanel; -import com.sencha.gxt.widget.core.client.button.TextButton; import com.sencha.gxt.widget.core.client.container.MarginData; import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; @@ -36,13 +43,11 @@ import com.sencha.gxt.widget.core.client.event.CollapseItemEvent; import com.sencha.gxt.widget.core.client.event.CollapseItemEvent.CollapseItemHandler; import com.sencha.gxt.widget.core.client.event.ExpandItemEvent; import com.sencha.gxt.widget.core.client.event.ExpandItemEvent.ExpandItemHandler; -import com.sencha.gxt.widget.core.client.event.SelectEvent; -import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; import com.sencha.gxt.widget.core.client.grid.ColumnConfig; import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.menu.Item; import com.sencha.gxt.widget.core.client.menu.Menu; import com.sencha.gxt.widget.core.client.menu.MenuItem; -import com.sencha.gxt.widget.core.client.toolbar.ToolBar; import com.sencha.gxt.widget.core.client.treegrid.TreeGrid; /** @@ -51,22 +56,23 @@ import com.sencha.gxt.widget.core.client.treegrid.TreeGrid; * href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it * */ -public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackgroundUpdaterListener { - protected static final int STATUS_POLLING_DELAY = 2000; +public class MonitorBackgroundPanel extends FramedPanel implements + MonitorBackgroundUpdaterListener { + protected static final int STATUS_POLLING_DELAY = 4000; protected static final String WIDTH = "298px"; protected static final String HEIGHT = "520px"; - protected static final int CC1WIDTH = 168; - protected static final int CC2WIDTH = 100; - protected static final int CC3WIDTH = 140; - protected static final int CC4WIDTH = 100; - + protected static final int CC1WIDTH = 110; + protected static final int CC2WIDTH = 70; + protected static final int CC3WIDTH = 100; + protected MonitorBackgroundDialog parent; + protected ArrayList monitorBackgroundEventUIListeners = new ArrayList(); protected MonitorBackgroundPanel thisPanel; protected Menu contextMenu; - protected MenuItem resumeItem; - protected MenuItem resolveItem; + protected MenuItem infoItem; + protected MenuItem abortItem; protected TRId trId; protected VerticalLayoutContainer con; @@ -79,7 +85,7 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg protected EventBus eventBus; protected MonitorBackgroundUpdater monitorBackgroundUpdater; - + class KeyProvider implements ModelKeyProvider { @Override public String getKey(MonitorBaseDto item) { @@ -87,8 +93,7 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg + item.getId(); } } - - + public MonitorBackgroundPanel(EventBus eventBus) { super(); this.eventBus = eventBus; @@ -96,7 +101,17 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg init(); create(); } - + + public MonitorBackgroundPanel(MonitorBackgroundDialog parent, + EventBus eventBus) { + super(); + this.eventBus = eventBus; + this.parent = parent; + forceLayoutOnResize = true; + init(); + create(); + } + protected void init() { setWidth(WIDTH); setHeight(HEIGHT); @@ -105,17 +120,18 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg setResize(true); } - + protected void create() { con = new VerticalLayoutContainer(); - // con.setScrollMode(ScrollMode.AUTO); + con.setScrollMode(ScrollMode.AUTO); store = new TreeStore(new KeyProvider()); addChildrensToStore(); ColumnConfig cc1 = new ColumnConfig( - new ToStringValueProvider("task"), CC1WIDTH, "Task"); + new ToStringValueProvider("task"), CC1WIDTH, + "Task"); cc1.setHeader("Task"); cc1.setCell(new AbstractCell() { @@ -165,41 +181,7 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg }, CC2WIDTH, "Status"); cc2.setHeader("Status"); - ColumnConfig cc3 = new ColumnConfig( - new ValueProvider() { - - @Override - public String getValue(MonitorBaseDto object) { - String state = null; - if (object instanceof MonitorValidationJobSDto) { - state = ((MonitorValidationJobSDto) object).getHumanReadableStatus(); - } - if (object instanceof MonitorFolderDto) { - state = ((MonitorFolderDto) object).getHumanReadableStatus(); - } - return state; - } - - @Override - public void setValue(MonitorBaseDto object, String value) { - if (object instanceof MonitorValidationJobSDto) { - ((MonitorValidationJobSDto) object) - .setHumanReadableStatus(value); - - } - if (object instanceof MonitorFolderDto) { - ((MonitorFolderDto) object).setHumanReadableStatus(value); - } - } - - @Override - public String getPath() { - return "humanreadablestatus"; - } - }, CC3WIDTH, "Human Readble"); - cc3.setHeader("Human Readble"); - - ColumnConfig cc4 = new ColumnConfig( + ColumnConfig cc3 = new ColumnConfig( new ValueProvider() { @Override @@ -233,8 +215,8 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg public String getPath() { return "progress"; } - }, CC4WIDTH, "Progress"); - cc4.setHeader("Progress"); + }, CC3WIDTH, "Progress"); + cc3.setHeader("Progress"); ProgressBarCell progress = new ProgressBarCell() { @Override @@ -245,13 +227,12 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg progress.setProgressText("{0}% Complete"); progress.setWidth(110); - cc4.setCell(progress); + cc3.setCell(progress); List> l = new ArrayList>(); l.add(cc1); l.add(cc2); l.add(cc3); - l.add(cc4); ColumnModel cm = new ColumnModel(l); tree = new TreeGrid(store, cm, cc1); @@ -260,8 +241,8 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg tree.setLoadMask(true); tree.setColumnResize(true); tree.getView().setAutoExpandColumn(cc1); + tree.getElement().setAttribute("height", "auto"); - IconProvider iconProvider = new IconProvider() { @Override @@ -304,59 +285,27 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg } }); - // createContextMenu(); + createContextMenu(); - ToolBar toolBar = new ToolBar(); - - TextButton btnExpandAll = new TextButton(); - btnExpandAll.setIcon(ResourceBundle.INSTANCE.magnifierZoomIn()); - btnExpandAll.setToolTip("Expand All"); - btnExpandAll.addSelectHandler(new SelectHandler() { - - @Override - public void onSelect(SelectEvent event) { - tree.expandAll(); - forceLayout(); - } - }); - toolBar.add(btnExpandAll); - - TextButton btnCollapseAll = new TextButton(); - btnCollapseAll.setIcon(ResourceBundle.INSTANCE.magnifierZoomOut()); - btnCollapseAll.setToolTip("Collapse All"); - btnCollapseAll.addSelectHandler(new SelectHandler() { - - @Override - public void onSelect(SelectEvent event) { - tree.collapseAll(); - forceLayout(); - } - }); - toolBar.add(btnCollapseAll); - - con.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); con.add(tree, new VerticalLayoutData(1, -1, new Margins(0))); add(con, new MarginData(0)); - addMonitor(); - - //tree.expandAll(); + // addMonitor(); + forceLayout(); } - - + protected void addMonitor() { monitorBackgroundUpdater = new MonitorBackgroundUpdater(); - + monitorBackgroundUpdater.addListener(this); monitorBackgroundUpdater.scheduleRepeating(STATUS_POLLING_DELAY); - - addMonitorBackgroundEventUIListener(monitorBackgroundUpdater); - - } + addMonitorBackgroundEventUIListener(monitorBackgroundUpdater); + + } public void addMonitorBackgroundEventUIListener( MonitorBackgroundEventUIListener listener) { @@ -367,20 +316,18 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg MonitorBackgroundEventUIListener listener) { monitorBackgroundEventUIListeners.remove(listener); } - + public void update() { forceLayout(); } - - protected void close() { - /* - * if (parent != null) { parent.close(); } - */ + if (parent != null) { + parent.close(); + } + } - protected void requestOperationOnKey(Context context) { String key = (String) context.getKey(); @SuppressWarnings("unused") @@ -388,50 +335,104 @@ public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackg } - - private void addChildrensToStore() { gen = new MonitorTreeDataGenerator(); + try { + MonitorFolderDto root = gen.getRoot(operationMonitorList); + Log.debug("root childrens " + root.getChildrens().size()); + for (MonitorBaseDto base : root.getChildrens()) { + Log.debug("Check children: " + base); + + store.add(base); - MonitorFolderDto root = gen.getRoot(operationMonitorList); - for (MonitorBaseDto base : root.getChildrens()) { - store.add(base); - if (base instanceof MonitorFolderDto) { - processFolder(store, (MonitorFolderDto) base); } + } catch (Throwable e) { + Log.error("Error adding childrens to store :" + + e.getLocalizedMessage()); + e.printStackTrace(); } } - private void processFolder(TreeStore store, - MonitorFolderDto folder) { - for (MonitorBaseDto child : folder.getChildrens()) { - store.add(folder, child); - if (child instanceof MonitorFolderDto) { - processFolder(store, (MonitorFolderDto) child); + protected void createContextMenu() { + contextMenu = new Menu(); + + infoItem = new MenuItem(); + infoItem.setText("Info"); + infoItem.setIcon(ResourceBundle.INSTANCE.ok()); + infoItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + MonitorBaseDto selected = tree.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestMoreInfo(selected); + } + }); + + abortItem = new MenuItem(); + abortItem.setText("Abort"); + abortItem.setIcon(ResourceBundle.INSTANCE.basket()); + abortItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + MonitorBaseDto selected = tree.getSelectionModel() + .getSelectedItem(); + Log.debug(selected.toString()); + requestBacgroundAbort(selected); + + } + + }); + + contextMenu.add(infoItem); + contextMenu.add(abortItem); + tree.setContextMenu(contextMenu); + + } + + protected void requestMoreInfo(MonitorBaseDto selected) { + for (OperationMonitor operationMonitor : operationMonitorList) { + if (operationMonitor.getTaskId().compareTo(selected.getId()) == 0) { + Log.debug("Found Task Id: " + operationMonitor.getTaskId()); + MonitorBackgroundInfoDialog monitorBackgroundInfoDialog = new MonitorBackgroundInfoDialog( + operationMonitor, eventBus); + monitorBackgroundInfoDialog.show(); + return; } } + } - - + + protected void requestBacgroundAbort(MonitorBaseDto selected) { + + } + @Override public void operationMonitorListUpdated( ArrayList operationMonitorList) { + this.operationMonitorList = operationMonitorList; store.clear(); store.commitChanges(); addChildrensToStore(); store.commitChanges(); - tree.expandAll(); + // tree.expandAll(); forceLayout(); - - } + } @Override public void retrieveOperationMonitorListFailed(Throwable caught) { - // TODO Auto-generated method stub - + if (caught instanceof TDGWTSessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + UtilsGXT3.alert("Error", "Error retrieving tasks in bacground: " + + caught.getLocalizedMessage()); + + } + } - - } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorFolderDto.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorFolderDto.java index 2194b88..0fccb75 100644 --- a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorFolderDto.java +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorFolderDto.java @@ -17,6 +17,8 @@ public class MonitorFolderDto extends MonitorBaseDto { protected String state; protected String humanReadableStatus; protected float progress; + protected String startTime; + protected String endTime; public MonitorFolderDto(){ @@ -77,7 +79,6 @@ public class MonitorFolderDto extends MonitorBaseDto { this.state = state; } - public String getHumanReadableStatus() { return humanReadableStatus; @@ -86,6 +87,24 @@ public class MonitorFolderDto extends MonitorBaseDto { public void setHumanReadableStatus(String humanReadableStatus) { this.humanReadableStatus = humanReadableStatus; } + + + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } @Override public String toString() { diff --git a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorTreeDataGenerator.java b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorTreeDataGenerator.java index c93b055..c28d549 100644 --- a/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorTreeDataGenerator.java +++ b/src/main/java/org/gcube/portlets/user/td/monitorwidget/client/details/tree/MonitorTreeDataGenerator.java @@ -54,12 +54,17 @@ public class MonitorTreeDataGenerator { jobs.add(foldJob); } MonitorFolderDto foldTask = new MonitorFolderDto("task", - task.getId(), task.getId() + " [Date:" - + sdf.format(task.getStartTime()) + "]", task - .getState().toString(), "", task.getProgress(), + task.getId(), operationMonitor.getOperationId().toString(), + task.getState().toString(), "", task.getProgress(), jobs); + if(task.getStartTime()!=null){ + foldTask.setStartTime(sdf.format(task.getStartTime())); + } + if(task.getEndTime()!=null){ + foldTask.setEndTime(sdf.format(task.getEndTime())); + } + childrens.add(foldTask); - root = new MonitorFolderDto("root", "-1", "root", "root", "", 0, childrens); Log.debug("Generated root"); @@ -115,9 +120,11 @@ public class MonitorTreeDataGenerator { ArrayList operationMonitorList) { ArrayList childrens = new ArrayList(); if (operationMonitorList != null && operationMonitorList.size() > 0) { + Log.debug("getRoot: "+operationMonitorList.size()); for (OperationMonitor operationMonitor : operationMonitorList) { if (operationMonitor != null && operationMonitor.getTask() != null) { + Log.debug("getRoot: [TaskId="+operationMonitor.getTaskId()+"]"); TaskS task = operationMonitor.getTask(); ArrayList jobs = new ArrayList(); for (JobS job : task.getJobs()) { @@ -143,15 +150,21 @@ public class MonitorTreeDataGenerator { jobs.add(foldJob); } MonitorFolderDto foldTask = new MonitorFolderDto("task", - task.getId(), task.getId() + " [Date:" - + sdf.format(task.getStartTime()) + "]", + task.getId(), operationMonitor.getOperationId().toString(), task.getState().toString(), "", task.getProgress(), jobs); + if(task.getStartTime()!=null){ + foldTask.setStartTime(sdf.format(task.getStartTime())); + } + if(task.getEndTime()!=null){ + foldTask.setEndTime(sdf.format(task.getEndTime())); + } childrens.add(foldTask); } else { - + Log.debug("getRoot: operation null"); } } + Log.debug("childrens size:"+childrens.size()); root = new MonitorFolderDto("root", "-1", "root", "root", "", 0, childrens); Log.debug("Generated root"); diff --git a/src/main/resources/org/gcube/portlets/user/td/monitorwidget/MonitorWidgetTD.gwt.xml b/src/main/resources/org/gcube/portlets/user/td/monitorwidget/MonitorWidgetTD.gwt.xml index b10d50a..57a7c5f 100644 --- a/src/main/resources/org/gcube/portlets/user/td/monitorwidget/MonitorWidgetTD.gwt.xml +++ b/src/main/resources/org/gcube/portlets/user/td/monitorwidget/MonitorWidgetTD.gwt.xml @@ -23,9 +23,9 @@ - + -