/** * 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 demo.jaxrs.server; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.json.basic.JsonMapObject; import org.apache.cxf.rs.security.oauth2.common.ClientAccessToken; import org.apache.cxf.rs.security.oidc.rp.OidcClientTokenContext; @Path("/") public class BigQueryService { private static final String BQ_SELECT = "SELECT corpus,corpus_date FROM publicdata:samples.shakespeare WHERE word=\\\"%s\\\""; private static final String BQ_REQUEST = "{" + "\"kind\": \"bigquery#queryRequest\"," + "\"query\": \"%s\"," + "\"maxResults\": %d" + "}"; @Context private OidcClientTokenContext oidcContext; private WebClient bigQueryClient; @GET @Path("/start") @Produces("text/html") public BigQueryStart startBigQuerySearch() { return new BigQueryStart(getUserInfo()); } @POST @Path("/complete") @Consumes("application/x-www-form-urlencoded") @Produces("text/html") public BigQueryResponse completeBigQuerySearch(@FormParam("word") String searchWord, @FormParam("maxResults") String maxResults) { ClientAccessToken accessToken = oidcContext.getToken(); BigQueryResponse bigQueryResponse = new BigQueryResponse(getUserInfo(), searchWord); bigQueryResponse.setTexts(getMatchingTexts(bigQueryClient, accessToken, searchWord, maxResults)); return bigQueryResponse; } private String getUserInfo() { if (oidcContext.getUserInfo() != null) { return oidcContext.getUserInfo().getName(); } else { return oidcContext.getIdToken().getSubject(); } } public void setBigQueryClient(WebClient bigQueryClient) { this.bigQueryClient = bigQueryClient; } static List<ShakespeareText> getMatchingTexts(WebClient bqClient, ClientAccessToken accessToken, String searchWord, String maxResults) { bqClient.authorization(accessToken); String bigQuerySelect = String.format(BQ_SELECT, searchWord); String bigQueryRequest = String.format(BQ_REQUEST, bigQuerySelect, Integer.parseInt(maxResults)); JsonMapObject jsonMap = bqClient.post(bigQueryRequest, JsonMapObject.class); List<ShakespeareText> texts = new LinkedList<ShakespeareText>(); List<Map<String, Object>> rows = CastUtils.cast((List<?>)jsonMap.getProperty("rows")); if (rows != null) { for (Map<String, Object> row : rows) { List<Map<String, Object>> fields = CastUtils.cast((List<?>)row.get("f")); ShakespeareText text = new ShakespeareText((String)fields.get(0).get("v"), (String)fields.get(1).get("v")); texts.add(text); } } return texts; } }