Minor Update

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-monitor-widget@99644 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Giancarlo Panichi 2014-09-09 17:17:22 +00:00 committed by Giancarlo Panichi
parent d406e0371a
commit 56b5816023
8 changed files with 677 additions and 33 deletions

View File

@ -36,7 +36,7 @@ import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
*/
public class MonitorDialog extends Window implements MonitorUpdaterListener {
public static final int STATUS_POLLING_DELAY = 1000;
private static final int STATUS_POLLING_DELAY = 1000;
private static final String WIDTH = "640px";
private static final String HEIGHT = "378px";
private static final String PANELWIDTH = "620px";

View File

@ -1,8 +1,5 @@
package org.gcube.portlets.user.td.monitorwidget.client.background;
import org.gcube.portlets.user.td.monitorwidget.client.details.MonitorDetailPanel;
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import com.google.web.bindery.event.shared.EventBus;
import com.sencha.gxt.widget.core.client.Window;
@ -15,26 +12,15 @@ import com.sencha.gxt.widget.core.client.Window;
*/
public class MonitorBackgroundDialog extends Window {
private static final String WIDTH = "640px";
private static final String HEIGHT = "378px";
private static final String PANELWIDTH = "620px";
private static final String PANELHEIGHT = "308px";
private static final String PROGRESSWIDTH = "618px";
private static final String WIDTH = "400px";
private static final String HEIGHT = "520px";
private EventBus eventBus;
private String taskId;
protected EventBus eventBus;
protected MonitorBackgroundPanel monitorBackgroundPanel;
private TRId trId;
private MonitorDetailPanel monitorDetailPanel;
public MonitorBackgroundDialog(String taskId, EventBus eventBus) {
public MonitorBackgroundDialog(EventBus eventBus) {
this.eventBus = eventBus;
this.taskId=taskId;
trId = null;
initWindow();
create();
@ -46,13 +32,15 @@ public class MonitorBackgroundDialog extends Window {
setHeight(HEIGHT);
setBodyBorder(false);
setResizable(true);
setModal(true);
setModal(false);
setClosable(true);
setHeadingText("Background Operations Monitor");
}
protected void create(){
monitorBackgroundPanel = new MonitorBackgroundPanel(eventBus);
add(monitorBackgroundPanel);
show();
}
/**

View File

@ -0,0 +1,22 @@
package org.gcube.portlets.user.td.monitorwidget.client.background;
public interface MonitorBackgroundEventUIListener {
/**
* Called when the task is aborted
*
*/
public void requestAborted(String taskId);
/**
* Called when the task is resumed
*
*/
public void requestResume(String taskId);
}

View File

@ -0,0 +1,437 @@
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.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell.Context;
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.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;
/**
*
* @author "Giancarlo Panichi" <a
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
public class MonitorBackgroundPanel extends FramedPanel implements MonitorBackgroundUpdaterListener {
protected static final int STATUS_POLLING_DELAY = 2000;
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 ArrayList<MonitorBackgroundEventUIListener> monitorBackgroundEventUIListeners = new ArrayList<MonitorBackgroundEventUIListener>();
protected MonitorBackgroundPanel thisPanel;
protected Menu contextMenu;
protected MenuItem resumeItem;
protected MenuItem resolveItem;
protected TRId trId;
protected VerticalLayoutContainer con;
protected ValidationsTasksMetadata validationsTasksMetadata;
protected MonitorTreeDataGenerator gen;
protected TreeStore<MonitorBaseDto> store;
protected TreeGrid<MonitorBaseDto> tree;
protected ArrayList<OperationMonitor> operationMonitorList;
protected EventBus eventBus;
protected MonitorBackgroundUpdater monitorBackgroundUpdater;
class KeyProvider implements ModelKeyProvider<MonitorBaseDto> {
@Override
public String getKey(MonitorBaseDto item) {
return (item instanceof MonitorFolderDto ? "f-" : "v-")
+ item.getId();
}
}
public MonitorBackgroundPanel(EventBus eventBus) {
super();
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<MonitorBaseDto>(new KeyProvider());
addChildrensToStore();
ColumnConfig<MonitorBaseDto, String> cc1 = new ColumnConfig<MonitorBaseDto, String>(
new ToStringValueProvider<MonitorBaseDto>("task"), CC1WIDTH, "Task");
cc1.setHeader("Task");
cc1.setCell(new AbstractCell<String>() {
@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<span title='"
+ SafeHtmlUtils.htmlEscape(value) + "'>" + value
+ "</span>");
}
});
ColumnConfig<MonitorBaseDto, String> cc2 = new ColumnConfig<MonitorBaseDto, String>(
new ValueProvider<MonitorBaseDto, String>() {
@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<MonitorBaseDto, String> cc3 = new ColumnConfig<MonitorBaseDto, String>(
new ValueProvider<MonitorBaseDto, String>() {
@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<MonitorBaseDto, Double> cc4 = new ColumnConfig<MonitorBaseDto, Double>(
new ValueProvider<MonitorBaseDto, Double>() {
@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<ColumnConfig<MonitorBaseDto, ?>> l = new ArrayList<ColumnConfig<MonitorBaseDto, ?>>();
l.add(cc1);
l.add(cc2);
l.add(cc3);
l.add(cc4);
ColumnModel<MonitorBaseDto> cm = new ColumnModel<MonitorBaseDto>(l);
tree = new TreeGrid<MonitorBaseDto>(store, cm, cc1);
tree.getView().setAutoFill(true);
tree.setBorders(false);
tree.setLoadMask(true);
tree.setColumnResize(true);
tree.getView().setAutoExpandColumn(cc1);
IconProvider<MonitorBaseDto> iconProvider = new IconProvider<MonitorBaseDto>() {
@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<MonitorBaseDto>() {
@Override
public void onExpand(ExpandItemEvent<MonitorBaseDto> event) {
forceLayout();
}
});
tree.addCollapseHandler(new CollapseItemHandler<MonitorBaseDto>() {
@Override
public void onCollapse(CollapseItemEvent<MonitorBaseDto> event) {
forceLayout();
}
});
// 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();
forceLayout();
}
protected void addMonitor() {
monitorBackgroundUpdater = new MonitorBackgroundUpdater();
monitorBackgroundUpdater.addListener(this);
monitorBackgroundUpdater.scheduleRepeating(STATUS_POLLING_DELAY);
addMonitorBackgroundEventUIListener(monitorBackgroundUpdater);
}
public void addMonitorBackgroundEventUIListener(
MonitorBackgroundEventUIListener listener) {
monitorBackgroundEventUIListeners.add(listener);
}
public void removeMonitorBackgroundEventUIListener(
MonitorBackgroundEventUIListener listener) {
monitorBackgroundEventUIListeners.remove(listener);
}
public void update() {
forceLayout();
}
protected void close() {
/*
* if (parent != null) { parent.close(); }
*/
}
protected void requestOperationOnKey(Context context) {
String key = (String) context.getKey();
@SuppressWarnings("unused")
MonitorBaseDto d = store.findModelWithKey(key);
}
private void addChildrensToStore() {
gen = new MonitorTreeDataGenerator();
MonitorFolderDto root = gen.getRoot(operationMonitorList);
for (MonitorBaseDto base : root.getChildrens()) {
store.add(base);
if (base instanceof MonitorFolderDto) {
processFolder(store, (MonitorFolderDto) base);
}
}
}
private void processFolder(TreeStore<MonitorBaseDto> store,
MonitorFolderDto folder) {
for (MonitorBaseDto child : folder.getChildrens()) {
store.add(folder, child);
if (child instanceof MonitorFolderDto) {
processFolder(store, (MonitorFolderDto) child);
}
}
}
@Override
public void operationMonitorListUpdated(
ArrayList<OperationMonitor> operationMonitorList) {
store.clear();
store.commitChanges();
addChildrensToStore();
store.commitChanges();
tree.expandAll();
forceLayout();
}
@Override
public void retrieveOperationMonitorListFailed(Throwable caught) {
// TODO Auto-generated method stub
}
}

View File

@ -0,0 +1,114 @@
package org.gcube.portlets.user.td.monitorwidget.client.background;
import java.util.ArrayList;
import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
import org.gcube.portlets.user.td.gwtservice.shared.monitor.BackgroundOperationMonitorSession;
import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitor;
import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitorSession;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
*
* @author "Giancarlo Panichi"
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
public class MonitorBackgroundUpdater extends Timer implements MonitorBackgroundEventUIListener {
protected ArrayList<MonitorBackgroundUpdaterListener> listeners = new ArrayList<MonitorBackgroundUpdaterListener>();
protected BackgroundOperationMonitorSession backgroundOperationMonitorSession;
public MonitorBackgroundUpdater(){
backgroundOperationMonitorSession=new BackgroundOperationMonitorSession();
}
/**
* {@inheritDoc}
*/
@Override
public void run() {
Log.debug("requesting list of operation in background ");
TDGWTServiceAsync.INSTANCE
.getBackgroundOperationMonitor(backgroundOperationMonitorSession, new AsyncCallback<ArrayList<OperationMonitor>>() {
public void onFailure(Throwable caught) {
cancel();
Log.error("Error retrieving operation monitor list",
caught);
fireRetrieveOperationMonitorListFailed(caught);
}
public void onSuccess(ArrayList<OperationMonitor> result) {
Log.debug("retrieved Operation Monitor List: "
+ result.size());
fireOperationMonitorListUpdated(result);
}
});
}
protected void fireOperationMonitorListUpdated(ArrayList<OperationMonitor> operationMonitorList){
for (MonitorBackgroundUpdaterListener listener : listeners)
listener.operationMonitorListUpdated(operationMonitorList);
}
protected void fireRetrieveOperationMonitorListFailed(Throwable throwable){
for (MonitorBackgroundUpdaterListener listener : listeners)
listener.retrieveOperationMonitorListFailed(throwable);
}
/**
*
*
* @param listener
*/
public void addListener(MonitorBackgroundUpdaterListener listener) {
listeners.add(listener);
}
/**
*
* @param listener
*/
public void removeListener(MonitorBackgroundUpdaterListener listener) {
listeners.remove(listener);
}
@Override
public void requestAborted(String taskId) {
OperationMonitorSession operationMonitorSession=new OperationMonitorSession(taskId);
operationMonitorSession.setAbort(true);
backgroundOperationMonitorSession.addToOperationMonitorSessionList(operationMonitorSession);
}
@Override
public void requestResume(String taskId) {
// TODO Auto-generated method stub
}
}

View File

@ -0,0 +1,28 @@
package org.gcube.portlets.user.td.monitorwidget.client.background;
import java.util.ArrayList;
import org.gcube.portlets.user.td.gwtservice.shared.monitor.OperationMonitor;
/**
*
* @author giancarlo
* email: <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
public interface MonitorBackgroundUpdaterListener {
/**
* Called when the list of opration is updated
*/
public void operationMonitorListUpdated(ArrayList<OperationMonitor> operationMonitorList);
/**
* Called when operation is failed
*/
public void retrieveOperationMonitorListFailed(Throwable caught);
}

View File

@ -362,9 +362,9 @@ public class MonitorDetailPanel extends FramedPanel {
}
private void addChildrensToStore() {
gen = new MonitorTreeDataGenerator(operationMonitor);
gen = new MonitorTreeDataGenerator();
MonitorFolderDto root = gen.getRootNoTask();
MonitorFolderDto root = gen.getRootNoTask(operationMonitor);
for (MonitorBaseDto base : root.getChildrens()) {
store.add(base);
if (base instanceof MonitorFolderDto) {

View File

@ -21,15 +21,16 @@ public class MonitorTreeDataGenerator {
.getFormat("yyyy-MM-dd HH:mm:ss");
protected MonitorFolderDto root;
protected OperationMonitor operationMonitor;
public MonitorTreeDataGenerator(OperationMonitor operationMonitor) {
protected boolean singleOperation;
public MonitorTreeDataGenerator() {
Log.debug("MonitorTreeDataGenerator");
this.operationMonitor = operationMonitor;
}
public MonitorFolderDto getRoot() {
public MonitorFolderDto getRoot(OperationMonitor operationMonitor) {
ArrayList<MonitorBaseDto> childrens = new ArrayList<MonitorBaseDto>();
if (operationMonitor != null && operationMonitor.getTask() != null) {
TaskS task = operationMonitor.getTask();
ArrayList<MonitorBaseDto> jobs = new ArrayList<MonitorBaseDto>();
@ -72,8 +73,8 @@ public class MonitorTreeDataGenerator {
return root;
}
public MonitorFolderDto getRootNoTask(){
public MonitorFolderDto getRootNoTask(OperationMonitor operationMonitor) {
ArrayList<MonitorBaseDto> jobs = new ArrayList<MonitorBaseDto>();
if (operationMonitor != null && operationMonitor.getTask() != null) {
TaskS task = operationMonitor.getTask();
@ -95,7 +96,7 @@ public class MonitorTreeDataGenerator {
validations);
jobs.add(foldJob);
}
root = new MonitorFolderDto("root", "-1", "root", "root", "", 0,
jobs);
Log.debug("Generated root");
@ -109,7 +110,61 @@ public class MonitorTreeDataGenerator {
return root;
}
public MonitorFolderDto getRoot(
ArrayList<OperationMonitor> operationMonitorList) {
ArrayList<MonitorBaseDto> childrens = new ArrayList<MonitorBaseDto>();
if (operationMonitorList != null && operationMonitorList.size() > 0) {
for (OperationMonitor operationMonitor : operationMonitorList) {
if (operationMonitor != null
&& operationMonitor.getTask() != null) {
TaskS task = operationMonitor.getTask();
ArrayList<MonitorBaseDto> jobs = new ArrayList<MonitorBaseDto>();
for (JobS job : task.getJobs()) {
ArrayList<MonitorBaseDto> validations = new ArrayList<MonitorBaseDto>();
for (ValidationsJobS v : job.getValidationsJobS()) {
MonitorValidationJobSDto validationDto = new MonitorValidationJobSDto(
task.getId() + "-" + job.getId() + "-"
+ v.getId(), v.getWorkerState(),
v.getProgress(), v.getDescription(),
v.getErrorMessage(),
v.getHumanReadableStatus(),
job.getInvocation());
validations.add(validationDto);
}
MonitorFolderDto foldJob = new MonitorFolderDto("job",
task.getId() + "-" + job.getId(),
job.getDescription(), job.getWorkerState()
.toString(),
job.getHumaReadableStatus(), job.getProgress(),
validations);
jobs.add(foldJob);
}
MonitorFolderDto foldTask = new MonitorFolderDto("task",
task.getId(), task.getId() + " [Date:"
+ sdf.format(task.getStartTime()) + "]",
task.getState().toString(), "", task.getProgress(),
jobs);
childrens.add(foldTask);
} else {
}
}
root = new MonitorFolderDto("root", "-1", "root", "root",
"", 0, childrens);
Log.debug("Generated root");
} else {
root = new MonitorFolderDto("root", "-1", "root", "root",
"", 0, childrens);
Log.debug("Generated root without childrens");
}
return root;
}
protected void printRecorsive(MonitorFolderDto root) {
for (MonitorBaseDto base : root.getChildrens()) {