LogExecutor.java

88 lines | 3.612 kB Blame History Raw Download
/*
 * 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;

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.Request;
import br.ufrgs.inf.prosoft.requestssimulator.requests.RequestPlan;
import com.google.gson.Gson;
import com.google.gson.JsonParser;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author romulo
 */
public class LogExecutor {

    public static void execute(Profile profile, String tracePath) {
        String fileContent = null;
        try (Stream<String> lines = Files.lines(Paths.get(tracePath))) {
            fileContent = lines.collect(Collectors.joining());
        } catch (IOException ex) {
            Logger.getLogger(ProfileReader.class.getName()).log(Level.SEVERE, null, ex);
        }
        JsonParser jsonParser = new JsonParser();
        Collection<Thread> threads = new ArrayList<>();
        JsonElement parse = jsonParser.parse(fileContent);
        JsonArray users = parse
                .getAsJsonArray();
        Gson gson = new Gson();
        users.forEach(user -> {
            Thread thread = new Thread(() -> {
                JsonArray sessions = user.getAsJsonArray();
                Session session = profile.newSession();
                sessions.forEach(sessionExecution -> {
                    JsonArray requests = sessionExecution.getAsJsonArray();
                    requests.forEach(requestJson -> {
                        JsonObject jsonObject = requestJson.getAsJsonObject();
                        String requestPlanReference = jsonObject.get("reference").getAsString();
                        RequestPlan requestPlan = profile.getRequestPlan(requestPlanReference);
                        if (requestPlan == null) {
                            throw new RuntimeException("Request Plan not found");
                        }
                        Request request;
                        if (requestPlan.getMethod().equals("GET")) {
                            request = gson.fromJson(jsonObject, GetRequest.class);
                        } else {
                            JsonElement headers = jsonObject.get("headers");
                            if (headers != null && headers.getAsString().contains("multipart")) {
                                request = gson.fromJson(jsonObject, MultipartRequest.class);
                            } else {
                                request = gson.fromJson(jsonObject, PostRequest.class);
                            }
                        }
                        request = requestPlan.bind(request, session);
                        request.fire();
                    });
                });
            });
            threads.add(thread);
            thread.start();
        });
        threads.forEach((thread) -> {
            try {
                thread.join();
            } catch (InterruptedException ex) {
                Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
    }
}