1 package com.fasterxml.jackson.core.util;
2
3 import java.io.IOException;
4
5 import com.fasterxml.jackson.core.JsonGenerator;
6
7
13 public class DefaultIndenter
14 extends DefaultPrettyPrinter.NopIndenter
15 {
16 private static final long serialVersionUID = 1L;
17
18 public final static String SYS_LF;
19 static {
20 String lf;
21 try {
22 lf = System.getProperty("line.separator");
23 } catch (Throwable t) {
24 lf = "\n";
25 }
26 SYS_LF = lf;
27 }
28
29 public static final DefaultIndenter SYSTEM_LINEFEED_INSTANCE = new DefaultIndenter(" ", SYS_LF);
30
31
35 private final static int INDENT_LEVELS = 16;
36 private final char[] indents;
37 private final int charsPerLevel;
38 private final String eol;
39
40
43 public DefaultIndenter() {
44 this(" ", SYS_LF);
45 }
46
47
51 public DefaultIndenter(String indent, String eol)
52 {
53 charsPerLevel = indent.length();
54
55 indents = new char[indent.length() * INDENT_LEVELS];
56 int offset = 0;
57 for (int i=0; i<INDENT_LEVELS; i++) {
58 indent.getChars(0, indent.length(), indents, offset);
59 offset += indent.length();
60 }
61
62 this.eol = eol;
63 }
64
65 public DefaultIndenter withLinefeed(String lf)
66 {
67 if (lf.equals(eol)) {
68 return this;
69 }
70 return new DefaultIndenter(getIndent(), lf);
71 }
72
73 public DefaultIndenter withIndent(String indent)
74 {
75 if (indent.equals(getIndent())) {
76 return this;
77 }
78 return new DefaultIndenter(indent, eol);
79 }
80
81 @Override
82 public boolean isInline() { return false; }
83
84 @Override
85 public void writeIndentation(JsonGenerator jg, int level) throws IOException
86 {
87 jg.writeRaw(eol);
88 if (level > 0) {
89 level *= charsPerLevel;
90 while (level > indents.length) {
91 jg.writeRaw(indents, 0, indents.length);
92 level -= indents.length;
93 }
94 jg.writeRaw(indents, 0, level);
95 }
96 }
97
98 public String getEol() {
99 return eol;
100 }
101
102 public String getIndent() {
103 return new String(indents, 0, charsPerLevel);
104 }
105 }