package ru.gelin.android.weather.source; import android.content.Context; import android.util.Log; import ru.gelin.android.weather.notification.app.DebugSettings; import ru.gelin.android.weather.notification.app.Tag; import java.io.File; import java.io.FileWriter; import java.io.Writer; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Set; import java.util.TimeZone; /** * Saves the query result to a file. */ public class DebugDumper { static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss'Z'"); static final Set<Character> BAD_CHARS = new HashSet<Character>(); static final char REPLACEMENT = '_'; static { DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); BAD_CHARS.add('/'); BAD_CHARS.add('?'); BAD_CHARS.add('<'); BAD_CHARS.add('>'); BAD_CHARS.add('\\'); BAD_CHARS.add(':'); BAD_CHARS.add('*'); BAD_CHARS.add('|'); BAD_CHARS.add('"'); BAD_CHARS.add('&'); BAD_CHARS.add('='); } private final DebugSettings settings; private final File path; private final String prefix; public DebugDumper(Context context, String prefix) { this.settings = new DebugSettings(context); this.path = settings.getDebugDir(); this.prefix = prefix; } public void dump(String url, String content) { if (!this.settings.isAPIDebug()) { return; } File dumpFile = getDumpFile(url); File dir = dumpFile.getParentFile(); if (!(dir.mkdirs() || dir.isDirectory())) { Log.w(Tag.TAG, "cannot create dir " + dir); return; } try { Log.d(Tag.TAG, "dumping to " + dumpFile); Writer out = new FileWriter(dumpFile); out.write(content); out.close(); } catch (Exception e) { Log.w(Tag.TAG, "cannot create debug dump", e); } } File getDumpFile(String url) { StringBuilder fileName = new StringBuilder(); fileName.append(DATE_FORMAT.format(new Date())); fileName.append(url.replace(this.prefix, "")); for (int i = 0; i < fileName.length(); i++) { if (BAD_CHARS.contains(fileName.charAt(i))) { fileName.setCharAt(i, REPLACEMENT); } } fileName.append(".txt"); return new File(this.path, fileName.toString()); } }