All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
net.zerobuilder.compiler.generate.UpdaterContextB Maven / Gradle / Ivy
package net.zerobuilder.compiler.generate;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import net.zerobuilder.compiler.generate.DtoBeanGoalContext.BeanGoalContext;
import net.zerobuilder.compiler.generate.DtoBeanStep.AbstractBeanStep;
import net.zerobuilder.compiler.generate.DtoBeanStep.AccessorPairStep;
import net.zerobuilder.compiler.generate.DtoBeanStep.BeanStepCases;
import net.zerobuilder.compiler.generate.DtoBeanStep.LoneGetterStep;
import net.zerobuilder.compiler.generate.DtoStep.CollectionInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import static com.squareup.javapoet.MethodSpec.methodBuilder;
import static com.squareup.javapoet.WildcardTypeName.subtypeOf;
import static java.util.Collections.singletonList;
import static javax.lang.model.element.Modifier.PUBLIC;
import static net.zerobuilder.compiler.generate.DtoBeanParameter.beanParameterName;
import static net.zerobuilder.compiler.generate.DtoBeanStep.asFunction;
import static net.zerobuilder.compiler.generate.UpdaterContext.updaterType;
import static net.zerobuilder.compiler.generate.Utilities.ClassNames.ITERABLE;
import static net.zerobuilder.compiler.generate.Utilities.nullCheck;
import static net.zerobuilder.compiler.generate.Utilities.parameterSpec;
import static net.zerobuilder.compiler.generate.Utilities.presentInstances;
final class UpdaterContextB {
static final Function> fields
= goal -> singletonList(goal.goal.field);
static final Function> updateMethods
= goal -> {
List builder = new ArrayList<>();
Function> updateMethods1 = stepToMethods(goal);
for (AbstractBeanStep step : goal.goal.steps) {
builder.addAll(updateMethods1.apply(step));
}
return builder;
};
private static Function>
stepToMethods(final BeanGoalContext goal) {
return asFunction(new BeanStepCases>() {
@Override
public List accessorPair(AccessorPairStep step) {
return regularMethods(step, goal);
}
@Override
public List loneGetter(LoneGetterStep step) {
return collectionUpdaters(goal, step);
}
});
}
private static List regularMethods(AccessorPairStep step, BeanGoalContext goal) {
List builder = new ArrayList<>();
builder.add(normalUpdate(goal, step));
builder.addAll(presentInstances(regularEmptyCollection(goal, step)));
return builder;
}
private static Optional regularEmptyCollection(BeanGoalContext goal, AccessorPairStep step) {
Optional maybeEmptyOption = step.emptyOption();
if (!maybeEmptyOption.isPresent()) {
return Optional.empty();
}
CollectionInfo collectionInfo = maybeEmptyOption.get();
TypeName type = step.accessorPair.type;
String name = step.accessorPair.accept(beanParameterName);
ParameterSpec emptyColl = parameterSpec(type, name);
return Optional.of(methodBuilder(collectionInfo.name)
.returns(updaterType(goal))
.addStatement("$T $N = $L", emptyColl.type, emptyColl, collectionInfo.initializer)
.addStatement("this.$N.$L($N)",
goal.goal.field, step.setter, emptyColl)
.addStatement("return this")
.addModifiers(PUBLIC)
.build());
}
private static MethodSpec normalUpdate(BeanGoalContext goal, AccessorPairStep step) {
String name = step.accessorPair.accept(beanParameterName);
ParameterSpec parameter = step.parameter();
return methodBuilder(name)
.returns(updaterType(goal))
.addParameter(parameter)
.addStatement("this.$N.$L($N)",
goal.goal.field, step.setter, parameter)
.addStatement("return this")
.addModifiers(PUBLIC)
.build();
}
private static List collectionUpdaters(BeanGoalContext goal, LoneGetterStep step) {
List builder = new ArrayList<>();
builder.add(iterateCollection(goal, step));
builder.add(loneGetterEmptyCollection(goal, step));
return builder;
}
private static MethodSpec iterateCollection(BeanGoalContext goal, LoneGetterStep step) {
ParameterizedTypeName iterable = ParameterizedTypeName.get(ITERABLE,
subtypeOf(step.loneGetter.iterationType()));
String name = step.loneGetter.accept(beanParameterName);
ParameterSpec parameter = parameterSpec(iterable, name);
ParameterSpec iterationVar = step.loneGetter.iterationVar(parameter);
return methodBuilder(name)
.returns(updaterType(goal))
.addParameter(parameter)
.addCode(nullCheck(name, name))
.addCode(clearCollection(goal, step))
.beginControlFlow("for ($T $N : $N)", iterationVar.type, iterationVar, name)
.addStatement("this.$N.$N().add($N)",
goal.goal.field, step.loneGetter.getter, iterationVar)
.endControlFlow()
.addStatement("return this")
.addModifiers(PUBLIC)
.build();
}
private static MethodSpec loneGetterEmptyCollection(BeanGoalContext goal, LoneGetterStep step) {
return methodBuilder(step.emptyMethod)
.returns(updaterType(goal))
.addCode(clearCollection(goal, step))
.addStatement("return this")
.addModifiers(PUBLIC)
.build();
}
private static CodeBlock clearCollection(BeanGoalContext goal, LoneGetterStep step) {
return CodeBlock.builder().addStatement("this.$N.$N().clear()",
goal.goal.field, step.loneGetter.getter).build();
}
private UpdaterContextB() {
throw new UnsupportedOperationException("no instances");
}
}