brut.androlib.apk.YamlWriter Maven / Gradle / Ivy
/*
* Copyright (C) 2010 Ryszard Wiśniewski
* Copyright (C) 2010 Connor Tumbleson
*
* 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
*
* https://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 brut.androlib.apk;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class YamlWriter implements Closeable {
private int mIndent = 0;
private final PrintWriter mWriter;
private final String QUOTE = "'";
public YamlWriter(OutputStream out) {
mWriter = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(out, StandardCharsets.UTF_8)));
}
@Override
public void close() throws IOException {
mWriter.close();
}
public String getIndentString() {
// for java 11
// return " ".repeat(mIndent);
// for java 8
return String.join("", Collections.nCopies(mIndent, " "));
}
public static String escape(String value) {
return YamlStringEscapeUtils.escapeString(value);
}
public void nextIndent() {
mIndent += 2;
}
public void prevIndent() {
if (mIndent != 0) {
mIndent -= 2;
}
}
public void writeIndent() {
mWriter.print(getIndentString());
}
public void writeBool(String key, boolean value) {
writeIndent();
String val = value ? "true": "false";
mWriter.println(escape(key) + ": " + val);
}
public void writeString(String key, String value, boolean quoted) {
writeIndent();
if (Objects.isNull(value)) {
mWriter.println(escape(key) + ": null");
} else {
if (quoted) {
value = QUOTE + value + QUOTE;
}
mWriter.println(escape(key) + ": " + escape(value));
}
}
public void writeString(String key, String value) {
writeString(key, value, false);
}
public void writeList(String key, List list) {
if (Objects.isNull(list)) {
return;
}
writeIndent();
mWriter.println(escape(key) + ":");
for (T item: list) {
writeIndent();
mWriter.println("- " + item);
}
}
public void writeStringMap(String key, Map map) {
if (Objects.isNull(map)) {
return;
}
writeIndent();
mWriter.println(escape(key) + ":");
nextIndent();
for (String mapKey: map.keySet()) {
writeString(mapKey, map.get(mapKey));
}
prevIndent();
}
public void writeObject(String key, T obj) {
if (Objects.isNull(obj)) {
return;
}
writeIndent();
mWriter.println(escape(key) + ":");
nextIndent();
obj.write(this);
prevIndent();
}
}