/*
* Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved
* http://www.griddynamics.com
*
* This library is free software; you can redistribute it and/or modify it under the terms of
* the Apache License; either
* version 2.0 of the License, or any later version.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.griddynamics.jagger.invoker;
import com.griddynamics.jagger.coordinator.NodeContext;
import com.griddynamics.jagger.engine.e1.Provider;
import com.griddynamics.jagger.util.JavaSystemClock;
import com.griddynamics.jagger.util.SystemClock;
public class QueryPoolScenarioFactory<Q, R, E> implements ScenarioFactory<Q, R, E> {
private Class<Invoker<Q, R, E>> invokerClazz;
private QueryPoolLoadBalancer<Q, E> loadBalancer;
private SystemClock systemClock = new JavaSystemClock();
private Iterable<Q> queryProvider;
private Iterable<E> endpointProvider;
private Provider<Invoker> invokerProvider;
@Override
public Scenario<Q, R, E> get(NodeContext nodeContext, KernelInfo kernelInfo) {
Invoker<Q, R, E> invoker = instantiateInvoker(nodeContext);
initLoadBalancer(kernelInfo);
return new QueryPoolScenario<Q, R, E>(invoker, loadBalancer.provide(), systemClock);
}
private Invoker<Q, R, E> instantiateInvoker(final NodeContext nodeContext) {
// TODO: to remove request to context after JFG-1090
Invoker<Q, R, E> invoker = nodeContext.getService(invokerClazz);
if (invokerProvider != null) {
invoker = invokerProvider.provide();
}
if (invoker == null) {
throw new IllegalArgumentException("Service for class + '" + invokerClazz.getCanonicalName()
+ "' not found!");
}
return invoker;
}
private void initLoadBalancer(KernelInfo kernelInfo) {
if (endpointProvider != null) {
loadBalancer.setEndpointProvider(getEndpointProvider());
}
if (queryProvider != null) {
loadBalancer.setQueryProvider(getQueryProvider());
}
loadBalancer.setKernelInfo(kernelInfo);
loadBalancer.init();
}
//@Required
public void setInvokerClazz(Class<Invoker<Q, R, E>> invokerClazz) {
this.invokerClazz = invokerClazz;
}
//@Required
public void setLoadBalancer(QueryPoolLoadBalancer<Q, E> loadBalancer) {
this.loadBalancer = loadBalancer;
}
public void setSystemClock(SystemClock systemClock) {
this.systemClock = systemClock;
}
public Iterable<Q> getQueryProvider() {
return queryProvider;
}
public void setQueryProvider(Iterable<Q> queryProvider) {
this.queryProvider = queryProvider;
}
public Iterable<E> getEndpointProvider() {
return endpointProvider;
}
public void setEndpointProvider(Iterable<E> endpointProvider) {
this.endpointProvider = endpointProvider;
}
public void setInvokerProvider(Provider<Invoker> invokerProvider) {
this.invokerProvider = invokerProvider;
}
}