Author: jbellis Date: Mon Aug 16 16:49:37 2010 New Revision: 986039 URL: http://svn.apache.org/viewvc?rev=986039&view=rev Log: revert switch to yamlbeans. patch by jbellis; reviewed by Jon Hermes for CASSANDRA-1394
Added: cassandra/trunk/lib/licenses/snakeyaml-1.6.txt cassandra/trunk/lib/snakeyaml-1.6.jar cassandra/trunk/src/java/org/apache/cassandra/utils/SkipNullRepresenter.java Removed: cassandra/trunk/lib/licenses/yamlbeans-1.04.txt cassandra/trunk/lib/yamlbeans-1.04.jar Modified: cassandra/trunk/CHANGES.txt cassandra/trunk/NOTICE.txt cassandra/trunk/conf/cassandra.yaml cassandra/trunk/src/java/org/apache/cassandra/config/Config.java cassandra/trunk/src/java/org/apache/cassandra/config/Converter.java cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java cassandra/trunk/src/java/org/apache/cassandra/config/RawColumnFamily.java cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java cassandra/trunk/src/java/org/apache/cassandra/tools/SchemaTool.java Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Mon Aug 16 16:49:37 2010 @@ -1,8 +1,6 @@ dev * remove cassandra.yaml dependency from Hadoop and Pig (CASSADRA-1322) * expose CfDef metadata in describe_keyspaces (CASSANDRA-1633) - * add back percentage option for cache size configuration, and replace - SnakeYAML with YamlBeans (CASSANDRA-1313) * restore use of mmap_index_only option (CASSANDRA-1241) * dropping a keyspace with no column families generated an error (CASSANDRA-1378) Modified: cassandra/trunk/NOTICE.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/NOTICE.txt?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/NOTICE.txt (original) +++ cassandra/trunk/NOTICE.txt Mon Aug 16 16:49:37 2010 @@ -30,5 +30,5 @@ Copyright 1995-2006 Mort Bay Consulting Alternative UUID support provided by Jug (http://jug.safehaus.org/). Copyright (c) 2002- Tatu Saloranta. -YAML support provided by yamlbeans (http://code.google.com/p/yamlbeans/). -Copyright (c) 2008 Nathan Sweet +YAML support provided by snakeyaml (http://code.google.com/p/snakeyaml/). +Copyright (c) 2008-2010 Andrey Somov Modified: cassandra/trunk/conf/cassandra.yaml URL: http://svn.apache.org/viewvc/cassandra/trunk/conf/cassandra.yaml?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/conf/cassandra.yaml (original) +++ cassandra/trunk/conf/cassandra.yaml Mon Aug 16 16:49:37 2010 @@ -268,7 +268,6 @@ keyspaces: read_repair_chance: 0.1 keys_cached: 100 gc_grace_seconds: 0 - rows_cached: 72% - name: StandardByUUID1 compare_with: TimeUUIDType @@ -284,7 +283,7 @@ keyspaces: column_type: Super compare_subcolumns_with: UTF8Type preload_row_cache: true - rows_cached: 72% + rows_cached: 10000 keys_cached: 50 comment: 'A column family with supercolumns, whose column and subcolumn names are UTF8 strings' Added: cassandra/trunk/lib/licenses/snakeyaml-1.6.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/lib/licenses/snakeyaml-1.6.txt?rev=986039&view=auto ============================================================================== --- cassandra/trunk/lib/licenses/snakeyaml-1.6.txt (added) +++ cassandra/trunk/lib/licenses/snakeyaml-1.6.txt Mon Aug 16 16:49:37 2010 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. Added: cassandra/trunk/lib/snakeyaml-1.6.jar URL: http://svn.apache.org/viewvc/cassandra/trunk/lib/snakeyaml-1.6.jar?rev=986039&view=auto ============================================================================== Files cassandra/trunk/lib/snakeyaml-1.6.jar (added) and cassandra/trunk/lib/snakeyaml-1.6.jar Mon Aug 16 16:49:37 2010 differ Modified: cassandra/trunk/src/java/org/apache/cassandra/config/Config.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/Config.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/config/Config.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/config/Config.java Mon Aug 16 16:49:37 2010 @@ -95,7 +95,7 @@ public class Config public RequestSchedulerId request_scheduler_id; public RequestSchedulerOptions request_scheduler_options; - public RawKeyspace[] keyspaces; + public List<RawKeyspace> keyspaces; public static enum CommitLogSync { periodic, Modified: cassandra/trunk/src/java/org/apache/cassandra/config/Converter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/Converter.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/config/Converter.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/config/Converter.java Mon Aug 16 16:49:37 2010 @@ -32,13 +32,20 @@ import javax.xml.parsers.ParserConfigura import javax.xml.transform.TransformerException; import javax.xml.xpath.XPathExpressionException; -import com.esotericsoftware.yamlbeans.YamlWriter; import org.apache.cassandra.utils.FBUtilities; +import org.apache.cassandra.utils.SkipNullRepresenter; import org.apache.cassandra.utils.XMLUtils; import org.apache.cassandra.db.ColumnFamilyType; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.xml.sax.SAXException; +import org.yaml.snakeyaml.Dumper; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.introspector.Property; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.representer.Representer; /** * @deprecated Yaml configuration for Keyspaces and ColumnFamilies is deprecated in 0.7 @@ -49,7 +56,7 @@ public class Converter private static Config conf = new Config(); private final static String PREVIOUS_CONF_FILE = "cassandra.xml"; - private static RawKeyspace[] readTablesFromXml(XMLUtils xmlUtils) throws ConfigurationException + private static List<RawKeyspace> readTablesFromXml(XMLUtils xmlUtils) throws ConfigurationException { List<RawKeyspace> keyspaces = new ArrayList<RawKeyspace>(); @@ -120,7 +127,7 @@ public class Converter } keyspaces.add(ks); } - return keyspaces.toArray(new RawKeyspace[0]); + return keyspaces; } catch (XPathExpressionException e) { @@ -276,9 +283,23 @@ public class Converter private static void dumpConfig(String outfile) throws IOException { - YamlWriter writer = new YamlWriter(new FileWriter(outfile)); - writer.write(conf); - writer.close(); + DumperOptions options = new DumperOptions(); + /* Use a block YAML arrangement */ + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + SkipNullRepresenter representer = new SkipNullRepresenter(); + /* Use Tag.MAP to avoid the class name being included as global tag */ + representer.addClassTag(Config.class, Tag.MAP); + representer.addClassTag(RawColumnFamily.class, Tag.MAP); + Dumper dumper = new Dumper(representer, options); + Yaml yaml = new Yaml(dumper); + String output = yaml.dump(conf); + + /* Write to output file */ + BufferedWriter out = new BufferedWriter(new FileWriter(outfile)); + out.write("# Cassandra YAML generated from previous config\n"); + out.write("# Configuration wiki: http://wiki.apache.org/cassandra/StorageConfiguration\n"); + out.write(output); + out.close(); } public static void main (String[] args) Modified: cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Mon Aug 16 16:49:37 2010 @@ -27,9 +27,6 @@ import java.net.URL; import java.net.UnknownHostException; import java.util.*; -import com.esotericsoftware.yamlbeans.YamlException; -import com.esotericsoftware.yamlbeans.YamlReader; - import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.locator.DynamicEndpointSnitch; import org.slf4j.Logger; @@ -58,6 +55,10 @@ import org.apache.cassandra.scheduler.No import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; +import org.yaml.snakeyaml.Loader; +import org.yaml.snakeyaml.TypeDescription; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.error.YAMLException; public class DatabaseDescriptor { @@ -115,10 +116,21 @@ public class DatabaseDescriptor if (logger.isDebugEnabled()) logger.info("Loading settings from " + configFileName); - - YamlReader yaml = new YamlReader(new FileReader(configFileName)); - conf = yaml.read(Config.class); - + + InputStream input = new FileInputStream(new File(configFileName)); + org.yaml.snakeyaml.constructor.Constructor constructor = new org.yaml.snakeyaml.constructor.Constructor(Config.class); + TypeDescription desc = new TypeDescription(Config.class); + desc.putListPropertyType("keyspaces", RawKeyspace.class); + TypeDescription ksDesc = new TypeDescription(RawKeyspace.class); + ksDesc.putListPropertyType("column_families", RawColumnFamily.class); + TypeDescription cfDesc = new TypeDescription(RawColumnFamily.class); + cfDesc.putListPropertyType("column_metadata", RawColumnDefinition.class); + constructor.addTypeDescription(desc); + constructor.addTypeDescription(ksDesc); + constructor.addTypeDescription(cfDesc); + Yaml yaml = new Yaml(new Loader(constructor)); + conf = (Config)yaml.load(input); + if (conf.commitlog_sync == null) { throw new ConfigurationException("Missing required directive CommitLogSync"); @@ -359,13 +371,13 @@ public class DatabaseDescriptor } catch (ConfigurationException e) { - logger.error("System error: " + e.getMessage()); + logger.error("Fatal error: " + e.getMessage()); System.err.println("Bad configuration; unable to start server"); System.exit(1); } - catch (YamlException e) + catch (YAMLException e) { - logger.error("Parsing error: " + e.getMessage()); + logger.error("Fatal error: " + e.getMessage()); System.err.println("Bad configuration; unable to start server"); System.exit(1); } @@ -491,7 +503,7 @@ public class DatabaseDescriptor } // since we loaded definitions from local storage, log a warning if definitions exist in yaml. - if (conf.keyspaces != null && conf.keyspaces.length > 0) + if (conf.keyspaces != null && conf.keyspaces.size() > 0) logger.warn("Schema definitions were defined both locally and in " + STORAGE_CONF_FILE + ". Definitions in " + STORAGE_CONF_FILE + " were ignored."); Modified: cassandra/trunk/src/java/org/apache/cassandra/config/RawColumnFamily.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/RawColumnFamily.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/config/RawColumnFamily.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/config/RawColumnFamily.java Mon Aug 16 16:49:37 2010 @@ -26,7 +26,6 @@ import java.util.Map; import org.apache.cassandra.db.ClockType; import org.apache.cassandra.db.ColumnFamilyType; -import org.apache.cassandra.utils.FBUtilities; /** * @deprecated Yaml configuration for Keyspaces and ColumnFamilies is deprecated in 0.7 @@ -46,22 +45,4 @@ public class RawColumnFamily public boolean preload_row_cache = CFMetaData.DEFAULT_PRELOAD_ROW_CACHE; public int gc_grace_seconds = CFMetaData.DEFAULT_GC_GRACE_SECONDS; public RawColumnDefinition[] column_metadata = new RawColumnDefinition[0]; - - - /** - * These getters/setters allow us to read X% in as a double. - */ - public String getRows_cached() { - return String.valueOf(rows_cached); - } - public void setRows_cached(String in) { - rows_cached = FBUtilities.parseDoubleOrPercent(in); - } - - public String getKeys_cached() { - return String.valueOf(keys_cached); - } - public void setKeys_cached(String in) { - keys_cached = FBUtilities.parseDoubleOrPercent(in); - } } Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Mon Aug 16 16:49:37 2010 @@ -18,7 +18,8 @@ package org.apache.cassandra.service; -import java.io.*; +import java.io.IOError; +import java.io.IOException; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.UnknownHostException; @@ -27,12 +28,12 @@ import java.util.concurrent.*; import javax.management.MBeanServer; import javax.management.ObjectName; -import com.esotericsoftware.yamlbeans.YamlWriter; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.RawColumnDefinition; import org.apache.cassandra.config.RawColumnFamily; import org.apache.cassandra.config.RawKeyspace; +import org.apache.cassandra.utils.SkipNullRepresenter; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -70,6 +71,10 @@ import org.apache.cassandra.thrift.Unava import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.WrappedRunnable; import org.apache.log4j.Level; +import org.yaml.snakeyaml.Dumper; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.nodes.Tag; /* * This abstraction contains the token/identifier of this node @@ -1745,7 +1750,7 @@ public class StorageService implements I } - public void exportSchema(String filename) throws IOException + public String exportSchema() throws IOException { List<RawKeyspace> keyspaces = new ArrayList<RawKeyspace>(); for (String ksname : DatabaseDescriptor.getNonSystemTables()) @@ -1790,10 +1795,20 @@ public class StorageService implements I // whew. keyspaces.add(rks); } - - YamlWriter writer = new YamlWriter(new FileWriter(filename)); - writer.write(keyspaces); - writer.close(); + + DumperOptions options = new DumperOptions(); + /* Use a block YAML arrangement */ + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + SkipNullRepresenter representer = new SkipNullRepresenter(); + /* Use Tag.MAP to avoid the class name being included as global tag */ + representer.addClassTag(RawColumnFamily.class, Tag.MAP); + representer.addClassTag(Keyspaces.class, Tag.MAP); + representer.addClassTag(ColumnDefinition.class, Tag.MAP); + Dumper dumper = new Dumper(representer, options); + Yaml yaml = new Yaml(dumper); + Keyspaces ks = new Keyspaces(); + ks.keyspaces = keyspaces; + return yaml.dump(ks); } public class Keyspaces Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java Mon Aug 16 16:49:37 2010 @@ -19,8 +19,6 @@ package org.apache.cassandra.service; import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; import java.net.UnknownHostException; import java.util.List; import java.util.Map; @@ -221,7 +219,7 @@ public interface StorageServiceMBean * Introduced in 0.7 to allow schema yaml to be exported. * @todo: deprecate in 0.7+1, remove in 0.7+2. */ - public void exportSchema(String filename) throws IOException; + public String exportSchema() throws IOException; /** * Truncates (deletes) the given columnFamily from the provided keyspace. Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java Mon Aug 16 16:49:37 2010 @@ -19,7 +19,6 @@ package org.apache.cassandra.tools; import java.io.IOException; -import java.io.OutputStream; import java.io.PrintStream; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; @@ -412,9 +411,9 @@ public class NodeProbe ssProxy.loadSchemaFromYAML(); } - public void exportSchemaToYAML(String filename) throws IOException + public String exportSchemaToYAML() throws IOException { - ssProxy.exportSchema(filename); + return ssProxy.exportSchema(); } } Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/SchemaTool.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/SchemaTool.java?rev=986039&r1=986038&r2=986039&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/tools/SchemaTool.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/tools/SchemaTool.java Mon Aug 16 16:49:37 2010 @@ -49,18 +49,18 @@ public class SchemaTool System.err.println("Port must be a number."); System.exit(1); } - + if ("import".equals(args[2])) new NodeProbe(host, port).loadSchemaFromYAML(); else if ("export".equals(args[2])) - new NodeProbe(host, port).exportSchemaToYAML(args[3]); + System.out.println(new NodeProbe(host, port).exportSchemaToYAML()); else usage(); } private static void usage() { - System.err.printf("java %s <host> <port> import|export to_file%n", SchemaTool.class.getName()); + System.err.printf("java %s <host> <port> import|export%n", SchemaTool.class.getName()); System.exit(1); } } Added: cassandra/trunk/src/java/org/apache/cassandra/utils/SkipNullRepresenter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/SkipNullRepresenter.java?rev=986039&view=auto ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/SkipNullRepresenter.java (added) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/SkipNullRepresenter.java Mon Aug 16 16:49:37 2010 @@ -0,0 +1,41 @@ +package org.apache.cassandra.utils; + +import org.yaml.snakeyaml.introspector.Property; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.representer.Representer; + +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/* used to prevent null values from being included in generated YAML */ +public class SkipNullRepresenter extends Representer +{ + protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) + { + if (propertyValue == null) + { + return null; + } + else + { + return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag); + } + } +} \ No newline at end of file