java/sql-dk/src/info/globalcode/sql/dk/configuration/FormatterDefinition.java
author František Kučera <franta-hg@frantovo.cz>
Tue, 26 Feb 2019 18:19:49 +0100
branchv_0
changeset 236 a3ec71fa8e17
parent 188 54bacc7ed42b
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!“
franta-hg@26
     1
/**
franta-hg@26
     2
 * SQL-DK
franta-hg@26
     3
 * Copyright © 2013 František Kučera (frantovo.cz)
franta-hg@26
     4
 *
franta-hg@26
     5
 * This program is free software: you can redistribute it and/or modify
franta-hg@26
     6
 * it under the terms of the GNU General Public License as published by
franta-hg@26
     7
 * the Free Software Foundation, either version 3 of the License, or
franta-hg@26
     8
 * (at your option) any later version.
franta-hg@26
     9
 *
franta-hg@26
    10
 * This program is distributed in the hope that it will be useful,
franta-hg@26
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
franta-hg@26
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
franta-hg@26
    13
 * GNU General Public License for more details.
franta-hg@26
    14
 *
franta-hg@26
    15
 * You should have received a copy of the GNU General Public License
franta-hg@26
    16
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
franta-hg@26
    17
 */
franta-hg@26
    18
package info.globalcode.sql.dk.configuration;
franta-hg@26
    19
franta-hg@30
    20
import static info.globalcode.sql.dk.Xmlns.CONFIGURATION;
franta-hg@26
    21
import info.globalcode.sql.dk.formatting.Formatter;
franta-hg@26
    22
import info.globalcode.sql.dk.formatting.FormatterContext;
franta-hg@34
    23
import info.globalcode.sql.dk.formatting.FormatterException;
franta-hg@26
    24
import java.lang.reflect.Constructor;
franta-hg@26
    25
import java.lang.reflect.InvocationTargetException;
franta-hg@26
    26
import javax.xml.bind.annotation.XmlElement;
franta-hg@26
    27
franta-hg@26
    28
/**
franta-hg@155
    29
 * Configured (but not yet instantiated) formatter.
franta-hg@26
    30
 *
franta-hg@26
    31
 * @author Ing. František Kučera (frantovo.cz)
franta-hg@26
    32
 */
franta-hg@26
    33
public class FormatterDefinition implements NameIdentified {
franta-hg@26
    34
franta-hg@26
    35
	private String name;
franta-hg@26
    36
	private String className;
franta-hg@104
    37
	private Properties properties = new Properties();
franta-hg@26
    38
franta-hg@29
    39
	public FormatterDefinition() {
franta-hg@29
    40
	}
franta-hg@29
    41
franta-hg@29
    42
	public FormatterDefinition(String name, String className) {
franta-hg@29
    43
		this.name = name;
franta-hg@29
    44
		this.className = className;
franta-hg@29
    45
	}
franta-hg@29
    46
franta-hg@104
    47
	public FormatterDefinition(String name, String className, Properties properties) {
franta-hg@104
    48
		this(name, className);
franta-hg@104
    49
		this.properties = properties;
franta-hg@104
    50
	}
franta-hg@104
    51
franta-hg@30
    52
	@XmlElement(name = "name", namespace = CONFIGURATION)
franta-hg@26
    53
	@Override
franta-hg@26
    54
	public String getName() {
franta-hg@26
    55
		return name;
franta-hg@26
    56
	}
franta-hg@26
    57
franta-hg@26
    58
	public void setName(String name) {
franta-hg@26
    59
		this.name = name;
franta-hg@26
    60
	}
franta-hg@26
    61
franta-hg@26
    62
	/**
franta-hg@26
    63
	 * Filter's class. Must implement the
franta-hg@26
    64
	 * <code>info.globalcode.sql.dk.formatting.Formatter</code> interface.
franta-hg@26
    65
	 * Subclassing the
franta-hg@26
    66
	 * <code>info.globalcode.sql.dk.formatting.AbstractFormatter</code> is strongly recommended.
franta-hg@26
    67
	 * The constructor must accept one parameter:
franta-hg@26
    68
	 * <code>info.globalcode.sql.dk.formatting.FormatterContext</code>
franta-hg@26
    69
	 *
franta-hg@26
    70
	 * @return fully qualified class name
franta-hg@26
    71
	 */
franta-hg@30
    72
	@XmlElement(name = "class", namespace = CONFIGURATION)
franta-hg@26
    73
	public String getClassName() {
franta-hg@26
    74
		return className;
franta-hg@26
    75
	}
franta-hg@26
    76
franta-hg@26
    77
	public void setClassName(String className) {
franta-hg@26
    78
		this.className = className;
franta-hg@26
    79
	}
franta-hg@26
    80
franta-hg@104
    81
	@XmlElement(name = "property", namespace = CONFIGURATION)
franta-hg@104
    82
	public Properties getProperties() {
franta-hg@104
    83
		return properties;
franta-hg@104
    84
	}
franta-hg@104
    85
franta-hg@104
    86
	public void setProperties(Properties properties) {
franta-hg@104
    87
		this.properties = properties;
franta-hg@104
    88
	}
franta-hg@104
    89
franta-hg@26
    90
	/**
franta-hg@26
    91
	 * @param context
franta-hg@26
    92
	 * @return
franta-hg@188
    93
	 * @throws FormatterException
franta-hg@26
    94
	 */
franta-hg@34
    95
	public Formatter getInstance(FormatterContext context) throws FormatterException {
franta-hg@104
    96
		context.getProperties().setDefaults(properties);
franta-hg@26
    97
		try {
franta-hg@26
    98
			Constructor constructor = Class.forName(className).getConstructor(context.getClass());
franta-hg@26
    99
franta-hg@26
   100
			Object instance = constructor.newInstance(context);
franta-hg@26
   101
			if (instance instanceof Formatter) {
franta-hg@26
   102
				return (Formatter) instance;
franta-hg@26
   103
			} else {
franta-hg@34
   104
				throw new FormatterException("Formatter " + instance + " does not implement the " + Formatter.class.getName() + " interface");
franta-hg@26
   105
			}
franta-hg@26
   106
		} catch (ClassNotFoundException e) {
franta-hg@160
   107
			throw new FormatterException("Formatter class does not exist: " + className, e);
franta-hg@26
   108
		} catch (NoSuchMethodException e) {
franta-hg@34
   109
			throw new FormatterException("Formatter class with no valid constructor: " + className, e);
franta-hg@26
   110
		} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
franta-hg@34
   111
			throw new FormatterException("Formatter's constructor caused an error: " + className, e);
franta-hg@26
   112
		}
franta-hg@26
   113
	}
franta-hg@26
   114
}