ext/java/nokogiri/XmlElementDecl.java
package nokogiri;
import static nokogiri.internals.NokogiriHelpers.getLocalPart;
import static nokogiri.internals.NokogiriHelpers.getNokogiriClass;
import static nokogiri.internals.NokogiriHelpers.getPrefix;
import org.jruby.Ruby;
import org.jruby.RubyArray;
import org.jruby.RubyClass;
import org.jruby.anno.JRubyClass;
import org.jruby.anno.JRubyMethod;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
import org.w3c.dom.Node;
/**
* DTD element declaration.
*
* @author Patrick Mahoney <pat@polycrystal.org>
* @author Yoko Harada <yokolet@gmail.com>
*/
@JRubyClass(name = "Nokogiri::XML::ElementDecl", parent = "Nokogiri::XML::Node")
public class XmlElementDecl extends XmlNode
{
private static final long serialVersionUID = 1L;
RubyArray<?> attrDecls;
IRubyObject contentModel;
public
XmlElementDecl(Ruby runtime, RubyClass klazz)
{
super(runtime, klazz);
attrDecls = RubyArray.newArray(runtime);
contentModel = runtime.getNil();
}
/**
* Initialize based on an elementDecl node from a NekoDTD parsed DTD.
*/
public
XmlElementDecl(Ruby ruby, RubyClass klass, Node elemDeclNode)
{
super(ruby, klass, elemDeclNode);
}
@Override // gets called from constructor ^^^
public void
setNode(Ruby runtime, Node node)
{
super.setNode(runtime, node);
attrDecls = RubyArray.newArray(runtime);
contentModel = runtime.getNil();
}
static XmlElementDecl
create(ThreadContext context, Node elemDeclNode)
{
return new XmlElementDecl(context.runtime,
getNokogiriClass(context.runtime, "Nokogiri::XML::ElementDecl"),
elemDeclNode
);
}
public IRubyObject
element_name(ThreadContext context)
{
return getAttribute(context, "ename");
}
public void
setContentModel(IRubyObject cm)
{
contentModel = cm;
}
@Override
@JRubyMethod
public IRubyObject
content(ThreadContext context)
{
return contentModel;
}
public boolean
isEmpty()
{
return "EMPTY".equals(getAttribute("model"));
}
@JRubyMethod
public IRubyObject
prefix(ThreadContext context)
{
String enamePrefix = getPrefix(getAttribute("ename"));
if (enamePrefix == null) { return context.nil; }
return context.runtime.newString(enamePrefix);
}
/**
* Returns the local part of the element name.
*/
@Override
@JRubyMethod
public IRubyObject
node_name(ThreadContext context)
{
String ename = getLocalPart(getAttribute("ename"));
return context.runtime.newString(ename);
}
@Override
@JRubyMethod(name = "node_name=")
public IRubyObject
node_name_set(ThreadContext context, IRubyObject name)
{
throw context.runtime.newRuntimeError("cannot change name of DTD decl");
}
@Override
@JRubyMethod
public IRubyObject
attribute_nodes(ThreadContext context)
{
return attrDecls;
}
@Override
@JRubyMethod
public IRubyObject
attribute(ThreadContext context, IRubyObject name)
{
throw context.runtime.newRuntimeError("attribute by name not implemented");
}
public void
appendAttrDecl(XmlAttributeDecl decl)
{
attrDecls.append(decl);
}
@JRubyMethod
public IRubyObject
element_type(ThreadContext context)
{
return context.runtime.newFixnum(node.getNodeType());
}
}