// Copyright 2012 Google Inc. All Rights Reserved. // // 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.google.api.ads.adwords.lib.client; import com.google.api.ads.adwords.lib.conf.AdWordsApiConfiguration; import com.google.api.ads.common.lib.client.AdsServiceDescriptor; import com.google.api.ads.common.lib.exception.ServiceException; import com.google.api.ads.common.lib.soap.compatability.AxisCompatible; import com.google.api.ads.common.lib.soap.compatability.JaxWsCompatible; import com.google.common.annotations.VisibleForTesting; import com.google.inject.assistedinject.Assisted; import java.net.MalformedURLException; import java.net.URL; import javax.inject.Inject; /** * {@code AdWordsServiceDescriptor} provides a class which defines a service * that can be instantiated through reflection. */ public class AdWordsServiceDescriptor implements AdsServiceDescriptor, AxisCompatible, JaxWsCompatible { private final Class<?> interfaceClass; private final String version; private final AdWordsApiConfiguration apiConfig; /** * Enumeration of high-level sub products within AdWords. */ public enum AdWordsSubProduct{ DEFAULT, EXPRESS } /** * Constructor. Requires the necessary information to instantiate an AdWords * service. * * @param interfaceClass the {@code Class<?>} object of the requested * interfaceClass * @param version the version of the service * @param apiConfig the API configuration */ @Inject public AdWordsServiceDescriptor(@Assisted("interfaceClass") Class<?> interfaceClass, @Assisted("version") String version, AdWordsApiConfiguration apiConfig) { this.interfaceClass = interfaceClass; this.version = version; this.apiConfig = apiConfig; } /** * @see AdsServiceDescriptor#getInterfaceClass() */ @Override public Class<?> getInterfaceClass() throws ServiceException { return interfaceClass; } /** * @throws MalformedURLException * @see AdsServiceDescriptor#getEndpointAddress(String) */ @Override public String getEndpointAddress(String endpointServer) throws MalformedURLException { String serviceName = getServiceName(); String endpointServerUrl = new URL(endpointServer).toString(); if (endpointServerUrl.endsWith("/")) { endpointServerUrl = endpointServerUrl.substring(0, endpointServerUrl.length() - 1); } return endpointServerUrl + "/api/adwords/" + apiConfig.getServiceUrlGroup(version, serviceName) + "/" + version + "/" + serviceName; } /** * @see AdsServiceDescriptor#getVersion() */ @Override public String getVersion() { return version; } /** * @see AxisCompatible#getLocatorClass() */ @Override public Class<?> getLocatorClass() throws ClassNotFoundException { return Class.forName( interfaceClass.getPackage().getName() + "." + getServiceName() + "Locator"); } /** * @see JaxWsCompatible#getServiceClass() */ @Override public Class<?> getServiceClass() throws ClassNotFoundException { return Class.forName(interfaceClass.getPackage().getName() + "." + getServiceName()); } /** * Generates the name of this service by using reflection. * * @return the name of the service this descriptor represents */ @VisibleForTesting String getServiceName() { String simpleName = interfaceClass.getSimpleName(); return simpleName.substring(0, simpleName.indexOf("Interface")); } /** * Gets the package group that the service is in i.e. "cm", "o", etc... */ public String getPackageGroup() { String packageName = interfaceClass.getPackage().getName(); String[] parts = packageName.split("\\."); return parts[parts.length - 1]; } /** * Gets the sub product for this service. */ public AdWordsSubProduct getSubProduct() { return apiConfig.getServiceSubProduct(version, getServiceName()); } }