added lock server-side to ckeck if ws-sync is on-going

added message one-shot if a folder is under sync

git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@165516 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2018-03-28 16:35:12 +00:00
parent 8ec93e3684
commit 90d1be3a05
9 changed files with 165 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gcube.portal.clientcontext.client.GCubeClientContext;
import org.gcube.portlets.user.workspace.client.ConstantsExplorer.WS_UPLOAD_TYPE;
@ -18,6 +19,8 @@ import org.gcube.portlets.user.workspace.client.event.AddFolderEvent;
import org.gcube.portlets.user.workspace.client.event.AddFolderEventHandler;
import org.gcube.portlets.user.workspace.client.event.AddSmartFolderEvent;
import org.gcube.portlets.user.workspace.client.event.AddSmartFolderEventHandler;
import org.gcube.portlets.user.workspace.client.event.CheckItemLockedBySyncEvent;
import org.gcube.portlets.user.workspace.client.event.CheckItemLockedBySyncEventHandler;
import org.gcube.portlets.user.workspace.client.event.CompletedFileUploadEvent;
import org.gcube.portlets.user.workspace.client.event.CompletedFileUploadEventHandler;
import org.gcube.portlets.user.workspace.client.event.CopytemEvent;
@ -195,6 +198,8 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
private UserStore userStore = new UserStore();
private static AppControllerExplorer singleton;
private Map<String, String> msgFolderSynched = new HashMap<String,String>();
private WsThreddsWidget wsThreddsWidget = new WsThreddsWidget();
/**
@ -242,6 +247,44 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
*/
private void bind() {
eventBus.addHandler(CheckItemLockedBySyncEvent.TYPE, new CheckItemLockedBySyncEventHandler() {
@Override
public void onCheckItemLockedBySync(final CheckItemLockedBySyncEvent checkItemLockedBySyncEvent) {
GWT.log("Fired CheckItemLocked...");
if(checkItemLockedBySyncEvent.getItem()!=null){
rpcWorkspaceService.isItemUnderSync(checkItemLockedBySyncEvent.getItem().getIdentifier(), new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(Boolean result) {
GWT.log("CheckItemLocked for folder: "+checkItemLockedBySyncEvent.getItem().getName() +" returned locked: "+result);
String msgDisplayed = msgFolderSynched.get(checkItemLockedBySyncEvent.getItem().getIdentifier());
if(msgDisplayed==null && result){
String msg= "The folder: "+checkItemLockedBySyncEvent.getItem().getName()+", "+ConstantsExplorer.MSG_FOLDER_LOCKED_BY_SYNC;
MessageBox.info("Warning: folder under synchornization", msg, null);
msgFolderSynched.put(checkItemLockedBySyncEvent.getItem().getIdentifier(), msg);
}
}
});
}
}
});
eventBus.addHandler(PublishOnDataCatalogueEvent.TYPE, new PublishOnDataCatalogueEventHandler() {
@Override

View File

@ -257,6 +257,7 @@ public static enum WS_UPLOAD_TYPE {File, Archive};
public static final int HEIGHT_DIALOG_SHARE_FOLDER = 445;
public static final String MSG_FOLDER_LOCKED_BY_SYNC= "is under synchronization process.\nPlease be aware that some operations are not currently available and that the content might change during this process.";
/**
* Log.

View File

@ -0,0 +1,36 @@
package org.gcube.portlets.user.workspace.client.event;
import org.gcube.portlets.user.workspace.client.model.FileModel;
import com.google.gwt.event.shared.GwtEvent;
public class CheckItemLockedBySyncEvent extends GwtEvent<CheckItemLockedBySyncEventHandler>{
public static Type<CheckItemLockedBySyncEventHandler> TYPE = new Type<CheckItemLockedBySyncEventHandler>();
private FileModel item;
public CheckItemLockedBySyncEvent(FileModel item) {
this.item = item;
}
@Override
public Type<CheckItemLockedBySyncEventHandler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(CheckItemLockedBySyncEventHandler handler) {
handler.onCheckItemLockedBySync(this);
}
/**
* @return the itemId
*/
public FileModel getItem() {
return item;
}
}

View File

@ -0,0 +1,20 @@
package org.gcube.portlets.user.workspace.client.event;
import com.google.gwt.event.shared.EventHandler;
/**
* The Interface CheckItemLockedBySyncEventHandler.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Mar 28, 2018
*/
public interface CheckItemLockedBySyncEventHandler extends EventHandler {
/**
* On check item locked by sync.
*
* @param checkItemLockedBySyncEvent the check item locked by sync event
*/
void onCheckItemLockedBySync(CheckItemLockedBySyncEvent checkItemLockedBySyncEvent);
}

View File

@ -4,7 +4,6 @@ import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ClientBundle.Source;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
/**

View File

@ -789,5 +789,14 @@ public interface GWTWorkspaceService extends RemoteService{
*/
List<GcubeVRE> getListOfVREsForLoggedUser()
throws Exception;
/**
* @param itemId
* @return
* @throws Exception
*/
Boolean isItemUnderSync(String itemId)
throws Exception;
}

View File

@ -214,6 +214,15 @@ public interface GWTWorkspaceServiceAsync {
*/
void getUrlById(String identifier, boolean isInternalUrl, boolean fullDetails, AsyncCallback<GWTWorkspaceItem> callback);
/**
* Creates the external url.
*
* @param parentId the parent id
* @param name the name
* @param description the description
* @param url the url
* @param callback the callback
*/
void createExternalUrl(
String parentId, String name, String description, String url,
AsyncCallback<FileModel> callback);
@ -777,4 +786,14 @@ public interface GWTWorkspaceServiceAsync {
* @return the list of vr es for logged user
*/
void getListOfVREsForLoggedUser(AsyncCallback<List<GcubeVRE>> callback);
/**
* Checks if is item under sync.
*
* @param itemId the item id
* @param callback the callback
*/
void isItemUnderSync(String itemId, AsyncCallback<Boolean> callback);
}

View File

@ -6,6 +6,7 @@ import java.util.List;
import org.gcube.portlets.user.workspace.client.AppControllerExplorer;
import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
import org.gcube.portlets.user.workspace.client.constant.WorkspaceOperation;
import org.gcube.portlets.user.workspace.client.event.CheckItemLockedBySyncEvent;
import org.gcube.portlets.user.workspace.client.event.ExpandFolderEvent;
import org.gcube.portlets.user.workspace.client.event.MoveItemEvent;
import org.gcube.portlets.user.workspace.client.event.SelectedItemEvent;
@ -886,6 +887,8 @@ public class AsyncTreePanel extends LayoutContainer {
store.removeAll(folder);
addChildrenToFolder(folder, result);
GWT.log("End RPC - getFolderChildren");
AppControllerExplorer.getEventBus().fireEvent(new CheckItemLockedBySyncEvent(folder));
}
});

View File

@ -46,6 +46,7 @@ import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashItem;
import org.gcube.common.portal.PortalContext;
import org.gcube.portal.wssynclibrary.shared.ItemNotSynched;
import org.gcube.portal.wssynclibrary.shared.WorkspaceFolderLocked;
import org.gcube.portal.wssynclibrary.shared.thredds.Sync_Status;
import org.gcube.portal.wssynclibrary.thredds.WorkspaceThreddsSynchronize;
import org.gcube.portlets.user.urlshortener.UrlShortener;
import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
@ -661,6 +662,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
if(itemId == null)
throw new Exception(IDENTIFIER_IS_NULL);
checkItemLocked(itemId);
checkItemLocked(destinationId);
workspaceLogger.trace("moveItem item: "+itemId+" destination: "+destinationId);
WorkspaceItem sourceItem = workspace.getItem(itemId); //GET SOURCE ITEM BEFORE OF MOVE
@ -692,6 +696,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
return Boolean.TRUE;
}catch (WorkspaceFolderLocked e1){
throw new Exception(e1.getMessage());
}catch (InsufficientPrivilegesException e) {
workspaceLogger.error("Error in server Item move", e);
String error = "An error occurred on moving item. "+e.getMessage();
@ -4357,4 +4364,31 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
}
}
/**
* Checks if is item under sync.
*
* @return true, if is item under sync
* @throws Exception
*/
@Override
public Boolean isItemUnderSync(String itemId) throws Exception{
try {
GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest());
try{
Sync_Status status = WorkspaceThreddsSynchronize.getInstance().getSynchedStatusFromItemProperty(itemId, user.getUsername());
}catch(Exception e){
return false;
}
//HERE THE ITEM IS SYNCHED SO CHECK IF IT IS LOCKED
checkItemLocked(itemId);
return false;
}catch (WorkspaceFolderLocked e1){
return true;
}catch (Exception e) {
throw new Exception("Error on checking item "+itemId+" is under sync");
}
}
}