You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Heinrich Götzger <go...@web.de> on 2013/04/02 20:47:41 UTC

creation of yaml-configuration from existing Config-object fails

Hello,

I try to read, edit, write and re-read a cassandra-yaml-config file 
programmatically, but this unfortunately does not work as expected:

Here is my example:

/* start */
package com.fue;

import java.io.*;

import org.apache.cassandra.config.*;
import org.apache.cassandra.utils.SkipNullRepresenter;
import org.yaml.snakeyaml.*;
import org.yaml.snakeyaml.DumperOptions.*;
import org.yaml.snakeyaml.constructor.*;
import org.yaml.snakeyaml.nodes.*;

public class YamlConfigTest {

    public static void main(String[] args) throws IOException {

       // 1. reading an existing config-file,
       InputStream input = new FileInputStream("/tmp/cassandra-1.2.3.yaml");

       Constructor constructor = new Constructor(Config.class);
       TypeDescription seedDesc = new 
TypeDescription(SeedProviderDef.class);
       seedDesc.putMapPropertyType("parameters", String.class, 
String.class);
       constructor.addTypeDescription(seedDesc);
       Yaml cassandraConfYaml = new Yaml(new Loader(constructor));

       Config conf = (Config) cassandraConfYaml.load(input);

       // 2. change the setting in the Config-object
       SeedProviderDef spd = conf.seed_provider;
       spd.parameters.put("seeds", "192.168.1.2");

       DumperOptions options = new DumperOptions();
       options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
       options.setDefaultScalarStyle(ScalarStyle.PLAIN);

       SkipNullRepresenter representer = new SkipNullRepresenter();
       representer.addClassTag(Config.class, Tag.MAP);

       Dumper dumper = new Dumper(representer, options);

       Yaml yamlWriter = new Yaml(new Loader(constructor), dumper);

       // 3. and writing it back to another file.
       String fileName = "/tmp/myCassandra.yaml";
       Writer output = new FileWriter(fileName);
       yamlWriter.dump(conf, output);

       Reader reader = new FileReader(fileName);

       Yaml myCassandraConfYaml = new Yaml(new Loader(constructor));

       // This procedure looses these two dashes and makes the 
configuration not
       // usable for further processing in other tasks.
       Config myConf = (Config) myCassandraConfYaml.load(reader);

    }
}
/* end */

And this is the output:

Exception in thread "main" Can't construct a java object for 
tag:yaml.org,2002:org.apache.cassandra.config.Config; exception=Cannot 
create property=seed_provider for 
JavaBean=org.apache.cassandra.config.Config@3c3ac93e; 
java.lang.NoSuchMethodException: 
org.apache.cassandra.config.SeedProviderDef.<init>()
  in 'reader', line 1, column 1:
     authenticator: org.apache.cassan ...
     ^

	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:333)
	at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
	at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)
	at 
org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
	at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481)
	at org.yaml.snakeyaml.Yaml.load(Yaml.java:424)
	at com.fue.YamlConfigTest.main(YamlConfigTest.java:53)
Caused by: org.yaml.snakeyaml.error.YAMLException: Cannot create 
property=seed_provider for 
JavaBean=org.apache.cassandra.config.Config@3c3ac93e; 
java.lang.NoSuchMethodException: 
org.apache.cassandra.config.SeedProviderDef.<init>()
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:299)
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:189)
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:331)
	... 6 more
Caused by: org.yaml.snakeyaml.error.YAMLException: 
java.lang.NoSuchMethodException: 
org.apache.cassandra.config.SeedProviderDef.<init>()
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.createEmptyJavaBean(Constructor.java:219)
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:189)
	at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:296)
	... 8 more
Caused by: java.lang.NoSuchMethodException: 
org.apache.cassandra.config.SeedProviderDef.<init>()
	at java.lang.Class.getConstructor0(Class.java:2715)
	at java.lang.Class.getDeclaredConstructor(Class.java:1987)
	at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.createEmptyJavaBean(Constructor.java:215)
	... 11 more

I'm using:
- snakeyaml-1.12
- cassandra-1.2.3

What am I doing wrong?
Is it a theme for cassandra or for yaml, is it in between or do I expect 
impossible things.


There is a thread about this in th SnakeYAML-group already:
https://groups.google.com/forum/?fromgroups=#!topic/snakeyaml-core/D4M0Ciy023E

Thanks for helping with some ideas.


Cheers

Heinrich

Re: creation of yaml-configuration from existing Config-object fails

Posted by aaron morton <aa...@thelastpickle.com>.
Compare the yaml file you created with the default one, something is different. 

Cheers

-----------------
Aaron Morton
Freelance Cassandra Consultant
New Zealand

@aaronmorton
http://www.thelastpickle.com

On 3/04/2013, at 12:17 AM, Heinrich Götzger <go...@web.de> wrote:

> Hello,
> 
> I try to read, edit, write and re-read a cassandra-yaml-config file programmatically, but this unfortunately does not work as expected:
> 
> Here is my example:
> 
> /* start */
> package com.fue;
> 
> import java.io.*;
> 
> import org.apache.cassandra.config.*;
> import org.apache.cassandra.utils.SkipNullRepresenter;
> import org.yaml.snakeyaml.*;
> import org.yaml.snakeyaml.DumperOptions.*;
> import org.yaml.snakeyaml.constructor.*;
> import org.yaml.snakeyaml.nodes.*;
> 
> public class YamlConfigTest {
> 
>   public static void main(String[] args) throws IOException {
> 
>      // 1. reading an existing config-file,
>      InputStream input = new FileInputStream("/tmp/cassandra-1.2.3.yaml");
> 
>      Constructor constructor = new Constructor(Config.class);
>      TypeDescription seedDesc = new TypeDescription(SeedProviderDef.class);
>      seedDesc.putMapPropertyType("parameters", String.class, String.class);
>      constructor.addTypeDescription(seedDesc);
>      Yaml cassandraConfYaml = new Yaml(new Loader(constructor));
> 
>      Config conf = (Config) cassandraConfYaml.load(input);
> 
>      // 2. change the setting in the Config-object
>      SeedProviderDef spd = conf.seed_provider;
>      spd.parameters.put("seeds", "192.168.1.2");
> 
>      DumperOptions options = new DumperOptions();
>      options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
>      options.setDefaultScalarStyle(ScalarStyle.PLAIN);
> 
>      SkipNullRepresenter representer = new SkipNullRepresenter();
>      representer.addClassTag(Config.class, Tag.MAP);
> 
>      Dumper dumper = new Dumper(representer, options);
> 
>      Yaml yamlWriter = new Yaml(new Loader(constructor), dumper);
> 
>      // 3. and writing it back to another file.
>      String fileName = "/tmp/myCassandra.yaml";
>      Writer output = new FileWriter(fileName);
>      yamlWriter.dump(conf, output);
> 
>      Reader reader = new FileReader(fileName);
> 
>      Yaml myCassandraConfYaml = new Yaml(new Loader(constructor));
> 
>      // This procedure looses these two dashes and makes the configuration not
>      // usable for further processing in other tasks.
>      Config myConf = (Config) myCassandraConfYaml.load(reader);
> 
>   }
> }
> /* end */
> 
> And this is the output:
> 
> Exception in thread "main" Can't construct a java object for tag:yaml.org,2002:org.apache.cassandra.config.Config; exception=Cannot create property=seed_provider for JavaBean=org.apache.cassandra.config.Config@3c3ac93e; java.lang.NoSuchMethodException: org.apache.cassandra.config.SeedProviderDef.<init>()
> in 'reader', line 1, column 1:
>    authenticator: org.apache.cassan ...
>    ^
> 
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:333)
> 	at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
> 	at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)
> 	at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
> 	at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481)
> 	at org.yaml.snakeyaml.Yaml.load(Yaml.java:424)
> 	at com.fue.YamlConfigTest.main(YamlConfigTest.java:53)
> Caused by: org.yaml.snakeyaml.error.YAMLException: Cannot create property=seed_provider for JavaBean=org.apache.cassandra.config.Config@3c3ac93e; java.lang.NoSuchMethodException: org.apache.cassandra.config.SeedProviderDef.<init>()
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:299)
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:189)
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:331)
> 	... 6 more
> Caused by: org.yaml.snakeyaml.error.YAMLException: java.lang.NoSuchMethodException: org.apache.cassandra.config.SeedProviderDef.<init>()
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.createEmptyJavaBean(Constructor.java:219)
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:189)
> 	at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:296)
> 	... 8 more
> Caused by: java.lang.NoSuchMethodException: org.apache.cassandra.config.SeedProviderDef.<init>()
> 	at java.lang.Class.getConstructor0(Class.java:2715)
> 	at java.lang.Class.getDeclaredConstructor(Class.java:1987)
> 	at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.createEmptyJavaBean(Constructor.java:215)
> 	... 11 more
> 
> I'm using:
> - snakeyaml-1.12
> - cassandra-1.2.3
> 
> What am I doing wrong?
> Is it a theme for cassandra or for yaml, is it in between or do I expect impossible things.
> 
> 
> There is a thread about this in th SnakeYAML-group already:
> https://groups.google.com/forum/?fromgroups=#!topic/snakeyaml-core/D4M0Ciy023E
> 
> Thanks for helping with some ideas.
> 
> 
> Cheers
> 
> Heinrich