br.com.objectos.way.core.code.jdt.CompilationUnitWriter.java Source code

Java tutorial

Introduction

Here is the source code for br.com.objectos.way.core.code.jdt.CompilationUnitWriter.java

Source

/*
 * Copyright 2014 Objectos, Fbrica 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.core.code.jdt;

import br.com.objectos.way.code.CodeCanvasArtifact;
import br.com.objectos.way.code.info.*;
import br.com.objectos.way.core.util.WayIterables;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;

import java.util.List;

/**
 * @author marcio.endo@objectos.com.br (Marcio Endo)
 */
@SuppressWarnings("unchecked")
public class CompilationUnitWriter {

    private final AST ast;
    private final CompilationUnit compilationUnit;
    private final PackageInfo packageInfo;

    private TypeDeclarationWriter typeDeclarationWriter;

    private CompilationUnitWriter(CompilationUnit compilationUnit, PackageInfo packageInfo) {
        this.ast = compilationUnit.getAST();
        this.compilationUnit = compilationUnit;
        this.packageInfo = packageInfo;
    }

    public static CompilationUnitWriter atPackageOf(TypeInfo typeInfo) {
        AST ast = AST.newAST(AST.JLS8);
        CompilationUnit compilationUnit = ast.newCompilationUnit();
        PackageInfo packageInfo = typeInfo.writePackage(compilationUnit);
        return new CompilationUnitWriter(compilationUnit, packageInfo);
    }

    public TypeDeclarationWriter newTypeDeclarationWriter() {
        TypeDeclaration typeDeclaration = ast.newTypeDeclaration();
        compilationUnit.types().add(typeDeclaration);
        return typeDeclarationWriter = new TypeDeclarationWriter(typeDeclaration);
    }

    public CodeCanvasArtifact toCodeCanvasArtifact() {
        List<ImportDeclaration> importDeclarationList = WayIterables.from(typeDeclarationWriter.toImportInfoSet())
                .when(packageInfo != null).filter(new NotSamePackage())
                .filter(Predicates.not(ImportInfoIsJavaLang.INSTANCE))
                .transform(new ImportInfoJdtToImportDeclaration(ast)).toImmutableList();

        compilationUnit.imports().addAll(importDeclarationList);

        return new CodeCanvasArtifactBuilder().build();
    }

    private class CodeCanvasArtifactBuilder implements CodeCanvasArtifact.Builder {

        @Override
        public CodeCanvasArtifact build() {
            return CodeCanvasArtifact.POJO.get(this);
        }

        @Override
        public String getName() {
            String name = "Snippet.java";

            if (typeDeclarationWriter != null) {
                name = typeDeclarationWriter.toCompilationUnitName();
            }

            return name;
        }

        @Override
        public String getContents() {
            return compilationUnit.toString();
        }

    }

    private class NotSamePackage implements Predicate<ImportInfo> {
        @Override
        public boolean apply(ImportInfo input) {
            return !input.isSamePackage(packageInfo);
        }
    }

}