Avoid reusing/rewriting the DB connection properties.
There was weird random errors while testing connection to multiple DB in parallel when one of them was meta connection to same DB connection.
Two kinds of exception: 1) missing password 2) „Passing DB password as CLI parameter is insecure!“
3 * Copyright © 2013 František Kučera (frantovo.cz)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package info.globalcode.sql.dk.configuration;
20 import static info.globalcode.sql.dk.Xmlns.CONFIGURATION;
21 import static info.globalcode.sql.dk.Functions.findByName;
22 import info.globalcode.sql.dk.formatting.BarChartFormatter;
23 import info.globalcode.sql.dk.formatting.SilentFormatter;
24 import info.globalcode.sql.dk.formatting.SingleRecordFormatter;
25 import info.globalcode.sql.dk.formatting.SingleValueFormatter;
26 import info.globalcode.sql.dk.formatting.TabularFormatter;
27 import info.globalcode.sql.dk.formatting.TabularPrefetchingFormatter;
28 import info.globalcode.sql.dk.formatting.TabularWrappingFormatter;
29 import info.globalcode.sql.dk.formatting.TeXFormatter;
30 import info.globalcode.sql.dk.formatting.XhtmlFormatter;
31 import info.globalcode.sql.dk.formatting.XmlFormatter;
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.Collections;
35 import java.util.List;
36 import javax.xml.bind.annotation.XmlElement;
37 import javax.xml.bind.annotation.XmlRootElement;
38 import javax.xml.bind.annotation.XmlTransient;
41 * Object representation of user configuration loaded from XML.
43 * @author Ing. František Kučera (frantovo.cz)
45 @XmlRootElement(name = "configuration", namespace = CONFIGURATION)
46 public class Configuration {
48 private List<DatabaseDefinition> databases = new ArrayList<>();
49 private List<FormatterDefinition> formatters = new ArrayList<>();
51 * is used if no formatter is specified on CLI nor in user configuration
53 public static final String DEFAULT_FORMATTER = TabularFormatter.NAME;
55 * Can be used as default if prefetching is ok – for configuration listings (config is alread in
56 * memory, so this does not matter)
58 public static final String DEFAULT_FORMATTER_PREFETCHING = TabularPrefetchingFormatter.NAME;
59 private String defaultFormatter;
61 * Default list of formatters. Is used if particular name is not found in user configuration.
63 private static final Collection<FormatterDefinition> buildInFormatters;
66 Collection<FormatterDefinition> l = new ArrayList<>();
67 l.add(new FormatterDefinition(SilentFormatter.NAME, SilentFormatter.class.getName()));
68 l.add(new FormatterDefinition(SingleValueFormatter.NAME, SingleValueFormatter.class.getName()));
69 l.add(new FormatterDefinition(SingleRecordFormatter.NAME, SingleRecordFormatter.class.getName()));
70 l.add(new FormatterDefinition(XmlFormatter.NAME, XmlFormatter.class.getName()));
71 l.add(new FormatterDefinition(XhtmlFormatter.NAME, XhtmlFormatter.class.getName()));
72 l.add(new FormatterDefinition(TabularFormatter.NAME, TabularFormatter.class.getName()));
73 l.add(new FormatterDefinition(TabularPrefetchingFormatter.NAME, TabularPrefetchingFormatter.class.getName()));
74 l.add(new FormatterDefinition(TabularWrappingFormatter.NAME, TabularWrappingFormatter.class.getName()));
75 l.add(new FormatterDefinition(TeXFormatter.NAME, TeXFormatter.class.getName()));
76 //l.add(new FormatterDefinition(DsvFormatter.NAME, DsvFormatter.class.getName()));
77 //l.add(new FormatterDefinition(SystemCommandExecutor.NAME, SystemCommandExecutor.class.getName()));
78 l.add(new FormatterDefinition(BarChartFormatter.NAME, BarChartFormatter.class.getName()));
79 buildInFormatters = Collections.unmodifiableCollection(l);
82 @XmlElement(name = "database", namespace = CONFIGURATION)
83 public List<DatabaseDefinition> getDatabases() {
87 public void setDatabases(List<DatabaseDefinition> databases) {
88 this.databases = databases;
94 * @throws ConfigurationException if no database with this name is configured
96 public DatabaseDefinition getDatabase(String name) throws ConfigurationException {
97 DatabaseDefinition dd = findByName(databases, name);
99 throw new ConfigurationException("Database is not configured: " + name);
106 * @return only configured formatters
107 * @see #getBuildInFormatters()
108 * @see #getAllFormatters()
110 @XmlElement(name = "formatter", namespace = CONFIGURATION)
111 public List<FormatterDefinition> getFormatters() {
115 public void setFormatters(List<FormatterDefinition> formatters) {
116 this.formatters = formatters;
120 * @param name name of desired formatter. Looking for this name in user configuration, then in
121 * buil-in formatters. If null, default from configuration or (if not configured) built-in
123 * @return formatter definition
124 * @throws ConfigurationException if no formatter with this name was found
126 public FormatterDefinition getFormatter(String name) throws ConfigurationException {
128 return defaultFormatter == null ? getFormatter(DEFAULT_FORMATTER) : getFormatter(defaultFormatter);
130 FormatterDefinition fd = findByName(formatters, name);
131 fd = fd == null ? findByName(buildInFormatters, name) : fd;
133 throw new ConfigurationException("Formatter is not configured: " + name);
141 * @return only built-in formatters
142 * @see #getAllFormatters()
143 * @see #getFormatters()
146 public Collection<FormatterDefinition> getBuildInFormatters() {
147 return buildInFormatters;
151 * @return built-in + configured formatters
152 * @see #getFormatters()
155 public Collection<FormatterDefinition> getAllFormatters() {
156 Collection<FormatterDefinition> allFormatters = new ArrayList<>();
157 allFormatters.addAll(buildInFormatters);
158 allFormatters.addAll(formatters);
159 return allFormatters;
163 * @return name of default formatter, is used if name is not specified on CLI
165 @XmlElement(name = "defaultFormatter", namespace = CONFIGURATION)
166 public String getDefaultFormatter() {
167 return defaultFormatter;
170 public void setDefaultFormatter(String defaultFormatter) {
171 this.defaultFormatter = defaultFormatter;