aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/squareup/javapoet/JavaPoet.java
blob: a61a31a18cb3fcd8f5246407afd896d7084dad4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 * Copyright (C) 2014 Google, Inc.
 *
 * 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 com.squareup.javapoet;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.processing.Filer;
import javax.lang.model.element.Element;
import javax.tools.JavaFileObject;

import static com.squareup.javapoet.Util.checkArgument;

/** Writes generated types to a filesystem using the standard directory structure. */
public final class JavaPoet {
  private final List<JavaFile> javaFiles = new ArrayList<>();
  private String indent = "  ";

  public JavaPoet setIndent(String indent) {
    this.indent = indent;
    return this;
  }

  public JavaPoet add(JavaFile javaFile) {
    javaFiles.add(javaFile);
    return this;
  }

  public JavaPoet add(String packageName, TypeSpec type) {
    return add(JavaFile.builder(packageName, type).build());
  }

  public void writeTo(Path directory) throws IOException {
    checkArgument(Files.notExists(directory) || Files.isDirectory(directory),
        "path %s exists but is not a directory.", directory);
    for (JavaFile javaFile : javaFiles) {
      String packageName = javaFile.packageName;

      Path outputDirectory = directory;
      if (!packageName.isEmpty()) {
        for (String packageComponent : packageName.split("\\.")) {
          outputDirectory = outputDirectory.resolve(packageComponent);
        }
        Files.createDirectories(outputDirectory);
      }

      Path outputPath = outputDirectory.resolve(javaFile.typeSpec.name + ".java");
      try (Writer writer = new OutputStreamWriter(Files.newOutputStream(outputPath))) {
        javaFile.emit(writer, indent);
      }
    }
  }

  public void writeTo(File directory) throws IOException {
    writeTo(directory.toPath());
  }

  public void writeTo(Filer filer) throws IOException {
    for (JavaFile javaFile : javaFiles) {
      String fileName = javaFile.packageName.isEmpty()
          ? javaFile.typeSpec.name
          : javaFile.packageName + "." + javaFile.typeSpec.name;
      List<Element> originatingElements = javaFile.typeSpec.originatingElements;
      JavaFileObject filerSourceFile = filer.createSourceFile(fileName,
          originatingElements.toArray(new Element[originatingElements.size()]));
      try (Writer writer = filerSourceFile.openWriter()) {
        javaFile.emit(writer, indent);
      } catch (Exception e) {
        try {
          filerSourceFile.delete();
        } catch (Exception ignored) {
        }
        throw e;
      }
    }
  }
}