
br.com.objectos.way.flat.FlatContainerVisitor Maven / Gradle / Ivy
/*
* Copyright 2016 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.way.flat;
import javax.lang.model.element.Modifier;
import br.com.objectos.way.flat.FlatReader;
import br.com.objectos.way.flat.FlatReaderVisitor;
import br.com.objectos.way.flat.UnsupportedPrefixException;
import br.com.objectos.way.pojo.plugin.Naming;
import br.com.objectos.way.pojo.plugin.PojoInfo;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
/**
* @author [email protected] (Marcio Endo)
*/
class FlatContainerVisitor {
private final TypeSpec.Builder visitor;
private final BuildMethod buildMethod;
private final VisitLineMethod visitLineMethod;
public FlatContainerVisitor(PojoInfo pojoInfo) {
Naming naming = pojoInfo.naming();
visitor = TypeSpec.classBuilder(naming.superClassSuffix("FlatReaderVisitor"))
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
.addSuperinterface(FlatReaderVisitor.class);
buildMethod = new BuildMethod(naming);
visitLineMethod = new VisitLineMethod();
}
public void add(FlatContainerProperty property) {
property.flatReaderVisitor(visitor);
buildMethod.add(property);
visitLineMethod.add(property);
}
public TypeSpec build() {
return visitor
.addMethod(buildMethod.build())
.addMethod(visitLineMethod.build())
.build();
}
private static class BuildMethod {
private final MethodSpec.Builder method;
private boolean first = true;
public BuildMethod(Naming naming) {
method = MethodSpec.methodBuilder("build")
.addModifiers(Modifier.PUBLIC)
.returns(naming.superClass())
.addCode("return new $T(", naming.pojo());
}
public void add(FlatContainerProperty property) {
if (first) {
method.addCode("$L", property.propertyName());
first = false;
} else {
method.addCode(", $L", property.propertyName());
}
}
public MethodSpec build() {
return method.addStatement(")").build();
}
}
private static class VisitLineMethod {
private final MethodSpec.Builder method;
private boolean first = true;
public VisitLineMethod() {
method = MethodSpec.methodBuilder("visitLine")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.addParameter(FlatReader.class, "reader");
}
public void add(FlatContainerProperty property) {
if (first) {
addFirst(property);
} else {
addNext(property);
}
}
public MethodSpec build() {
return method
.addCode("default:\n")
.addStatement("throw new $T(prefix)", UnsupportedPrefixException.class)
.endControlFlow()
.build();
}
private void addFirst(FlatContainerProperty property) {
first = false;
property.visitLineMethodSwitch(method);
addNext(property);
}
private void addNext(FlatContainerProperty property) {
property.visitLineMethod(method);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy