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

br.com.objectos.schema.SchemaCompiler Maven / Gradle / Ivy

The 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.schema;

import javax.annotation.Generated;
import javax.annotation.processing.Processor;

import br.com.objectos.code.Artifact;
import br.com.objectos.code.Configuration;
import br.com.objectos.code.PackageInfo;
import br.com.objectos.code.tools.ProcessorCompiler;
import br.com.objectos.metainf.Services;

import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.JavaFile;

/**
 * @author [email protected] (Marcio Endo)
 */
@Services(Processor.class)
public class SchemaCompiler extends ThisAnnotationProcessor {

  static final AnnotationSpec GENERATED = AnnotationSpec.builder(Generated.class)
      .addMember("value", "$S", SchemaCompiler.class.getName())
      .build();

  @Override
  protected Configuration configuration() {
    return Configuration.builder()
        .addAnnotationType(Schema.class)
        .addPackageInfoArtifactGenerator(this::generate)
        .listener(this)
        .build();
  }

  private Artifact generate(PackageInfo packageInfo) {
    try {
      return generate0(packageInfo);
    } catch (DdlException e) {
      e.printStackTrace();
      return Artifact.empty();
    }
  }

  private Artifact generate0(PackageInfo packageInfo) throws DdlException {
    RecordingConfiguration configuration = new RecordingConfiguration();
    ProcessorCompiler compiler = classPath.processorCompiler(processingEnv);

    packageInfo.annotationInfo(Schema.class)
        .get()
        .simpleTypeInfoArrayValue("migrations")
        .get()
        .stream()
        .map(MigrationTypeInfo::of)
        .map(info -> info.compile(compiler))
        .forEach(compiled -> compiled.configure(configuration));

    JavaFile[] files = configuration.build()
        .tableList()
        .stream()
        .map(table -> generateTable(packageInfo, table))
        .toArray(JavaFile[]::new);

    return Artifact.of(files);
  }

  private JavaFile generateTable(PackageInfo packageInfo, TableDef table) {
    return SchemaTableDef.of(table).generate(packageInfo);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy