() {
+
+ public void onFailure(Throwable caught) {
+ wpanel.endWaiting();
+ if (caught instanceof TDGWTSessionExpiredException) {
+ getEventBus()
+ .fireEvent(
+ new SessionExpiredEvent(
+ SessionExpiredType.EXPIREDONSERVER));
+ } else {
+ thisCard.showErrorAndHide("Error",
+ "Error retrieving the file from the workspace: "
+ + caught.getLocalizedMessage(),
+ caught.toString(), caught);
+ }
+ }
+
+ public void onSuccess(Void result) {
+ wpanel.endWaiting();
+ goForward();
+
+ }
+
+ });
+
+ }
+
+ protected void goForward() {
+ CodelistMappingTableDetailCard detailsCard = new CodelistMappingTableDetailCard(
+ importSession);
+ getWizardWindow().addCard(detailsCard);
+ Log.info("NextCard CodelistMappingTableDetailCard");
+ getWizardWindow().nextCard();
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/SourceSelectionCard.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/SourceSelectionCard.java
new file mode 100644
index 0000000..36418e5
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/SourceSelectionCard.java
@@ -0,0 +1,141 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client;
+
+import org.gcube.portlets.user.td.wizardwidget.client.WizardCard;
+
+import org.gcube.portlets.user.td.gwtservice.shared.csv.CSVImportSession;
+import org.gcube.portlets.user.td.gwtservice.shared.source.FileSource;
+import org.gcube.portlets.user.td.gwtservice.shared.source.WorkspaceSource;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.HasValue;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.sencha.gxt.core.client.util.ToggleGroup;
+import com.sencha.gxt.widget.core.client.form.Radio;
+
+/**
+ *
+ * @author "Giancarlo Panichi" g.panichi@isti.cnr.it
+ *
+ */
+public class SourceSelectionCard extends WizardCard {
+
+ protected final CSVImportSession importSession;
+
+ final FileSource fileSource = FileSource.INSTANCE;
+ final WorkspaceSource workspaceSource = WorkspaceSource.INSTANCE;
+
+ public SourceSelectionCard(final CSVImportSession importSession) {
+ super("Codelist Mapping source selection", "");
+
+ this.importSession = importSession;
+ // Default
+ importSession.setSource(fileSource);
+
+ VerticalPanel sourceSelectionPanel = new VerticalPanel();
+ sourceSelectionPanel.setStylePrimaryName(res.wizardCSS()
+ .getImportSelectionSources());
+
+ Radio radioFileSource = new Radio();
+ radioFileSource.setBoxLabel(""
+ + fileSource.getName() + "
"
+ + fileSource.getDescription() + "
");
+ radioFileSource.setName(fileSource.getName());
+ radioFileSource.setStylePrimaryName(res.wizardCSS()
+ .getImportSelectionSource());
+ radioFileSource.setValue(true);
+
+ Radio radioWorkspaceSource = new Radio();
+ radioWorkspaceSource.setBoxLabel(""
+ + workspaceSource.getName() + "
"
+ + workspaceSource.getDescription() + "
");
+ radioWorkspaceSource.setName(workspaceSource.getName());
+ radioWorkspaceSource.setStylePrimaryName(res.wizardCSS()
+ .getImportSelectionSource());
+ // radioWorkspaceSource.disable();
+
+ sourceSelectionPanel.add(radioFileSource);
+ sourceSelectionPanel.add(radioWorkspaceSource);
+
+ // we can set name on radios or use toggle group
+ ToggleGroup toggle = new ToggleGroup();
+ toggle.add(radioWorkspaceSource);
+ toggle.add(radioFileSource);
+
+ toggle.addValueChangeHandler(new ValueChangeHandler>() {
+
+
+ public void onValueChange(ValueChangeEvent> event) {
+ try {
+ ToggleGroup group = (ToggleGroup) event.getSource();
+ Radio radio = (Radio) group.getValue();
+ Log.info("Source Selected:" + radio.getName());
+ if (radio.getName().compareTo(workspaceSource.getName()) == 0) {
+ importSession.setSource(workspaceSource);
+ } else {
+ if (radio.getName().compareTo(fileSource.getName()) == 0) {
+ importSession.setSource(fileSource);
+ } else {
+
+ }
+
+ }
+
+ } catch (Exception e) {
+ Log.error("ToggleGroup: onValueChange "
+ + e.getLocalizedMessage());
+ }
+
+ }
+ });
+
+ setContent(sourceSelectionPanel);
+
+ }
+
+ @Override
+ public void setup() {
+ Log.debug("Setup Card");
+ Command sayNextCard = new Command() {
+ public void execute() {
+ try {
+ String sourceId = importSession.getSource().getId();
+ if (sourceId == null || sourceId.isEmpty()) {
+ Log.error("CSV Import Source Id: " + sourceId);
+ } else {
+ if (sourceId.compareTo("File") == 0) {
+ Log.info("NextCard CSVUploadFileCard");
+ CodelistMappingUploadFileCard csvUploadFileCard = new CodelistMappingUploadFileCard(
+ importSession);
+ getWizardWindow().addCard(csvUploadFileCard);
+ getWizardWindow().nextCard();
+ } else {
+ if (sourceId.compareTo("Workspace") == 0) {
+ Log.info("NextCard CSVWorkspaceSelectionCard");
+ CodelistMappingWorkSpaceSelectionCard csvWorkspaceSelectionCard = new CodelistMappingWorkSpaceSelectionCard(
+ importSession);
+ getWizardWindow().addCard(
+ csvWorkspaceSelectionCard);
+ getWizardWindow().nextCard();
+ } else {
+ Log.debug("No source selected and no card loaded");
+ }
+ }
+ }
+ } catch (Exception e) {
+ Log.error("sayNextCard :" + e.getLocalizedMessage());
+ }
+ }
+ };
+
+ getWizardWindow().setNextButtonCommand(sayNextCard);
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/dataresource/CodelistMappingImportCSS.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/dataresource/CodelistMappingImportCSS.java
new file mode 100644
index 0000000..04da495
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/dataresource/CodelistMappingImportCSS.java
@@ -0,0 +1,41 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client.dataresource;
+
+import com.google.gwt.resources.client.CssResource;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public interface CodelistMappingImportCSS extends CssResource {
+
+ @ClassName("wizard-title")
+ public String getWizardTitle();
+
+ @ClassName("wizard-footer")
+ public String getWizardFooter();
+
+ @ClassName("source-selection-hover")
+ public String getSourceSelectionHover();
+
+ @ClassName("column-excluded")
+ public String getColumnExcluded();
+
+ @ClassName("importSelection-sources")
+ public String getImportSelectionSources();
+
+ @ClassName("importSelection-source")
+ public String getImportSelectionSource();
+
+ @ClassName("sdmxRegistryUrlStyle")
+ public String getSDMXRegistryUrlStyle();
+
+ @ClassName("sdmxRegistryUrlInputStyle")
+ public String getSDMXRegistryUrlInputStyle();
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/dataresource/ResourceBundle.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/dataresource/ResourceBundle.java
new file mode 100644
index 0000000..8515d15
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/dataresource/ResourceBundle.java
@@ -0,0 +1,40 @@
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client.dataresource;
+
+
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.ImageResource;
+
+
+public interface ResourceBundle extends ClientBundle {
+
+ public static final ResourceBundle INSTANCE=GWT.create(ResourceBundle.class);
+
+ @Source("resources/CSVImportWizardTD.css")
+ CodelistMappingImportCSS importCss();
+
+ @Source("resources/arrow-refresh.png")
+ ImageResource refresh();
+
+ @Source("resources/arrow-refresh_16.png")
+ ImageResource refresh_16();
+
+ @Source("resources/arrow-refresh_32.png")
+ ImageResource refresh32();
+
+ @Source("resources/accept.png")
+ ImageResource csvCheckSuccess();
+
+ @Source("resources/error.png")
+ ImageResource csvCheckFailure();
+
+ @Source("resources/loading.gif")
+ ImageResource loading();
+
+ @Source("resources/information.png")
+ ImageResource information();
+
+
+}
+
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressBarUpdater.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressBarUpdater.java
new file mode 100644
index 0000000..736b46d
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressBarUpdater.java
@@ -0,0 +1,99 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.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;
+
+/**
+ * Updates a {@link ProgressBar} progress and text based on {@link CodelistMappingImportProgressListener} events.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class CodelistMappingImportProgressBarUpdater implements CodelistMappingImportProgressListener {
+
+ protected ProgressBar progressBar;
+
+ /**
+ * Creates a new {@link ProgressBar} updater.
+ * @param progressBar the {@link ProgressBar} to update.
+ */
+ public CodelistMappingImportProgressBarUpdater(ProgressBar progressBar) {
+ this.progressBar = progressBar;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void operationComplete(TRId trId) {
+ Log.info("Import completed");
+ progressBar.updateProgress(1, "Import completed.");
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void operationFailed(Throwable caught, String reason, String failureDetails) {
+ Log.info("Import failed");
+ progressBar.updateText("Import failed");
+ }
+
+ @Override
+ public void operationInitializing() {
+ Log.info("Inport Inizializing");
+ progressBar.updateProgress(0, "Initializing...");
+ }
+
+ @Override
+ public void operationUpdate(float elaborated) {
+ Log.info("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+"% Importing...");
+ }
+ if (elaborated == 1) progressBar.updateProgress(1, "Completing...");
+
+ }
+
+ @Override
+ public void operationValidate(float elaborated) {
+ Log.info("Validation Elaborated: "+elaborated);
+ if (elaborated == 0) progressBar.updateProgress(0, "Start Validation...");
+ if (elaborated>0 && elaborated<1) {
+ Log.trace("Validation progress "+elaborated);
+ int elab=new Float(elaborated*100).intValue();
+ progressBar.updateProgress(elaborated,elab+"% Validation Progress...");
+ }
+ if (elaborated == 1) progressBar.updateProgress(1, "Validation...");
+ }
+
+ @Override
+ public void operationStopped(TRId trId,String reason, String details) {
+ Log.debug("Operation Stopped: ["+trId.toString()+", "+reason+", "+details+"]");
+ progressBar.updateText("Validations failed");
+
+ }
+
+
+ @Override
+ public void operationGeneratingView() {
+ Log.info("Generating View...");
+ progressBar.updateText("Generating View...");
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressListener.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressListener.java
new file mode 100644
index 0000000..a118699
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressListener.java
@@ -0,0 +1,63 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.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 CodelistMappingImportProgressListener {
+
+ /**
+ * 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 there is a validate for the operation.
+ * @param elaborated the elaborated part.
+ */
+ public void operationValidate(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 stopped
+ *
+ * @param trId
+ * @param reason
+ * @param details
+ */
+ public void operationStopped(TRId trId, String reason, String details);
+
+ /**
+ * Called when the operation is generating the view
+ */
+ public void operationGeneratingView();
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressUpdater.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressUpdater.java
new file mode 100644
index 0000000..87744c9
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/CodelistMappingImportProgressUpdater.java
@@ -0,0 +1,193 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.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.CSVImportMonitor;
+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;
+
+/**
+ * This {@link Timer} retrieves {@link OperationProgress} from the specified
+ * {@link OperationProgressSource} with the scheduled interval. The retrieved
+ * information are spread to the subscribed {@link CodelistMappingImportProgressListener}.
+ *
+ * @author "Giancarlo Panichi" g.panichi@isti.cnr.it
+ *
+ */
+public class CodelistMappingImportProgressUpdater extends Timer {
+
+ protected ArrayList listeners = new ArrayList();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void run() {
+ Log.debug("requesting operation progress");
+ TDGWTServiceAsync.INSTANCE
+ .getCSVImportMonitor(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(CSVImportMonitor result) {
+ Log.info("retrieved CSVImportMonitor: "
+ + result.getStatus());
+ switch (result.getStatus()) {
+ case INITIALIZING:
+ Log.info("CSV Import Initializing...");
+ fireOperationInitializing();
+ break;
+ case ABORTED:
+ cancel();
+ Log.info("CSV Import Operation Aborted");
+ break;
+ case IN_PROGRESS:
+ fireOperationUpdate(result.getProgress());
+ break;
+ case VALIDATING_RULES:
+ fireOperationValidate(result.getProgress());
+ break;
+ case GENERATING_VIEW:
+ Log.info("Generating View...");
+ fireOperationGeneratingView();
+ 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(CSVImportMonitor result) {
+ Log.info("CSV Import Failed");
+ Throwable th = null;
+ String failure = null;
+ String details = null;
+ if (result.getError() != null) {
+ th = result.getError();
+ failure = "Failed Client Library Import";
+ details = result.getError().getLocalizedMessage();
+ } else {
+ th = new Throwable("Failed");
+ failure = "Failed Client Library Import";
+ details = "Error in import";
+ }
+ fireOperationFailed(th, failure, details);
+
+ }
+
+ protected void stopMessage(CSVImportMonitor result) {
+ Log.info("CSV Import Stopped");
+ String failure = null;
+ String details = null;
+ if (result.getError() != null) {
+ failure = "Stopped";
+ details = result.getError().getLocalizedMessage();
+ } else {
+ failure = "Stopped";
+ details = "Stopped import CSV";
+ }
+
+ fireOperationStopped(result.getTrId(),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 (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationInitializing();
+ }
+
+ protected void fireOperationGeneratingView() {
+ for (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationGeneratingView();
+ }
+
+ protected void fireOperationUpdate(float elaborated) {
+ for (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationUpdate(elaborated);
+ }
+
+ protected void fireOperationValidate(float elaborated) {
+ for (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationValidate(elaborated);
+ }
+
+ protected void fireOperationComplete(TRId trId) {
+ for (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationComplete(trId);
+ }
+
+ protected void fireOperationFailed(Throwable caught, String failure,
+ String failureDetails) {
+ for (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationFailed(caught, failure, failureDetails);
+ }
+
+ protected void fireOperationStopped(TRId trId, String reason, String details) {
+ for (CodelistMappingImportProgressListener listener : listeners)
+ listener.operationStopped(trId,reason, details);
+ }
+
+ /**
+ * Add a new {@link CodelistMappingImportProgressListener} to this
+ * {@link CodelistMappingImportProgressUpdater}.
+ *
+ * @param listener
+ * the listener to add.
+ */
+ public void addListener(CodelistMappingImportProgressListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes the specified {@link CodelistMappingImportProgressListener} from this
+ * {@link CodelistMappingImportProgressUpdater}.
+ *
+ * @param listener
+ * the listener to remove.
+ */
+ public void removeListener(CodelistMappingImportProgressListener listener) {
+ listeners.remove(listener);
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressBarUpdater.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressBarUpdater.java
new file mode 100644
index 0000000..196d3bb
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressBarUpdater.java
@@ -0,0 +1,64 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.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 CodelistMappingImportProgressListener} events.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class FileUploadProgressBarUpdater implements FileUploadProgressListener {
+
+ protected ProgressBar progressBar;
+
+ /**
+ * Creates a new {@link ProgressBar} updater.
+ * @param progressBar the {@link ProgressBar} to update.
+ */
+ public FileUploadProgressBarUpdater(ProgressBar progressBar) {
+ this.progressBar = progressBar;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void operationComplete() {
+ Log.info("File upload complete");
+ progressBar.updateProgress(1, "File upload completed.");
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void operationFailed(Throwable caught, String reason, String failureDetails) {
+ Log.info("File upload failed");
+ progressBar.updateText("File upload failed.");
+ }
+
+ public void operationInitializing() {
+ Log.info("File upload inizializing");
+ progressBar.updateProgress(0, "Initializing...");
+ }
+
+ public void operationUpdate(float elaborated) {
+ Log.info("File upload 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+"% Uploading...");
+ }
+ if (elaborated == 1) progressBar.updateProgress(1, "Completed.");
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressCardUpdater.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressCardUpdater.java
new file mode 100644
index 0000000..dc78562
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressCardUpdater.java
@@ -0,0 +1,45 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client.progress;
+
+
+import com.allen_sauer.gwt.log.client.Log;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class FileUploadProgressCardUpdater implements FileUploadProgressListener {
+
+
+ /**
+ *
+ */
+ public FileUploadProgressCardUpdater() {
+ }
+
+
+ public void operationComplete() {
+ Log.info("File upload completed");
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void operationFailed(Throwable caught, String reason, String failureDetails) {
+ Log.info("File upload failed");
+ }
+
+ public void operationInitializing() {
+ Log.info("File upload inizializing");
+ }
+
+ public void operationUpdate(float elaborated) {
+ Log.info("File uploading: "+elaborated);
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressListener.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressListener.java
new file mode 100644
index 0000000..51adc17
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressListener.java
@@ -0,0 +1,41 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client.progress;
+
+
+
+
+/**
+ * Defines a listener for operation progress.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public interface FileUploadProgressListener {
+
+ /**
+ * 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/codelistmappingimportwidget/client/progress/FileUploadProgressUpdater.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressUpdater.java
new file mode 100644
index 0000000..ead8112
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/progress/FileUploadProgressUpdater.java
@@ -0,0 +1,127 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client.progress;
+
+import java.util.ArrayList;
+
+import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
+import org.gcube.portlets.user.td.gwtservice.shared.file.FileUploadMonitor;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+/**
+ * This {@link Timer} retrieves {@link OperationProgress} from the specified {@link OperationProgressSource} with the scheduled interval.
+ * The retrieved information are spread to the subscribed {@link CodelistMappingImportProgressListener}.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class FileUploadProgressUpdater extends Timer {
+
+ protected ArrayList listeners = new ArrayList();
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void run() {
+ Log.debug("requesting operation progress");
+ TDGWTServiceAsync.INSTANCE.getFileUploadMonitor(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(FileUploadMonitor result) {
+ Log.info("retrieved FileUploadMonitor: "+result.getState());
+ switch (result.getState()) {
+ case STARTED:
+ Log.debug("File Upload Started");
+ break;
+ case INPROGRESS:
+ Log.debug("Progress: "+result.getElaboratedLenght()+" of "+result.getTotalLenght());
+ fireOperationUpdate(result.getPercentDone());
+ break;
+ case FAILED:
+ Log.debug("File Upload Failed");
+ cancel();
+ fireOperationFailed(new Throwable("Failed Client Library Import") ,result.getFailureReason(), result.getFailureDetails());
+ break;
+ case COMPLETED:
+ cancel();
+ Log.debug("File Upload Completed");
+ fireOperationComplete();
+ break;
+ default:
+ break;
+ }
+
+ }
+
+
+
+
+
+ });
+
+
+
+ }
+
+
+
+ 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 (FileUploadProgressListener listener:listeners) listener.operationInitializing();
+ }
+
+ protected void fireOperationUpdate(float elaborated)
+ {
+ for (FileUploadProgressListener listener:listeners) listener.operationUpdate(elaborated);
+ }
+
+ protected void fireOperationComplete()
+ {
+ for (FileUploadProgressListener listener:listeners) listener.operationComplete();
+ }
+
+ protected void fireOperationFailed(Throwable caught, String failure, String failureDetails)
+ {
+ for (FileUploadProgressListener listener:listeners) listener.operationFailed(caught, failure, failureDetails);
+ }
+
+ /**
+ * Add a new {@link CodelistMappingImportProgressListener} to this {@link FileUploadProgressUpdater}.
+ * @param listener the listener to add.
+ */
+ public void addListener(FileUploadProgressListener listener)
+ {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes the specified {@link CodelistMappingImportProgressListener} from this {@link FileUploadProgressUpdater}.
+ * @param listener the listener to remove.
+ */
+ public void removeListener(FileUploadProgressListener listener)
+ {
+ listeners.remove(listener);
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/util/ErrorMessageBox.java b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/util/ErrorMessageBox.java
new file mode 100644
index 0000000..6ac73d8
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/codelistmappingimportwidget/client/util/ErrorMessageBox.java
@@ -0,0 +1,67 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.codelistmappingimportwidget.client.util;
+
+import com.google.gwt.core.client.Callback;
+import com.google.gwt.user.client.ui.Label;
+import com.sencha.gxt.widget.core.client.Dialog;
+import com.sencha.gxt.widget.core.client.Dialog.PredefinedButton;
+import com.sencha.gxt.widget.core.client.box.MessageBox;
+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 ErrorMessageBox {
+
+
+ private static final String DETAILS = "Details";
+
+
+ public static void showError(String title, String failureReason, final String failureDetails)
+ {
+ showError(title, failureReason, failureDetails, new NOPCallBack