
br.com.objectos.code.pojo.OptionalAttributeMethod Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2015 Objectos, Fábrica de Software LTDA.
*
* 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 br.com.objectos.code.pojo;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import javax.lang.model.element.Modifier;
import br.com.objectos.code.Code;
import br.com.objectos.code.MethodInfo;
import br.com.objectos.code.SimpleTypeInfo;
import br.com.objectos.code.TypeParameterInfo;
import br.com.objectos.core.auto.AutoPojo;
import com.google.common.collect.ImmutableList;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeName;
/**
* @author [email protected] (Marcio Endo)
*/
@AutoPojo
abstract class OptionalAttributeMethod extends AttributeMethod {
abstract TypeName elementTypeName();
OptionalAttributeMethod() {
}
public static OptionalAttributeMethodBuilder builder() {
return new OptionalAttributeMethodBuilderPojo();
}
public static AttributeMethod of(Naming naming, MethodInfo methodInfo, SimpleTypeInfo returnTypeInfo) {
TypeParameterInfo typeParameterInfo = returnTypeInfo.getTypeParameterInfoStream()
.findFirst()
.get();
TypeName elementTypeName = typeParameterInfo.typeNameBound();
return OptionalAttributeMethod.builder()
.naming(naming)
.accessInfo(methodInfo.accessInfo())
.name(methodInfo.name())
.fieldName(methodInfo.fieldName())
.returnTypeName(returnTypeInfo.typeName())
.elementTypeName(elementTypeName)
.build();
}
@Override
Stream builderClassSetter() {
TypeName returns = naming().builderInnerTypeName(this);
return Stream.of(
builderClassSetterStandard(returns),
builderClassSetterEmpty(returns),
builderClassSetterOf(returns),
builderClassSetterOfNullable(returns)
);
}
@Override
List builderInterfaceMiddle() {
TypeName returns = naming().builderInnerTypeName(this);
return ImmutableList. builder()
.add(builderInterfaceMiddleStandard(returns))
.add(builderInterfaceMiddleEmpty(returns))
.add(builderInterfaceMiddleOf(returns))
.add(builderInterfaceMiddleOfNullable(returns))
.build();
}
private MethodSpec.Builder builderClassSetter(String suffix, TypeName returns, TypeName returnTypeName) {
MethodSpec.Builder method = MethodSpec.methodBuilder(fieldName() + suffix)
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(returns);
if (returnTypeName != null) {
method.addParameter(returnTypeName, fieldName());
}
return method;
}
private MethodSpec builderClassSetterEmpty(TypeName returns) {
return builderClassSetter("", returns, null)
.addStatement("this.$L = $T.empty()", fieldName(), Optional.class)
.addStatement("return this")
.build();
}
private MethodSpec builderClassSetterOf(TypeName returns) {
return builderClassSetter("Of", returns, elementTypeName())
.addStatement("this.$L = $T.of($L)", fieldName(), Optional.class, fieldName())
.addStatement("return this")
.build();
}
private MethodSpec builderClassSetterOfNullable(TypeName returns) {
return builderClassSetter("OfNullable", returns, elementTypeName())
.addStatement("this.$L = $T.ofNullable($L)", fieldName(), Optional.class, fieldName())
.addStatement("return this")
.build();
}
private MethodSpec builderClassSetterStandard(TypeName returns) {
return builderClassSetter("", returns, returnTypeName())
.addCode(Code.nullCheck(fieldName()))
.addStatement("this.$L = $L", fieldName(), fieldName())
.addStatement("return this")
.build();
}
private MethodSpec builderInterface(String suffix, TypeName returns, TypeName returnTypeName) {
MethodSpec.Builder method = MethodSpec.methodBuilder(fieldName() + suffix)
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
.returns(returns);
if (returnTypeName != null) {
method.addParameter(returnTypeName, fieldName());
}
return method.build();
}
private MethodSpec builderInterfaceMiddleEmpty(TypeName returns) {
return builderInterface("", returns, null);
}
private MethodSpec builderInterfaceMiddleOf(TypeName returns) {
return builderInterface("Of", returns, elementTypeName());
}
private MethodSpec builderInterfaceMiddleOfNullable(TypeName returns) {
return builderInterface("OfNullable", returns, elementTypeName());
}
private MethodSpec builderInterfaceMiddleStandard(TypeName returns) {
return builderInterface("", returns, returnTypeName());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy