package org.gcube.portlets.widgets.wsthreddssync.client; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.gcube.portal.wssynclibrary.shared.WorkspaceFolderLocked; import org.gcube.portal.wssynclibrary.shared.thredds.ThSyncStatus; import org.gcube.portlets.widgets.wsthreddssync.client.SyncCompletedNotification.HasWsSyncNotificationListner; import org.gcube.portlets.widgets.wsthreddssync.client.SyncCompletedNotification.SyncCompletedNotificationListner; import org.gcube.portlets.widgets.wsthreddssync.client.dialog.DialogConfirm; import org.gcube.portlets.widgets.wsthreddssync.client.dialog.DialogResult; import org.gcube.portlets.widgets.wsthreddssync.client.event.PerformDoSyncEvent; import org.gcube.portlets.widgets.wsthreddssync.client.event.PerformDoSyncEventHandler; import org.gcube.portlets.widgets.wsthreddssync.client.event.PerformDoUnSyncEvent; import org.gcube.portlets.widgets.wsthreddssync.client.event.PerformDoUnSyncEventHandler; import org.gcube.portlets.widgets.wsthreddssync.client.event.ShowMonitorSyncStatusEvent; import org.gcube.portlets.widgets.wsthreddssync.client.event.ShowMonitorSyncStatusEventHandler; import org.gcube.portlets.widgets.wsthreddssync.client.rpc.ThreddsWorkspaceSyncServiceAsync; import org.gcube.portlets.widgets.wsthreddssync.client.view.LoaderIcon; import org.gcube.portlets.widgets.wsthreddssync.client.view.WsThreddsWidgetViewManager; import org.gcube.portlets.widgets.wsthreddssync.client.view.binder.MonitorFolderSyncStatusView; import org.gcube.portlets.widgets.wsthreddssync.shared.GatewayRolesThredds; import org.gcube.portlets.widgets.wsthreddssync.shared.WsFolder; import org.gcube.portlets.widgets.wsthreddssync.shared.WsThreddsSynchFolderConfiguration; import org.gcube.portlets.widgets.wsthreddssync.shared.WsThreddsSynchFolderDescriptor; import com.github.gwtbootstrap.client.ui.Alert; import com.github.gwtbootstrap.client.ui.Modal; import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.HorizontalPanel; // TODO: Auto-generated Javadoc /** * The Class WsThreddsWidget. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Feb 14, 2018 */ public class WsThreddsWidget implements HasWsSyncNotificationListner { /** The ws thredds sync service. */ public static final ThreddsWorkspaceSyncServiceAsync wsThreddsSyncService = ThreddsWorkspaceSyncServiceAsync.Util.getInstance(); /** The Constant eventBus. */ public final static HandlerManager eventBus = new HandlerManager(null); private WsThreddsWidgetViewManager viewManager = new WsThreddsWidgetViewManager(); private final List syncEventsListeners = new ArrayList(); public static final String MISSING_THREDDS_ADMIN_RIGHTS = "It seems you are not authorized to create a configuration towards THREDDS Catalogue. Request it to the VRE manager or the portal administrator."; public static final String MISSING_THREDDS_PUBLISHER_RIGHTS = "It seems you are not authorized to run a syncronization task towards THREDDS Catalogue. Request it to the VRE manager or the portal administrator."; public static final String MISSING_THREDDS_RIGHTS = "It seems you are not authorized to interact with the facility 'Sync with THREDDS'. Request authorization to the VRE manager or the portal administrator."; /** * This is the entry point method. */ public WsThreddsWidget() { bindEvents(); } /** * Bind events. */ private void bindEvents() { eventBus.addHandler(PerformDoSyncEvent.TYPE, new PerformDoSyncEventHandler() { @Override public void onPerformDoSync(PerformDoSyncEvent performDoSyncEvent) { //GWT.log("One PerformDoSyncEvent "+Random.nextDouble()); if(performDoSyncEvent.getFolder()!=null) performFolderSync(performDoSyncEvent.getFolder(), performDoSyncEvent.getConf()); } }); eventBus.addHandler(ShowMonitorSyncStatusEvent.TYPE, new ShowMonitorSyncStatusEventHandler() { @Override public void onShowMonitorSyncStatus(ShowMonitorSyncStatusEvent showSyncStatusEvent) { if(showSyncStatusEvent.getFolder()!=null) viewManager.showMonitorSyncToFolder(showSyncStatusEvent.getFolder(), syncEventsListeners); } }); eventBus.addHandler(PerformDoUnSyncEvent.TYPE, new PerformDoUnSyncEventHandler() { @Override public void onPerformDoUnSync(final PerformDoUnSyncEvent performDoUnSyncEvent) { GWT.log("DO UnSync performed on: "+performDoUnSyncEvent.getFolder()); if(performDoUnSyncEvent.getFolder()!=null){ final DialogConfirm confirm = new DialogConfirm(null, "Unsync confirm?", "Deleting sync configurations to the folder '"+performDoUnSyncEvent.getFolder().getFoderName()+"'
Confirm?"); confirm.getYesButton().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { confirm.hide(); performFolderUnSync(performDoUnSyncEvent.getFolder()); } }); confirm.getElement().getStyle().setZIndex(Integer.MAX_VALUE-1000); confirm.center(); } } }); } /** * Show sync folder info. * * @param folder the folder * @throws Exception the exception */ public void showSyncFolderInfo(final WsFolder folder) throws Exception { if(folder==null || folder.getFolderId()==null) throw new Exception("Invalid parameter folder null"); MonitorFolderSyncStatusView monitor = viewManager.getMonitor(folder); //SHOWING CURRENT ACTIVE MONITOR if(monitor!=null) { GWT.log("Monitor for folder: "+folder.getFolderId() +" exists showing it.."); viewManager.showMonitorSyncToFolder(folder, syncEventsListeners); return; } final Modal box = new Modal(true); box.setTitle("Checking configurations..."); final HorizontalPanel hpLoader = new HorizontalPanel(); LoaderIcon loader = new LoaderIcon("Checking authorizations and folder configurations..."); hpLoader.add(loader); box.add(hpLoader); //LAOADING ROLES WsThreddsWidget.wsThreddsSyncService.getScopesWithThreddsRolesForLoggedUser(new AsyncCallback>() { @Override public void onFailure(Throwable caught) { hpLoader.clear(); hpLoader.setVisible(false); Alert alert = new Alert(); alert.setType(AlertType.INFO); alert.setText(caught.getMessage()); box.add(alert); } @Override public void onSuccess(Map result) { try { hpLoader.clear(); hpLoader.setVisible(false); }catch (Exception e) { //Silent } if(result!=null) { GWT.log("Returned Map(Scope,Role): "+result); final boolean isThreddsPubliser = result.containsValue(GatewayRolesThredds.DATA_EDITOR); final boolean isThreddsAdmin = result.containsValue(GatewayRolesThredds.DATA_MANAGER); //no rights assigned if(!isThreddsAdmin && !isThreddsPubliser) { showMissingRights(box); return; } //at least one THREDDS rights is assigned GWT.log("Performing isItemSynched: "+folder.getFolderId()); WsThreddsWidget.wsThreddsSyncService.isItemSynched(folder.getFolderId(), new AsyncCallback() { @Override public void onSuccess(WsThreddsSynchFolderDescriptor result) { box.hide(); //GWT.log("WsThreddsSynchFolderDescriptor result: "+result); viewManager.showThreddsFolderInfo(folder, result, isThreddsAdmin, isThreddsPubliser); } @Override public void onFailure(Throwable caught) { box.hide(); if(caught instanceof WorkspaceFolderLocked){ viewManager.showMonitorSyncToFolder(folder,syncEventsListeners); return; } viewManager.cancelMonitor(folder); Window.alert(caught.getMessage()); } }); }else { //no rights detected showMissingRights(box); return; } } }); box.show(); } private void showMissingRights(Modal box) { Alert alert = new Alert(); alert.setType(AlertType.WARNING); alert.setText(MISSING_THREDDS_RIGHTS); alert.setClose(false); box.add(alert); } private void performFolderUnSync(final WsFolder folder) { GWT.log("Performing doSyncFolder on: "+folder); final Modal box = new Modal(true); box.setTitle("Deleting..."); box.hide(false); LoaderIcon loader = new LoaderIcon("Deleting sync configurations to the folder: "+folder.getFoderName()); box.add(loader); wsThreddsSyncService.doUnSyncFolder(folder.getFolderId(), new AsyncCallback() { @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); if(box!=null) box.hide(); //CALLING METHOD ON SYNC ERROR TO THE LISTENERS for (SyncCompletedNotificationListner myListener : syncEventsListeners) { myListener.onSyncError(folder); } } @Override public void onSuccess(Boolean result) { box.hide(); if(result){ DialogResult dlg = new DialogResult(null, "Unsync performed", "Unsync was performed correctly"); dlg.center(); //CALLING METHOD UNSYNC PERFORMED COMPLETED TO THE LISTENERS for (SyncCompletedNotificationListner myListener : syncEventsListeners) { myListener.onUnSyncPerformed(folder); } } } }); box.show(); } /** * Perform folder sync. * * @param folder the folder * @param config the config */ private void performFolderSync(final WsFolder folder, WsThreddsSynchFolderConfiguration config) { GWT.log("Performing doSyncFolder on: "+folder); final Modal box = new Modal(true); box.setTitle("Starting synchronization..."); box.hide(false); LoaderIcon loader = new LoaderIcon("Inizializiting synchronization to the folder: "+folder.getFoderName()); box.add(loader); wsThreddsSyncService.doSyncFolder(folder.getFolderId(), config, new AsyncCallback() { @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); viewManager.cancelMonitor(folder); if(box!=null) box.hide(); } @Override public void onSuccess(ThSyncStatus result) { if(box!=null) box.hide(); GWT.log("doSyncFolder Updating sync status: "+result); viewManager.showMonitorSyncToFolder(folder, syncEventsListeners); } }); box.show(); } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsthreddssync.client.SyncCompletedNotification.HasWsSyncNotificationListner#addSyncCompletedListner(org.gcube.portlets.widgets.wsthreddssync.client.SyncCompletedNotification.SyncCompletedNotificationListner) */ @Override public void addSyncCompletedListner(SyncCompletedNotificationListner listner) { syncEventsListeners.add(listner); } }