/**
* Copyright 2011-2015 John Ericksen
*
* 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 org.androidtransfuse.gen.variableBuilder;
import com.google.common.collect.ImmutableList;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import org.androidtransfuse.adapter.ASTType;
import org.androidtransfuse.adapter.classes.ASTClassFactory;
import org.androidtransfuse.model.TypedExpression;
import javax.inject.Inject;
/**
* @author John Ericksen
*/
public class InjectionBindingBuilder {
private final VariableInjectionBuilderFactory variableInjectionBuilderFactory;
private final ASTClassFactory astClassFactory;
@Inject
public InjectionBindingBuilder(VariableInjectionBuilderFactory variableInjectionBuilderFactory, ASTClassFactory astClassFactory) {
this.variableInjectionBuilderFactory = variableInjectionBuilderFactory;
this.astClassFactory = astClassFactory;
}
public DependencyBindingBuilder dependency(Class clazz) {
return dependency(astClassFactory.getType(clazz));
}
public DependencyBindingBuilder dependency(ASTType type) {
return new DependencyBindingBuilder(type);
}
public StaticInvocationBindingBuilder staticInvoke(ASTType invocationTarget, ASTType returnType, String method) {
return new StaticInvocationBindingBuilder(invocationTarget, returnType, method);
}
public InjectionNodeBuilder buildThis(Class targetClass) {
ASTType astType = astClassFactory.getType(targetClass);
return buildThis(astType);
}
public InjectionNodeBuilder buildThis(ASTType targetType) {
return variableInjectionBuilderFactory.buildInjectionNodeBuilder(
variableInjectionBuilderFactory.buildIndependentVariableBuilderWrapper(targetType, JExpr._this()));
}
public InjectionNodeBuilder buildExpression(TypedExpression typedExpression) {
return variableInjectionBuilderFactory.buildInjectionNodeBuilder(
variableInjectionBuilderFactory.buildExpressionWrapper(typedExpression));
}
public final class StaticInvocationBindingBuilder {
private final ASTType invocationTarget;
private final ASTType returnType;
private final String method;
private StaticInvocationBindingBuilder(ASTType invocationTarget, ASTType returnType, String method) {
this.invocationTarget = invocationTarget;
this.returnType = returnType;
this.method = method;
}
public StaticInvocationBindingBuilderArgument dependencyArg(ASTType dependency) {
return new StaticInvocationBindingBuilderArgument(this, dependency);
}
}
public final class StaticInvocationBindingBuilderArgument {
private final StaticInvocationBindingBuilder parent;
private final ASTType dependency;
private StaticInvocationBindingBuilderArgument(StaticInvocationBindingBuilder parent, ASTType dependency) {
this.parent = parent;
this.dependency = dependency;
}
public InjectionNodeBuilder build() {
return variableInjectionBuilderFactory.buildDependentInjectionNodeBuilder(
dependency,
parent.returnType,
variableInjectionBuilderFactory.buildStaticInvocationVariableBuilder(parent.invocationTarget, parent.method));
}
}
public final class DependencyBindingBuilder {
private final ASTType type;
private DependencyBindingBuilder(ASTType type) {
this.type = type;
}
public DependantVariableBuilderWrapper invoke(ASTType returnType, DependentVariableBuilder dependentVariableBuilder) {
return new DependantVariableBuilderWrapper(returnType, dependentVariableBuilder);
}
public DependencyArgumentBindingBuilder invoke(ASTType returnType, String methodName) {
return new DependencyArgumentBindingBuilder(type, returnType, methodName);
}
public final class DependencyArgumentBindingBuilder {
private final ASTType type;
private final ASTType returnType;
private final String methodName;
private final ImmutableList.Builder<JExpression> arguments = ImmutableList.builder();
private DependencyArgumentBindingBuilder(ASTType type, ASTType returnType, String methodName) {
this.type = type;
this.returnType = returnType;
this.methodName = methodName;
}
public DependencyArgumentBindingBuilder arg(JExpression value) {
arguments.add(value);
return this;
}
public InjectionNodeBuilder build() {
return variableInjectionBuilderFactory.buildDependentInjectionNodeBuilder(
type,
returnType,
variableInjectionBuilderFactory.buildMethodCallVariableBuilder(methodName, arguments.build()));
}
}
public final class DependantVariableBuilderWrapper {
private final DependentVariableBuilder dependentVariableBuilder;
private final ASTType returnType;
private DependantVariableBuilderWrapper(ASTType returnType, DependentVariableBuilder dependentVariableBuilder) {
this.returnType = returnType;
this.dependentVariableBuilder = dependentVariableBuilder;
}
public InjectionNodeBuilder build() {
return variableInjectionBuilderFactory.buildDependentInjectionNodeBuilder(
type,
returnType,
dependentVariableBuilder
);
}
}
}
}