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; 017 018 import org.ini4j.spi.EscapeTool; 019 020 import java.io.IOException; 021 import java.io.InputStream; 022 import java.io.Reader; 023 024 import java.net.URL; 025 026 import java.util.Locale; 027 028 public abstract class AbstractParser 029 { 030 private final String _comments; 031 private Config _config = Config.getGlobal(); 032 private final String _operators; 033 034 protected AbstractParser(String operators, String comments) 035 { 036 _operators = operators; 037 _comments = comments; 038 } 039 040 public void setConfig(Config value) 041 { 042 _config = value; 043 } 044 045 protected Config getConfig() 046 { 047 return _config; 048 } 049 050 protected int indexOfOperator(String line) 051 { 052 int idx = -1; 053 054 for (char c : _operators.toCharArray()) 055 { 056 int index = line.indexOf(c); 057 058 if ((index >= 0) && ((idx == -1) || (index < idx))) 059 { 060 idx = index; 061 } 062 } 063 064 return idx; 065 } 066 067 protected void parseError(String line, int lineNumber) throws InvalidIniFormatException 068 { 069 throw new InvalidIniFormatException("parse error (at line: " + lineNumber + "): " + line); 070 } 071 072 protected void parseOptionLine(String line, OptionHandler handler, int lineNumber) throws InvalidIniFormatException 073 { 074 int idx = indexOfOperator(line); 075 String name = null; 076 String value = null; 077 078 if (idx < 0) 079 { 080 if (getConfig().isEmptyOption()) 081 { 082 name = line; 083 } 084 else 085 { 086 parseError(line, lineNumber); 087 } 088 } 089 else 090 { 091 name = unescape(line.substring(0, idx)).trim(); 092 value = unescape(line.substring(idx + 1)).trim(); 093 } 094 095 if (name.length() == 0) 096 { 097 parseError(line, lineNumber); 098 } 099 100 if (getConfig().isLowerCaseOption()) 101 { 102 name = name.toLowerCase(Locale.getDefault()); 103 } 104 105 handler.handleOption(name, value); 106 } 107 108 protected String unescape(String line) 109 { 110 return getConfig().isEscape() ? EscapeTool.getInstance().unescape(line) : line; 111 } 112 113 IniSource newIniSource(InputStream input) 114 { 115 return new IniSource(input, getConfig().isInclude(), _comments); 116 } 117 118 IniSource newIniSource(Reader input) 119 { 120 return new IniSource(input, getConfig().isInclude(), _comments); 121 } 122 123 IniSource newIniSource(URL input) throws IOException 124 { 125 return new IniSource(input, getConfig().isInclude(), _comments); 126 } 127 }