/* * 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.*; import com.seomoz.api.authentication.Authenticator; import com.seomoz.api.service.URLMetricsService; import com.seomoz.api.response.UrlResponse; import com.google.gson.*; /** * Class to get various info using Moz API * @author themis */ public class Moz { /** * Method that captures the various Moz metrics for the provided urls (with help of the sample here https://github.com/seomoz/SEOmozAPISamples * and ranks them accordingly * @param links the urls to analyze * @param top_count the amount of results to keep when we rerank the results according to their value of a specific Moz metric * @param moz_threshold the threshold to the Moz value to use * @param moz_threshold_option flag if we are going to use threshold in the Moz value or not * @param mozMetrics list that contains which metric to use for Moz //1st place is Page Authority,2nd external mozRank, 3rd, mozTrust, 4th DomainAuthority and 5th MozRank (it is the default) * @param config_path path that has the config files with the api keys and secret for Moz * @return an array with the links sorted according to their moz values */ public String[] perform(String[] links,int top_count,Double moz_threshold,Boolean moz_threshold_option,List<Boolean> mozMetrics, String config_path){ //=====short codes for the metrics long upa=34359738368L;//page authority long pda=68719476736L;//domain authority long uemrp=1048576;//mozrank external equity long utrp=131072;//moztrust long fmrp=32768;//mozrank subdomain long umrp=16384;//mozrank System.gc(); System.out.println("into Moz"); Double[] mozRanks= new Double[links.length]; DataManipulation textualmanipulation=new DataManipulation(); for(int i=0;i<links.length;i++){ if(links[i]!=null){ if(!textualmanipulation.StructuredFileCheck(links[i])){ try{ Thread.sleep(10000); URLMetricsService urlMetricsservice; urlMetricsservice = authenticate(config_path); String objectURL =links[i].substring(0, links[i].length()); Gson gson = new Gson(); if(mozMetrics.get(1)){//Domain Authority String response = urlMetricsservice.getUrlMetrics(objectURL,pda); UrlResponse res = gson.fromJson(response, UrlResponse.class); System.gc(); if(res!=null&&!(response.equalsIgnoreCase("{}"))){ String mozvalue_string=res.getPda(); mozRanks[i]=Double.parseDouble(mozvalue_string); } else{mozRanks[i]=Double.parseDouble("0");} } else if(mozMetrics.get(2)){//External MozRank String response = urlMetricsservice.getUrlMetrics(objectURL,uemrp); UrlResponse res = gson.fromJson(response, UrlResponse.class); System.gc(); if(res!=null&&!(response.equalsIgnoreCase("{}"))){ String mozvalue_string=res.getUemrp(); mozRanks[i]=Double.parseDouble(mozvalue_string); } else{mozRanks[i]=Double.parseDouble("0");} } else if(mozMetrics.get(3)){//MozRank String response = urlMetricsservice.getUrlMetrics(objectURL,umrp); UrlResponse res = gson.fromJson(response, UrlResponse.class); System.gc(); if(res!=null&&!(response.equalsIgnoreCase("{}"))){ String mozvalue_string=res.getUmrp(); mozRanks[i]=Double.parseDouble(mozvalue_string); } else{mozRanks[i]=Double.parseDouble("0");} } else if(mozMetrics.get(4)){//MozTrust String response = urlMetricsservice.getUrlMetrics(objectURL,utrp); UrlResponse res = gson.fromJson(response, UrlResponse.class); System.gc(); if(res!=null&&!(response.equalsIgnoreCase("{}"))){ String mozvalue_string=res.getUtrp(); mozRanks[i]=Double.parseDouble(mozvalue_string); } else{mozRanks[i]=Double.parseDouble("0");} } else if(mozMetrics.get(5)){//Page Authority String response = urlMetricsservice.getUrlMetrics(objectURL,upa); UrlResponse res = gson.fromJson(response, UrlResponse.class); System.gc(); if(res!=null&&!(response.equalsIgnoreCase("{}"))){ String mozvalue_string=res.getUpa(); mozRanks[i]=Double.parseDouble(mozvalue_string); } else{mozRanks[i]=Double.parseDouble("0");} } else if(mozMetrics.get(6)){//subdomain MozRank String response = urlMetricsservice.getUrlMetrics(objectURL,fmrp); UrlResponse res = gson.fromJson(response, UrlResponse.class); System.gc(); if(res!=null&&!(response.equalsIgnoreCase("{}"))){ String mozvalue_string=res.getFmrp(); mozRanks[i]=Double.parseDouble(mozvalue_string); } else{mozRanks[i]=Double.parseDouble("0");} } } catch (InterruptedException | JsonSyntaxException | NumberFormatException ex){ System.out.println("exception moz:" +ex.toString()); mozRanks[i]=Double.parseDouble("0"); String[] links_out=null; return links_out; } } else{ mozRanks[i]=Double.parseDouble("0"); } } } try{//ranking of the urls according to their moz score //get the scores to a list System.out.println("I am goint to rank the scores of Moz"); System.gc(); List<Double> seomozRanks_scores_list=Arrays.asList(mozRanks); //create a hashmap in order to map the scores with the indexes System.gc(); IdentityHashMap<Double, Integer> originalIndices = new IdentityHashMap<Double, Integer>(); //copy the original scores list System.gc(); for(int i=0; i<seomozRanks_scores_list.size(); i++){ originalIndices.put(seomozRanks_scores_list.get(i), i); System.gc(); } //sort the scores List<Double> sorted_seomozRanks_scores = new ArrayList<Double>(); System.gc(); sorted_seomozRanks_scores.addAll(seomozRanks_scores_list); System.gc(); sorted_seomozRanks_scores.removeAll(Collections.singleton(null)); System.gc(); if(!sorted_seomozRanks_scores.isEmpty()){ Collections.sort(sorted_seomozRanks_scores,Collections.reverseOrder());} //get the original indexes //the max amount of results int[] origIndex=new int[150]; if(!sorted_seomozRanks_scores.isEmpty()){ //if we want to take the top scores(for example top 10) if(!moz_threshold_option){ origIndex=new int[top_count]; for(int i=0; i<top_count; i++){ Double score = sorted_seomozRanks_scores.get(i); System.gc(); // Lookup original index efficiently origIndex[i] = originalIndices.get(score); } } //if we have a threshold else if(moz_threshold_option) { int j=0; int counter=0; while(j<sorted_seomozRanks_scores.size()){ if(sorted_seomozRanks_scores.get(j).compareTo(moz_threshold)>=0){counter++;} j++; } origIndex=new int[counter]; for(int k=0;k<origIndex.length-1;k++){ System.gc(); Double score = sorted_seomozRanks_scores.get(k); origIndex[k] = originalIndices.get(score); } } } String[] links_out=new String[origIndex.length]; for(int jj=0;jj<origIndex.length;jj++){ System.gc(); links_out[jj]=links[origIndex[jj]]; } System.gc(); System.out.println("I have ranked the scores of moz"); return links_out; } catch (Exception ex){ System.out.println("exception moz list" +ex.toString()); //Logger.getLogger(Moz.class.getName()).log(Level.SEVERE, null, ex); String[] links_out=null; return links_out; } } /** * Method to check if Moz API works * @param config_path the directory to get the Moz keys from * @return flag if the API works */ public boolean check(String config_path){ boolean moz=false; URLMetricsService urlMetricsservice; urlMetricsservice = authenticate(config_path); String objectURL ="www.thesmartweb.eu"; String response = urlMetricsservice.getUrlMetrics(objectURL); //if moz fails we set the moz option "false" and if we do not have merged option as true we set the results number=top_count_seomoz if(response.length()!=0){ moz=true; } return moz; } /** * Method to authenticate in Moz API * @param config_path the directory to get the API keys from * @return a URLMetricsService to get the Moz metrics */ public URLMetricsService authenticate(String config_path){ List<String> apikeys = GetKeys(config_path); //Add your accessID here String accessID=""; String secretKey=""; if(apikeys.size()==2){ accessID = apikeys.get(0); //Add your secretKey here secretKey = apikeys.get(1); } System.setProperty("log4j.logger.org.apache.http","ERROR"); Authenticator authenticator = new Authenticator(); authenticator.setAccessID(accessID); authenticator.setSecretKey(secretKey); String SEOmozAPISign="http://lsapi.seomoz.com/linkscape/url-metrics/www.seomoz.org%2fblog?Cols=2048&Cols=16384&Cols=131072&Cols=1048576&Cols=34359738368&Cols=68719476736&Cols=131072&Cols=32768&AccessID=member-87c6a749b0&Expires=1353362399&Signature=rLWrFGFil%2Bt56DbIuZNgZhoNxew%3D"; URLMetricsService urlMetricsService = new URLMetricsService(authenticator); return urlMetricsService; } public List<String> GetKeys(String config_path){ ReadInput ri = new ReadInput(); List<String> apikeysList=ri.GetKeyFile(config_path, "mozkeys"); return apikeysList; } }