summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/network/format_handler.rb43
1 files changed, 39 insertions, 4 deletions
diff --git a/lib/puppet/network/format_handler.rb b/lib/puppet/network/format_handler.rb
index f3c3380e1..efeea79e3 100644
--- a/lib/puppet/network/format_handler.rb
+++ b/lib/puppet/network/format_handler.rb
@@ -3,6 +3,33 @@ require 'puppet/network'
require 'puppet/network/format'
module Puppet::Network::FormatHandler
+ class FormatError < Puppet::Error; end
+
+ class FormatProtector
+ attr_reader :format
+
+ def protect(method, args)
+ begin
+ Puppet::Network::FormatHandler.format(format).send(method, *args)
+ rescue => details
+ direction = method.to_s.include?("intern") ? "from" : "to"
+ error = FormatError.new("Could not %s %s %s: %s" % [method, direction, format, details])
+ error.set_backtrace(details.backtrace)
+ raise error
+ end
+ end
+
+ def initialize(format)
+ @format = format
+ end
+
+ [:intern, :intern_multiple, :render, :render_multiple].each do |method|
+ define_method(method) do |*args|
+ protect(method, args)
+ end
+ end
+ end
+
@formats = {}
def self.create(*args, &block)
instance = Puppet::Network::Format.new(*args)
@@ -35,21 +62,29 @@ module Puppet::Network::FormatHandler
@formats.values.find { |format| format.mime == mimetype }
end
+ # Use a delegator to make sure any exceptions generated by our formats are
+ # handled intelligently.
+ def self.protected_format(name)
+ @format_protectors ||= {}
+ @format_protectors[name] ||= FormatProtector.new(name)
+ @format_protectors[name]
+ end
+
module ClassMethods
def format_handler
Puppet::Network::FormatHandler
end
def convert_from(format, data)
- format_handler.format(format).intern(self, data)
+ format_handler.protected_format(format).intern(self, data)
end
def convert_from_multiple(format, data)
- format_handler.format(format).intern_multiple(self, data)
+ format_handler.protected_format(format).intern_multiple(self, data)
end
def render_multiple(format, instances)
- format_handler.format(format).render_multiple(instances)
+ format_handler.protected_format(format).render_multiple(instances)
end
def default_format
@@ -72,7 +107,7 @@ module Puppet::Network::FormatHandler
def render(format = nil)
format ||= self.class.default_format
- Puppet::Network::FormatHandler.format(format).render(self)
+ Puppet::Network::FormatHandler.protected_format(format).render(self)
end
def support_format?(name)