001 package de.java2html.properties;
002 
003 import java.util.Properties;
004 import java.util.StringTokenizer;
005 
006 import de.java2html.javasource.SourceType;
007 import de.java2html.options.ConversionOptionsUtilities;
008 import de.java2html.options.HorizontalAlignment;
009 import de.java2html.options.IConversionOptionsConstants;
010 import de.java2html.options.JavaSourceConversionOptions;
011 import de.java2html.options.JavaSourceStyleEntry;
012 import de.java2html.options.JavaSourceStyleTable;
013 import de.java2html.util.RGB;
014 
015 /**
016  @author Markus Gebhard
017  */
018 public class ConversionOptionsPropertiesReader {
019 
020   public JavaSourceConversionOptions read(Properties propertiesthrows IllegalPropertyValueException {
021     final JavaSourceConversionOptions conversionOptions = JavaSourceConversionOptions.getRawDefault();
022     adjustStyleTable(properties, conversionOptions);
023     adjustShowFileName(properties, conversionOptions);
024     adjustBorder(properties, conversionOptions);
025     adjustLineNumbers(properties, conversionOptions);
026     adjustShowJava2HtmlLink(properties, conversionOptions);
027     adjustTabSize(properties, conversionOptions);
028     adjustAlignment(properties, conversionOptions);
029     adjustStyleEntries(properties, conversionOptions);
030     return conversionOptions;
031   }
032 
033   private void adjustAlignment(Properties properties, JavaSourceConversionOptions conversionOptions)
034     throws IllegalPropertyValueException {
035     final String alignmentValue = properties.getProperty(IConversionOptionsConstants.HORIZONTAL_ALIGNMENT);
036     if (alignmentValue != null) {
037       final HorizontalAlignment alignment = HorizontalAlignment.getByName(alignmentValue);
038       if (alignment == null) {
039         throw new IllegalPropertyValueException(
040           IConversionOptionsConstants.HORIZONTAL_ALIGNMENT,
041           alignmentValue,
042           ConversionOptionsUtilities.getAvailableHorizontalAlignmentNames());
043       }
044       conversionOptions.setHorizontalAlignment(alignment);
045     }
046   }
047 
048   private void adjustTabSize(Properties properties, JavaSourceConversionOptions conversionOptions)
049     throws IllegalPropertyValueException {
050     final String tabSizeValue = properties.getProperty(IConversionOptionsConstants.TAB_SIZE);
051     if (tabSizeValue != null) {
052       try {
053         final int tabSize = Integer.parseInt(tabSizeValue);
054         if (tabSize < 0) {
055           throw new NumberFormatException();
056         }
057         conversionOptions.setTabSize(tabSize);
058       }
059       catch (final NumberFormatException e) {
060         throw new IllegalPropertyValueException(IConversionOptionsConstants.TAB_SIZE, tabSizeValue);
061       }
062     }
063   }
064 
065   private void adjustShowFileName(Properties properties, JavaSourceConversionOptions conversionOptions)
066     throws IllegalPropertyValueException {
067     final String value = properties.getProperty(IConversionOptionsConstants.SHOW_FILE_NAME);
068     if (value != null) {
069       conversionOptions.setShowFileName(parseBooleanValue(IConversionOptionsConstants.SHOW_FILE_NAME, value));
070     }
071   }
072 
073   private void adjustShowJava2HtmlLink(Properties properties, JavaSourceConversionOptions conversionOptions)
074     throws IllegalPropertyValueException {
075     final String value = properties.getProperty(IConversionOptionsConstants.SHOW_JAVA2HTML_LINK);
076     if (value != null) {
077       conversionOptions.setShowJava2HtmlLink(
078         parseBooleanValue(IConversionOptionsConstants.SHOW_JAVA2HTML_LINK, value));
079     }
080   }
081 
082   private void adjustLineNumbers(Properties properties, JavaSourceConversionOptions conversionOptions)
083     throws IllegalPropertyValueException {
084     final String value = properties.getProperty(IConversionOptionsConstants.SHOW_LINE_NUMBERS);
085     if (value != null) {
086       conversionOptions.setShowLineNumbers(
087         parseBooleanValue(IConversionOptionsConstants.SHOW_LINE_NUMBERS, value));
088     }
089   }
090 
091   private void adjustBorder(Properties properties, JavaSourceConversionOptions conversionOptions)
092     throws IllegalPropertyValueException {
093     final String value = properties.getProperty(IConversionOptionsConstants.SHOW_TABLE_BORDER);
094     if (value != null) {
095       conversionOptions.setShowTableBorder(
096         parseBooleanValue(IConversionOptionsConstants.SHOW_TABLE_BORDER, value));
097     }
098   }
099 
100   private void adjustStyleTable(Properties properties, JavaSourceConversionOptions conversionOptions)
101     throws IllegalPropertyValueException {
102     final String defaultTableName = properties.getProperty(IConversionOptionsConstants.DEFAULT_STYLE_NAME);
103     if (defaultTableName != null) {
104       final JavaSourceStyleTable table = JavaSourceStyleTable.getPredefinedTable(defaultTableName);
105       if (table == null) {
106         throw new IllegalPropertyValueException(
107           IConversionOptionsConstants.DEFAULT_STYLE_NAME,
108           defaultTableName,
109           ConversionOptionsUtilities.getPredefinedStyleTableNames());
110       }
111       conversionOptions.setStyleTable(table);
112     }
113   }
114 
115   private boolean parseBooleanValue(String propertyName, String valuethrows IllegalPropertyValueException {
116     if (value.equalsIgnoreCase("true"|| value.equalsIgnoreCase("yes")) {
117       return true;
118     }
119     if (value.equalsIgnoreCase("false"|| value.equalsIgnoreCase("no")) {
120       return false;
121     }
122     throw new IllegalPropertyValueException(propertyName, value, new String[] { "true""false" });
123   }
124 
125   private RGB parseColorValue(String propertyName, String colorValuethrows IllegalPropertyValueException {
126     final StringTokenizer tokenizer = new StringTokenizer(colorValue, ",")//$NON-NLS-1$
127     if (tokenizer.countTokens() != 3) {
128       throw new IllegalPropertyValueException(propertyName, colorValue);
129     }
130     final String redValue = tokenizer.nextToken();
131     final String greenValue = tokenizer.nextToken();
132     final String blueValue = tokenizer.nextToken();
133     int red = 0, green = 0, blue = 0;
134     try {
135       red = Integer.parseInt(redValue);
136       green = Integer.parseInt(greenValue);
137       blue = Integer.parseInt(blueValue);
138     }
139     catch (final NumberFormatException e) {
140       throw new IllegalPropertyValueException(propertyName, colorValue);
141     }
142     if (red > 255 || red < || green > 255 || green < || blue > 255 || blue < 0) {
143       throw new IllegalPropertyValueException(propertyName, colorValue);
144     }
145     return new RGB(red, green, blue);
146   }
147 
148   private void adjustStyleEntries(Properties properties, JavaSourceConversionOptions conversionOptions)
149     throws IllegalPropertyValueException {
150     final SourceType[] sourceTypes = SourceType.getAll();
151     for (int i = 0; i < sourceTypes.length; i++) {
152       adjustStyleEntry(properties, conversionOptions, sourceTypes[i]);
153     }
154   }
155 
156   private void adjustStyleEntry(
157     Properties properties,
158     JavaSourceConversionOptions conversionOptions,
159     SourceType type)
160     throws IllegalPropertyValueException {
161     final RGB color = getColor(properties, conversionOptions, type);
162     final boolean bold = getBold(properties, conversionOptions, type);
163     final boolean italic = getItalic(properties, conversionOptions, type);
164     conversionOptions.getStyleTable().put(type, new JavaSourceStyleEntry(color, bold, italic));
165   }
166 
167   private boolean getItalic(
168     Properties properties,
169     JavaSourceConversionOptions conversionOptions,
170     SourceType type)
171     throws IllegalPropertyValueException {
172 
173     final String italicPropertyName = type.getName() + IConversionOptionsConstants.POSTFIX_ITALIC;
174     final String italicValue = properties.getProperty(italicPropertyName);
175     if (italicValue != null) {
176       return parseBooleanValue(italicPropertyName, italicValue);
177     }
178     return conversionOptions.getStyleTable().get(type).isItalic();
179   }
180 
181   private boolean getBold(
182     Properties properties,
183     JavaSourceConversionOptions conversionOptions,
184     SourceType type)
185     throws IllegalPropertyValueException {
186     final String boldPropertyName = type.getName() + IConversionOptionsConstants.POSTFIX_BOLD;
187     final String boldValue = properties.getProperty(boldPropertyName);
188     if (boldValue != null) {
189       return parseBooleanValue(boldPropertyName, boldValue);
190     }
191     return conversionOptions.getStyleTable().get(type).isBold();
192   }
193 
194   private RGB getColor(
195     Properties properties,
196     JavaSourceConversionOptions conversionOptions,
197     SourceType type)
198     throws IllegalPropertyValueException {
199     final String colorPropertyName = type.getName() + IConversionOptionsConstants.POSTFIX_COLOR;
200     final String colorValue = properties.getProperty(colorPropertyName);
201     if (colorValue != null) {
202       return parseColorValue(colorPropertyName, colorValue);
203     }
204     return conversionOptions.getStyleTable().get(type).getColor();
205   }
206 }