requests-simulator

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java
index ecad084..182221b 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java
@@ -9,6 +9,7 @@ import br.ufrgs.inf.prosoft.requestssimulator.requests.DeleteRequest;
 import br.ufrgs.inf.prosoft.requestssimulator.requests.GetRequest;
 import br.ufrgs.inf.prosoft.requestssimulator.requests.PostRequest;
 import br.ufrgs.inf.prosoft.requestssimulator.requests.MultipartRequest;
+import br.ufrgs.inf.prosoft.requestssimulator.requests.PutRequest;
 import br.ufrgs.inf.prosoft.requestssimulator.requests.Request;
 import br.ufrgs.inf.prosoft.requestssimulator.requests.RequestPlan;
 import com.google.gson.Gson;
@@ -66,6 +67,8 @@ public class LogReader {
                         request = gson.fromJson(jsonObject, GetRequest.class);
                     } else if (requestPlan.getMethod().equals("DELETE")) {
                         request = gson.fromJson(jsonObject, DeleteRequest.class);
+                    } else if (requestPlan.getMethod().equals("PUT")) {
+                        request = gson.fromJson(jsonObject, PutRequest.class);
                     } else {
                         JsonElement headers = jsonObject.get("headers");
                         if (headers != null && headers.getAsString().contains("multipart")) {
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Main.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Main.java
index cb7d9a6..0eda719 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Main.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Main.java
@@ -22,7 +22,7 @@ public class Main {
 
         if (args.length < 2) {
             System.err.println("--profile=<ProfilePath> --time=<time> [--users=<users>] [--log=<LogPath>] [--throughput=<ThroughputPath>] [--host=<host>] [--home=<homePath>]");
-            System.err.println("--profile=<ProfilePath> --execute=<LogPath> [--throughput=<ThroughputPath>] [--host=<host>]");
+            System.err.println("--profile=<ProfilePath> --execute=<LogPath> [--throughput=<ThroughputPath>] [--host=<host>] [--home=<homePath>]");
             System.err.println("--throughput=<ThroughputPath> --reduce=<ReducePath> --prefix=<prefix>");
             System.exit(1);
         }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PutRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PutRequest.java
new file mode 100644
index 0000000..ee25a69
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PutRequest.java
@@ -0,0 +1,96 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package br.ufrgs.inf.prosoft.requestssimulator.requests;
+
+import br.ufrgs.inf.prosoft.requestssimulator.Session;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author romulo
+ */
+public class PutRequest extends Request {
+
+    private final String data;
+
+    protected PutRequest(RequestPlan requestPlan, Session session, String URL, String data) {
+        super(requestPlan, session, URL);
+        this.data = data;
+    }
+
+    protected PutRequest(RequestPlan requestPlan, Session session, String URL, String data, String headers) {
+        super(requestPlan, session, URL, headers);
+        this.data = data;
+    }
+
+    protected PutRequest(RequestPlan requestPlan, Session session, String URL, String data, String headers, Collection<String> storeFields) {
+        super(requestPlan, session, URL, headers, storeFields);
+        this.data = data;
+    }
+
+    protected String getData() {
+        return this.data;
+    }
+
+    @Override
+    protected void fireRequest() {
+        HttpURLConnection httpURLConnection = null;
+        try {
+            String stringURL = fillPropertyVariable(getURL());
+            URL url = new URL(stringURL);
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            httpURLConnection = connection;
+            connection.setRequestMethod("PUT");
+            headers().forEach(entry -> {
+                String value = fillPropertyVariable(entry.getValue());
+                connection.setRequestProperty(entry.getKey(), value);
+            });
+            if (this.data != null) {
+                connection.setDoOutput(true);
+                try ( OutputStream outputStream = connection.getOutputStream()) {
+                    String data = fillPropertyVariable(this.data);
+                    outputStream.write(data.getBytes());
+                }
+            } else {
+                connection.setDoOutput(false);
+            }
+            int responseCode = connection.getResponseCode();
+            if (responseCode < 400) {
+                Logger.getGlobal().log(Level.INFO, "{0} on {1} {2}", new Object[]{responseCode, getMethod(), stringURL});
+                List<String> setCookies = connection.getHeaderFields().get("Set-Cookie");
+                storeCookies(setCookies);
+                try ( BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+                    String response = bufferedReader.lines().collect(Collectors.joining());
+                    processResponse(response);
+                }
+            } else {
+                Logger.getGlobal().log(Level.SEVERE, "error {0} on {1} {2}", new Object[]{responseCode, getMethod(), stringURL});
+            }
+            log(responseCode);
+        } catch (MalformedURLException ex) {
+            Logger.getGlobal().log(Level.SEVERE, "Malormed URL");
+        } catch (IOException ex) {
+            Logger.getGlobal().log(Level.SEVERE, "IOException");
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            if (httpURLConnection != null) {
+                httpURLConnection.disconnect();
+            }
+        }
+    }
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
index eafb411..6af14e1 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
@@ -235,7 +235,7 @@ public abstract class Request {
                         return;
                     }
                 }
-                Pattern pattern = Pattern.compile("#\\[(.*?)\\]");
+                Pattern pattern = Pattern.compile("\\[(.*?)\\]");
                 Matcher matcher = pattern.matcher(storeField);
                 while (matcher.find()) {
                     String found = matcher.group();
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
index 733c97f..14fa202 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
@@ -36,18 +36,6 @@ public class RequestPlan {
     private String headers;
     private String forms;
 
-    private RequestPlan(String URL) {
-        this.method = "GET";
-        this.URL = URL;
-        this.data = null;
-    }
-
-    private RequestPlan(String URL, String data) {
-        this.method = "POST";
-        this.URL = URL;
-        this.data = data;
-    }
-
     private RequestPlan(String method, String URL, String data) {
         this.method = method;
         this.URL = URL;
@@ -55,17 +43,29 @@ public class RequestPlan {
     }
 
     public static RequestPlan get(String URL) {
-        return new RequestPlan(URL);
+        return new RequestPlan("GET", URL, null);
     }
 
     public static RequestPlan post(String URL, String data) {
-        return new RequestPlan(URL, data);
+        return new RequestPlan("POST", URL, data);
+    }
+
+    public static RequestPlan put(String URL, String data) {
+        return new RequestPlan("PUT", URL, data);
+    }
+
+    public static RequestPlan put(String URL) {
+        return put(URL, null);
     }
 
     public static RequestPlan delete(String URL, String data) {
         return new RequestPlan("DELETE", URL, data);
     }
 
+    public static RequestPlan delete(String URL) {
+        return delete(URL, null);
+    }
+
     public String getMethod() {
         return this.method;
     }
@@ -170,7 +170,7 @@ public class RequestPlan {
         }
         return this.storeFields.stream();
     }
-    
+
     protected Stream<String> storeCookies() {
         if (this.storeCookies == null || this.storeCookies.isEmpty()) {
             return Stream.empty();
@@ -207,14 +207,6 @@ public class RequestPlan {
         String URL = replaceOptionals(this.URL);
         HashMap<String, Integer> map = new HashMap<>();
         URL = replaceRandoms(URL, map);
-        Pattern pattern = Pattern.compile("#\\{(.*?)\\[(.*?)\\](.*?)\\}");
-        Matcher originalMatcher = pattern.matcher(this.URL);
-        Matcher randomMatcher = pattern.matcher(URL);
-        while (originalMatcher.find() & randomMatcher.find()) {
-            String originalFound = originalMatcher.group();
-            String randomFound = randomMatcher.group();
-            URL = URL.replace(randomFound, originalFound);
-        }
         Collection<String> storeFields = storeFields()
                 .map(storeField -> replaceRandoms(storeField, map))
                 .collect(Collectors.toList());
@@ -233,7 +225,13 @@ public class RequestPlan {
         if (this.method.equals("GET")) {
             return new GetRequest(this, session, URL, headers, storeFields);
         }
-        String data = replaceOptionals(this.data);
+        String data = null;
+        if (this.data != null) {
+            data = replaceOptionals(this.data);
+        }
+        if (this.method.equals("PUT")) {
+            return new PutRequest(this, session, URL, data, headers, storeFields);
+        }
         data = replaceRandoms(data, map);
         return new PostRequest(this, session, URL, data, headers, storeFields);
     }
@@ -268,7 +266,12 @@ public class RequestPlan {
             randomInt = random.nextInt() & Integer.MAX_VALUE;
             map.put("$", randomInt);
         }
-        data = data.replace("$", String.valueOf(randomInt));
+        pattern = Pattern.compile("#\\{(.*?)\\}");
+        String[] split = pattern.split(data);
+        for (String around : split) {
+            String newAround = around.replace("$", String.valueOf(randomInt));
+            data = data.replace(around, newAround);
+        }
         return data;
     }
 
@@ -300,6 +303,10 @@ public class RequestPlan {
             PostRequest postRequest = (PostRequest) request;
             return new PostRequest(this, session, postRequest.getURL(), postRequest.getData(), postRequest.getHeaders(), postRequest.getStoreFields());
         }
+        if (request instanceof PutRequest) {
+            PutRequest putRequest = (PutRequest) request;
+            return new PutRequest(this, session, putRequest.getURL(), putRequest.getData(), putRequest.getHeaders(), putRequest.getStoreFields());
+        }
         MultipartRequest multipartRequest = (MultipartRequest) request;
         return new MultipartRequest(this, session, multipartRequest.getURL(), multipartRequest.getHeaders(), multipartRequest.getForms(), multipartRequest.getStoreFields());
     }