Java tutorial
/* * 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); } } }