From 1a9a127b013d81393c435b5995ff54ed11c13c6c Mon Sep 17 00:00:00 2001 From: almirus Date: Sun, 11 Mar 2018 21:48:13 +0300 Subject: [PATCH] remove code duplication add $ref support (external resource) for ComboBox --- .../io/asfjava/ui/core/form/ComboBox.java | 4 +- .../ui/core/generators/CheckBoxGenerator.java | 34 ++-------------- .../ui/core/generators/ComboBoxGenerator.java | 37 +++--------------- .../ui/core/generators/ListGenerator.java | 39 +++++++++++++++++++ 4 files changed, 51 insertions(+), 63 deletions(-) create mode 100644 src/main/java/io/asfjava/ui/core/generators/ListGenerator.java diff --git a/src/main/java/io/asfjava/ui/core/form/ComboBox.java b/src/main/java/io/asfjava/ui/core/form/ComboBox.java index 9d57f0b..816c5aa 100644 --- a/src/main/java/io/asfjava/ui/core/form/ComboBox.java +++ b/src/main/java/io/asfjava/ui/core/form/ComboBox.java @@ -38,7 +38,9 @@ boolean required() default false; int size() default 1; - + + String refURL() default ""; + Class titleMap() default ValuesContainer.class; } diff --git a/src/main/java/io/asfjava/ui/core/generators/CheckBoxGenerator.java b/src/main/java/io/asfjava/ui/core/generators/CheckBoxGenerator.java index f396c1c..3d62da7 100644 --- a/src/main/java/io/asfjava/ui/core/generators/CheckBoxGenerator.java +++ b/src/main/java/io/asfjava/ui/core/generators/CheckBoxGenerator.java @@ -12,7 +12,7 @@ import io.asfjava.ui.core.form.ValuesContainer; import io.asfjava.ui.core.logging.ASFUILogger; -public class CheckBoxGenerator implements FormDefinitionGenerator{ +public class CheckBoxGenerator extends ListGenerator implements FormDefinitionGenerator{ @Override public void generate(ObjectNode fieldFormDefinition, Field field) { @@ -25,39 +25,11 @@ public void generate(ObjectNode fieldFormDefinition, Field field) { ArrayNode titlesMap = checkBoxMapper.createArrayNode(); if (annotation.values().length > 0) { Arrays.stream(annotation.values()).forEach(value -> buildValueDefinition(checkBoxMapper, titlesMap, value)); - fieldFormDefinition.set("titleMap", titlesMap); } else if (!annotation.titleMap().equals(ValuesContainer.class)) { - - try { - Map map = (annotation.titleMap()).newInstance().getValues(); - map.entrySet().stream().forEach(mapEntry -> { - ObjectNode entryNode = checkBoxMapper.createObjectNode(); - entryNode.put("name", mapEntry.getKey()); - entryNode.putPOJO("value", mapEntry.getValue()); - titlesMap.add(entryNode); - }); - fieldFormDefinition.set("titleMap", titlesMap); - } catch (InstantiationException | IllegalAccessException e) { - ASFUILogger.getLogger().error(e.getMessage()); - throw new RuntimeException(e); - } - } - } - - private void buildValueDefinition(ObjectMapper checkBoxMapper, ArrayNode titlesMap, String value) { - ObjectNode entry = checkBoxMapper.createObjectNode(); - String upperCasedValue = value.toUpperCase(); - String lowerCasedValue = value.toLowerCase(); - if (value.equals(upperCasedValue)) { - entry.put("name", value.toLowerCase()); - } else if (value.equals(lowerCasedValue)) { - entry.put("name", value.replace(value.substring(0, 1), value.substring(0, 1).toUpperCase())); - } else { - entry.put("name", value); + buildValues(checkBoxMapper, titlesMap, annotation.titleMap()); + fieldFormDefinition.set("titleMap", titlesMap); } - entry.put("value", value); - titlesMap.add(entry); } @Override diff --git a/src/main/java/io/asfjava/ui/core/generators/ComboBoxGenerator.java b/src/main/java/io/asfjava/ui/core/generators/ComboBoxGenerator.java index cdf8a13..2761d6c 100644 --- a/src/main/java/io/asfjava/ui/core/generators/ComboBoxGenerator.java +++ b/src/main/java/io/asfjava/ui/core/generators/ComboBoxGenerator.java @@ -12,7 +12,7 @@ import io.asfjava.ui.core.form.ValuesContainer; import io.asfjava.ui.core.logging.ASFUILogger; -public class ComboBoxGenerator implements FormDefinitionGenerator { +public class ComboBoxGenerator extends ListGenerator implements FormDefinitionGenerator { @Override public void generate(ObjectNode fieldFormDefinition, Field field) { @@ -24,47 +24,22 @@ public void generate(ObjectNode fieldFormDefinition, Field field) { fieldFormDefinition.put("multiple", annotation.multiple()); fieldFormDefinition.put("required", annotation.required()); fieldFormDefinition.put("size", annotation.size()); + if (!annotation.refURL().isEmpty()) { + fieldFormDefinition.put("$ref", annotation.refURL()); + } ObjectMapper comboMapper = new ObjectMapper(); ArrayNode titlesMap = comboMapper.createArrayNode(); if (annotation.values().length != 0) { Arrays.stream(annotation.values()).forEach(value -> buildValueDefinition(comboMapper, titlesMap, value)); - fieldFormDefinition.set("titleMap", titlesMap); } else if (!annotation.titleMap().equals(ValuesContainer.class)) { - - try { - Map map = (annotation.titleMap()).newInstance().getValues(); - map.entrySet().stream().forEach(mapEntry -> { - ObjectNode entryNode = comboMapper.createObjectNode(); - entryNode.put("name", mapEntry.getKey()); - entryNode.putPOJO("value", mapEntry.getValue()); - titlesMap.add(entryNode); - }); - fieldFormDefinition.set("titleMap", titlesMap); - } catch (InstantiationException | IllegalAccessException e) { - ASFUILogger.getLogger().error(e.getMessage()); - throw new RuntimeException(e); - } + buildValues(comboMapper, titlesMap, annotation.titleMap()); + fieldFormDefinition.set("titleMap", titlesMap); } } - private void buildValueDefinition(ObjectMapper comboMapper, ArrayNode titlesMap, String value) { - ObjectNode entry = comboMapper.createObjectNode(); - String upperCasedValue = value.toUpperCase(); - String lowerCasedValue = value.toLowerCase(); - if (value.equals(upperCasedValue)) { - entry.put("name", value.toLowerCase()); - } else if (value.equals(lowerCasedValue)) { - entry.put("name", value.replace(value.substring(0, 1), value.substring(0, 1).toUpperCase())); - } else { - entry.put("name", value); - } - entry.put("value", value); - titlesMap.add(entry); - } - @Override public String getAnnotation() { return ComboBox.class.getName(); diff --git a/src/main/java/io/asfjava/ui/core/generators/ListGenerator.java b/src/main/java/io/asfjava/ui/core/generators/ListGenerator.java new file mode 100644 index 0000000..feeb402 --- /dev/null +++ b/src/main/java/io/asfjava/ui/core/generators/ListGenerator.java @@ -0,0 +1,39 @@ +package io.asfjava.ui.core.generators; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import io.asfjava.ui.core.form.ValuesContainer; +import io.asfjava.ui.core.logging.ASFUILogger; + +public class ListGenerator { + + protected void buildValueDefinition(ObjectMapper listMapper, ArrayNode titlesMap, String value) { + ObjectNode entry = listMapper.createObjectNode(); + String upperCasedValue = value.toUpperCase(); + String lowerCasedValue = value.toLowerCase(); + if (value.equals(upperCasedValue)) { + entry.put("name", value.toLowerCase()); + } else if (value.equals(lowerCasedValue)) { + entry.put("name", value.replace(value.substring(0, 1), value.substring(0, 1).toUpperCase())); + } else { + entry.put("name", value); + } + entry.put("value", value); + titlesMap.add(entry); + } + + protected void buildValues(ObjectMapper listMapper, ArrayNode titlesMap, Class valuesContainer) { + try { + valuesContainer.newInstance().getValues().forEach((key, value) -> { + ObjectNode entryNode = listMapper.createObjectNode(); + entryNode.put("name", key); + entryNode.putPOJO("value", value); + titlesMap.add(entryNode); + }); + } catch (InstantiationException | IllegalAccessException e) { + ASFUILogger.getLogger().error(e.getMessage()); + throw new RuntimeException(e); + } + } +}