diff --git a/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressBarUpdater.java b/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressBarUpdater.java
new file mode 100644
index 0000000..3c4e357
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressBarUpdater.java
@@ -0,0 +1,71 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.sdmxexportwidget.client.progress;
+
+
+
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.sencha.gxt.widget.core.client.ProgressBar;
+
+/**
+ * Updates a {@link ProgressBar} progress and text based on {@link SDMXExportProgressListener} events.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class SDMXExportProgressBarUpdater implements SDMXExportProgressListener {
+
+ protected ProgressBar progressBar;
+ //protected FramedPanel operationResult;
+ //protected WizardWindow wizardWindow;
+ /**
+ * Creates a new {@link ProgressBar} updater.
+ * @param progressBar the {@link ProgressBar} to update.
+ */
+ public SDMXExportProgressBarUpdater(ProgressBar progressBar) {
+ this.progressBar = progressBar;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void operationComplete() {
+ Log.info("Export completed");
+ progressBar.updateProgress(1, "Export completed.");
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void operationFailed(Throwable caught, String reason, String failureDetails) {
+ Log.info("Export failed");
+ progressBar.updateText("Export failed.");
+ }
+
+ @Override
+ public void operationInitializing() {
+ Log.info("Export Inizializing");
+ progressBar.updateProgress(0, "Initializing...");
+ }
+
+ @Override
+ public void operationUpdate(float elaborated) {
+ Log.info("Export 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+"% Exporting...");
+ }
+ if (elaborated == 1) progressBar.updateProgress(1, "Completing...");
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressListener.java b/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressListener.java
new file mode 100644
index 0000000..717b93f
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressListener.java
@@ -0,0 +1,41 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.sdmxexportwidget.client.progress;
+
+
+
+
+/**
+ * Defines a listener for operation progress.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public interface SDMXExportProgressListener {
+
+ /**
+ * 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();
+
+ /**
+ * 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);
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressUpdater.java b/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressUpdater.java
new file mode 100644
index 0000000..4783250
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/sdmxexportwidget/client/progress/SDMXExportProgressUpdater.java
@@ -0,0 +1,165 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.sdmxexportwidget.client.progress;
+
+import java.util.ArrayList;
+
+import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
+import org.gcube.portlets.user.td.gwtservice.shared.csv.CSVExportMonitor;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.sencha.gxt.widget.core.client.box.AlertMessageBox;
+import com.sencha.gxt.widget.core.client.event.HideEvent;
+import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+
+public class SDMXExportProgressUpdater extends Timer {
+
+ protected ArrayList listeners = new ArrayList();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void run() {
+ Log.debug("requesting operation progress");
+ TDGWTServiceAsync.INSTANCE
+ .getCSVExportMonitor(new AsyncCallback() {
+
+ @Override
+ 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);
+ }
+
+ @Override
+ public void onSuccess(CSVExportMonitor result) {
+ Log.info("retrieved CSVImportMonitor: "
+ + result.getStatus());
+ switch (result.getStatus()) {
+ case INITIALIZING:
+ Log.info("CSV Export Initializing...");
+ fireOperationInitializing();
+ break;
+ case ABORTED:
+ cancel();
+ Log.info("CSV Export Operation Aborted");
+ break;
+ case IN_PROGRESS:
+ fireOperationUpdate(result.getProgress());
+ break;
+ case FAILED:
+ cancel();
+ errorMessage(result);
+ break;
+ case SUCCEDED:
+ cancel();
+ Log.info("Export fisnish ExportMetadata:"
+ + result.getTrExportMetadata());
+ fireOperationComplete();
+ break;
+
+ default:
+ Log.info("Unknow State");
+ break;
+ }
+
+ }
+
+ });
+
+ }
+
+ protected void errorMessage(CSVExportMonitor result) {
+ Log.info("CSV Export Failed");
+ Throwable th = null;
+ String failure = null;
+ String details = null;
+ if (result.getError() != null) {
+ th = result.getError();
+ failure = "Failed Client Library Export";
+ details = result.getError().getLocalizedMessage();
+ } else {
+ th = new Throwable("Failed");
+ failure = "Failed Client Library Export";
+ details = "Error in export";
+ }
+ fireOperationFailed(th, failure, details);
+
+ AlertMessageBox d = new AlertMessageBox("Error in CSV Export", details);
+ d.addHideHandler(new HideHandler() {
+
+ @Override
+ public void onHide(HideEvent event) {
+ //
+ }
+
+ });
+ d.show();
+
+ }
+
+ 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 (SDMXExportProgressListener listener : listeners)
+ listener.operationInitializing();
+ }
+
+ protected void fireOperationUpdate(float elaborated) {
+ for (SDMXExportProgressListener listener : listeners)
+ listener.operationUpdate(elaborated);
+ }
+
+ protected void fireOperationComplete() {
+ for (SDMXExportProgressListener listener : listeners)
+ listener.operationComplete();
+ }
+
+ protected void fireOperationFailed(Throwable caught, String failure,
+ String failureDetails) {
+ for (SDMXExportProgressListener listener : listeners)
+ listener.operationFailed(caught, failure, failureDetails);
+ }
+
+ /**
+ * Add a new {@link SDMXExportProgressListener} to this
+ * {@link SDMXExportProgressUpdater}.
+ *
+ * @param listener
+ * the listener to add.
+ */
+ public void addListener(SDMXExportProgressListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes the specified {@link SDMXExportProgressListener} from this
+ * {@link SDMXExportProgressUpdater}.
+ *
+ * @param listener
+ * the listener to remove.
+ */
+ public void removeListener(SDMXExportProgressListener listener) {
+ listeners.remove(listener);
+ }
+}