diff --git a/pom.xml b/pom.xml index 2a11b0f..c703bed 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,13 @@ provided + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + diff --git a/src/test/java/org/gcube/lb2pc/HttpRequest.java b/src/test/java/org/gcube/lb2pc/HttpRequest.java index 1afa9dd..90f5dfa 100644 --- a/src/test/java/org/gcube/lb2pc/HttpRequest.java +++ b/src/test/java/org/gcube/lb2pc/HttpRequest.java @@ -2,18 +2,10 @@ package org.gcube.lb2pc; public class HttpRequest { - /** - * - */ - private final Proxy ok; - - /** - * @param proxy - */ - HttpRequest(Proxy proxy) { - ok = proxy; + public HttpRequest() { + } - + public String getHeader(String string) { return null; } @@ -26,13 +18,26 @@ public class HttpRequest { return null; } - public String getContentType() { - return null; - } - public String getContent() { // TODO Auto-generated method stub return null; } + public String getContentType() { + String contentType = "application/json"; + if(this.getHeader("Content-Type")!=null) { + contentType = this.getHeader("Content-Type"); + } else if(this.getHeader("Accept")!=null) { + contentType = selectBestContenType(this.getHeader("Accept")); + } + return contentType; + } + + protected String getTransactionURI(HttpRequest request) { + return request.getHeader("X-Transaction-URI"); + } + + private String selectBestContenType(String header) { + return null; + } } \ No newline at end of file diff --git a/src/test/java/org/gcube/lb2pc/Proxy.java b/src/test/java/org/gcube/lb2pc/Proxy.java index 3e32053..bf400e1 100644 --- a/src/test/java/org/gcube/lb2pc/Proxy.java +++ b/src/test/java/org/gcube/lb2pc/Proxy.java @@ -1,118 +1,196 @@ package org.gcube.lb2pc; import java.net.MalformedURLException; +import java.util.List; +import java.util.Random; public class Proxy { - public HttpResponse service(HttpRequest request) throws Exception { + public HttpResponse onRequest(HttpRequest request) throws Exception { HttpMethod httpMethod = request.getMethod(); - if(httpMethod == HttpMethod.OPTIONS) { - sendTransactionServerList(); + switch(httpMethod) { + case OPTIONS: + return sendSupportedTransactionServiceList(request); + + case POST: + case HEAD: + case GET: + case PUT: + case DELETE: + String transactionURI = request.getTransactionURI(request); + + if(transactionURI!=null) { + // Transactional Client + return manageTransactionAction(request, transactionURI); + }else { + // Non-Transactional Client + return createMiniTransaction(request); + } + + default: + return sendErrorResponseToClient(HttpStatusCode._405, "Unsupported Operation"); + } - String transactionURI = request.getHeader("X-Transaction-URI"); - String requestURI = request.getRequestURI(); - String contentType = "application/json"; + } + + + + + protected HttpResponse manageTransactionAction(HttpRequest request, String transactionURI) throws Exception { - if(transactionURI!=null) { - // Transactional Client - - if(request.getHeader("Accept")!=null) { - contentType = request.getHeader("Accept"); - } + HttpMethod httpMethod = request.getMethod(); + String requestURI = request.getRequestURI(); + String contentType = request.getContentType(); + String lockURI = request.getHeader("X-Lock-URI"); + + if(lockURI!=null) { + // Client already own a lock, verifying and upgrading if needed + verifyAndUpgradeLock(httpMethod, contentType, lockURI, transactionURI, requestURI); + String shadowResourceURI = getShadowResourceURI(transactionURI, requestURI); + logRequest(shadowResourceURI, contentType, httpMethod, null); + + HttpResponse actionResponse = forwardAction(request); - String lockURI = request.getHeader("X-Lock-URI"); - - if(lockURI!=null) { - // Client already own a lock, verifying and upgrading if needed - verifyAndUpgradeLock(httpMethod, contentType, lockURI, transactionURI, requestURI); - - String shadowResourceURI = ShadowResource.getShadowResourceURI(transactionURI, requestURI); - logRequest(shadowResourceURI, contentType, httpMethod, null); - - HttpResponse actionResponse = forwardAction(request); - - actionResponse.setHeader("X-Lock-URI", lockURI); - actionResponse.setHeader("X-Transaction-URI", transactionURI); - return replyToClient(actionResponse); - - }else { - // Client does not own a lock - - if(httpMethod != HttpMethod.POST && httpMethod != HttpMethod.PUT && - httpMethod != HttpMethod.GET && httpMethod != HttpMethod.HEAD) { - // The first action on a resource must be a GET or a CREATE - sendErrorResponseToClient(HttpStatusCode._403, "A resource must be read before to be able to modify or delete it."); - } - - HttpResponse actionResponse = null; - - Lock lock = createLock(httpMethod, transactionURI, requestURI); - lockURI = lock.getLockURI(); - - String resource = null; - String shadowResourceURI= null; - - switch(httpMethod) { - case PUT: - - HttpResponse r = createHttpRequest(HttpMethod.HEAD, null, null, requestURI); - if(r.getHttpStatusCode() == HttpStatusCode._204 || (r.getHttpStatusCode().getCode()>=200 && r.getHttpStatusCode().getCode()<300)) { - lock.delete(); - sendErrorResponseToClient(HttpStatusCode._403, "A resource must be read before to be able to modify or delete it."); - }else { - // Create with PUT - shadowResourceURI = createShadowResource(transactionURI, requestURI, lockURI, contentType, null); - logRequest(shadowResourceURI, contentType, httpMethod, request.getContent()); - actionResponse = forwardAction(request); - } - break; - - case POST: - HttpResponse getResponse = getResourceOnEffectiveService(requestURI); - resource = getResponse.getContent(); - - shadowResourceURI = createShadowResource(transactionURI, requestURI, lockURI, contentType, resource); - logRequest(shadowResourceURI, contentType, httpMethod, request.getContent()); - - actionResponse = forwardAction(request); - - String locationURI = actionResponse.getHeader("Location"); - logRequest(shadowResourceURI, contentType, httpMethod, null, locationURI); - - break; - - default: - - HttpResponse response = getResourceOnEffectiveService(requestURI); - resource = response.getContent(); - - shadowResourceURI = createShadowResource(transactionURI, requestURI, lockURI, contentType, resource); - - // We don't need any log - // logRequest(shadowResourceURI, contentType, httpMethod, requestURI, request.getContent()); - - actionResponse = forwardAction(request); - - break; - } - - actionResponse.setHeader("X-Lock-URI", lockURI); - - actionResponse.setHeader("X-Transaction-URI", transactionURI); - - return replyToClient(actionResponse); - } - + actionResponse.setHeader("X-Lock-URI", lockURI); + return createResponse(actionResponse); }else { - // Non-Transactional Client - return createMiniTransaction(); + // Client does not own a lock + + if(httpMethod != HttpMethod.POST && httpMethod != HttpMethod.PUT && + httpMethod != HttpMethod.GET && httpMethod != HttpMethod.HEAD) { + // The first action on a resource must be a GET or a CREATE + sendErrorResponseToClient(HttpStatusCode._403, "A resource must be read before to be able to modify or delete it."); + } + + HttpResponse actionResponse = null; + + Lock lock = createLock(httpMethod, transactionURI, requestURI); + lockURI = lock.getLockURI(); + + String resource = null; + String shadowResourceURI= null; + + switch(httpMethod) { + case PUT: + + HttpResponse r = createHttpRequest(HttpMethod.HEAD, null, null, requestURI); + if(r.getHttpStatusCode() == HttpStatusCode._204 || (r.getHttpStatusCode().getCode()>=200 && r.getHttpStatusCode().getCode()<300)) { + lock.delete(); + sendErrorResponseToClient(HttpStatusCode._403, "A resource must be read before to be able to modify or delete it."); + }else { + // Create with PUT + shadowResourceURI = createShadowResource(transactionURI, requestURI, lockURI, contentType, null); + logRequest(shadowResourceURI, contentType, httpMethod, request.getContent()); + actionResponse = forwardAction(request); + } + break; + + case POST: + HttpResponse getResponse = getResourceOnEffectiveService(requestURI); + resource = getResponse.getContent(); + + shadowResourceURI = createShadowResource(transactionURI, requestURI, lockURI, contentType, resource); + logRequest(shadowResourceURI, contentType, httpMethod, request.getContent()); + + actionResponse = forwardAction(request); + + String locationURI = actionResponse.getHeader("Location"); + logRequest(shadowResourceURI, contentType, httpMethod, null, locationURI); + + break; + + default: + + HttpResponse response = getResourceOnEffectiveService(requestURI); + resource = response.getContent(); + + shadowResourceURI = createShadowResource(transactionURI, requestURI, lockURI, contentType, resource); + + // Optimization We don't need any log here + // logRequest(shadowResourceURI, contentType, httpMethod, requestURI, request.getContent()); + + actionResponse = forwardAction(request); + + break; + } + + actionResponse.setHeader("X-Lock-URI", lockURI); + + actionResponse.setHeader("X-Transaction-URI", transactionURI); + + return createResponse(actionResponse); } + } + + + private String getShadowResourceURI(String transactionURI, String requestURI) throws MalformedURLException { + return ShadowResource.getShadowResourceURI(transactionURI, requestURI); + } + + + protected HttpResponse createMiniTransaction(HttpRequest request) throws Exception { + String contentType = request.getContentType(); + String transactionURI = createTransaction(contentType); + + HttpResponse actionResponse = manageTransactionAction(request, transactionURI); + + commitTransation(transactionURI); + + return actionResponse; + } + + + + + + + private void commitTransation(String transactionURI) { + // TODO + } + + protected String createTransaction(String contentType) { + HttpResponse createTransactionResponse = createHttpRequest(HttpMethod.POST, contentType, getOneTransactionServiceURI()); + if(createTransactionResponse.getHttpStatusCode() != HttpStatusCode._201) { + sendErrorResponseToClient(HttpStatusCode._503, "Please try later"); + } + return createTransactionResponse.getHeader("Location"); + } + + + private String getOneTransactionServiceURI() { + List list = getTransactionServiceURIs(); + Random random = new Random(); + return list.get(random.nextInt(list.size())); + } + + private List getTransactionServiceURIs() { + return null; + } + + @SuppressWarnings("unused") + private HttpResponse sendSupportedTransactionServiceList(HttpRequest request) { + String contentType = request.getContentType(); + List list = getTransactionServiceURIs(); + // TODO create response with Transaction Services + return null; + } + + private static HttpResponse createResponse(HttpResponse actionResponse) { + return null; + } + + private static HttpResponse forwardAction(HttpRequest request) { + return null; + } + + private HttpResponse getResourceOnEffectiveService(String resourceURI) { + return null; } private void logRequest(String shadowResourceURI, String contentType, HttpMethod httpMethod, String resource) @@ -124,28 +202,6 @@ public class Proxy { Log log = new Log(httpMethod, resource, locationURI); log.create(shadowResourceURI, contentType); } - - private HttpResponse createMiniTransaction() { - // TODO Auto-generated method stub - return null; - } - - private void sendTransactionServerList() { - // TODO Auto-generated method stub - - } - - private static HttpResponse replyToClient(HttpResponse actionResponse) { - return null; - } - - private static HttpResponse forwardAction(HttpRequest request) { - return null; - } - - private HttpResponse getResourceOnEffectiveService(String resourceURI) { - return null; - } private String createShadowResource(String transactionURI, String requestURI, String lockURI, String contentType, String resource) throws MalformedURLException { @@ -187,8 +243,8 @@ public class Proxy { } - public static void sendErrorResponseToClient(HttpStatusCode name, String string) { - return; + public static HttpResponse sendErrorResponseToClient(HttpStatusCode name, String string) { + return null; } /**