001 /* 002 * Copyright 2005,2009 Ivan SZKIBA 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.ini4j.spi; 017 018 import org.ini4j.Config; 019 import org.ini4j.IniHandler; 020 import org.ini4j.IniParser; 021 022 import java.io.OutputStream; 023 import java.io.OutputStreamWriter; 024 import java.io.PrintWriter; 025 import java.io.Writer; 026 027 public class IniFormatter implements IniHandler 028 { 029 private static final char OPERATOR = '='; 030 private static final char SPACE = ' '; 031 private Config _config = Config.getGlobal(); 032 private PrintWriter _output; 033 034 public static IniFormatter newInstance(Writer out) 035 { 036 IniFormatter instance = newInstance(); 037 038 instance.setOutput(new PrintWriter(out)); 039 040 return instance; 041 } 042 043 public static IniFormatter newInstance(OutputStream out) 044 { 045 return newInstance(new OutputStreamWriter(out)); 046 } 047 048 public static IniFormatter newInstance(Writer out, Config config) 049 { 050 IniFormatter instance = newInstance(out); 051 052 instance.setConfig(config); 053 054 return instance; 055 } 056 057 public static IniFormatter newInstance(OutputStream out, Config config) 058 { 059 return newInstance(new OutputStreamWriter(out), config); 060 } 061 062 public Config getConfig() 063 { 064 return _config; 065 } 066 067 @Override public void endIni() 068 { 069 getOutput().flush(); 070 } 071 072 @Override public void endSection() 073 { 074 getOutput().println(); 075 } 076 077 @Override public void handleOption(String optionName, String optionValue) 078 { 079 if (getConfig().isStrictOperator()) 080 { 081 if (getConfig().isEmptyOption() || (optionValue != null)) 082 { 083 getOutput().print(escape(optionName)); 084 getOutput().print(OPERATOR); 085 } 086 087 if (optionValue != null) 088 { 089 getOutput().print(escape(optionValue)); 090 } 091 092 if (getConfig().isEmptyOption() || (optionValue != null)) 093 { 094 getOutput().println(); 095 } 096 } 097 else 098 { 099 String value = ((optionValue == null) && getConfig().isEmptyOption()) ? "" : optionValue; 100 101 if (value != null) 102 { 103 getOutput().print(escape(optionName)); 104 getOutput().print(SPACE); 105 getOutput().print(OPERATOR); 106 getOutput().print(SPACE); 107 getOutput().println(escape(value)); 108 } 109 } 110 } 111 112 @Override public void startIni() 113 { 114 assert true; 115 } 116 117 @Override public void startSection(String sectionName) 118 { 119 getOutput().print(IniParser.SECTION_BEGIN); 120 getOutput().print(escape(sectionName)); 121 getOutput().println(IniParser.SECTION_END); 122 } 123 124 protected static IniFormatter newInstance() 125 { 126 return ServiceFinder.findService(IniFormatter.class); 127 } 128 129 protected void setConfig(Config value) 130 { 131 _config = value; 132 } 133 134 protected PrintWriter getOutput() 135 { 136 return _output; 137 } 138 139 protected void setOutput(PrintWriter value) 140 { 141 _output = value; 142 } 143 144 protected String escape(String input) 145 { 146 return getConfig().isEscape() ? EscapeTool.getInstance().escape(input) : input; 147 } 148 }