All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.com.objectos.way.flat.FlatContainerVisitor Maven / Gradle / Ivy

There is a newer version: 0.6.0
Show newest version
/*
 * 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