Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions etc/namespaces.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,7 @@ http://ddex.net/xml/20120214/ddexC: DDEX::V20120214::DDEXC
http://ddex.net/xml/20110630/ddexC: DDEX::V20110630::DDEXC
http://ddex.net/xml/2010/ern-main/32: DDEX::ERN::V32
http://ddex.net/xml/20100712/ddexC: DDEX::V20100712::DDEXC
http://ddex.net/xml/2011/echo/11: DDEX::ECHO::V11
http://ddex.net/xml/20110120/ddexC: DDEX::V20110120::DDEXC
http://ddex.net/xml/2011/amep/11: DDEX::V2011::AMEP::V11
http://www.w3.org/2000/09/xmldsig: W3::V2000::V09::XMLDsig
1,293 changes: 1,293 additions & 0 deletions etc/schemas/echo/11/echo.xsd

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion lib/ddex.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@

module DDEX
autoload :ERN, "ddex/ern"
autoload :ECHO, "ddex/echo"

XML_SCHEMA_INSTANCE_PREFIX = "xsi".freeze
XML_SCHEMA_INSTANCE_NS = "http://www.w3.org/2001/XMLSchema-instance".freeze
XML_SCHEMA_INSTANCE_ATTR = "#{XML_SCHEMA_INSTANCE_PREFIX}:schemaLocation".freeze

SPECS = %w[ERN]
SPECS = %w[ERN ECHO]

class DDEXError < StandardError; end
class UnknownVersionError < DDEXError; end
Expand Down
118 changes: 118 additions & 0 deletions lib/ddex/echo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
require "active_support/core_ext/module/attribute_accessors"
require "nokogiri"

module DDEX
module ECHO
autoload :V11, "ddex/echo/v11"

ROOT_ELEMENT = "ManifestMessage".freeze
VERSION_ATTR = "MessageVersionId".freeze

DEFAULT_CONFIG = {
"V11" => {
:schema => "http://ddex.net/xml/2011/echo/11/echo.xsd",
:version => "1.1",
:message_version_id => "2011/echo/11"
},
}.freeze

mattr_reader :config
@@config = DEFAULT_CONFIG

def self.supported_versions
config.values.map { |cfg| cfg[:version].dup }.sort
end

def self.supports?(version)
version = version.downcase.strip
config.any? { |name,cfg| name == version || cfg[:version] == version || cfg[:message_version_id] == version }
end

# options[:validate] ???
def self.read(xml, options = nil)
options ||= {}
raise ArgumentError, "options must be a Hash" unless options.is_a?(Hash)

doc = parse(xml, options)
ver = options[:version] || doc.root[VERSION_ATTR]
klass = load_version(ver)

begin
klass.from_xml(doc)
rescue NoMethodError => e # Yes, fo real... this is from ROXML
raise unless e.name == :root # It's legit
raise XMLLoadError, "XML is not well-formed"
# This is a subclass of Exception(!) so we must name it
rescue ROXML::RequiredElementMissing => e
raise XMLLoadError, "missing required element: #{e}"
end
end

def self.write(object, options = nil)
raise ArgumentError, "not a DDEX object" unless object.is_a?(DDEX::Element)

options ||= {}
raise ArgumentError, "options must be a Hash" unless options.is_a?(Hash)

xmlopts = options.reject { |k, _| k == :schema }

node = object.to_xml
return node.to_xml(xmlopts) unless object.respond_to?(:message_version_id) # Is it the root element?

schema = schema_location(object, options[:schema])
if schema
node.add_namespace_definition(XML_SCHEMA_INSTANCE_PREFIX, XML_SCHEMA_INSTANCE_NS)
node[XML_SCHEMA_INSTANCE_ATTR] = schema
end

doc = Nokogiri::XML::Document.new
doc.root = node
doc.to_xml(xmlopts)
end

private
def self.schema_location(object, schema)
# extract version from namespace e.g., DDEX::ECHO::V11::ManifestMessage
ver = object.class.name.split("::")[-2]
return unless schema or config.include?(ver)

# Check if it's "NS schema"
if schema && schema.strip.include?(" ")
schema
else
sprintf "%s %s", object.class.ns[1], schema || config[ver][:schema]
end
end

def self.parse(xml, options)
xml = File.read(xml) if xml.is_a?(String) and xml !~ /\A\s*<[?\w]/
Nokogiri::XML(xml, nil, options[:encoding]) { |cfg| cfg.strict }
# ArgumentError means there was a problem with types, expected an int, got a str
rescue IOError, SystemCallError, ArgumentError => e
raise XMLLoadError, "cannot load XML: #{e}"
rescue Nokogiri::XML::SyntaxError => e
raise XMLLoadError, "XML parsing error: #{e}"
end

def self.raise_unknown_version(version)
message = "ECHO version %s" % (version ? "'#{version}'" : "attribute missing")
raise UnknownVersionError, message
end

def self.load_version(version)
raise_unknown_version(version) if version.nil?

# Some normalization
v = version.strip.gsub(%r{//+}, "/").gsub(%r{\A/|/\Z}, "")
klass, _ = config.find do |name, cfg|
cfg[:message_version_id] == v || cfg[:version] == v
end
raise_unknown_version(version) unless klass

# >= 2.0 allows for one call
DDEX::ECHO.const_get(klass).const_get(ROOT_ELEMENT)
rescue LoadError, NameError => e
raise_unknown_version(version)
end
end
end

@sshaw sshaw Jun 21, 2018

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is more or less a copy a ern.rb. Can you put this into a base class or module or something to eliminate the duplication?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is. I'll do.

11 changes: 11 additions & 0 deletions lib/ddex/echo/v11.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#
# Do not edit. Automatically generated by `rake generate:main`.
#
module DDEX
module ECHO
module V11
extend DDEX
require_standard("echo", "1.1")
end
end
end
38 changes: 38 additions & 0 deletions lib/ddex/echo/v11/delivered_release.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#
# Auto-generated by jaxb2ruby v0.0.1 on 2016-07-11 13:50:26 +0100
# https://github.com/sshaw/jaxb2ruby
#
#
# DO NOT MODIFY
# Automatically generated by jaxb2ruby v0.0.1 (https://github.com/sshaw/jaxb2ruby)
#

require "roxml"
require "ddex/element"

require "ddex/echo/v11/delivery_message"
require "ddex/v20110120/ddexc/name"
require "ddex/v20110120/ddexc/reference_title"
require "ddex/v20110120/ddexc/release_id"
require "ddex/v20110120/ddexc/release_type"

module DDEX module ECHO module V11 # :nodoc: all

class DeliveredRelease < Element
include ROXML


xml_name "DeliveredRelease"

xml_accessor :release_ids, :as => [DDEX::V20110120::DDEXC::ReleaseId], :from => "ReleaseId", :required => true
xml_accessor :release_type, :as => DDEX::V20110120::DDEXC::ReleaseType, :from => "ReleaseType", :required => true
xml_accessor :display_artist_names, :as => [DDEX::V20110120::DDEXC::Name], :from => "DisplayArtistName", :required => true
xml_accessor :reference_title, :as => DDEX::V20110120::DDEXC::ReferenceTitle, :from => "ReferenceTitle", :required => true
xml_accessor :delivery_message, :as => DDEX::ECHO::V11::DeliveryMessage, :from => "DeliveryMessage", :required => false




end

end end end
30 changes: 30 additions & 0 deletions lib/ddex/echo/v11/delivered_release_list.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#
# Auto-generated by jaxb2ruby v0.0.1 on 2016-07-11 13:50:26 +0100
# https://github.com/sshaw/jaxb2ruby
#
#
# DO NOT MODIFY
# Automatically generated by jaxb2ruby v0.0.1 (https://github.com/sshaw/jaxb2ruby)
#

require "roxml"
require "ddex/element"

require "ddex/echo/v11/delivered_release"

module DDEX module ECHO module V11 # :nodoc: all

class DeliveredReleaseList < Element
include ROXML


xml_name "DeliveredReleaseList"

xml_accessor :delivered_releases, :as => [DDEX::ECHO::V11::DeliveredRelease], :from => "DeliveredRelease", :required => true




end

end end end
44 changes: 44 additions & 0 deletions lib/ddex/echo/v11/delivery_frequency_change_request_message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#
# Auto-generated by jaxb2ruby v0.0.1 on 2016-07-11 13:50:26 +0100
# https://github.com/sshaw/jaxb2ruby
#
#
# DO NOT MODIFY
# Automatically generated by jaxb2ruby v0.0.1 (https://github.com/sshaw/jaxb2ruby)
#

require "roxml"
require "ddex/element"

require "ddex/echo/v11/maximum_deliveries_per_day"
require "ddex/v2011/amep/v11/ws_message_header"
require "ddex/v20110120/ddexc/order_type"
require "ddex/v20110120/ddexc/party_descriptor"
require "ddex/v20110120/ddexc/period"

module DDEX module ECHO module V11 # :nodoc: all

class DeliveryFrequencyChangeRequestMessage < Element
include ROXML

setns "echo", "http://ddex.net/xml/2011/echo/11"

xml_name "DeliveryFrequencyChangeRequestMessage"

xml_accessor :message_header, :as => DDEX::V2011::AMEP::V11::WsMessageHeader, :from => "MessageHeader", :required => true
xml_accessor :dsp, :as => DDEX::V20110120::DDEXC::PartyDescriptor, :from => "DSP", :required => true
xml_accessor :delivery_action_type, :from => "DeliveryActionType", :required => true
xml_accessor :order_type, :as => DDEX::V20110120::DDEXC::OrderType, :from => "OrderType", :required => false
xml_accessor :maximum_deliveries_per_day, :as => DDEX::ECHO::V11::MaximumDeliveriesPerDay, :from => "MaximumDeliveriesPerDay", :required => false
xml_accessor :affected_period, :as => DDEX::V20110120::DDEXC::Period, :from => "AffectedPeriod", :required => false
xml_accessor :comment, :from => "Comment", :required => false



xml_accessor :message_version_id, :from => "@MessageVersionId", :required => true



end

end end end
34 changes: 34 additions & 0 deletions lib/ddex/echo/v11/delivery_frequency_change_response_message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#
# Auto-generated by jaxb2ruby v0.0.1 on 2016-07-11 13:50:26 +0100
# https://github.com/sshaw/jaxb2ruby
#
#
# DO NOT MODIFY
# Automatically generated by jaxb2ruby v0.0.1 (https://github.com/sshaw/jaxb2ruby)
#

require "roxml"
require "ddex/element"

require "ddex/echo/v11/ws_acknowledgement"

module DDEX module ECHO module V11 # :nodoc: all

class DeliveryFrequencyChangeResponseMessage < DDEX::ECHO::V11::WsAcknowledgement
include ROXML

setns "echo", "http://ddex.net/xml/2011/echo/11"

xml_name "DeliveryFrequencyChangeResponseMessage"

xml_accessor :successful?, :from => "IsSuccessful", :required => false



xml_accessor :message_version_id, :from => "@MessageVersionId", :required => true



end

end end end
34 changes: 34 additions & 0 deletions lib/ddex/echo/v11/delivery_message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#
# Auto-generated by jaxb2ruby v0.0.1 on 2016-07-11 13:50:26 +0100
# https://github.com/sshaw/jaxb2ruby
#
#
# DO NOT MODIFY
# Automatically generated by jaxb2ruby v0.0.1 (https://github.com/sshaw/jaxb2ruby)
#

require "roxml"
require "ddex/element"


module DDEX module ECHO module V11 # :nodoc: all

class DeliveryMessage < Element
include ROXML


xml_name "DeliveryMessage"

xml_accessor :message_type, :from => "MessageType", :required => true
xml_accessor :delivery_date, :as => DateTime, :from => "DeliveryDate", :required => false
xml_accessor :url, :from => "URL", :required => false
xml_accessor :message_size, :from => "MessageSize", :required => false
xml_accessor :number_of_resource_files_delivered, :as => Integer, :from => "NumberOfResourceFilesDelivered", :required => false
xml_accessor :message_id, :from => "MessageId", :required => false




end

end end end
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#
# Auto-generated by jaxb2ruby v0.0.1 on 2016-07-11 13:50:26 +0100
# https://github.com/sshaw/jaxb2ruby
#
#
# DO NOT MODIFY
# Automatically generated by jaxb2ruby v0.0.1 (https://github.com/sshaw/jaxb2ruby)
#

require "roxml"
require "ddex/element"

require "ddex/v2011/amep/v11/ws_message_header"
require "ddex/v20110120/ddexc/party_descriptor"
require "ddex/v20110120/ddexc/period"

module DDEX module ECHO module V11 # :nodoc: all

class InformationAboutAvailableReleaseRequestMessage < Element
include ROXML

setns "echo", "http://ddex.net/xml/2011/echo/11"

xml_name "InformationAboutAvailableReleaseRequestMessage"

xml_accessor :message_header, :as => DDEX::V2011::AMEP::V11::WsMessageHeader, :from => "MessageHeader", :required => true
xml_accessor :dsp, :as => DDEX::V20110120::DDEXC::PartyDescriptor, :from => "DSP", :required => true
xml_accessor :period, :as => DDEX::V20110120::DDEXC::Period, :from => "Period", :required => false



xml_accessor :message_version_id, :from => "@MessageVersionId", :required => true



end

end end end
Loading