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 info.globalcode.sql.dk.formatting.Formatter;
22 import info.globalcode.sql.dk.formatting.FormatterContext;
23 import info.globalcode.sql.dk.formatting.FormatterException;
24 import java.lang.reflect.Constructor;
25 import java.lang.reflect.InvocationTargetException;
26 import javax.xml.bind.annotation.XmlElement;
29 * Configured (but not yet instantiated) formatter.
31 * @author Ing. František Kučera (frantovo.cz)
33 public class FormatterDefinition implements NameIdentified {
36 private String className;
37 private Properties properties = new Properties();
39 public FormatterDefinition() {
42 public FormatterDefinition(String name, String className) {
44 this.className = className;
47 public FormatterDefinition(String name, String className, Properties properties) {
48 this(name, className);
49 this.properties = properties;
52 @XmlElement(name = "name", namespace = CONFIGURATION)
54 public String getName() {
58 public void setName(String name) {
63 * Filter's class. Must implement the
64 * <code>info.globalcode.sql.dk.formatting.Formatter</code> interface.
66 * <code>info.globalcode.sql.dk.formatting.AbstractFormatter</code> is strongly recommended.
67 * The constructor must accept one parameter:
68 * <code>info.globalcode.sql.dk.formatting.FormatterContext</code>
70 * @return fully qualified class name
72 @XmlElement(name = "class", namespace = CONFIGURATION)
73 public String getClassName() {
77 public void setClassName(String className) {
78 this.className = className;
81 @XmlElement(name = "property", namespace = CONFIGURATION)
82 public Properties getProperties() {
86 public void setProperties(Properties properties) {
87 this.properties = properties;
93 * @throws FormatterException
95 public Formatter getInstance(FormatterContext context) throws FormatterException {
96 context.getProperties().setDefaults(properties);
98 Constructor constructor = Class.forName(className).getConstructor(context.getClass());
100 Object instance = constructor.newInstance(context);
101 if (instance instanceof Formatter) {
102 return (Formatter) instance;
104 throw new FormatterException("Formatter " + instance + " does not implement the " + Formatter.class.getName() + " interface");
106 } catch (ClassNotFoundException e) {
107 throw new FormatterException("Formatter class does not exist: " + className, e);
108 } catch (NoSuchMethodException e) {
109 throw new FormatterException("Formatter class with no valid constructor: " + className, e);
110 } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
111 throw new FormatterException("Formatter's constructor caused an error: " + className, e);