Package core

Source Code of core.DataFinder

package core;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.lang.String;

import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.xpath.*;

// only manage the REALLY "finder" thing (meaning retrieving data from API)
public class DataFinder {
 
  private String PathToRules = "resources/Rules.xml";

  public HashMap<String, String> getFinalData(ArrayList<String> OutputData, String URI, String MovieName) {
   
    HashMap<String, String> FinalData = new HashMap<String, String>();
   
    String StrMovieData = new String(); // JSON String returned from server
    JSONParser parser = new JSONParser();
    KeyFinder finder = new KeyFinder();
   
    // avoid EOF exception
    MovieName = MovieName.replaceAll("([\\.\\s_])", "+"); // avoid EOF exception
    MovieName = MovieName.replaceAll("(?i)" +
              "(dvdrip" +
              "|hdtv" +
              "|xvid" +
              "|subforced" +
              "|vfstfr" +
              "|fastsub" +
              "|brrip" +
              "|ac3" +
              "|dvd)", "");
    MovieName = MovieName.replaceAll("(?i)vost[a-zA-Z]{2}", "");
    //MovieName = MovieName.replaceAll("(?i)(fr|en)", ""); // "freak" = "eak"
    MovieName = MovieName.replaceAll("\\[(.*)\\]", "");
    MovieName = MovieName.replaceAll("\\((.*)\\)", "");
    MovieName = MovieName.replaceAll("[\\+]+", "+");

    try {
      // Create URL for the API
      URL url = new URL(URI+MovieName);
     
      // Get JSON from server
      BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
      String JSONString;
      while ((JSONString = in.readLine()) != null) {
        StrMovieData += JSONString;
      }
      in.close();
    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }

    for (String Data : OutputData) {
   
      finder.setMatchKey(Data);

      try{
        parser.parse(StrMovieData, finder, true);
        if(finder.isFound()){
          finder.setFound(false);
          FinalData.put(Data, finder.getValue().toString().trim());
        }
        parser.reset();
      }
      catch(ParseException pe){// TODO add an error for Unavailable service
        return null;
      }
   
    }
     
    return FinalData;
   
  }
 
  public ArrayList<String> getOutputData(String OutputFormat, HashMap<String, String> DataMatch) {
   
    String[] outputdata = OutputFormat.split("<");
    ArrayList<String> OutputData = new ArrayList<String>();

    for (String Data : outputdata) {
      if (Data != null && Data.length() > 0)
        OutputData.add(DataMatch.get(Data.split(">")[0]));
    }
   
    return OutputData;

  }
 
  public String getFinalName(HashMap<String, String> DataMatch, HashMap<String, String> FinalData, String OutputFormat) {
   
    HashMap<String, String> FinalMap = new HashMap<String, String>();
   
    Iterator<Map.Entry<String, String>> DataMatchIterator = DataMatch.entrySet().iterator();
   
    while (DataMatchIterator.hasNext()) {

      Map.Entry<String, String> datamatch = (Map.Entry<String, String>) DataMatchIterator.next();
     
      if (FinalData.get(datamatch.getValue()) != null)
        FinalMap.put(datamatch.getKey(), FinalData.get(datamatch.getValue()));
       
    }
 
    Scanner scanOutputFormat = new Scanner(OutputFormat);
    scanOutputFormat.useDelimiter("<|>");
    String FinalName = OutputFormat;
    while (scanOutputFormat.hasNext()) {
        final String data = scanOutputFormat.next();
        final String finalname = FinalMap.get(data);
        if (finalname != null) {
          FinalName = FinalName.replace("<" + data + ">", finalname);
        }
    }
   
    // return null if nothing replaced
   
    if (FinalName != OutputFormat)
      return FinalName;
   
    return null;
   
  }

  public static Document initRulesForAPI(String linkToRulesForAPI) {
   
    try {
      File RulesForAPI = new File(linkToRulesForAPI);
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
      Document rules = dBuilder.parse(RulesForAPI);
      rules.getDocumentElement().normalize();
      return rules;
     
    } catch (Exception e) {
      e.printStackTrace();
    }
   
    return null;

  }
 
  private static Object getXPathObject(String DOM, String XPath) {
   
    Object XPathObject = new Object();
   
    Document rules = initRulesForAPI(DOM);
   
    try {

      XPathFactory factory = XPathFactory.newInstance();
      XPath xpath = factory.newXPath();
      XPathExpression expr = xpath.compile(XPath);

      XPathObject = expr.evaluate(rules, XPathConstants.NODESET);

    } catch(Exception e) {
      e.printStackTrace();
    }
   
    return XPathObject;
   
  }
 
  public String getURI(String language, String datasource) {
   
    Object XPathObject = getXPathObject(PathToRules, "//language[@value='"+language+"']/api[@name='"+datasource+"']/@uri");
    NodeList uri = (NodeList) XPathObject;
    String URI = uri.item(0).getTextContent();
   
    return URI;
   
  }
 
  public HashMap<String, Boolean> getRequired() {
   
    Object XPathObject = getXPathObject(PathToRules, "//required//data");
    NodeList required = (NodeList) XPathObject;
   
    HashMap<String, Boolean> Required = new HashMap<String, Boolean>();
   
    for (int i = 0; i < required.getLength(); i++) {
      Element data = (Element) required.item(i);
      Required.put(data.getAttribute("name"), Boolean.parseBoolean(data.getAttribute("selected")));
    }
     
    return Required;
   
  }
 
  public HashMap<String, String> getDataMatch(String language, String datasource) {
   
    Object XPathObject = getXPathObject(PathToRules, "//language[@value='"+language+"']/api[@name='"+datasource+"']/datamatch");
    NodeList datamatch = (NodeList) XPathObject;
   
    HashMap<String, String> DataMatch = new HashMap<String, String>();
   
    for (int i = 0; i < datamatch.getLength(); i++) {
      Element data = (Element) datamatch.item(i);
      DataMatch.put(data.getAttribute("type"), data.getTextContent());
    }
   
    return DataMatch;

  }

}
TOP

Related Classes of core.DataFinder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.