Author: jmhodges
Date: Wed Apr  7 04:54:12 2010
New Revision: 931437

URL: http://svn.apache.org/viewvc?rev=931437&view=rev
Log:
AVRO-504. Improved error handling while schema parsing.

Modified:
    hadoop/avro/trunk/lang/ruby/lib/avro/schema.rb

Modified: hadoop/avro/trunk/lang/ruby/lib/avro/schema.rb
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/ruby/lib/avro/schema.rb?rev=931437&r1=931436&r2=931437&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/ruby/lib/avro/schema.rb (original)
+++ hadoop/avro/trunk/lang/ruby/lib/avro/schema.rb Wed Apr  7 04:54:12 2010
@@ -51,7 +51,7 @@ module Avro
             fields = json_obj['fields']
             return RecordSchema.new(name, namespace, fields, names, type)
           else
-            raise SchemaParseError.new("Unknown Named Type: #{type}")
+            raise SchemaParseError.new("Unknown named type: #{type}")
           end
         elsif VALID_TYPES.include?(type)
           case type
@@ -73,7 +73,7 @@ module Avro
       elsif PRIMITIVE_TYPES.include? json_obj
         return PrimitiveSchema.new(json_obj)
       else
-        msg = "Could not make an Avro Schema object from #{json_obj}"
+        msg = "#{json_obj.inspect} is not a schema we know about."
         raise SchemaParseError.new(msg)
       end
     end
@@ -129,6 +129,15 @@ module Avro
       @type.hash
     end
 
+    def subparse(json_obj, names=nil)
+      begin
+        Schema.real_parse(json_obj, names)
+      rescue => e
+        raise e if e.is_a? SchemaParseError
+        raise SchemaParseError, "Sub-schema for #{self.class.name} not a valid 
Avro schema. Bad schema: #{json_obj}"
+      end
+    end
+
     def to_hash
       {'type' => @type}
     end
@@ -215,12 +224,7 @@ module Avro
           @items = names[items]
           @items_schema_from_names = true
         else
-          begin
-            @items = Schema.real_parse(items, names)
-          rescue => e
-            msg = "Items schema not a valid Avro schema" + e.to_s
-            raise SchemaParseError, msg
-          end
+          @items = subparse(items, names)
         end
       end
 
@@ -244,11 +248,7 @@ module Avro
           values_schema = names[values]
           @values_schema_from_names = true
         else
-          begin
-            values_schema = Schema.real_parse(values, names)
-          rescue => e
-            raise SchemaParseError.new('Values schema not a valid Avro 
schema.' + e.to_s)
-          end
+          values_schema = subparse(values, names)
         end
         @values = values_schema
       end
@@ -277,11 +277,7 @@ module Avro
             new_schema = names[schema]
             from_names = true
           else
-            begin
-              new_schema = Schema.real_parse(schema, names)
-            rescue
-              raise SchemaParseError, 'Union item must be a valid Avro schema'
-            end
+            new_schema = subparse(schema, names)
           end
 
           ns_type = new_schema.type
@@ -361,7 +357,7 @@ module Avro
       end
     end
 
-    class Field
+    class Field < Schema
       attr_reader :type, :name, :default, :order, :type_from_names
       def initialize(type, name, default=nil, order=nil, names=nil)
         @type_from_names = false
@@ -369,7 +365,7 @@ module Avro
           type_schema = names[type]
           @type_from_names = true
         else
-          type_schema = Schema.real_parse(type, names)
+          type_schema = subparse(type, names)
         end
         @type = type_schema
         @name = name


Reply via email to