Java tutorial
/** * Copyright 2010 Guardian News And Media * * 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.gu.openplatform.contentapi; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.Set; import static com.gu.openplatform.contentapi.GuardianApiHostProvider.getGuardianApiHost; public class ApiUrlFactory { private static final Logger logger = LoggerFactory.getLogger(ApiUrlFactory.class); URL constructApiUrl(String path, ApiQuery<?> apiQuery) { Map<ApiParameter, Object> params = apiQuery.generateParameterMap(); String hostPrefix = getGuardianApiHost(); StringBuilder url = new StringBuilder(); if (path.startsWith(hostPrefix)) { url.append(path); } else { url.append(hostPrefix); if (!path.startsWith("/")) url.append("/"); url.append(path); } Iterator<ApiParameter> parameterIter = params.keySet().iterator(); if (parameterIter.hasNext()) { url.append("?"); while (parameterIter.hasNext()) { appendParam(params, url, parameterIter.next()); if (parameterIter.hasNext()) url.append("&"); } } return convertToUrl(url); } private URL convertToUrl(StringBuilder urlString) { URL url; try { url = new URL(urlString.toString()); } catch (MalformedURLException e) { logger.error("Could not convert URL: " + urlString.toString()); throw new RuntimeException(e); } return url; } private void appendParam(Map<ApiParameter, Object> params, StringBuilder url, ApiParameter param) { Object value = params.get(param); url.append(param.getUrlParam()); url.append("="); url.append(value == null ? "" : UrlEncoder.encode(generateUrlRepresentation(value))); } private String generateUrlRepresentation(Object parameter) { if (parameter instanceof Set) return generateUrlRepresentation((Set) parameter); if (parameter instanceof Integer) return generateUrlRepresentation((Integer) parameter); if (parameter instanceof String) return (String) parameter; if (parameter instanceof DateTime) return generateUrlRepresentation((DateTime) parameter); throw new RuntimeException("Cannot convert paramter " + parameter.getClass()); } private String generateUrlRepresentation(DateTime date) { StringBuilder dateBuilder = new StringBuilder(); dateBuilder.append(date.getYear()); dateBuilder.append("-"); dateBuilder.append(date.getMonthOfYear()); dateBuilder.append("-"); dateBuilder.append(date.getDayOfMonth()); return dateBuilder.toString(); } private String generateUrlRepresentation(Integer parameter) { return Integer.toString(parameter); } private String generateUrlRepresentation(Set parameter) { StringBuilder builder = new StringBuilder(); Iterator iter = parameter.iterator(); while (iter.hasNext()) { Object part = iter.next(); if (part instanceof ApiUrlParameter) builder.append(((ApiUrlParameter) part).asApiUrlParameter()); else builder.append(part.toString()); if (iter.hasNext()) builder.append(","); } return builder.toString(); } }