diff --git a/.classpath b/.classpath deleted file mode 100644 index fae1a2b..0000000 --- a/.classpath +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 714351a..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/CHANGELOG.md b/CHANGELOG.md index 65fc15e..91e4ae5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.spatial.data.sdi-service -## [v1.4.2-SNAPSHOT] 2020-05-15 +## [v1.0.0-SNAPSHOT] 2020-05-15 + + ### Fixes diff --git a/pom.xml b/pom.xml index ebe28bc..71ccb5d 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.gcube.spatial.data ws-thredds - 0.2.3-SNAPSHOT + 1.0.0-SNAPSHOT ws-thredds prototype of WS integration with data-transfer for Thredds pubblication diff --git a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Process.java b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Process.java index d3134d6..c2bba7b 100644 --- a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Process.java +++ b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Process.java @@ -59,14 +59,15 @@ public class Process { private CompletionCallback callback=null; public Process(String folderId,CompletionCallback callback) throws WorkspaceInteractionException, InternalException { - log.debug("Created Process with id {} ",processId); + String operator=Security.getToken(); + log.debug("Created Process with id {}, operator {} ",processId,operator); // this.folderId=folderId; manager=new WorkspaceFolderManager(folderId); manager.lock(processId); SynchFolderConfiguration folderConfig=manager.getSynchConfiguration(); - try { - descriptor=new ProcessDescriptor(folderId, manager.getTheFolder().get().getPath(),System.currentTimeMillis(),processId,folderConfig); + try { + descriptor=new ProcessDescriptor(folderId, manager.getTheFolder().get().getPath(),System.currentTimeMillis(),processId,operator,folderConfig); }catch(Exception e) { throw new WorkspaceInteractionException("Unable to read path from folder "+folderId,e); } @@ -225,7 +226,7 @@ public class Process { } String relativePath=toScanFolder.get().getMetadata().getMap().get(Constants.WorkspaceProperties.REMOTE_PATH)+""; - ThreddsController folderController=new ThreddsController(relativePath,config.getTargetToken()); + ThreddsController folderController=new ThreddsController(relativePath,ownerProcess.getDescriptor().getOperator()); RemoteFileDescriptor folderDesc=null; try{ @@ -305,7 +306,7 @@ public class Process { }catch(ItemNotFoundException e) { log.info("Creating folder {} under {} ",item,folderPath); folder=toScanFolder.newFolder(item, "Imported from thredds"); - WorkspaceUtils.initProperties(folder,relativePath+"/"+item , config.getFilter(), config.getTargetToken(),config.getToCreateCatalogName(),config.getValidateMetadata(),config.getRootFolderId()); + WorkspaceUtils.initProperties(folder,relativePath+"/"+item , config.getFilter(), ownerProcess.getDescriptor().getOperator(),config.getToCreateCatalogName(),config.getValidateMetadata(),config.getRootFolderId()); generateRequests(ownerProcess, service, folder); } diff --git a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/ProcessDescriptor.java b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/ProcessDescriptor.java index e7bc75a..d84d293 100644 --- a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/ProcessDescriptor.java +++ b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/ProcessDescriptor.java @@ -14,6 +14,8 @@ public class ProcessDescriptor implements Cloneable{ private long launchTime; private String processId; + private String operator; + private SynchFolderConfiguration synchConfiguration; @Override diff --git a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Security.java b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Security.java new file mode 100644 index 0000000..82840a2 --- /dev/null +++ b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/Security.java @@ -0,0 +1,52 @@ +package org.gcube.usecases.ws.thredds.engine.impl; + +import static org.gcube.common.authorization.client.Constants.authorizationService; + +import org.gcube.common.authorization.client.exceptions.ObjectNotFound; +import org.gcube.common.authorization.library.AuthorizationEntry; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class Security { + + public static String getCurrentScope(){ + try{ + String token=SecurityTokenProvider.instance.get(); + log.debug("Token is : "+token); + if(token==null) throw new Exception("Security Token is null"); + AuthorizationEntry entry = authorizationService().get(token); + return entry.getContext(); + }catch(Exception e ){ + log.debug("Unable to resolve token, checking scope provider..",e); + return ScopeProvider.instance.get(); + } +} + + + public static String getContext(String token) throws ObjectNotFound, Exception { + log.debug("Resolving token {} ",token); + AuthorizationEntry entry = authorizationService().get(token); + return entry.getContext(); + } + + public static String getToken() { + return SecurityTokenProvider.instance.get(); + } + + +public static String getCurrentCaller(){ + try{ + String token=SecurityTokenProvider.instance.get(); + log.debug("Token is : "+token); + if(token==null) throw new Exception("Security Token is null"); + AuthorizationEntry entry = authorizationService().get(token); + return entry.getClientInfo().getId(); + }catch(Exception e ){ + log.debug("Unable to resolve token, checking scope provider..",e); + return "Unidentified data-transfer user"; + } +} +} diff --git a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/SynchEngineImpl.java b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/SynchEngineImpl.java index 86d371a..f78dcf2 100644 --- a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/SynchEngineImpl.java +++ b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/SynchEngineImpl.java @@ -138,6 +138,11 @@ public class SynchEngineImpl implements SyncEngine{ if (!manager.isSynched()) throw new WorkspaceNotSynchedException("Folder "+folderId+" is not configured for synchronization."); if(manager.isLocked()) throw new WorkspaceLockedException("Folder "+folderId+"is locked by an external process."); if(!manager.isRoot()) throw new WorkspaceFolderNotRootException("Unable to launch synch operation. Folder "+folderId+" is not root configuration"); + + //TODO check context + //TODO set operating context +// if(manager.getSynchConfiguration().get) + Process toLaunch=new Process(folderId,completionCallback); localProcesses.put(folderId, toLaunch); initializationExecutor.submit(new ProcessInitializationThread(toLaunch,synchronizationExecutor)); diff --git a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/WorkspaceFolderManager.java b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/WorkspaceFolderManager.java index dae4da4..80fda61 100644 --- a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/WorkspaceFolderManager.java +++ b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/WorkspaceFolderManager.java @@ -51,9 +51,27 @@ public class WorkspaceFolderManager { private StorageHubClient sc; + + private String operator=null; + + private String getToken() { + if(operator==null) { + log.warn("******************Using config operator**********"); + return config.getTargetToken(); + } + else return operator; + } + + + + public WorkspaceFolderManager(String folderId) throws WorkspaceInteractionException { try{ // ws = HomeLibrary.getHomeManagerFactory().getHomeManager().getHome().getWorkspace(); + String operator=Security.getToken(); + log.debug("Setting operator "+operator); + this.operator=operator; + sc=WorkspaceUtils.getClient(); theFolder=sc.open(folderId).asFolder(); this.folderId=folderId; @@ -70,7 +88,7 @@ public class WorkspaceFolderManager { public ThreddsController getThreddsController() throws WorkspaceNotSynchedException, WorkspaceInteractionException, InternalException { if(threddsController==null) { SynchFolderConfiguration config=getSynchConfiguration(); - threddsController=new ThreddsController(config.getRemotePath(),config.getTargetToken()); + threddsController=new ThreddsController(config.getRemotePath(),getToken()); } return threddsController; } @@ -79,7 +97,7 @@ public class WorkspaceFolderManager { try { FolderContainer root=sc.open(getSynchConfiguration().getRootFolderId()).asFolder(); SynchFolderConfiguration rootConfig=WorkspaceUtils.loadConfiguration(root); - return new ThreddsController(rootConfig.getRemotePath(),rootConfig.getTargetToken()); + return new ThreddsController(rootConfig.getRemotePath(),getToken()); }catch(StorageHubException e) { throw new WorkspaceInteractionException(e); } @@ -116,7 +134,7 @@ public class WorkspaceFolderManager { SynchFolderConfiguration config=getSynchConfiguration(); try{ - checkFolder(theFolder,recursively,config,null,theFolder.getId(),WorkspaceUtils.safelyGetLastUpdate(theFolder.get())); + checkFolder(theFolder,recursively,config,null,theFolder.getId(),WorkspaceUtils.safelyGetLastUpdate(theFolder.get()),getToken()); return new SyncFolderDescriptor(this.folderId,this.theFolder.get().getPath(),config); }catch(StorageHubException e) { throw new WorkspaceInteractionException(e); @@ -151,7 +169,7 @@ public class WorkspaceFolderManager { try { String catalogName=toSet.getToCreateCatalogName(); - ThreddsController controller= new ThreddsController(toSet.getRemotePath(),toSet.getTargetToken()); + ThreddsController controller= new ThreddsController(toSet.getRemotePath(),getToken()); if(!controller.existsThreddsFile(null)) { log.info("Folder not found, creating it.."); controller.createEmptyFolder(null); @@ -241,7 +259,7 @@ public class WorkspaceFolderManager { - private static void checkFolder(FolderContainer folder,boolean recursive, SynchFolderConfiguration rootConfig, String relativePathFromRootFolder, String rootFolderId,Date lastUpdatedRoutine) throws StorageHubException, InternalException { + private static void checkFolder(FolderContainer folder,boolean recursive, SynchFolderConfiguration rootConfig, String relativePathFromRootFolder, String rootFolderId,Date lastUpdatedRoutine, String toUseToken) throws StorageHubException, InternalException { // Check folder configuration log.trace("Checking folder {} ",folder.get().getPath()); log.debug("Configuration is {}, relativePath is {} ",rootConfig,relativePathFromRootFolder); @@ -252,7 +270,7 @@ public class WorkspaceFolderManager { - ThreddsController controller=new ThreddsController(currentRemotePath, rootConfig.getTargetToken()); + ThreddsController controller=new ThreddsController(currentRemotePath, toUseToken); HashSet currentFolderExistingItem=new HashSet(); @@ -269,7 +287,7 @@ public class WorkspaceFolderManager { String itemRemotePath=currentRemotePath+"/"+itemName; if(item.getType().equals(ContainerType.FOLDER)) { if(recursive) - checkFolder((FolderContainer) item,recursive,rootConfig,itemRelativePath,rootFolderId,lastUpdatedRoutine); + checkFolder((FolderContainer) item,recursive,rootConfig,itemRelativePath,rootFolderId,lastUpdatedRoutine,toUseToken); else WorkspaceUtils.initProperties(item, itemRemotePath, rootConfig.getFilter(), rootConfig.getTargetToken(),rootConfig.getToCreateCatalogName(),rootConfig.getValidateMetadata(),rootFolderId); }else if(rootConfig.matchesFilter(itemName)) { if(!WorkspaceUtils.isConfigured(item.get())) diff --git a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/threads/SynchronizationThread.java b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/threads/SynchronizationThread.java index d79f756..f2b7176 100644 --- a/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/threads/SynchronizationThread.java +++ b/src/main/java/org/gcube/usecases/ws/thredds/engine/impl/threads/SynchronizationThread.java @@ -73,7 +73,7 @@ public class SynchronizationThread implements Runnable { FolderContainer parentFolder=client.open(parentFolderItem.getId()).asFolder(); checkCancelledProcess(); SynchFolderConfiguration synchConfig=WorkspaceUtils.loadConfiguration(parentFolder); - ThreddsController controller=new ThreddsController(synchConfig.getRemotePath(), synchConfig.getTargetToken()); + ThreddsController controller=new ThreddsController(synchConfig.getRemotePath(), theRequest.getProcess().getDescriptor().getOperator()); if(theRequest instanceof TransferToThreddsRequest) { TransferToThreddsRequest request=(TransferToThreddsRequest) theRequest; diff --git a/src/main/java/org/gcube/usecases/ws/thredds/faults/GenericWebException.java b/src/main/java/org/gcube/usecases/ws/thredds/faults/GenericWebException.java new file mode 100644 index 0000000..33f3c36 --- /dev/null +++ b/src/main/java/org/gcube/usecases/ws/thredds/faults/GenericWebException.java @@ -0,0 +1,49 @@ +package org.gcube.usecases.ws.thredds.faults; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(callSuper = true) +public class GenericWebException extends Exception{ + + + + /** + * + */ + private static final long serialVersionUID = 5200927893712698886L; + + private String remoteMessage=null; + + private Integer responseHTTPCode=0; + + public GenericWebException() { + super(); + // TODO Auto-generated constructor stub + } + + public GenericWebException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public GenericWebException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public GenericWebException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public GenericWebException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + +}