// Copyright 2011, 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.common.lib.factory; import com.google.api.ads.common.lib.client.AdsServiceClient; import com.google.api.ads.common.lib.client.AdsServiceDescriptor; import com.google.api.ads.common.lib.client.AdsSession; import com.google.api.ads.common.lib.factory.helper.AdsServiceClientFactoryHelper; import com.google.inject.AbstractModule; import com.google.inject.TypeLiteral; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.FactoryModuleBuilder; /** * Module for factories. * * @param <C> the subclass of {@link AdsServiceClient} * @param <D> the subclass of {@link AdsServiceDescriptor} * @param <S> the subclass of {@link AdsSession} * @param <H> the subclass of {@link AdsServiceClientFactoryHelper} * @param <F> the subclass of {@link BaseAdsServiceClientFactory} */ public class FactoryModule<C extends AdsServiceClient<S, D>, D extends AdsServiceDescriptor, S extends AdsSession, H extends AdsServiceClientFactoryHelper<C, S, D>, F extends BaseAdsServiceClientFactory<C, S, D>> extends AbstractModule { private final TypeLiteral<AdsServiceClientFactoryInterface<C, S, D>> adsServiceClientFactoryTypeLiteral; private final TypeLiteral<AdsServiceDescriptorFactoryInterface<D>> adsServiceDescriptorFactoryTypeLiteral; private final TypeLiteral<C> adsServiceClientTypeLiteral; private final TypeLiteral<D> adsServiceDescriptorTypeLiteral; private final Class<H> factoryHelperClass; private final Class<F> factoryClass; /** * Constructor. * * @param adsServiceClientFactoryTypeLiteral the factory type literal which * contains a {@link AdsServiceClientFactoryInterface} * @param adsServiceDescriptorFactoryTypeLiteral the factory type literal * which contains a {@link AdsServiceDescriptorFactoryInterface} * @param adsServiceClientTypeLiteral the ads service client literal which * contains a {@link AdsServiceClient} * @param adsServiceDescriptorTypeLiteral the ads service descriptor literal * which contains a {@link AdsServiceDescriptor} * @param adsServiceClientFactoryHelperClass the {@link AdsServiceClientFactoryHelper} class * @param baseAdsServiceClientFactoryClass the {@link BaseAdsServiceClientFactory} class */ public FactoryModule( TypeLiteral<AdsServiceClientFactoryInterface<C, S, D>> adsServiceClientFactoryTypeLiteral, TypeLiteral<AdsServiceDescriptorFactoryInterface<D>> adsServiceDescriptorFactoryTypeLiteral, TypeLiteral<C> adsServiceClientTypeLiteral, TypeLiteral<D> adsServiceDescriptorTypeLiteral, Class<H> adsServiceClientFactoryHelperClass, Class<F> baseAdsServiceClientFactoryClass) { this.adsServiceClientFactoryTypeLiteral = adsServiceClientFactoryTypeLiteral; this.adsServiceDescriptorFactoryTypeLiteral = adsServiceDescriptorFactoryTypeLiteral; this.adsServiceClientTypeLiteral = adsServiceClientTypeLiteral; this.adsServiceDescriptorTypeLiteral = adsServiceDescriptorTypeLiteral; this.factoryHelperClass = adsServiceClientFactoryHelperClass; this.factoryClass = baseAdsServiceClientFactoryClass; } @Override protected void configure() { // Bind the base Guice factory interface to its typed one. install( new FactoryModuleBuilder() .implement(adsServiceClientTypeLiteral, adsServiceClientTypeLiteral) .build(adsServiceClientFactoryTypeLiteral)); install( new FactoryModuleBuilder() .implement(adsServiceDescriptorTypeLiteral, adsServiceDescriptorTypeLiteral) .build(adsServiceDescriptorFactoryTypeLiteral)); bind(AdsServiceClientFactoryHelper.class).to(factoryHelperClass); bind(factoryClass); } /** * Factory interface class to create {@link AdsServiceClient}. * * @param <C> the subclass of {@link AdsServiceClient} * @param <S> the subclass of {@link AdsSession} * @param <D> the subclass of {@link AdsServiceDescriptor} */ public static interface AdsServiceClientFactoryInterface<C extends AdsServiceClient<S, D>, S extends AdsSession, D extends AdsServiceDescriptor> { /** * Creates an {@link AdsServiceClient} given a SOAP client and an * {@link AdsServiceDescriptor} descriptor. * * @param soapClient the SOAP client underlying this service client * @param adsServiceDescriptor the service to get the client for * @param adsSession the ads session * @return a client for the specified ads service */ C create(@Assisted("soapClient") Object soapClient, @Assisted("adsServiceDescriptor") D adsServiceDescriptor, @Assisted("adsSession") S adsSession); } /** * Factory interface class to create {@link AdsServiceDescriptor}. * * @param <D> the subclass of {@link AdsServiceDescriptor} */ public static interface AdsServiceDescriptorFactoryInterface<D extends AdsServiceDescriptor>{ /** * Creates an ads service descriptor given an interface class. * * @param interfaceClass the interface class for the descriptor. * @param version the version of the service * @return the ads service descriptor */ D create(@Assisted("interfaceClass") Class<?> interfaceClass, @Assisted("version") String version); } }