diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/ChangeTableType.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/ChangeTableType.java new file mode 100644 index 0000000..806497b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/ChangeTableType.java @@ -0,0 +1,189 @@ +package org.gcube.portlets.user.td.informationwidget.client; + + + +import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync; +import org.gcube.portlets.user.td.gwtservice.shared.tr.TableData; +import org.gcube.portlets.user.td.gwtservice.shared.tr.table.ChangeTableTypeSession; +import org.gcube.portlets.user.td.informationwidget.client.progress.ChangeTableTypeProgressDialog; +import org.gcube.portlets.user.td.informationwidget.client.table.TableTypeElement; +import org.gcube.portlets.user.td.informationwidget.client.table.TableTypeProperties; +import org.gcube.portlets.user.td.informationwidget.client.table.TableTypeStore; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.cell.core.client.form.ComboBoxCell.TriggerAction; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.box.AlertMessageBox; +import com.sencha.gxt.widget.core.client.button.TextButton; +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.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; +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.form.ComboBox; +import com.sencha.gxt.widget.core.client.form.FieldLabel; + + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public class ChangeTableType extends FramedPanel { + protected String WIDTH = "640px"; + protected String HEIGHT = "520px"; + + protected TRId trId; + protected TableData table; + protected String headingTitle; + protected VerticalLayoutContainer vl; + protected EventBus eventBus; + protected ChangeTableTypeSession changeTableTypeSession; + protected ChangeTableTypeProgressDialog changeTableTypeProgressDialog; + + protected ComboBox comboTableType; + protected TextButton change; + + + + public ChangeTableType(TRId trId, EventBus eventBus) { + super(); + this.trId=trId; + this.eventBus = eventBus; + forceLayoutOnResize=true; + load(); + } + + protected void create(){ + setWidth(WIDTH); + setHeight(HEIGHT); + setHeaderVisible(false); + setBodyBorder(false); + + + TableTypeProperties props = GWT.create(TableTypeProperties.class); + ListStore storeTableType = new ListStore(props.id()); + + storeTableType.addAll(TableTypeStore.getTableTypes()); + + Log.trace("Store created"); + + comboTableType = new ComboBox(storeTableType, + props.label()); + + Log.trace("ComboTableType created"); + + + comboTableType.setEmptyText("Select a Table Type..."); + comboTableType.setItemId("ComboTableType"); + comboTableType.setWidth("200px"); + comboTableType.setEditable(false); + comboTableType.setTriggerAction(TriggerAction.ALL); + + + change=new TextButton("Change"); + change.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + onChangeTableType(); + + } + }); + + vl = new VerticalLayoutContainer(); + vl.setScrollMode(ScrollMode.AUTO); + vl.setAdjustForScroll(true); + + + vl.add(new FieldLabel(comboTableType, "Table Type"), new VerticalLayoutData(1, + -1)); + vl.add(change, new VerticalLayoutData(-1, -1, new Margins(10, 0, 10, 0))); + + add(vl); + + show(); + setCurrentType(); + + } + + protected void onChangeTableType(){ + TableTypeElement tableTypeElement = comboTableType.getCurrentValue(); + if(tableTypeElement!=null){ + changeTableTypeSession=new ChangeTableTypeSession(trId,tableTypeElement.getTableType()); + callChangeTableType(); + } else { + alert("Attention", "Select a table type!"); + } + } + + private void callChangeTableType() { + TDGWTServiceAsync.INSTANCE.startChangeTableType( + changeTableTypeSession, new AsyncCallback() { + + public void onFailure(Throwable caught) { + Log.debug("Change The Table Type Error: " + + caught.getLocalizedMessage()); + alert("Error Changing The Table Type", + "Error in invocation of Change Table Type operation!"); + + } + + public void onSuccess(Void result) { + changeTableTypeProgressDialog= new ChangeTableTypeProgressDialog(changeTableTypeSession, eventBus); + } + + }); + + } + + + protected void setCurrentType(){ + TableTypeElement tElement=TableTypeStore.getTableTypeElement(table.getTypeName()); + comboTableType.setValue(tElement); + + } + + + private void load() { + TDGWTServiceAsync.INSTANCE.getTable(trId, + new AsyncCallback() { + + public void onFailure(Throwable caught) { + Log.error("Error retrieving table: " + + caught.getMessage()); + alert("Error retrieving table",caught.getMessage()); + } + + public void onSuccess(TableData result) { + Log.debug("Retrieved table: "+result.toString()); + table=result; + create(); + } + + }); + + } + + private void alert(String title, String message) { + final AlertMessageBox d = new AlertMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + + } + }); + d.show(); + + } + +} + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressBarUpdater.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressBarUpdater.java new file mode 100644 index 0000000..6c906fa --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressBarUpdater.java @@ -0,0 +1,75 @@ +/** + * + */ +package org.gcube.portlets.user.td.informationwidget.client.progress; + + + + +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public class ChangeTableTypeProgressBarUpdater implements ChangeTableTypeProgressListener { + + protected ProgressBar progressBar; + + /** + * Creates a new {@link ProgressBar} updater. + * @param progressBar the {@link ProgressBar} to update. + */ + public ChangeTableTypeProgressBarUpdater(ProgressBar progressBar) { + this.progressBar = progressBar; + } + + + /** + * {@inheritDoc} + */ + public void operationComplete(TRId trId) { + Log.info("Completed"); + progressBar.updateProgress(1, "Completed"); + + } + + /** + * {@inheritDoc} + */ + public void operationFailed(Throwable caught, String reason, String failureDetails) { + Log.info("Failed"); + progressBar.updateText("Failed"); + } + + public void operationInitializing() { + Log.info("Inizializing"); + progressBar.updateProgress(0, "Initializing..."); + } + + public void operationUpdate(float elaborated) { + Log.info("Import elaborated: "+elaborated); + if (elaborated == 0) progressBar.updateProgress(0, "Initializing..."); + if (elaborated>0 && elaborated<1) { + Log.trace("progress "+elaborated); + int elab=new Float(elaborated*100).intValue(); + progressBar.updateProgress(elaborated,elab+"% Progress..."); + } + if (elaborated == 1) progressBar.updateProgress(1, "Completing..."); + + } + + + @Override + public void operationStopped(String reason, String details) { + Log.info("Stopped"); + progressBar.updateText("Stopped"); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressDialog.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressDialog.java new file mode 100644 index 0000000..975b4d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressDialog.java @@ -0,0 +1,139 @@ +package org.gcube.portlets.user.td.informationwidget.client.progress; + +import org.gcube.portlets.user.td.gwtservice.shared.tr.table.ChangeTableTypeSession; +import org.gcube.portlets.user.td.widgetcommonevent.client.event.ChangeTableRequestEvent; +import org.gcube.portlets.user.td.widgetcommonevent.client.type.ChangeTableRequestType; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.web.bindery.event.shared.EventBus; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.ProgressBar; +import com.sencha.gxt.widget.core.client.Window; +import com.sencha.gxt.widget.core.client.box.AlertMessageBox; +import com.sencha.gxt.widget.core.client.button.TextButton; +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.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; + + + +/** + * LabelColumnProgressDialog is a Dialog that show progress of change the column label + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public class ChangeTableTypeProgressDialog extends Window implements ChangeTableTypeProgressListener { + public static final int STATUS_POLLING_DELAY = 1000; + protected String WIDTH = "400px"; + protected String HEIGHT = "120px"; + protected ChangeTableTypeSession changeTableTypeSession; + protected EventBus eventBus; + protected ChangeTableTypeProgressUpdater progressUpdater; + protected TextButton ok; + protected TRId trId; + + public ChangeTableTypeProgressDialog(ChangeTableTypeSession changeTableTypeSession, EventBus eventBus) { + this.changeTableTypeSession=changeTableTypeSession; + this.eventBus=eventBus; + setWidth(WIDTH); + setHeight(HEIGHT); + setBodyBorder(false); + setResizable(true); + setModal(true); + setHeadingText("Change The Table Type Progress"); + + trId=null; + + FramedPanel panel=new FramedPanel(); + panel.setHeaderVisible(false); + panel.setBodyBorder(false); + + VerticalLayoutContainer v = new VerticalLayoutContainer(); + + + ProgressBar progressBar = new ProgressBar(); + + ok=new TextButton("OK"); + ok.addSelectHandler(new SelectHandler() { + + public void onSelect(SelectEvent event) { + updateInvocation(); + + } + }); + + v.add(progressBar, new VerticalLayoutData(1, + 1, new Margins(5, 5, 5, 5))); + + panel.add(v); + panel.addButton(ok); + add(panel); + + + progressUpdater = new ChangeTableTypeProgressUpdater(); + progressUpdater.addListener(new ChangeTableTypeProgressBarUpdater(progressBar)); + + progressUpdater.addListener(this); + progressUpdater.scheduleRepeating(STATUS_POLLING_DELAY); + show(); + ok.setVisible(false); + + } + + public void operationInitializing() { + // TODO Auto-generated method stub + + } + + public void operationUpdate(float elaborated) { + // TODO Auto-generated method stub + + } + + public void operationComplete(TRId trId) { + Log.debug("Operation Complete return: "+trId.toString()); + ok.setVisible(true); + this.trId=trId; + } + + public void operationFailed(Throwable caught, String reason, + String failureDetails) { + ok.setVisible(true); + this.trId=null; + AlertMessageBox d = new AlertMessageBox("Error Changing The Table Type", reason); + d.addHideHandler(new HideHandler() { + public void onHide(HideEvent event) { + } + }); + d.show(); + } + + public void updateInvocation(){ + if(trId!=null){ + ChangeTableRequestEvent changeTableRequestEvent= + new ChangeTableRequestEvent(ChangeTableRequestType.CHANGETABLETYPE, trId); + eventBus.fireEvent(changeTableRequestEvent); + } + hide(); + } + + @Override + public void operationStopped(String reason, String details) { + ok.setVisible(true); + this.trId=null; + AlertMessageBox d = new AlertMessageBox("Stopped Changing The Table Type", reason); + d.addHideHandler(new HideHandler() { + public void onHide(HideEvent event) { + } + }); + d.show(); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressListener.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressListener.java new file mode 100644 index 0000000..0ecfbbf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressListener.java @@ -0,0 +1,50 @@ +/** + * + */ +package org.gcube.portlets.user.td.informationwidget.client.progress; + +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + + + +/** + * Defines a listener for operation progress. + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public interface ChangeTableTypeProgressListener { + + /** + * Called when the operation is starting. + */ + public void operationInitializing(); + + /** + * Called when there is a progress for the operation. + * @param elaborated the elaborated part. + */ + public void operationUpdate(float elaborated); + + + /** + * Called when the operation is complete. + */ + public void operationComplete(TRId trId); + + /** + * Called when the operation is failed. + * @param caught the failure exception. + * @param reason the failure reason. + */ + public void operationFailed(Throwable caught, String reason, String failureDetails); + + /** + * Called when the operation is failed. + * @param caught the failure exception. + * @param reason the failure reason. + */ + public void operationStopped(String reason, String details); + +} diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressUpdater.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressUpdater.java new file mode 100644 index 0000000..ac24a2d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/progress/ChangeTableTypeProgressUpdater.java @@ -0,0 +1,182 @@ +/** + * + */ +package org.gcube.portlets.user.td.informationwidget.client.progress; + +import java.util.ArrayList; + +import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync; +import org.gcube.portlets.user.td.gwtservice.shared.tr.table.ChangeTableTypeMonitor; +import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; + +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" + * g.panichi@isti.cnr.it + * + */ +public class ChangeTableTypeProgressUpdater extends Timer { + + protected ArrayList listeners = new ArrayList(); + + /** + * {@inheritDoc} + */ + @Override + public void run() { + Log.debug("requesting operation progress"); + TDGWTServiceAsync.INSTANCE + .getChangeTableTypeMonitor(new AsyncCallback() { + + + public void onFailure(Throwable caught) { + cancel(); + Log.error("Error retrieving the operation state", + caught); + String message = getStack(caught); + fireOperationFailed(caught, + "Failed getting operation updates", message); + } + + public void onSuccess(ChangeTableTypeMonitor result) { + Log.info("retrieved ChangeTableTypeMonitor: " + + result.getStatus()); + switch (result.getStatus()) { + case INITIALIZING: + Log.info("Change Table Type Initializing..."); + fireOperationInitializing(); + break; + case ABORTED: + cancel(); + Log.info("Change The Table Type Operation Aborted"); + break; + case IN_PROGRESS: + fireOperationUpdate(result.getProgress()); + break; + case VALIDATING_RULES: + fireOperationUpdate(result.getProgress()); + break; + case STOPPED: + cancel(); + stopMessage(result); + break; + case FAILED: + cancel(); + errorMessage(result); + break; + case SUCCEDED: + cancel(); + Log.info("Import fisnish TableId :" + + result.getTrId()); + fireOperationComplete(result.getTrId()); + break; + default: + Log.info("Unknow State"); + break; + } + + } + + + + }); + + } + + protected void errorMessage(ChangeTableTypeMonitor result) { + Log.info("Change Table Type Failed"); + Throwable th = null; + String failure = null; + String details = null; + if (result.getError() != null) { + th = result.getError(); + failure = "Failed Client Library Changing the table type"; + details = result.getError().getLocalizedMessage(); + } else { + th = new Throwable("Failed"); + failure = "Failed Client Library Changing the table type"; + details = "Change the table type failed"; + } + + fireOperationFailed(th, failure, details); + } + + protected void stopMessage(ChangeTableTypeMonitor result) { + Log.info("Change Table Type Stopped"); + String failure = null; + String details = null; + if (result.getError() != null) { + failure = "Stopped changing the table type"; + details = result.getError().getLocalizedMessage(); + } else { + failure = "Stopped changing the table type"; + details = "Change the table type stopped"; + } + + fireOperationStopped(failure, details); + } + + + protected String getStack(Throwable e) { + String message = e.getLocalizedMessage() + " ->
"; + Throwable c = e.getCause(); + if (c != null) + message += getStack(c); + return message; + } + + protected void fireOperationInitializing() { + for (ChangeTableTypeProgressListener listener : listeners) + listener.operationInitializing(); + } + + protected void fireOperationUpdate(float elaborated) { + for (ChangeTableTypeProgressListener listener : listeners) + listener.operationUpdate(elaborated); + } + + protected void fireOperationComplete(TRId trId) { + for (ChangeTableTypeProgressListener listener : listeners) + listener.operationComplete(trId); + } + + protected void fireOperationFailed(Throwable caught, String failure, + String failureDetails) { + for (ChangeTableTypeProgressListener listener : listeners) + listener.operationFailed(caught, failure, failureDetails); + } + + protected void fireOperationStopped(String reason, String details) { + for (ChangeTableTypeProgressListener listener : listeners) + listener.operationStopped(reason, details); + } + + + + /** + * Add a new {@link ChangeTableTypeProgressListener} to this + * {@link ChangeTableTypeProgressUpdater}. + * + * @param listener + * the listener to add. + */ + public void addListener(ChangeTableTypeProgressListener listener) { + listeners.add(listener); + } + + /** + * Removes the specified {@link ChangeTableTypeProgressListener} from this + * {@link ChangeTableTypeProgressUpdater}. + * + * @param listener + * the listener to remove. + */ + public void removeListener(ChangeTableTypeProgressListener listener) { + listeners.remove(listener); + } +} diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeElement.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeElement.java new file mode 100644 index 0000000..63bd808 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeElement.java @@ -0,0 +1,51 @@ +package org.gcube.portlets.user.td.informationwidget.client.table; + +import java.io.Serializable; + +import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.TableType; + + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public class TableTypeElement implements Serializable { + + private static final long serialVersionUID = -5913441587564742269L; + + protected Integer id; + protected TableType tableType; + + public TableTypeElement(Integer id, TableType tableType){ + this.id=id; + this.tableType=tableType; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public TableType getTableType() { + return tableType; + } + + public void setTableType(TableType tableType) { + this.tableType = tableType; + } + + public String getLabel(){ + return tableType.toString(); + } + + @Override + public String toString() { + return "TableTypeElement [id=" + id + ", tableType=" + tableType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeProperties.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeProperties.java new file mode 100644 index 0000000..d4fa28f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeProperties.java @@ -0,0 +1,17 @@ +package org.gcube.portlets.user.td.informationwidget.client.table; + + +import com.google.gwt.editor.client.Editor.Path; +import com.sencha.gxt.data.shared.LabelProvider; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.PropertyAccess; + +public interface TableTypeProperties extends PropertyAccess { + + @Path("id") + ModelKeyProvider id(); + + LabelProvider label(); + +} + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeStore.java b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeStore.java new file mode 100644 index 0000000..850fa61 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/informationwidget/client/table/TableTypeStore.java @@ -0,0 +1,44 @@ +package org.gcube.portlets.user.td.informationwidget.client.table; + +import java.util.ArrayList; + +import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.TableType; + +public class TableTypeStore { + + protected static TableTypeElement genericElement=new TableTypeElement(1, TableType.GENERIC); + protected static TableTypeElement codelistElement=new TableTypeElement(2, TableType.CODELIST); + protected static TableTypeElement datasetElement=new TableTypeElement(3, TableType.DATASET); + + + protected static ArrayList tableType = new ArrayList() { + private static final long serialVersionUID = -6559885743626876431L; + { + add(genericElement); + add(codelistElement); + add(datasetElement); + + } + }; + + public static ArrayList getTableTypes() { + return tableType; + } + + public static TableTypeElement getTableTypeElement(String tableType){ + if(tableType.compareTo(TableType.GENERIC.toString())==0){ + return genericElement; + } else { + if(tableType.compareTo(TableType.CODELIST.toString())==0){ + return genericElement; + } else { + if(tableType.compareTo(TableType.DATASET.toString())==0){ + return genericElement; + } else { + return null; + } + } + } + } + +} \ No newline at end of file