001/** 002 * Copyright (C) 2011-2012 Typesafe Inc. <http://typesafe.com> 003 */ 004package com.typesafe.config; 005 006/** 007 * <p> 008 * A set of options related to rendering a {@link ConfigValue}. Passed to 009 * {@link ConfigValue#render(ConfigRenderOptions)}. 010 * 011 * <p> 012 * Here is an example of creating a {@code ConfigRenderOptions}: 013 * 014 * <pre> 015 * ConfigRenderOptions options = 016 * ConfigRenderOptions.defaults().setComments(false) 017 * </pre> 018 */ 019public final class ConfigRenderOptions { 020 private final boolean originComments; 021 private final boolean comments; 022 private final boolean formatted; 023 private final boolean json; 024 025 private ConfigRenderOptions(boolean originComments, boolean comments, boolean formatted, 026 boolean json) { 027 this.originComments = originComments; 028 this.comments = comments; 029 this.formatted = formatted; 030 this.json = json; 031 } 032 033 /** 034 * Returns the default render options which are verbose (commented and 035 * formatted). See {@link ConfigRenderOptions#concise} for stripped-down 036 * options. This rendering will not be valid JSON since it has comments. 037 * 038 * @return the default render options 039 */ 040 public static ConfigRenderOptions defaults() { 041 return new ConfigRenderOptions(true, true, true, true); 042 } 043 044 /** 045 * Returns concise render options (no whitespace or comments). For a 046 * resolved {@link Config}, the concise rendering will be valid JSON. 047 * 048 * @return the concise render options 049 */ 050 public static ConfigRenderOptions concise() { 051 return new ConfigRenderOptions(false, false, false, true); 052 } 053 054 /** 055 * Returns options with comments toggled. This controls human-written 056 * comments but not the autogenerated "origin of this setting" comments, 057 * which are controlled by {@link ConfigRenderOptions#setOriginComments}. 058 * 059 * @param value 060 * true to include comments in the render 061 * @return options with requested setting for comments 062 */ 063 public ConfigRenderOptions setComments(boolean value) { 064 if (value == comments) 065 return this; 066 else 067 return new ConfigRenderOptions(originComments, value, formatted, json); 068 } 069 070 /** 071 * Returns whether the options enable comments. This method is mostly used 072 * by the config lib internally, not by applications. 073 * 074 * @return true if comments should be rendered 075 */ 076 public boolean getComments() { 077 return comments; 078 } 079 080 /** 081 * Returns options with origin comments toggled. If this is enabled, the 082 * library generates comments for each setting based on the 083 * {@link ConfigValue#origin} of that setting's value. For example these 084 * comments might tell you which file a setting comes from. 085 * 086 * <p> 087 * {@code setOriginComments()} controls only these autogenerated 088 * "origin of this setting" comments, to toggle regular comments use 089 * {@link ConfigRenderOptions#setComments}. 090 * 091 * @param value 092 * true to include autogenerated setting-origin comments in the 093 * render 094 * @return options with origin comments toggled 095 */ 096 public ConfigRenderOptions setOriginComments(boolean value) { 097 if (value == originComments) 098 return this; 099 else 100 return new ConfigRenderOptions(value, comments, formatted, json); 101 } 102 103 /** 104 * Returns whether the options enable automated origin comments. This method 105 * is mostly used by the config lib internally, not by applications. 106 * 107 * @return true if origin comments should be rendered 108 */ 109 public boolean getOriginComments() { 110 return originComments; 111 } 112 113 /** 114 * Returns options with formatting toggled. Formatting means indentation and 115 * whitespace, enabling formatting makes things prettier but larger. 116 * 117 * @param value 118 * true to enable formatting 119 * @return options with requested setting for formatting 120 */ 121 public ConfigRenderOptions setFormatted(boolean value) { 122 if (value == formatted) 123 return this; 124 else 125 return new ConfigRenderOptions(originComments, comments, value, json); 126 } 127 128 /** 129 * Returns whether the options enable formatting. This method is mostly used 130 * by the config lib internally, not by applications. 131 * 132 * @return true if the options enable formatting 133 */ 134 public boolean getFormatted() { 135 return formatted; 136 } 137 138 /** 139 * Returns options with JSON toggled. JSON means that HOCON extensions 140 * (omitting commas, quotes for example) won't be used. However, whether to 141 * use comments is controlled by the separate {@link #setComments(boolean)} 142 * and {@link #setOriginComments(boolean)} options. So if you enable 143 * comments you will get invalid JSON despite setting this to true. 144 * 145 * @param value 146 * true to include non-JSON extensions in the render 147 * @return options with requested setting for JSON 148 */ 149 public ConfigRenderOptions setJson(boolean value) { 150 if (value == json) 151 return this; 152 else 153 return new ConfigRenderOptions(originComments, comments, formatted, value); 154 } 155 156 /** 157 * Returns whether the options enable JSON. This method is mostly used by 158 * the config lib internally, not by applications. 159 * 160 * @return true if only JSON should be rendered 161 */ 162 public boolean getJson() { 163 return json; 164 } 165 166 @Override 167 public String toString() { 168 StringBuilder sb = new StringBuilder("ConfigRenderOptions("); 169 if (originComments) 170 sb.append("originComments,"); 171 if (comments) 172 sb.append("comments,"); 173 if (formatted) 174 sb.append("formatted,"); 175 if (json) 176 sb.append("json,"); 177 if (sb.charAt(sb.length() - 1) == ',') 178 sb.setLength(sb.length() - 1); 179 sb.append(")"); 180 return sb.toString(); 181 } 182}