diff --git a/pom.xml b/pom.xml index 681565c..1a07ed2 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,11 @@ org.gcube.resources.discovery ic-client + + com.google.code.gson + gson + 2.8.5 + org.gcube.core common-encryption diff --git a/src/main/java/org/gcube/portal/ddas/DdasVREService.java b/src/main/java/org/gcube/portal/ddas/DdasVREService.java index 663abee..618d047 100644 --- a/src/main/java/org/gcube/portal/ddas/DdasVREService.java +++ b/src/main/java/org/gcube/portal/ddas/DdasVREService.java @@ -1,72 +1,101 @@ package org.gcube.portal.ddas; + + import java.io.BufferedReader; import java.io.IOException; +import java.net.URL; import java.util.Base64; -import javax.portlet.PortletRequestDispatcher; -import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import com.liferay.portal.kernel.json.JSONFactoryUtil; -import com.liferay.portal.kernel.json.JSONObject; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.liferay.portal.kernel.log.LogFactoryUtil; +import net.spy.memcached.MemcachedClient; +import net.spy.memcached.internal.OperationFuture; + /** * Servlet implementation class DdasVREService */ public class DdasVREService extends HttpServlet { private static final long serialVersionUID = 1L; private static com.liferay.portal.kernel.log.Log _log = LogFactoryUtil.getLog(DdasVREService.class); - /** - * @see HttpServlet#HttpServlet() - */ - public DdasVREService() { - super(); - } + private static final int CACHE_SECONDS_EXPIRATION = 1800; //30 minutes + - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String toReturn = "
Blue-Cloud VRE - DD&AS integration accepts POST method only
"; + /** + * @see HttpServlet#HttpServlet() + */ + public DdasVREService() { + super(); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String toReturn = "
Blue-Cloud VRE - DD&AS integration accepts POST method only
"; response.setContentType("text/html"); response.getWriter().write(toReturn); - } - - + } + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuffer sb = new StringBuffer(); String line = null; - - JSONObject jsonObject = null; + JsonObject jsonObject = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) { sb.append(line); } - System.out.println("GOT String: "+sb.toString()); - jsonObject = JSONFactoryUtil.createJSONObject(sb.toString()); + _log.debug("GOT String: "+sb.toString()); + JsonParser parser = new JsonParser(); + jsonObject = parser.parse(sb.toString()).getAsJsonObject(); } catch (Exception e) { _log.error("Error parsing JSON request string", e); } - - - - - Base64.Encoder withoutPaddingEncoder = Base64.getEncoder().withoutPadding(); - String requestIdParam = withoutPaddingEncoder.encodeToString("request_id".getBytes()); - String requestId = jsonObject.getString("request_id"); - System.out.println("GOT JSON"); - System.out.println("JSON="+jsonObject.toString()); - - String redirect_url = "/group/nomesito/vre-data-pool-pagina?"+requestIdParam+"="+requestId; - - String toReturn = "{\"success\": true, \"redirect_url\": \""+redirect_url+"\"}"; + + BrokerResponse theResponse = null; + String requestId = jsonObject.get("request_id").getAsString(); + if (requestId == null || requestId.equals("")) { + theResponse = new BrokerResponse(405, "Method Not Allowed, something is wrong in the JSON, request_id not found", null); + } + _log.debug("GOT JSON"); + _log.debug("JSON="+jsonObject.toString()); + boolean result = authorizeRequest(requestId, jsonObject); + if (result) { + int status = 200; + Base64.Encoder withoutPaddingEncoder = Base64.getEncoder().withoutPadding(); + String requestIdParam = withoutPaddingEncoder.encodeToString("request_id".getBytes()); + String message = "Started downloading order files to Virtual Research Environment '"+requestId+"'"; + String vreConfirmUrl = "https://blue-cloud.d4science.org/group/bluecloud-gateway/vre-data-pool?"+requestIdParam+"="+requestId; //redirect URL + URL theURL = new URL(vreConfirmUrl); + theResponse = new BrokerResponse(status, message, theURL); + } + else { + theResponse = new BrokerResponse(500, "An error occurred in the VRE Service, downlaod not possible", null); + } + Gson gson = new Gson(); + String toReturn = gson.toJson(theResponse); response.setContentType("application/json"); response.getWriter().write(toReturn); + } + + private boolean authorizeRequest(String requestId,JsonObject jsonObject) { + OperationFuture writeOp = null; + try { + MemcachedClient mClient = new DistributedCacheClient().getMemcachedClient(); + writeOp = mClient.set(requestId, CACHE_SECONDS_EXPIRATION, jsonObject.toString()); + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + return writeOp.getStatus().isSuccess(); + } + return writeOp.getStatus().isSuccess(); } }