Class | Jabber::XMPPElement |
In: |
lib/xmpp4r/xmppelement.rb
|
Parent: | REXML::Element |
This class represents an XML element and provides functionality for automatic casting of XML element classes according to their element name and namespace.
Deriving classes must met these criteria:
Find a class for given name and namespace
name: | [String] |
xmlns: | [String] |
result: | A descendant of XMPPElement or REXML::Element |
# File lib/xmpp4r/xmppelement.rb, line 70 70: def self.class_for_name_xmlns(name, xmlns) 71: if @@name_xmlns_classes.has_key? [name, xmlns] 72: @@name_xmlns_classes[[name, xmlns]] 73: elsif @@name_xmlns_classes.has_key? [name, nil] 74: @@name_xmlns_classes[[name, nil]] 75: else 76: REXML::Element 77: end 78: end
Set whether this element is always built with an xmlns attribute
# File lib/xmpp4r/xmppelement.rb, line 35 35: def self.force_xmlns(force) 36: @@force_xmlns = force 37: end
Whether this element is always built with an xmlns attribute
# File lib/xmpp4r/xmppelement.rb, line 41 41: def self.force_xmlns? 42: @@force_xmlns 43: end
Import another REXML::Element descendant to:
# File lib/xmpp4r/xmppelement.rb, line 86 86: def self.import(element) 87: klass = class_for_name_xmlns(element.name, element.namespace) 88: if klass != self and klass.ancestors.include?(self) 89: klass.new.import(element) 90: else 91: self.new.import(element) 92: end 93: end
Specify XML element name and xmlns for a deriving class, this pair and the class will be added to a global pool
If the namespace is nil the class is a "wildcard class" matching elements with any xmlns if no other class with that namespace was defined
# File lib/xmpp4r/xmppelement.rb, line 29 29: def self.name_xmlns(name, xmlns=nil) 30: @@name_xmlns_classes[[name, xmlns]] = self 31: end
Find the name and namespace for a given class. This class must have registered these two values by calling name_xmlns at definition time.
Raises an exception if none was found
klass: | [Class] |
result: | [String, String] name and namespace |
# File lib/xmpp4r/xmppelement.rb, line 53 53: def self.name_xmlns_for_class(klass) 54: klass.ancestors.each do |klass1| 55: @@name_xmlns_classes.each do |name_xmlns,k| 56: if klass1 == k 57: return name_xmlns 58: end 59: end 60: end 61: 62: raise NoNameXmlnsRegistered.new(klass) 63: end
Initialize this element, which will then be initialized with the name registered with name_xmlns.
# File lib/xmpp4r/xmppelement.rb, line 98 98: def initialize(*arg) 99: if arg.empty? 100: name, xmlns = self.class::name_xmlns_for_class(self.class) 101: super(name) 102: if self.class::force_xmlns? 103: add_namespace(xmlns) 104: end 105: else 106: super 107: end 108: end
# File lib/xmpp4r/xmppelement.rb, line 140 140: def clone 141: cloned = self.class.new 142: cloned.add_attributes self.attributes.clone 143: cloned.context = @context 144: cloned 145: end
# File lib/xmpp4r/xmppelement.rb, line 128 128: def parent=(new_parent) 129: if parent and parent.namespace('') == namespace('') and attributes['xmlns'].nil? 130: add_namespace parent.namespace('') 131: end 132: 133: super 134: 135: if new_parent and new_parent.namespace('') == namespace('') 136: delete_namespace 137: end 138: end
Set XML language attribute (chainable)
# File lib/xmpp4r/xmppelement.rb, line 162 162: def set_xml_lang(l) 163: self.xml_lang = l 164: self 165: end
Add a child element which will be imported according to the child‘s name and xmlns
element: | [REXML::Element] Child |
result: | [REXML::Element or descendant of XMPPElement] New child |
# File lib/xmpp4r/xmppelement.rb, line 115 115: def typed_add(element) 116: if element.kind_of? REXML::Element 117: element_ns = (element.namespace.to_s == '') ? namespace : element.namespace 118: 119: klass = XMPPElement::class_for_name_xmlns(element.name, element_ns) 120: if klass != element.class 121: element = klass.import(element) 122: end 123: end 124: 125: super(element) 126: end