ProfileReader.java

99 lines | 4.293 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.RequestPlan;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;

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

    public static Profile parseFile(String profilePath) {
        return parseFile(profilePath, "localhost");
    }

    public static Profile parseFile(String profilePath, String host) {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(profilePath);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ProfileReader.class.getName()).log(Level.SEVERE, "File not found");
            System.exit(1);
        }
        Map<String, RequestPlan> referenceHasRequestPlan = new HashMap<>();
        Gson gson = new Gson();
        JsonParser jsonParser = new JsonParser();
        JsonObject jsonObject = jsonParser.parse(fileReader).getAsJsonObject();
        jsonObject.entrySet().forEach(entry -> {
            JsonElement urlJsonElement = entry.getValue().getAsJsonObject().get("URL");
            if (urlJsonElement != null) {
                String URL = urlJsonElement.getAsString().replaceFirst("localhost", host);
                entry.getValue().getAsJsonObject().remove("URL");
                entry.getValue().getAsJsonObject().addProperty("URL", URL);
            }
            RequestPlan requestPlan = gson.fromJson(entry.getValue(), RequestPlan.class);
            requestPlan.setReference(entry.getKey());
            referenceHasRequestPlan.put(requestPlan.getReference(), requestPlan);
        });
        jsonObject.entrySet().forEach(entry -> {
            RequestPlan requestPlan = referenceHasRequestPlan.get(entry.getKey());
            Collection<String> linksReferences = new ArrayList<>();
            JsonObject jsonRequestPlan = entry.getValue().getAsJsonObject();
            JsonElement linksReferencesElement = jsonRequestPlan.get("linksReferences");
            if (linksReferencesElement != null) {
                linksReferencesElement.getAsJsonArray().forEach(linkElement -> {
                    linksReferences.add(linkElement.getAsString());
                });
                linksReferences.forEach(new Consumer<String>() {
                    @Override
                    public void accept(String linkReference) {
                        RequestPlan link;
                        if (linkReference.charAt(0) == '*') {
                            link = referenceHasRequestPlan.get(linkReference.substring(1));
                            if (link == null) {
                                throw new RuntimeException("link not declared: " + linkReference);
                            }
                            link.links().forEach(referenceToCopy -> {
                                accept(referenceToCopy.getReference());
                            });
                        } else {
                            link = referenceHasRequestPlan.get(linkReference);
                            if (link == null) {
                                throw new RuntimeException("link not declared: " + linkReference);
                            }
                            requestPlan.addLink(link);
                        }
                    }
                });
            }
            JsonElement requirementsReferences = jsonRequestPlan.get("requirementsReferences");
            if (requirementsReferences != null) {
                requirementsReferences.getAsJsonArray().forEach(requirementReference -> {
                    RequestPlan link = referenceHasRequestPlan.get(requirementReference.getAsString());
                    requestPlan.addRequirement(link);
                });
            }
        });
        Profile profile = new Profile(referenceHasRequestPlan);
        return profile;
    }
}