1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.databind.io;
28
29 import gov.nist.secauto.metaschema.core.configuration.IConfiguration;
30 import gov.nist.secauto.metaschema.core.configuration.IMutableConfiguration;
31 import gov.nist.secauto.metaschema.core.metapath.DynamicContext;
32 import gov.nist.secauto.metaschema.core.metapath.StaticContext;
33 import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
34 import gov.nist.secauto.metaschema.core.model.constraint.DefaultConstraintValidator;
35 import gov.nist.secauto.metaschema.core.model.constraint.IConstraintValidationHandler;
36 import gov.nist.secauto.metaschema.core.model.constraint.LoggingConstraintValidationHandler;
37 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
38 import gov.nist.secauto.metaschema.databind.model.IAssemblyClassBinding;
39
40 import java.io.IOException;
41 import java.io.Reader;
42 import java.net.URI;
43
44 import edu.umd.cs.findbugs.annotations.NonNull;
45
46
47
48
49
50
51
52 public abstract class AbstractDeserializer<CLASS>
53 extends AbstractSerializationBase<DeserializationFeature<?>>
54 implements IDeserializer<CLASS> {
55
56 private IConstraintValidationHandler constraintValidationHandler;
57
58
59
60
61
62
63
64
65 protected AbstractDeserializer(@NonNull IAssemblyClassBinding classBinding) {
66 super(classBinding);
67 }
68
69
70
71
72
73
74
75 @Override
76 @NonNull
77 public IConstraintValidationHandler getConstraintValidationHandler() {
78 synchronized (this) {
79 if (constraintValidationHandler == null) {
80 constraintValidationHandler = new LoggingConstraintValidationHandler();
81 }
82 return ObjectUtils.notNull(constraintValidationHandler);
83 }
84 }
85
86 @Override
87 public void setConstraintValidationHandler(@NonNull IConstraintValidationHandler constraintValidationHandler) {
88 synchronized (this) {
89 this.constraintValidationHandler = constraintValidationHandler;
90 }
91 }
92
93 @Override
94 public INodeItem deserializeToNodeItem(Reader reader, URI documentUri) throws IOException {
95
96 INodeItem nodeItem;
97 try {
98 nodeItem = deserializeToNodeItemInternal(reader, documentUri);
99 } catch (Exception ex) {
100 throw new IOException(ex);
101 }
102
103 if (isValidating()) {
104 StaticContext staticContext = StaticContext.newInstance();
105 DynamicContext dynamicContext = staticContext.newDynamicContext();
106 dynamicContext.setDocumentLoader(getBindingContext().newBoundLoader());
107 DefaultConstraintValidator validator = new DefaultConstraintValidator(
108 dynamicContext,
109 getConstraintValidationHandler());
110 validator.validate(nodeItem);
111 validator.finalizeValidation();
112 }
113 return nodeItem;
114 }
115
116
117
118
119
120
121
122
123
124
125
126
127 @NonNull
128 protected abstract INodeItem deserializeToNodeItemInternal(@NonNull Reader reader, @NonNull URI documentUri)
129 throws IOException;
130
131 @Override
132 public IDeserializer<CLASS> enableFeature(DeserializationFeature<?> feature) {
133 return set(feature, true);
134 }
135
136 @Override
137 public IDeserializer<CLASS> disableFeature(DeserializationFeature<?> feature) {
138 return set(feature, false);
139 }
140
141 @Override
142 public IDeserializer<CLASS> applyConfiguration(
143 @NonNull IConfiguration<DeserializationFeature<?>> other) {
144 IMutableConfiguration<DeserializationFeature<?>> config = getConfiguration();
145 config.applyConfiguration(other);
146 configurationChanged(config);
147 return this;
148 }
149
150 @Override
151 public IDeserializer<CLASS> set(DeserializationFeature<?> feature, Object value) {
152 IMutableConfiguration<DeserializationFeature<?>> config = getConfiguration();
153 config.set(feature, value);
154 configurationChanged(config);
155 return this;
156 }
157 }