Module: ActiveFedora::Datastreams::NokogiriDatastreams
- Extended by:
- ActiveSupport::Concern
- Included in:
- NomDatastream, OmDatastream
- Defined in:
- lib/active_fedora/datastreams/nokogiri_datastreams.rb
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
- #autocreate? ⇒ Boolean
- #content=(new_content) ⇒ Object
- #content_changed? ⇒ Boolean
- #datastream_content ⇒ Object
- #local_or_remote_content(ensure_fetch = true) ⇒ Object
- #ng_xml ⇒ Object
- #ng_xml=(new_xml) ⇒ Object
-
#ng_xml_changed? ⇒ Boolean
don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods.
- #ng_xml_doesnt_change! ⇒ Object
-
#ng_xml_will_change! ⇒ Object
don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods.
- #to_xml(xml = nil) ⇒ Object
- #xml_loaded ⇒ Object
Instance Method Details
#autocreate? ⇒ Boolean
136 137 138 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 136 def autocreate? changed_attributes.has_key? :profile end |
#content=(new_content) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 85 def content=(new_content) if inline? # inline datastreams may be transformed by fedora 3, so we test for equivalence instead of equality if !EquivalentXml.equivalent?(datastream_content, new_content) ng_xml_will_change! @ng_xml = Nokogiri::XML::Document.parse(new_content) super(@ng_xml.to_s) end else if datastream_content != new_content ng_xml_will_change! @ng_xml = Nokogiri::XML::Document.parse(new_content) super(@ng_xml.to_s) end end self.class.decorate_ng_xml @ng_xml end |
#content_changed? ⇒ Boolean
103 104 105 106 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 103 def content_changed? return false if !xml_loaded super end |
#datastream_content ⇒ Object
81 82 83 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 81 def datastream_content @datastream_content ||= Nokogiri::XML(super).to_xml {|config| config.no_declaration}.strip end |
#local_or_remote_content(ensure_fetch = true) ⇒ Object
131 132 133 134 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 131 def local_or_remote_content(ensure_fetch = true) @content = to_xml if ng_xml_changed? || autocreate? super end |
#ng_xml ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 38 def ng_xml @ng_xml ||= begin if new? ## Load up the template xml = self.class.xml_template else xml = Nokogiri::XML::Document.parse(datastream_content) end self.class.decorate_ng_xml xml end end |
#ng_xml=(new_xml) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 50 def ng_xml=(new_xml) # before we set ng_xml, we load the datastream so we know if the new value differs. local_or_remote_content(true) case new_xml when Nokogiri::XML::Document self.content=new_xml.to_xml when Nokogiri::XML::Node ## Cast a fragment to a document self.content=new_xml.to_s when String self.content=new_xml else raise TypeError, "You passed a #{new_xml.class} into the ng_xml of the #{self.dsid} datastream. OmDatastream.ng_xml= only accepts Nokogiri::XML::Document, Nokogiri::XML::Element, Nokogiri::XML::Node, or raw XML (String) as inputs." end end |
#ng_xml_changed? ⇒ Boolean
don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods
77 78 79 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 77 def ng_xml_changed? changed_attributes.has_key? 'ng_xml' end |
#ng_xml_doesnt_change! ⇒ Object
72 73 74 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 72 def ng_xml_doesnt_change! changed_attributes.delete('ng_xml') end |
#ng_xml_will_change! ⇒ Object
don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods
68 69 70 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 68 def ng_xml_will_change! changed_attributes['ng_xml'] = nil end |
#to_xml(xml = nil) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 108 def to_xml(xml = nil) xml = self.ng_xml if xml.nil? ng_xml = self.ng_xml if ng_xml.respond_to?(:root) && ng_xml.root.nil? && self.class.respond_to?(:root_property_ref) && !self.class.root_property_ref.nil? ng_xml = self.class.generate(self.class.root_property_ref, "") if xml.root.nil? xml = ng_xml end end unless xml == ng_xml || ng_xml.root.nil? if xml.kind_of?(Nokogiri::XML::Document) xml.root.add_child(ng_xml.root) elsif xml.kind_of?(Nokogiri::XML::Node) xml.add_child(ng_xml.root) else raise "You can only pass instances of Nokogiri::XML::Node into this method. You passed in #{xml}" end end return xml.to_xml {|config| config.no_declaration}.strip end |
#xml_loaded ⇒ Object
140 141 142 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 140 def xml_loaded instance_variable_defined? :@ng_xml end |