Skip to content

Commit cae585e

Browse files
committed
change package and work on #1
1 parent ad6f25c commit cae585e

12 files changed

+244
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.asfjava.ui.core;
2+
3+
import java.lang.reflect.Field;
4+
5+
import com.fasterxml.jackson.databind.node.ObjectNode;
6+
7+
public interface FormDefinitionGenerator {
8+
9+
void generate(ObjectNode node, Field field);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.asfjava.ui.core;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.util.HashMap;
5+
6+
public final class FormDefinitionGeneratorFactory {
7+
8+
public FormDefinitionGenerator getGenerator(Annotation annotation) {
9+
return GENERATORS.get(annotation.annotationType().getName());
10+
}
11+
12+
void register(Annotation annotation, FormDefinitionGenerator generator) {
13+
GENERATORS.put(annotation.annotationType().getName(), generator);
14+
}
15+
16+
public static FormDefinitionGeneratorFactory getInstance() {
17+
if (INSTANCE == null) {
18+
INSTANCE = new FormDefinitionGeneratorFactory();
19+
}
20+
return INSTANCE;
21+
}
22+
23+
private static final HashMap<String, FormDefinitionGenerator> GENERATORS = new HashMap<>();
24+
25+
private static FormDefinitionGeneratorFactory INSTANCE;
26+
27+
private FormDefinitionGeneratorFactory() {
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.asfjava.ui.core;
2+
3+
import javax.servlet.ServletContextEvent;
4+
import javax.servlet.ServletContextListener;
5+
import javax.servlet.annotation.WebListener;
6+
7+
@WebListener
8+
class GeneratorFactoryInitializer implements ServletContextListener {
9+
10+
@Override
11+
public final void contextInitialized(final ServletContextEvent sce) {
12+
GeneratorFactoryLoader.getInstance().load();
13+
}
14+
15+
@Override
16+
public final void contextDestroyed(final ServletContextEvent sce) {
17+
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.asfjava.ui.core;
2+
3+
final class GeneratorFactoryLoader {
4+
5+
void load() {
6+
System.out.println("I'm loader");
7+
}
8+
9+
void unload() {
10+
System.out.println("I'm unloader");
11+
}
12+
13+
static GeneratorFactoryLoader getInstance() {
14+
if (INSTANCE == null)
15+
INSTANCE = new GeneratorFactoryLoader();
16+
return INSTANCE;
17+
}
18+
19+
private static GeneratorFactoryLoader INSTANCE;
20+
21+
private GeneratorFactoryLoader() {
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.asfjava.ui.core.form;
2+
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
5+
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.Target;
8+
9+
@Retention(RUNTIME)
10+
@Target(FIELD)
11+
public @interface TextArea {
12+
String title();
13+
14+
String placeHolder() default "";
15+
16+
String description() default "";
17+
18+
boolean noTitle() default false;
19+
20+
String validationMessage() default "";
21+
22+
boolean readOnly() default false;
23+
}

src/main/java/io/asfjava/ui/form/TextField.java renamed to src/main/java/io/asfjava/ui/core/form/TextField.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.asfjava.ui.form;
1+
package io.asfjava.ui.core.form;
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.RetentionPolicy.RUNTIME;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.asfjava.ui.core.generators;
2+
3+
import java.lang.reflect.Field;
4+
5+
import com.fasterxml.jackson.databind.node.ObjectNode;
6+
7+
import io.asfjava.ui.core.FormDefinitionGenerator;
8+
import io.asfjava.ui.core.form.TextField;
9+
10+
class TextFieldGenerator implements FormDefinitionGenerator {
11+
12+
@Override
13+
public void generate(ObjectNode fieldFormDefinition, Field field) {
14+
TextField annotation = field.getAnnotation(TextField.class);
15+
16+
fieldFormDefinition.put("key", field.getName());
17+
// fieldFormDefinition.put("type", annotation.value().getLayout());
18+
19+
String description = annotation.description();
20+
if (!description.isEmpty()) {
21+
fieldFormDefinition.put("description", description);
22+
}
23+
24+
String placeHolder = annotation.placeHolder();
25+
if (!placeHolder.isEmpty()) {
26+
fieldFormDefinition.put("placeholder", placeHolder);
27+
}
28+
29+
boolean noTitle = annotation.noTitle();
30+
if (noTitle) {
31+
fieldFormDefinition.put("notitle", noTitle);
32+
}
33+
34+
String validationMessage = annotation.validationMessage();
35+
if (!validationMessage.isEmpty()) {
36+
fieldFormDefinition.put("validationMessage", validationMessage);
37+
}
38+
39+
boolean readOnly = annotation.readOnly();
40+
if (readOnly) {
41+
fieldFormDefinition.put("readonly", readOnly);
42+
}
43+
}
44+
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.asfjava.ui.core.schema;
2+
3+
import com.fasterxml.jackson.module.jsonSchema.factories.JsonSchemaFactory;
4+
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
5+
6+
class CustomJsonSchemaFactory extends JsonSchemaFactory {
7+
@Override
8+
public StringSchema stringSchema() {
9+
return new CustomStringSchema();
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.asfjava.ui.core.schema;
2+
3+
import com.fasterxml.jackson.databind.SerializerProvider;
4+
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
5+
import com.fasterxml.jackson.module.jsonSchema.factories.VisitorContext;
6+
import com.fasterxml.jackson.module.jsonSchema.factories.WrapperFactory;
7+
8+
class CustomSchemaFactoryWrapper extends SchemaFactoryWrapper {
9+
10+
private static class ASFSchemaFactoryWrapperFactory extends WrapperFactory {
11+
@Override
12+
public SchemaFactoryWrapper getWrapper(SerializerProvider p) {
13+
SchemaFactoryWrapper wrapper = new CustomSchemaFactoryWrapper();
14+
if (p != null) {
15+
wrapper.setProvider(p);
16+
}
17+
return wrapper;
18+
};
19+
20+
@Override
21+
public SchemaFactoryWrapper getWrapper(SerializerProvider p, VisitorContext rvc) {
22+
SchemaFactoryWrapper wrapper = new CustomSchemaFactoryWrapper();
23+
if (p != null) {
24+
wrapper.setProvider(p);
25+
}
26+
wrapper.setVisitorContext(rvc);
27+
return wrapper;
28+
}
29+
};
30+
31+
CustomSchemaFactoryWrapper() {
32+
super(new ASFSchemaFactoryWrapperFactory());
33+
schemaProvider = new CustomJsonSchemaFactory();
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.asfjava.ui.core.schema;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.databind.BeanProperty;
5+
import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
6+
7+
import io.asfjava.ui.core.form.TextField;
8+
9+
class CustomStringSchema extends StringSchema {
10+
@JsonProperty
11+
private String layout;
12+
13+
@Override
14+
public void enrichWithBeanProperty(BeanProperty beanProperty) {
15+
super.enrichWithBeanProperty(beanProperty);
16+
TextField annotation = beanProperty.getAnnotation(TextField.class);
17+
if (annotation != null) {
18+
// this.setLayout(annotation.value().toString());
19+
this.setTitle(annotation.title());
20+
}
21+
}
22+
23+
String getLayout() {
24+
return layout;
25+
}
26+
27+
void setLayout(String layout) {
28+
this.layout = layout;
29+
}
30+
}

src/main/java/io/asfjava/ui/schema/UiFormSchemaGenerator.java renamed to src/main/java/io/asfjava/ui/core/schema/UiFormSchemaGenerator.java

+17-33
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
1-
package io.asfjava.ui.schema;
1+
package io.asfjava.ui.core.schema;
22

33
import java.io.Serializable;
4+
import java.lang.annotation.Annotation;
45
import java.lang.reflect.Field;
56
import java.util.Arrays;
7+
import java.util.List;
68

79
import com.fasterxml.jackson.databind.JsonMappingException;
10+
import com.fasterxml.jackson.databind.JsonNode;
811
import com.fasterxml.jackson.databind.ObjectMapper;
912
import com.fasterxml.jackson.databind.node.ArrayNode;
1013
import com.fasterxml.jackson.databind.node.ObjectNode;
1114
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
1215
import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
1316

14-
import io.asfjava.ui.form.TextField;
15-
import io.asfjava.ui.schema.dto.UiForm;
17+
import io.asfjava.ui.core.FormDefinitionGenerator;
18+
import io.asfjava.ui.core.FormDefinitionGeneratorFactory;
19+
import io.asfjava.ui.dto.UiForm;
1620

1721
public final class UiFormSchemaGenerator {
1822

@@ -25,45 +29,25 @@ public UiForm generate(Class<? extends Serializable> formDto) throws JsonMapping
2529

2630
ArrayNode formDefinition = mapper.createArrayNode();
2731

28-
Arrays.asList(formDto.getDeclaredFields()).stream().filter(field -> field.isAnnotationPresent(TextField.class))
32+
Arrays.asList(formDto.getDeclaredFields()).stream()
2933
.forEach(field -> buildFormDefinition(mapper, formDefinition, field));
3034

3135
return new UiForm(schema, formDefinition);
3236
}
3337

3438
private void buildFormDefinition(ObjectMapper mapper, ArrayNode formDefinition, Field field) {
35-
ObjectNode fieldFormDefinition = mapper.createObjectNode();
36-
TextField annotation = field.getAnnotation(TextField.class);
37-
38-
fieldFormDefinition.put("key", field.getName());
39-
// fieldFormDefinition.put("type", annotation.value().getLayout());
40-
41-
String description = annotation.description();
42-
if (!description.isEmpty()) {
43-
fieldFormDefinition.put("description", description);
44-
}
45-
46-
String placeHolder = annotation.placeHolder();
47-
if (!placeHolder.isEmpty()) {
48-
fieldFormDefinition.put("placeholder", placeHolder);
49-
}
50-
51-
boolean noTitle = annotation.noTitle();
52-
if (noTitle) {
53-
fieldFormDefinition.put("notitle", noTitle);
54-
}
55-
56-
String validationMessage = annotation.validationMessage();
57-
if (!validationMessage.isEmpty()) {
58-
fieldFormDefinition.put("validationMessage", validationMessage);
39+
List<Annotation> annoations = Arrays.asList(field.getAnnotations());
40+
for (Annotation annotation : annoations) {
41+
formDefinition.add(buildFieldDefinition(field, annotation, mapper));
5942
}
43+
}
6044

61-
boolean readOnly = annotation.readOnly();
62-
if (readOnly) {
63-
fieldFormDefinition.put("readonly", readOnly);
64-
}
45+
private JsonNode buildFieldDefinition(Field field, Annotation annotation, ObjectMapper mapper) {
46+
ObjectNode fieldFormDefinition = mapper.createObjectNode();
47+
FormDefinitionGenerator generator = FormDefinitionGeneratorFactory.getInstance().getGenerator(annotation);
48+
generator.generate(fieldFormDefinition, field);
49+
return fieldFormDefinition;
6550

66-
formDefinition.add(fieldFormDefinition);
6751
}
6852

6953
public static UiFormSchemaGenerator get() {

src/main/java/io/asfjava/ui/schema/dto/UiForm.java renamed to src/main/java/io/asfjava/ui/dto/UiForm.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.asfjava.ui.schema.dto;
1+
package io.asfjava.ui.dto;
22

33
import java.io.Serializable;
44

0 commit comments

Comments
 (0)