java/sql-dk/src/info/globalcode/sql/dk/configuration/Configuration.java
author František Kučera <franta-hg@frantovo.cz>
Tue, 26 Feb 2019 18:19:49 +0100
branchv_0
changeset 236 a3ec71fa8e17
parent 224 36db9fd27436
permissions -rw-r--r--
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!“
     1 /**
     2  * SQL-DK
     3  * Copyright © 2013 František Kučera (frantovo.cz)
     4  *
     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.
     9  *
    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.
    14  *
    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/>.
    17  */
    18 package info.globalcode.sql.dk.configuration;
    19 
    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;
    39 
    40 /**
    41  * Object representation of user configuration loaded from XML.
    42  *
    43  * @author Ing. František Kučera (frantovo.cz)
    44  */
    45 @XmlRootElement(name = "configuration", namespace = CONFIGURATION)
    46 public class Configuration {
    47 
    48 	private List<DatabaseDefinition> databases = new ArrayList<>();
    49 	private List<FormatterDefinition> formatters = new ArrayList<>();
    50 	/**
    51 	 * is used if no formatter is specified on CLI nor in user configuration
    52 	 */
    53 	public static final String DEFAULT_FORMATTER = TabularFormatter.NAME;
    54 	/**
    55 	 * Can be used as default if prefetching is ok – for configuration listings (config is alread in
    56 	 * memory, so this does not matter)
    57 	 */
    58 	public static final String DEFAULT_FORMATTER_PREFETCHING = TabularPrefetchingFormatter.NAME;
    59 	private String defaultFormatter;
    60 	/**
    61 	 * Default list of formatters. Is used if particular name is not found in user configuration.
    62 	 */
    63 	private static final Collection<FormatterDefinition> buildInFormatters;
    64 
    65 	static {
    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);
    80 	}
    81 
    82 	@XmlElement(name = "database", namespace = CONFIGURATION)
    83 	public List<DatabaseDefinition> getDatabases() {
    84 		return databases;
    85 	}
    86 
    87 	public void setDatabases(List<DatabaseDefinition> databases) {
    88 		this.databases = databases;
    89 	}
    90 
    91 	/**
    92 	 * @param name
    93 	 * @return
    94 	 * @throws ConfigurationException if no database with this name is configured
    95 	 */
    96 	public DatabaseDefinition getDatabase(String name) throws ConfigurationException {
    97 		DatabaseDefinition dd = findByName(databases, name);
    98 		if (dd == null) {
    99 			throw new ConfigurationException("Database is not configured: " + name);
   100 		} else {
   101 			return dd;
   102 		}
   103 	}
   104 
   105 	/**
   106 	 * @return only configured formatters
   107 	 * @see #getBuildInFormatters()
   108 	 * @see #getAllFormatters()
   109 	 */
   110 	@XmlElement(name = "formatter", namespace = CONFIGURATION)
   111 	public List<FormatterDefinition> getFormatters() {
   112 		return formatters;
   113 	}
   114 
   115 	public void setFormatters(List<FormatterDefinition> formatters) {
   116 		this.formatters = formatters;
   117 	}
   118 
   119 	/**
   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
   122 	 * default is used.
   123 	 * @return formatter definition
   124 	 * @throws ConfigurationException if no formatter with this name was found
   125 	 */
   126 	public FormatterDefinition getFormatter(String name) throws ConfigurationException {
   127 		if (name == null) {
   128 			return defaultFormatter == null ? getFormatter(DEFAULT_FORMATTER) : getFormatter(defaultFormatter);
   129 		} else {
   130 			FormatterDefinition fd = findByName(formatters, name);
   131 			fd = fd == null ? findByName(buildInFormatters, name) : fd;
   132 			if (fd == null) {
   133 				throw new ConfigurationException("Formatter is not configured: " + name);
   134 			} else {
   135 				return fd;
   136 			}
   137 		}
   138 	}
   139 
   140 	/**
   141 	 * @return only built-in formatters
   142 	 * @see #getAllFormatters()
   143 	 * @see #getFormatters()
   144 	 */
   145 	@XmlTransient
   146 	public Collection<FormatterDefinition> getBuildInFormatters() {
   147 		return buildInFormatters;
   148 	}
   149 
   150 	/**
   151 	 * @return built-in + configured formatters
   152 	 * @see #getFormatters()
   153 	 */
   154 	@XmlTransient
   155 	public Collection<FormatterDefinition> getAllFormatters() {
   156 		Collection<FormatterDefinition> allFormatters = new ArrayList<>();
   157 		allFormatters.addAll(buildInFormatters);
   158 		allFormatters.addAll(formatters);
   159 		return allFormatters;
   160 	}
   161 
   162 	/**
   163 	 * @return name of default formatter, is used if name is not specified on CLI
   164 	 */
   165 	@XmlElement(name = "defaultFormatter", namespace = CONFIGURATION)
   166 	public String getDefaultFormatter() {
   167 		return defaultFormatter;
   168 	}
   169 
   170 	public void setDefaultFormatter(String defaultFormatter) {
   171 		this.defaultFormatter = defaultFormatter;
   172 	}
   173 }