Skip to content

Schema Decorator #37

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 6 commits into from
Jun 8, 2017
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
10 changes: 10 additions & 0 deletions demo/src/main/java/io/asfjava/ui/demo/screen/DemoForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,16 @@ public String getCivilState() {
public void setCivilState(String civilState) {
this.civilState = civilState;
}


public String getCurrency() {
return currency;
}

public String getColor() {
return color;
}


private static final long serialVersionUID = -5073515619469444978L;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class GeneratorFactoryInitializer implements ServletContextListener {
@Override
public final void contextInitialized(final ServletContextEvent sce) {
GeneratorFactoryLoader.getInstance().load();
SchemaDecoratorLoader.getInstance().load();
}

@Override
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/io/asfjava/ui/core/SchemaDecoratorFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.asfjava.ui.core;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import io.asfjava.ui.schema.decorator.SchemaDecorator;

public final class SchemaDecoratorFactory {
public SchemaDecorator getGenerator(String annotationName) {
return GENERATORS.get(annotationName);
}

void register(String annotationName, SchemaDecorator generator) {
GENERATORS.put(annotationName, generator);
}

public static SchemaDecoratorFactory getInstance() {
if (INSTANCE == null) {
INSTANCE = new SchemaDecoratorFactory();
}
return INSTANCE;
}

private static final Map<String, SchemaDecorator> GENERATORS = new ConcurrentHashMap<>();

private static SchemaDecoratorFactory INSTANCE;

private SchemaDecoratorFactory() {
}
}
49 changes: 49 additions & 0 deletions src/main/java/io/asfjava/ui/core/SchemaDecoratorLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.asfjava.ui.core;

import java.util.Set;

import org.reflections.Reflections;

import io.asfjava.ui.schema.decorator.SchemaDecorator;



final class SchemaDecoratorLoader {

private static final String PACKAGESCAN = "io.asfjava.ui.schema.decorator";
private static Reflections reflections = new Reflections(PACKAGESCAN);
void load() {

Set<Class<? extends SchemaDecorator>> subTypes = reflections
.getSubTypesOf(SchemaDecorator.class);
for (Class<? extends SchemaDecorator> subtype : subTypes) {
SchemaDecorator schemaDecorator;
try {
schemaDecorator = (SchemaDecorator) Class.forName(subtype.getName()).newInstance();
SchemaDecoratorFactory.getInstance().register(schemaDecorator.getAnnotation(),
schemaDecorator);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

void unload() {
System.out.println("I'm unloader");
}

static SchemaDecoratorLoader getInstance() {
if (INSTANCE == null)
INSTANCE = new SchemaDecoratorLoader();
return INSTANCE;
}

private static SchemaDecoratorLoader INSTANCE;

private SchemaDecoratorLoader() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void generate(ObjectNode fieldFormDefinition, Field field) {
fieldFormDefinition.put("type", "checkboxes");
fieldFormDefinition.put("multiple", annotation.multiple());
fieldFormDefinition.put("required", annotation.required());
fieldFormDefinition.put("title", annotation.title());
// fieldFormDefinition.put("title", annotation.title());

ObjectMapper checkBoxMapper = new ObjectMapper();
ArrayNode titlesMap = checkBoxMapper.createArrayNode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void generate(ObjectNode fieldFormDefinition, Field field) {
fieldFormDefinition.put("multiple", annotation.multiple());
fieldFormDefinition.put("required", annotation.required());
fieldFormDefinition.put("size", annotation.size());
fieldFormDefinition.put("title", annotation.title());
// fieldFormDefinition.put("title", annotation.title());

ObjectMapper comboMapper = new ObjectMapper();
ArrayNode titlesMap = comboMapper.createArrayNode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class PasswordGenerator implements FormDefinitionGenerator {
public void generate(ObjectNode fieldFormDefinition, Field field) {
Password annotation = field.getAnnotation(Password.class);
fieldFormDefinition.put("key", field.getName());
fieldFormDefinition.put("title", annotation.title());
// fieldFormDefinition.put("title", annotation.title());
fieldFormDefinition.put("type", "password");

String description = annotation.description();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public void generate(ObjectNode fieldFormDefinition, Field field) {
fieldFormDefinition.put("key", field.getName());
fieldFormDefinition.put("readOnly", annotation.readOnly());
fieldFormDefinition.put("type", "radios");
fieldFormDefinition.put("title", annotation.title());
// fieldFormDefinition.put("title", annotation.title());

JsonNode radioFieldFormDefinition = ((JsonNode) fieldFormDefinition);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class TextAreaGenerator implements FormDefinitionGenerator {
public void generate(ObjectNode fieldFormDefinition, Field field) {
TextArea annotation = field.getAnnotation(TextArea.class);
fieldFormDefinition.put("key", field.getName());
fieldFormDefinition.put("title", annotation.title());
// fieldFormDefinition.put("title", annotation.title());
fieldFormDefinition.put("type", "textarea");

String description = annotation.description();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public void generate(ObjectNode fieldFormDefinition, Field field) {
TextField annotation = field.getAnnotation(TextField.class);

fieldFormDefinition.put("key", field.getName());
fieldFormDefinition.put("title", annotation.title());
// fieldFormDefinition.put("title", annotation.title());

String description = annotation.description();
if (!description.isEmpty()) {
Expand Down
14 changes: 8 additions & 6 deletions src/main/java/io/asfjava/ui/core/schema/CustomStringSchema.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package io.asfjava.ui.core.schema;

import java.lang.annotation.Annotation;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.TextField;
import io.asfjava.ui.core.SchemaDecoratorFactory;

class CustomStringSchema extends StringSchema {

@Override
public void enrichWithBeanProperty(BeanProperty beanProperty) {
super.enrichWithBeanProperty(beanProperty);
TextField annotation = beanProperty.getAnnotation(TextField.class);
if (annotation != null && !annotation.pattern().isEmpty()) {
this.setPattern(annotation.pattern());
}
super.enrichWithBeanProperty(beanProperty);
Iterable<Annotation> it = beanProperty.getMember().annotations();
String anno = it.iterator().next().annotationType().getName();
SchemaDecoratorFactory.getInstance().getGenerator(anno).customizeSchema(beanProperty, this);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.CheckBox;

public class CheckBoxSchemaDecorator implements SchemaDecorator {

@Override
public void customizeSchema(BeanProperty property, JsonSchema jsonschema) {
CheckBox annotation = property.getAnnotation(CheckBox.class);
if (annotation != null && annotation.title() != null) {
((StringSchema) jsonschema).setTitle(annotation.title());
}
}

@Override
public String getAnnotation() {
return CheckBox.class.getName();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.ComboBox;

public class ComboBoxSchemaDecorator implements SchemaDecorator {

@Override
public void customizeSchema(BeanProperty property, JsonSchema jsonschema) {
ComboBox annotation = property.getAnnotation(ComboBox.class);
if (annotation != null && annotation.title() != null) {
((StringSchema) jsonschema).setTitle(annotation.title());
}
}

@Override
public String getAnnotation() {
return ComboBox.class.getName();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.Password;

public class PasswordSchemaDecorator implements SchemaDecorator {

@Override
public void customizeSchema(BeanProperty property, JsonSchema jsonschema) {
Password annotation = property.getAnnotation(Password.class);
if (annotation != null && annotation.title() != null) {
((StringSchema) jsonschema).setTitle(annotation.title());
}
}

@Override
public String getAnnotation() {
return Password.class.getName();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.Password;
import io.asfjava.ui.core.form.RadioBox;

public class RadioBoxSchemaDecorator implements SchemaDecorator {

@Override
public void customizeSchema(BeanProperty property, JsonSchema jsonschema) {
RadioBox annotation = property.getAnnotation(RadioBox.class);
if (annotation != null && annotation.title() != null) {
((StringSchema) jsonschema).setTitle(annotation.title());
}
}

@Override
public String getAnnotation() {
return RadioBox.class.getName();
}

}
10 changes: 10 additions & 0 deletions src/main/java/io/asfjava/ui/schema/decorator/SchemaDecorator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;

public interface SchemaDecorator {

void customizeSchema(BeanProperty property,JsonSchema jsonschema);
String getAnnotation();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.TextArea;

public class TextAreaSchemaDecorator implements SchemaDecorator {

@Override
public void customizeSchema(BeanProperty property, JsonSchema jsonschema) {
TextArea annotation = property.getAnnotation(TextArea.class);
if (annotation != null && annotation.title() != null) {
((StringSchema) jsonschema).setTitle(annotation.title());
}
}

@Override
public String getAnnotation() {
return TextArea.class.getName();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.asfjava.ui.schema.decorator;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;

import io.asfjava.ui.core.form.TextField;

public class TextFieldSchemaDecorator implements SchemaDecorator{

@Override
public void customizeSchema(BeanProperty property, JsonSchema jsonschema) {
TextField annotation = property.getAnnotation(TextField.class);
if (annotation != null) {
if(annotation.title()!=null){
((StringSchema) jsonschema).setTitle(annotation.title());
}
if(annotation.pattern()!=null)
{
((StringSchema) jsonschema).setPattern(annotation.pattern());
}
}
}

@Override
public String getAnnotation() {
return TextField.class.getName();
}

}