Skip to content

Add $ref support for ComboBox + some optimization #77

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/main/java/io/asfjava/ui/core/form/ComboBox.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@
boolean required() default false;

int size() default 1;


String refURL() default "";

Class<? extends ValuesContainer> titleMap() default ValuesContainer.class;

}
34 changes: 3 additions & 31 deletions src/main/java/io/asfjava/ui/core/generators/CheckBoxGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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<String, String> 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
Expand Down
37 changes: 6 additions & 31 deletions src/main/java/io/asfjava/ui/core/generators/ComboBoxGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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<String, String> 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();
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/io/asfjava/ui/core/generators/ListGenerator.java
Original file line number Diff line number Diff line change
@@ -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<? extends ValuesContainer> 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);
}
}
}