/*
* Copyright 2015 Themistoklis Mavridis <themis.mavridis@issel.ee.auth.gr>.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.thesmartweb.swebrank;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.net.*;
import org.json.simple.parser.*;
import org.json.simple.JSONArray;
import java.util.*;
//
/**
* Class for the Google Search API
* @author Themistoklis Mavridis
*/
public class GoogleResults {
/**
* Get all the results from Google Search API
* @param quer the query to search for
* @param google_results_number the results number
* @param example_dir the directory to save the result
* @param config_path the directory to find the google search api keys
* @return the urls of the results
*/
public String[] Get(String quer,int google_results_number,String example_dir, String config_path){
//counter is set
int counter_limit=google_results_number+1;
String[] links_google_total=new String[google_results_number];//it contains all the links of the google, because the google api allows to get only 10 results each time
DataManipulation textualmanipulation = new DataManipulation();
APIconn apicon = new APIconn();
for (int counter=1;counter<counter_limit;counter+=10){//10 is the default number that Google Search API returns
String[] links=new String[10];
String[] keys;//keys is the combination of cxs and apikeys which are parameters for performing queries to Google Search API
keys=GetKeys(config_path);
int i=0;
int flag_key=0;
String key="";
String line="";
//-------------after this loop line will include the JSON response of the custom search api of google (we try with the different keys, due to account limitations)
while(flag_key==0&&i<(keys.length)){
key=keys[i];
i++;
URL link_ur = null;
//-------we form the URL-----
try {
link_ur = new URL("https://www.googleapis.com/customsearch/v1?key="+key+"&q=" + quer + "&alt=json" + "&start=" + counter);
} catch (MalformedURLException ex) {
Logger.getLogger(GoogleResults.class.getName()).log(Level.SEVERE, null, ex);
return links_google_total;
}
//------we attempt to connect to Google custom search API
line = apicon.connect(link_ur);
if(!line.equalsIgnoreCase("fail")){
flag_key=1;
textualmanipulation.AppendString(line, example_dir + "google/" + "json" + counter + ".txt");
//initialize JSONparsing that parses the json and gets the links
JSONparsing gg = new JSONparsing();
//get the links in an array
links = gg.GoogleJsonParsing(line);
//insert the links from each loop to the array with all the google links
for(int jj=0;jj<links.length;jj++){
links_google_total[jj+counter-1]=links[jj];
}
}
}
}
return links_google_total;
}
/**
* Method to get the results number for a specific query
* @param quer the query to search for
* @param config_path the directory to get the keys from
* @return the number of results
*/
public Long Get_Results_Number(String quer, String config_path){//it gets the results number for a specific query
long results_number = 0;
//we connect through the google api JSON custom search
String check_quer = quer.substring(quer.length() - 1, quer.length());
char plus = "+".charAt(0);
char check_plus = check_quer.charAt(0);
if (check_plus == plus) {
quer = quer.substring(0, quer.length() - 1);
}
String[] keys = GetKeys(config_path);
int flag_key=0;
int i=0;
while(flag_key==0&&i<(keys.length)){
try {
String key=keys[i];
i++;
URL link_ur = new URL("https://www.googleapis.com/customsearch/v1?key="+key+"&q=" + quer + "&alt=json");
APIconn apicon = new APIconn();
String line = apicon.connect(link_ur);
if(!line.equalsIgnoreCase("fail")){
flag_key=1;
JSONParser parser = new JSONParser();
//Create the map
Map json = (Map) parser.parse(line);
// Get a set of the entries
Set set = json.entrySet();
Object[] obj = set.toArray();
Map.Entry entry = (Map.Entry) obj[2];
//get to the second level
String you = entry.getValue().toString();
json = (Map) parser.parse(you);
set = json.entrySet();
obj = set.toArray();
entry = (Map.Entry) obj[obj.length-1];
//get to the third level
you = entry.getValue().toString();
JSONArray json_arr = (JSONArray) parser.parse(you);
obj = json_arr.toArray();
you = obj[0].toString();
//get to the fourth level
json = (Map) parser.parse(you);
set= json.entrySet();
obj = set.toArray();
entry = (Map.Entry) obj[4];
results_number = (Long) entry.getValue();
}
} catch (MalformedURLException | ParseException ex) {
Logger.getLogger(GoogleResults.class.getName()).log(Level.SEVERE, null, ex);
}
}
return results_number;
}
/**
* Method to get the keys of Google API search
* @param config_path the directory to get the keys from
* @return all the keys of Google
*/
public String[] GetKeys(String config_path){
ReadInput ri = new ReadInput();
List<String> cxsList = ri.GetKeyFile(config_path, "google_cxs");
List<String> apikeysList = ri.GetKeyFile(config_path, "google_apikeys");
String[] cxs = cxsList.toArray(new String[cxsList.size()]);
String[] apikeys = apikeysList.toArray(new String[apikeysList.size()]);
String[] keys=new String[cxsList.size()*cxsList.size()];
int k=0;
for(int i=0;i<cxs.length;i++){
for(int j=0;j<apikeys.length;j++){
keys[k]=apikeys[i]+"&cx="+cxs[j];
k++;
}
}
return keys;
}
}