22
33import java .io .BufferedReader ;
44import java .io .File ;
5+ import java .io .FileInputStream ;
56import java .io .IOException ;
67import java .io .InputStream ;
78import java .io .InputStreamReader ;
2324import com .aerospike .client .policy .ScanPolicy ;
2425import com .aerospike .mapper .annotations .AerospikeRecord ;
2526import com .aerospike .mapper .tools .ClassCache .PolicyType ;
27+ import com .aerospike .mapper .tools .configuration .BinConfig ;
2628import com .aerospike .mapper .tools .configuration .ClassConfig ;
2729import com .aerospike .mapper .tools .configuration .Configuration ;
2830import com .aerospike .mapper .tools .utils .TypeUtils ;
29- import com .fasterxml .jackson .core .JsonProcessingException ;
30- import com .fasterxml .jackson .databind .ObjectMapper ;
31- import com .fasterxml .jackson .dataformat .yaml .YAMLFactory ;
31+ import org .yaml .snakeyaml .LoaderOptions ;
32+ import org .yaml .snakeyaml .TypeDescription ;
33+ import org .yaml .snakeyaml .Yaml ;
34+ import org .yaml .snakeyaml .constructor .Constructor ;
3235
3336public abstract class AbstractBuilder <T extends IBaseAeroMapper > {
3437 private final T mapper ;
@@ -121,34 +124,48 @@ public AbstractBuilder<T> withConfigurationFile(File file) throws IOException {
121124 }
122125
123126 public AbstractBuilder <T > withConfigurationFile (File file , boolean allowsInvalid ) throws IOException {
124- ObjectMapper objectMapper = new ObjectMapper (new YAMLFactory ());
125- Configuration configuration = objectMapper .readValue (file , Configuration .class );
126- this .loadConfiguration (configuration , allowsInvalid );
127- return this ;
127+ try (InputStream fis = new FileInputStream (file )) {
128+ return this .withConfigurationFile (fis , allowsInvalid );
129+ }
128130 }
129131
130132 public AbstractBuilder <T > withConfigurationFile (InputStream ios ) throws IOException {
131133 return this .withConfigurationFile (ios , false );
132134 }
133135
134136 public AbstractBuilder <T > withConfigurationFile (InputStream ios , boolean allowsInvalid ) throws IOException {
135- ObjectMapper objectMapper = new ObjectMapper ( new YAMLFactory () );
136- Configuration configuration = objectMapper . readValue (ios , Configuration . class );
137+ Yaml yaml = createYamlParser ( );
138+ Configuration configuration = yaml . load (ios );
137139 this .loadConfiguration (configuration , allowsInvalid );
138140 return this ;
139141 }
140142
141- public AbstractBuilder <T > withConfiguration (String configurationYaml ) throws JsonProcessingException {
143+ public AbstractBuilder <T > withConfiguration (String configurationYaml ) {
142144 return this .withConfiguration (configurationYaml , false );
143145 }
144146
145- public AbstractBuilder <T > withConfiguration (String configurationYaml , boolean allowsInvalid ) throws JsonProcessingException {
146- ObjectMapper objectMapper = new ObjectMapper ( new YAMLFactory () );
147- Configuration configuration = objectMapper . readValue (configurationYaml , Configuration . class );
147+ public AbstractBuilder <T > withConfiguration (String configurationYaml , boolean allowsInvalid ) {
148+ Yaml yaml = createYamlParser ( );
149+ Configuration configuration = yaml . load (configurationYaml );
148150 this .loadConfiguration (configuration , allowsInvalid );
149151 return this ;
150152 }
151-
153+
154+ private static Yaml createYamlParser () {
155+ Constructor constructor = new Constructor (Configuration .class , new LoaderOptions ());
156+
157+ TypeDescription configDesc = new TypeDescription (Configuration .class );
158+ configDesc .addPropertyParameters ("classes" , ClassConfig .class );
159+ constructor .addTypeDescription (configDesc );
160+
161+ TypeDescription classConfigDesc = new TypeDescription (ClassConfig .class );
162+ classConfigDesc .substituteProperty ("class" , String .class , "getClassName" , "setClassName" );
163+ classConfigDesc .addPropertyParameters ("bins" , BinConfig .class );
164+ constructor .addTypeDescription (classConfigDesc );
165+
166+ return new Yaml (constructor );
167+ }
168+
152169 public AbstractBuilder <T > withClassConfigurations (ClassConfig classConfig , ClassConfig ...classConfigs ) {
153170 Configuration configuration = new Configuration ();
154171 configuration .add (classConfig );
@@ -161,6 +178,9 @@ public AbstractBuilder<T> withClassConfigurations(ClassConfig classConfig, Class
161178 }
162179
163180 private void loadConfiguration (@ NotNull Configuration configuration , boolean allowsInvalid ) {
181+ if (configuration == null ) {
182+ throw new AerospikeException ("YAML configuration is empty or invalid" );
183+ }
164184 for (ClassConfig config : configuration .getClasses ()) {
165185 try {
166186 String name = config .getClassName ();
0 commit comments