/*
* Copyright 2014 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.code;
import java.util.List;
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 br.com.objectos.way.base.WayIterables;
import com.google.common.base.Predicate;
/**
* @author marcio.endo@objectos.com.br (Marcio Endo)
*/
@SuppressWarnings("unchecked")
public class CompilationUnitWriter {
private final AST ast;
private final CompilationUnit compilationUnit;
private PackageInfo packageInfo;
private TypeDeclarationWriter typeDeclarationWriter;
CompilationUnitWriter(AST ast) {
this.ast = ast;
compilationUnit = ast.newCompilationUnit();
}
public CompilationUnitWriter atPackageOf(TypeInfo typeInfo) {
packageInfo = typeInfo.writePackage(compilationUnit);
return this;
}
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(ImportInfo.NOT_JAVA_LANG)
.transform(new ImportInfoToImportDeclaration(ast))
.toImmutableList();
compilationUnit.imports().addAll(importDeclarationList);
return new CodeCanvasArtifactBuilder().build();
}
private class CodeCanvasArtifactBuilder implements CodeCanvasArtifact.Builder {
@Override
public CodeCanvasArtifact build() {
return new CodeCanvasArtifactPojo(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);
}
}
}