1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.dishevelled.color.scheme.impl;
25
26 import java.awt.Color;
27
28 import java.io.InputStream;
29
30 import java.util.ArrayList;
31 import java.util.List;
32
33 import java.util.regex.Matcher;
34 import java.util.regex.Pattern;
35
36 import javax.xml.parsers.SAXParserFactory;
37
38 import net.sf.stax.SAX2StAXAdaptor;
39 import net.sf.stax.StAXContentHandlerBase;
40 import net.sf.stax.StAXContext;
41 import net.sf.stax.StAXDelegationContext;
42
43 import org.apache.commons.io.IOUtils;
44
45 import org.dishevelled.color.scheme.ColorFactory;
46 import org.dishevelled.color.scheme.ColorScheme;
47 import org.dishevelled.color.scheme.factory.DefaultColorFactory;
48
49 import org.xml.sax.XMLReader;
50 import org.xml.sax.Attributes;
51 import org.xml.sax.InputSource;
52 import org.xml.sax.SAXException;
53 import org.xml.sax.ContentHandler;
54
55
56
57
58
59
60 public final class ColorSchemes
61 {
62
63 private static final Pattern COLOR_SCHEME = Pattern.compile("^([a-z]+)-([a-z0-9-]+)-([0-9]+)$");
64
65
66 private static final ColorFactory COLOR_FACTORY = new DefaultColorFactory();
67
68
69
70
71
72 private ColorSchemes()
73 {
74
75 }
76
77
78
79
80
81
82
83
84 public static ColorScheme parseColorScheme(final String value)
85 {
86 if (value == null)
87 {
88 throw new IllegalArgumentException("value must not be null");
89 }
90 Matcher matcher = COLOR_SCHEME.matcher(value);
91 if (!matcher.matches())
92 {
93 throw new IllegalArgumentException("color scheme " + value + " not valid format");
94 }
95 String type = matcher.group(1);
96 String name = matcher.group(2);
97 int colors = Integer.parseInt(matcher.group(3));
98 if ("discrete".equals(type))
99 {
100 return getDiscreteColorScheme(name, colors);
101 }
102 else if ("continuous".equals(type))
103 {
104 return getContinuousColorScheme(name, colors);
105 }
106 else
107 {
108 throw new IllegalArgumentException("color scheme type " + type + " not valid type");
109 }
110 }
111
112
113
114
115
116
117
118
119
120
121
122 public static ColorScheme getDiscreteColorScheme(final String name,
123 final int colors)
124 {
125 InputStream inputStream = null;
126 ColorScheme colorScheme = null;
127 try
128 {
129 inputStream = ColorSchemes.class.getResourceAsStream(name + "-" + colors + ".xml");
130 XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
131 InputSource inputSource = new InputSource(inputStream);
132 ColorSchemeHandler colorSchemeHandler = new ColorSchemeHandler();
133 ContentHandler contentHandler = new SAX2StAXAdaptor(colorSchemeHandler);
134 xmlReader.setContentHandler(contentHandler);
135 xmlReader.parse(inputSource);
136 if ("divergent".equals(colorSchemeHandler.getType()))
137 {
138 colorScheme = new DiscreteDivergentColorScheme(colorSchemeHandler.getName(),
139 colorSchemeHandler.getColors(), 0.0d, 0.5d, 1.0d,
140 COLOR_FACTORY);
141 }
142 else
143 {
144 colorScheme = new DiscreteColorScheme(colorSchemeHandler.getName(),
145 colorSchemeHandler.getColors(), 0.0d, 1.0d,
146 COLOR_FACTORY);
147 }
148 }
149 catch (Exception e)
150 {
151
152 }
153 finally
154 {
155 IOUtils.closeQuietly(inputStream);
156 }
157 return colorScheme;
158 }
159
160
161
162
163
164
165
166
167
168
169
170 public static ColorScheme getContinuousColorScheme(final String name,
171 final int colors)
172 {
173 InputStream inputStream = null;
174 ColorScheme colorScheme = null;
175 try
176 {
177 inputStream = ColorSchemes.class.getResourceAsStream(name + "-" + colors + ".xml");
178 XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
179 InputSource inputSource = new InputSource(inputStream);
180 ColorSchemeHandler colorSchemeHandler = new ColorSchemeHandler();
181 ContentHandler contentHandler = new SAX2StAXAdaptor(colorSchemeHandler);
182 xmlReader.setContentHandler(contentHandler);
183 xmlReader.parse(inputSource);
184 if ("divergent".equals(colorSchemeHandler.getType()))
185 {
186 colorScheme = new ContinuousDivergentColorScheme(colorSchemeHandler.getName(),
187 colorSchemeHandler.getColors(), 0.0d, 0.5d, 1.0d,
188 COLOR_FACTORY);
189 }
190 else
191 {
192 colorScheme = new ContinuousColorScheme(colorSchemeHandler.getName(),
193 colorSchemeHandler.getColors(), 0.0d, 1.0d,
194 COLOR_FACTORY);
195 }
196 }
197 catch (Exception e)
198 {
199
200 }
201 finally
202 {
203 IOUtils.closeQuietly(inputStream);
204 }
205 return colorScheme;
206 }
207
208
209
210
211 private static final class ColorSchemeHandler
212 extends StAXContentHandlerBase
213 {
214
215 private String name;
216
217
218 private String type;
219
220
221 private final List<Color> colors = new ArrayList<Color>();
222
223
224 private final ColorHandler colorHandler = new ColorHandler();
225
226
227 @Override
228 public void startElement(final String nsURI,
229 final String localName,
230 final String qName,
231 final Attributes attrs,
232 final StAXDelegationContext dctx)
233 throws SAXException
234 {
235 if ("color".equals(qName))
236 {
237 dctx.delegate(colorHandler);
238 }
239 else if ("color-scheme".equals(qName))
240 {
241 name = attrs.getValue("name");
242 type = attrs.getValue("type");
243 }
244 }
245
246 @Override
247 public void endElement(final String nsURI,
248 final String localName,
249 final String qName,
250 final Object result,
251 final StAXContext context)
252 throws SAXException
253 {
254 if ("color".equals(qName))
255 {
256 Color color = (Color) result;
257 colors.add(color);
258 }
259 }
260
261
262
263
264
265
266 String getName()
267 {
268 return name;
269 }
270
271
272
273
274
275
276 String getType()
277 {
278 return type;
279 }
280
281
282
283
284
285
286 List<Color> getColors()
287 {
288 return colors;
289 }
290 }
291
292
293
294
295 private static final class ColorHandler
296 extends StAXContentHandlerBase
297 {
298
299 private Color color;
300
301
302 @Override
303 public void startElement(final String nsURI,
304 final String localName,
305 final String qName,
306 final Attributes attrs,
307 final StAXDelegationContext dctx)
308 throws SAXException
309 {
310 int r = Integer.parseInt(attrs.getValue("red"));
311 int g = Integer.parseInt(attrs.getValue("green"));
312 int b = Integer.parseInt(attrs.getValue("blue"));
313 float a = Float.parseFloat(attrs.getValue("alpha"));
314 this.color = COLOR_FACTORY.createColor(r, g, b, a);
315 }
316
317 @Override
318 public Object endTree(final StAXContext context)
319 throws SAXException
320 {
321 return color;
322 }
323 }
324 }