/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 gobblin.ingestion.google.webmaster; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.batch.BatchRequest; import com.google.api.client.repackaged.com.google.common.base.Preconditions; import com.google.api.services.webmasters.Webmasters; import com.google.api.services.webmasters.model.ApiDataRow; import com.google.api.services.webmasters.model.ApiDimensionFilter; import com.google.api.services.webmasters.model.ApiDimensionFilterGroup; import com.google.api.services.webmasters.model.SearchAnalyticsQueryRequest; import com.google.api.services.webmasters.model.SearchAnalyticsQueryResponse; import gobblin.source.extractor.extract.google.GoogleCommon; public class GoogleWebmasterClientImpl extends GoogleWebmasterClient { private final Webmasters.Searchanalytics _analytics; private final Webmasters _service; public GoogleWebmasterClientImpl(Credential credential, String appName) throws IOException { //transport: new NetHttpTransport() or GoogleNetHttpTransport.newTrustedTransport() //jsonFactory: new JacksonFactory() or JacksonFactory.getDefaultInstance() _service = new Webmasters.Builder(credential.getTransport(), GoogleCommon.getJsonFactory(), credential) .setApplicationName(appName).build(); _analytics = _service.searchanalytics(); } @Override public BatchRequest createBatch() { return _service.batch(); } @Override public List<String> getPages(String siteProperty, String startDate, String endDate, String country, int rowLimit, List<GoogleWebmasterFilter.Dimension> requestedDimensions, List<ApiDimensionFilter> filters, int startRow) throws IOException { checkRowLimit(rowLimit); Preconditions.checkArgument(requestedDimensions.contains(GoogleWebmasterFilter.Dimension.PAGE)); SearchAnalyticsQueryResponse rspByCountry = createSearchAnalyticsQuery(siteProperty, startDate, endDate, requestedDimensions, GoogleWebmasterFilter.andGroupFilters(filters), rowLimit, startRow).execute(); List<ApiDataRow> pageRows = rspByCountry.getRows(); List<String> pages = new ArrayList<>(rowLimit); if (pageRows != null) { int pageIndex = requestedDimensions.indexOf(GoogleWebmasterFilter.Dimension.PAGE); for (ApiDataRow row : pageRows) { pages.add(row.getKeys().get(pageIndex)); } } return pages; } @Override public Webmasters.Searchanalytics.Query createSearchAnalyticsQuery(String siteProperty, String startDate, String endDate, List<GoogleWebmasterFilter.Dimension> dimensions, ApiDimensionFilterGroup filterGroup, int rowLimit, int startRow) throws IOException { List<String> dimensionStrings = new ArrayList<>(); for (GoogleWebmasterFilter.Dimension dimension : dimensions) { dimensionStrings.add(dimension.toString().toLowerCase()); } SearchAnalyticsQueryRequest request = new SearchAnalyticsQueryRequest().setStartDate(startDate).setEndDate(endDate).setRowLimit(rowLimit) .setDimensions(dimensionStrings).setStartRow(startRow); if (filterGroup != null) { request.setDimensionFilterGroups(Arrays.asList(filterGroup)); } return _analytics.query(siteProperty, request); } private static void checkRowLimit(int rowLimit) { Preconditions.checkArgument(rowLimit > 0 && rowLimit <= API_ROW_LIMIT, "Row limit for Google Search Console API must be within range (0, 5000]"); } }