property annotations: first version (inherited properties are not working yet) v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 15 Aug 2015 11:52:38 +0200
branchv_0
changeset 212 d154d6012cbe
parent 211 b5148f646278
child 213 39d154429f7a
property annotations: first version (inherited properties are not working yet)
java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java
java/sql-dk/src/info/globalcode/sql/dk/configuration/PropertyDeclaration.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/CommonProperties.java
--- a/java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java	Sat Aug 15 11:07:50 2015 +0200
+++ b/java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java	Sat Aug 15 11:52:38 2015 +0200
@@ -25,8 +25,11 @@
 import info.globalcode.sql.dk.configuration.FormatterDefinition;
 import info.globalcode.sql.dk.configuration.Properties;
 import info.globalcode.sql.dk.configuration.Property;
+import info.globalcode.sql.dk.configuration.PropertyDeclaration;
+import info.globalcode.sql.dk.configuration.PropertyDeclarations;
 import info.globalcode.sql.dk.configuration.TunnelDefinition;
 import info.globalcode.sql.dk.formatting.ColumnsHeader;
+import info.globalcode.sql.dk.formatting.CommonProperties;
 import info.globalcode.sql.dk.formatting.FakeSqlArray;
 import info.globalcode.sql.dk.formatting.Formatter;
 import info.globalcode.sql.dk.formatting.FormatterContext;
@@ -184,23 +187,52 @@
 	}
 
 	private void listFormatterProperties(String formatterName) throws FormatterException, ConfigurationException {
-		ColumnsHeader header = constructHeader(
-				new HeaderField("name", SQLType.VARCHAR),
-				new HeaderField("type", SQLType.VARCHAR),
-				new HeaderField("default", SQLType.VARCHAR),
-				new HeaderField("description", SQLType.VARCHAR)
-		);
-		List<Object[]> data = new ArrayList<>();
+		FormatterDefinition fd = configurationProvider.getConfiguration().getFormatter(formatterName);
+		try {
+
+			ColumnsHeader header = constructHeader(
+					new HeaderField("name", SQLType.VARCHAR),
+					new HeaderField("type", SQLType.VARCHAR),
+					new HeaderField("default", SQLType.VARCHAR),
+					new HeaderField("description", SQLType.VARCHAR)
+			);
+			List<Object[]> data = new ArrayList<>();
+
+			Class<Formatter> formatterClass = (Class<Formatter>) Class.forName(fd.getClassName());
 
-		data.add(new Object[]{"TODO", "a", "b", "c"});
-		data.add(new Object[]{"TODO", "a", "b", "c"});
-		data.add(new Object[]{"TODO", "a", "b", "c"});
-		data.add(new Object[]{"TODO", "a", "b", "c"});
+			// TOOD: formatterClass.getDeclaredAnnotation(PropertyDeclarations.class); and separate inherited properties
+			// Repeated PropertyDeclaration wrapped in PropertyDeclarations
+			PropertyDeclarations properties = formatterClass.getAnnotation(PropertyDeclarations.class);
+			if (properties == null) {
+				log.log(Level.WARNING, "Formatter „{0}“  has no declared properties", formatterName);
+			} else {
+				for (PropertyDeclaration p : properties.value()) {
+					data.add(propertyDeclarationToRow(p));
+				}
+			}
+
+			// Single PropertyDeclaration
+			PropertyDeclaration property = formatterClass.getAnnotation(PropertyDeclaration.class);
+			if (property != null) {
+				data.add(propertyDeclarationToRow(property));
+			}
 
-		List<Parameter> parameters = new ArrayList<>();
-		parameters.add(new NamedParameter("formatter", formatterName, SQLType.VARCHAR));
+			List<Parameter> parameters = new ArrayList<>();
+			parameters.add(new NamedParameter("formatter", formatterName, SQLType.VARCHAR));
 
-		printTable(formatter, header, "-- formatter properties", parameters, data);
+			printTable(formatter, header, "-- formatter properties", parameters, data);
+		} catch (ClassNotFoundException e) {
+			throw new ConfigurationException("Unable to find class " + fd.getClassName() + " of formatter" + fd.getName(), e);
+		}
+	}
+
+	private static Object[] propertyDeclarationToRow(PropertyDeclaration p) {
+		return new Object[]{
+			p.name(),
+			CommonProperties.getSimpleTypeName(p.type()),
+			p.defaultValue(),
+			p.description()
+		};
 	}
 
 	private void listTypes() throws FormatterException, ConfigurationException {
--- a/java/sql-dk/src/info/globalcode/sql/dk/configuration/PropertyDeclaration.java	Sat Aug 15 11:07:50 2015 +0200
+++ b/java/sql-dk/src/info/globalcode/sql/dk/configuration/PropertyDeclaration.java	Sat Aug 15 11:52:38 2015 +0200
@@ -44,7 +44,7 @@
 	 * @return data type of the value: String, numbers, Boolean or Enum
 	 */
 	Class type();
-
+	
 	/**
 	 * @return documentation for the users
 	 */
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/CommonProperties.java	Sat Aug 15 11:07:50 2015 +0200
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/CommonProperties.java	Sat Aug 15 11:52:38 2015 +0200
@@ -17,12 +17,34 @@
  */
 package info.globalcode.sql.dk.formatting;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  *
  * @author Ing. František Kučera (frantovo.cz)
  */
 public class CommonProperties {
 
+	private static final Map<Class, String> TYPE_SIMPLE_NAMES;
+
+	static {
+		Map<Class, String> m = new HashMap<>();
+		m.put(Boolean.class, "boolean");
+		m.put(String.class, "String");
+		m.put(Character.class, "char");
+		m.put(Integer.class, "int");
+		m.put(Long.class, "long");
+		m.put(Double.class, "double");
+		TYPE_SIMPLE_NAMES = Collections.unmodifiableMap(m);
+	}
+
+	public static String getSimpleTypeName(Class type) {
+		String name = TYPE_SIMPLE_NAMES.get(type);
+		return name == null ? type.getName() : name;
+	}
+
 	public static final String COLORFUL = "color";
-	public static final String COLORFUL_DESCRIPTION = "whether the output should be printed in color (escape sequences)";
+	public static final String COLORFUL_DESCRIPTION = "whether the output should be printed in color (ANSI Escape Sequences)";
 }