diff -r 7e08730da258 -r 4a1864c3e867 java/sql-dk/src/main/java/info/globalcode/sql/dk/configuration/FormatterDefinition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/sql-dk/src/main/java/info/globalcode/sql/dk/configuration/FormatterDefinition.java Mon Mar 04 20:15:24 2019 +0100 @@ -0,0 +1,114 @@ +/** + * SQL-DK + * Copyright © 2013 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package info.globalcode.sql.dk.configuration; + +import static info.globalcode.sql.dk.Xmlns.CONFIGURATION; +import info.globalcode.sql.dk.formatting.Formatter; +import info.globalcode.sql.dk.formatting.FormatterContext; +import info.globalcode.sql.dk.formatting.FormatterException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import javax.xml.bind.annotation.XmlElement; + +/** + * Configured (but not yet instantiated) formatter. + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class FormatterDefinition implements NameIdentified { + + private String name; + private String className; + private Properties properties = new Properties(); + + public FormatterDefinition() { + } + + public FormatterDefinition(String name, String className) { + this.name = name; + this.className = className; + } + + public FormatterDefinition(String name, String className, Properties properties) { + this(name, className); + this.properties = properties; + } + + @XmlElement(name = "name", namespace = CONFIGURATION) + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * Filter's class. Must implement the + * info.globalcode.sql.dk.formatting.Formatter interface. + * Subclassing the + * info.globalcode.sql.dk.formatting.AbstractFormatter is strongly recommended. + * The constructor must accept one parameter: + * info.globalcode.sql.dk.formatting.FormatterContext + * + * @return fully qualified class name + */ + @XmlElement(name = "class", namespace = CONFIGURATION) + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + @XmlElement(name = "property", namespace = CONFIGURATION) + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + + /** + * @param context + * @return + * @throws FormatterException + */ + public Formatter getInstance(FormatterContext context) throws FormatterException { + context.getProperties().setDefaults(properties); + try { + Constructor constructor = Class.forName(className).getConstructor(context.getClass()); + + Object instance = constructor.newInstance(context); + if (instance instanceof Formatter) { + return (Formatter) instance; + } else { + throw new FormatterException("Formatter " + instance + " does not implement the " + Formatter.class.getName() + " interface"); + } + } catch (ClassNotFoundException e) { + throw new FormatterException("Formatter class does not exist: " + className, e); + } catch (NoSuchMethodException e) { + throw new FormatterException("Formatter class with no valid constructor: " + className, e); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new FormatterException("Formatter's constructor caused an error: " + className, e); + } + } +}