FileArchive.java [tools/MetaModelTools/src/archives] Revision: ec5f4cade4553a8341e1cd241b111bfdb77a87a8  Date: Fri Jan 10 10:59:55 MST 2020
/*
 * 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 archives;

import archives.ServiceArchive;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import models.ModelArchive;
import org.bson.conversions.Bson;

/**
 *
 * @author <a href="mailto:shaun.case@colostate.edu">Shaun Case</a>
 */
public class FileArchive implements ServiceArchive {

  HashMap<String, ModelArchive> archives = new HashMap<>();
  String directory;

  public FileArchive(String directory) throws Exception {
    this.directory = directory;
    if (!Files.isDirectory(Paths.get(directory))) {
      throw new Exception("Directory specified does not exist: (" + directory + ")");
    }
    FilenameFilter jsonFilter = (File dir, String name) -> {
      String lowercaseName = name.toLowerCase();
      return lowercaseName.endsWith(".json");
    };
    File folder = new File(directory);
    File[] fileList = folder.listFiles(jsonFilter);

    for (File file : fileList) {
      if (file.isFile() && file.canRead()) {
        ModelArchive model = new ModelArchive(readFile(file));
        archives.put(model.getSUID(), model);
      }
    }
  }

  @Override
  public ArrayList<ModelArchive> getArchiveByReqIP(String ip, String service) throws Exception {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

  @Override
  public ModelArchive getArchiveBySUID(String suid) throws Exception {
    return archives.get(suid);
  }

  @Override
  public long getCount() {
    return archives.size();
  }

  @Override
  public JSONObject getServiceRequest(String suid) throws Exception {
    JSONObject requestData = null;

    InputStream zipFile = new FileInputStream(directory + "/" + suid + ".zip");

    try (ZipInputStream zin = new ZipInputStream(zipFile)) {
      ZipEntry entry;

      while ((entry = zin.getNextEntry()) != null) {
        if (entry.getName().contains(".request")) {
          BufferedReader bReader = new BufferedReader(new InputStreamReader(zin));
          StringBuilder fileContent = new StringBuilder();
          String inputStr;
          while ((inputStr = bReader.readLine()) != null) {
            fileContent.append(inputStr);
          }
          requestData = new JSONObject(fileContent.toString());
          break;
        }
      }
    }

    return requestData;
  }

  @Override
  public JSONObject getServiceResponse(String suid) throws Exception {
    JSONObject requestData = null;

    InputStream zipFile = new FileInputStream(directory + "/" + suid + ".zip");

    try (ZipInputStream zin = new ZipInputStream(zipFile)) {
      ZipEntry entry;

      while ((entry = zin.getNextEntry()) != null) {
        if (entry.getName().contains(".response")) {
          BufferedReader bReader = new BufferedReader(new InputStreamReader(zin));
          StringBuilder fileContent = new StringBuilder();
          String inputStr;
          while ((inputStr = bReader.readLine()) != null) {
            fileContent.append(inputStr);
          }
          requestData = new JSONObject(fileContent.toString());
          break;
        }
      }
    }

    return requestData;
  }

  @Override
  public boolean hasArchive(String suid) throws Exception {
    return archives.containsKey(suid);
  }

  @Override
  public Set<String> keys(int skip, int limit, String sortby, boolean sortAsc) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

  @Override
  public void shutdown() throws Exception {

  }

  private JSONObject readFile(File file) throws FileNotFoundException, IOException, JSONException {
    JSONObject ret_val;

    try (BufferedReader br = new BufferedReader(new FileReader(file));) {
      StringBuilder sb = new StringBuilder();
      String line = br.readLine();

      while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
      }
      String jsonData = sb.toString();
      ret_val = new JSONObject(jsonData);
    }
    return ret_val;
  }

  @Override
  public ArrayList<ModelArchive> getArchivesByFilter(String key, String value, int limit, boolean useBasicArchiveFunctionality) throws Exception {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

  @Override
  public ArrayList<String> getSUIDsByFilter(String key, String value) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

  @Override
  public ArrayList<ModelArchive> getArchivesByFilters(Iterable<Bson> filters, int limit) throws Exception {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

}