diff --git a/pom.xml b/pom.xml index 289c817..8e4823c 100644 --- a/pom.xml +++ b/pom.xml @@ -73,6 +73,12 @@ + + org.gcube.data-publishing + storagehub-application-persistence + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + org.gcube.data.analysis dataminer-invocation-model diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java index a2d1dc9..b2ad509 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java @@ -3,12 +3,20 @@ */ package org.gcube.datatransfer.resolver.services; +import static org.gcube.common.authorization.client.Constants.authorizationService; +import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; +import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.nio.file.Files; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; @@ -22,18 +30,28 @@ import javax.ws.rs.core.Response; import javax.xml.bind.JAXBException; import org.apache.commons.io.IOUtils; +import org.gcube.common.authorization.library.AuthorizationEntry; +import org.gcube.common.authorization.library.provider.ClientInfo; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.encryption.StringEncrypter; +import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.Property; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.common.scope.impl.ScopeBean.Type; -import org.gcube.common.storagehub.client.dsl.FileContainer; -import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.Metadata; import org.gcube.data.analysis.dminvocation.ActionType; import org.gcube.data.analysis.dminvocation.DataMinerInvocationManager; import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; import org.gcube.datatransfer.resolver.requesthandler.TokenSetter; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; +import org.gcube.datatransfer.resolver.util.ScopeUtil; import org.gcube.datatransfer.resolver.util.Util; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.SimpleQuery; +import org.gcube.storagehub.ApplicationMode; +import org.gcube.storagehub.StorageHubManagement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; @@ -47,6 +65,14 @@ import org.xml.sax.SAXException; @Path("/analytics") public class AnalyticsCreateResolver { + /** + * + */ + protected static final String GCUBE_TOKEN = "gcube-token"; + /** + * + */ + private static final String ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME = "Analytics-Resolver"; private static final String DATAMINER_INVOCATION_MODEL = "dim"; private static Logger logger = LoggerFactory.getLogger(AnalyticsCreateResolver.class); private static String helpURI = "https://gcube.wiki.gcube-system.org/gcube/URI_Resolver#Analytics_Resolver"; @@ -58,6 +84,7 @@ public class AnalyticsCreateResolver { * @param req the req * @param body the body * @return the response + * @throws WebApplicationException the web application exception */ @POST @Path("/create") @@ -123,13 +150,29 @@ public class AnalyticsCreateResolver { ByteArrayOutputStream xmlByteArray = DataMinerInvocationManager.getInstance().marshaling(jsonRequest, org.gcube.data.analysis.dminvocation.MediaType.ApplicationXML, true); String uniqueName = createDMInvocationFileName(jsonRequest.getOperatorId()); tempInvocationFile = createTempFile(uniqueName, ".xml", xmlByteArray.toByteArray()); - - //CREATE THE FILE ON STORAGE HUB - StorageHubClient shc = new StorageHubClient(); logger.info("Created StorageHubClient Instance, uploading file: "+tempInvocationFile.getName()); - FileContainer fileContainer = shc.getWSRoot().uploadFile(new FileInputStream(tempInvocationFile), tempInvocationFile.getName(), "DataMinerInvocation Request created by "+this.getClass().getSimpleName()); - logger.info("UPLOADED FILE at: "+fileContainer.getPublicLink()); - URL thePublicLink = fileContainer.getPublicLink(); + + String infra = ScopeUtil.getInfrastructureNameFromScope(contextToken); + String theAppToken = readApplicationTokenFromSE(req, infra); + ApplicationMode applicationMode = new ApplicationMode(theAppToken); + applicationMode.start(); + + StorageHubManagement storageHubManagement = new StorageHubManagement(); + Metadata metadata = new Metadata(); + Map theMap = new HashMap(); + + AuthorizationEntry entry = authorizationService().get(contextToken); + //retrieve the info of the token owner + ClientInfo clientInfo = entry.getClientInfo(); + String owner = clientInfo.getId(); //IS THIS THE USERNAME? + theMap.put("owner", owner); + logger.info("Saving dataminer-invocation file for the user: "+owner); + URL thePublicLink = storageHubManagement.persistFile(new FileInputStream(tempInvocationFile), tempInvocationFile.getName(), "application/xml", metadata); + logger.info("Saved dataminer-invocation file at: "+thePublicLink); + +// FileContainer fileContainer = shc.getWSRoot().uploadFile(new FileInputStream(tempInvocationFile), tempInvocationFile.getName(), "DataMinerInvocation Request created by "+this.getClass().getSimpleName()); +// logger.info("UPLOADED FILE at: "+fileContainer.getPublicLink()); +// URL thePublicLink = fileContainer.getPublicLink(); publicLinkToDMInvFile = thePublicLink!=null?thePublicLink.toString():null; } catch (Exception e) { @@ -175,6 +218,78 @@ public class AnalyticsCreateResolver { } + /** + * Reads the Application Token from Service Endpoint {@link AnalyticsCreateResolver#ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME} + * + * @param req the req + * @param scope the scope + * @return the string + */ + private static String readApplicationTokenFromSE(HttpServletRequest req, String scope){ + + String origalScope = null; + String gCubeAppToken = null; + try{ + origalScope = ScopeProvider.instance.get(); + ScopeProvider.instance.set(scope); + logger.info("Searching SE "+ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME+" configurations in the scope: "+ScopeProvider.instance.get()); + + SimpleQuery query = queryFor(ServiceEndpoint.class); + query.addCondition("$resource/Profile/Name/text() eq '"+ ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME +"'"); + query.addCondition("$resource/Profile/Category/text() eq 'Service'"); + + DiscoveryClient client = clientFor(ServiceEndpoint.class); + List toReturn = client.submit(query); + + logger.info("The query returned "+toReturn.size()+ " ServiceEndpoint/s"); + + if(toReturn.size()==0){ + String errorMessage = "No "+ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME+" registered in the scope: "+ScopeProvider.instance.get(); + logger.error(errorMessage); + throw ExceptionManager.internalErrorException(req, errorMessage, AnalyticsCreateResolver.class, helpURI); + } + + + ServiceEndpoint se = toReturn.get(0); + Collection theAccessPoints = se.profile().accessPoints().asCollection(); + for (AccessPoint accessPoint : theAccessPoints) { + Collection properties = accessPoint.properties().asCollection(); + for (Property property : properties) { + if(property.name().equalsIgnoreCase(GCUBE_TOKEN)){ + logger.info("gcube-token as property was found, returning it"); + gCubeAppToken = property.value(); + break; + } + } + + if(gCubeAppToken!=null) + break; + } + + if(gCubeAppToken!=null){ + String decryptedPassword = StringEncrypter.getEncrypter().decrypt(gCubeAppToken); + logger.info("Returning decrypted Application Token registered into "+ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME +": "+decryptedPassword.substring(0,decryptedPassword.length()/2)+"...."); + return gCubeAppToken; + } + + + String errorMessage = "No "+GCUBE_TOKEN+" as Property saved in the "+ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME+" SE registered in the scope: "+ScopeProvider.instance.get(); + logger.error(errorMessage); + throw ExceptionManager.internalErrorException(req, errorMessage, AnalyticsCreateResolver.class, helpURI); + + + }catch(Exception e){ + String errorMessage = "Error occurred on reading the "+ANALYTICS_RESOLVER_SERVICE_ENDPOINT_NAME+" SE registered in the scope: "+ScopeProvider.instance.get(); + logger.error(errorMessage, e); + throw ExceptionManager.internalErrorException(req, errorMessage, AnalyticsCreateResolver.class, helpURI); + + }finally{ + if(origalScope!=null) + ScopeProvider.instance.reset(); + } + + } + /** * Creates the temp file. @@ -212,4 +327,11 @@ public class AnalyticsCreateResolver { return fileName; } + + public static void main(String[] args) { + + System.out.println(readApplicationTokenFromSE(null, "/gcube")); + + } + }