import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import google.webapi.*; public class GoogleSearch { private GoogleSearchPort port; public static final int MAX = 100; public static final int MIN = 10; public GoogleSearch() { // 手順 1 サービスのインスタンスの生成 GoogleSearchService service = new GoogleSearchService_Impl(); // 手順 2 スタブの取得 port = (GoogleSearchPort)service.getGoogleSearchPort(); } public GoogleSearchResult search(String keyword, int start) throws RemoteException { return search(keyword, start, MAX); } public GoogleSearchResult search(String keyword, int start, int max) throws RemoteException { // 最大件数が MAX 以上だったら MAX に、MIN 以下であれば MIN にする if (max > MAX) { max = MAX; } else if (max < MIN) { max = MIN; } GoogleSearchResult result = doSearch(keyword, start, max); double time = result.getSearchTime(); int count = result.getEstimatedTotalResultsCount(); // 検索結果の件数が 10 件以上で、表示する最大が 10 以上であれば // 再検索を行い、結果をマージする count -= start; if (count > 0 && max > 10) { max = (count > max) ? max : count; // ResultElement を保持させるためのリスト List elements = new ArrayList(); elements.add(result.getResultElements()); for (int i = 10; i < max; i += 10) { int m = (i + 10 < max) ? 10 : max - i; // 再検索を行い、検索結果をリストに追加 GoogleSearchResult tmpResult = doSearch(keyword, start + i, m); elements.add(tmpResult.getResultElements()); time += tmpResult.getSearchTime(); } // 検索でヒットしたページの総数を調べる int number = 0; for (int i = 0; i < elements.size(); i++) { number += ((ResultElement[])elements.get(i)).length; } // 配列にまとめて、result にセットする ResultElement[] resultElements = new ResultElement[number]; int size = 0; for (int i = 0; i < elements.size(); i++) { int length = ((ResultElement[])elements.get(i)).length; System.arraycopy((ResultElement[])elements.get(i), 0, resultElements, size, length); size += length; } result.setEndIndex(start + size); result.setSearchTime(time); result.setResultElements(resultElements); } return result; } private GoogleSearchResult doSearch(String keyword, int start, int max) throws RemoteException { // 手順 3 Web サービスで定義されたメソッドのコール // 手順 4 戻り値の受け取り。 return port.doGoogleSearch( "fSX43vJQFHJ5Tdiuwha/x2Xyl4l1Ti+H", // java.lang.String key keyword, //java.lang.String q start, // int start 10, // int maxResults false, //boolean filter "", // java.lang.String restrict false, //boolean safeSearch "lang_ja|lang_en", // java.lang.String lr "UTF-8", // java.lang.String ie "UTF-8"); // java.lang.String oe } }