/** * A simple Element class for storing the element name, attributes * and children. * * @author Janne Saarela */ package org.w3c.rdf; import java.util.*; import java.io.*; import org.xml.sax.AttributeList; public class Element { private String m_sName = null; private Hashtable m_attributes = null; private Vector m_children = new Vector(); private String m_sID = null; private Hashtable m_nodes = new Hashtable (); private Element m_target = null; private boolean m_bDone = false; private static Vector s_resolveQueue = new Vector (); private static Hashtable s_hIDtable = new Hashtable (); public final static String RDFSCHEMA = new String ("http://www.w3.org/schemas/RDFschema"); private static int s_iReificationCounter = 0; public static void init () { s_iReificationCounter = 0; } public Element (String sName, AttributeList al) { m_sName = sName; if (al != null) { int iLength = al.getLength (); if (al == null) { System.out.println("[Attributes not available]"); } else { m_attributes = new Hashtable(); for (int x = 0; x < iLength; x++) { String aname = al.getName (x); String avalue = al.getValue (x); m_attributes.put (aname, avalue); } } } if (m_attributes != null) { String sAbout = (String)m_attributes.get ("about"); if (sAbout != null && sAbout.startsWith("#")) { Element.resolveLater (this); } String sAboutEach = (String)m_attributes.get ("aboutEach"); if (sAboutEach != null && sAboutEach.startsWith("#")) { Element.resolveLater (this); } String sBagId = (String)m_attributes.get ("bagID"); if (sBagId != null) { Element.registerBag (this); } String sId = (String)m_attributes.get ("ID"); if (sId != null) { Element.registerID (this); } } } public String name() { return m_sName; } public void addChild (Element e) { m_children.addElement (e); } public Enumeration children () { return m_children.elements(); } public Enumeration attributes () { return m_attributes.keys(); } public void addAttribute (String sName, String sValue) { if (m_attributes == null) { m_attributes = new Hashtable (); } m_attributes.put (sName, sValue); } public String getAttribute (String sName) { return (String)m_attributes.get (sName); } public String prefix () { int i = name().indexOf (':'); if (i > 0) { return name().substring (0, i); } else { return null; } } public String postfix () { int i = name().indexOf (':'); if (i > 0) { return name().substring (i + 1); } else { return null; } } public String expandName () { String sPrefix = prefix (); String sPostfix = postfix (); String sNamespace = RDF2LP2.namespace (sPrefix); return sNamespace + "#" + sPostfix; } public static void resolveLater (Element e) { s_resolveQueue.addElement (e); } public static void resolve () { for (int x = 0; x < s_resolveQueue.size(); x++) { Element e = (Element)s_resolveQueue.elementAt(x); String sAbout = e.getAttribute ("about"); if (sAbout != null) { sAbout = sAbout.substring (1); Element e2 = (Element)lookforNode(sAbout); if (e2 != null) { e.setTarget (e2); } } String sAboutEach = e.getAttribute ("aboutEach"); if (sAboutEach != null) { sAboutEach = sAboutEach.substring (1); Element e2 = (Element)lookforNode(sAboutEach); if (e2 != null) { e.setTarget (e2); } } } s_resolveQueue.removeAllElements(); } public static Element lookforNode (String sId) { if (sId == null) return null; return (Element)s_hIDtable.get (sId); } public static void registerID (Element e) { if (e.getAttribute ("ID") != null) { s_hIDtable.put (e.getAttribute("ID"), e); } } public static void registerBag (Element e) { if (e.getAttribute ("bagID") != null) { s_hIDtable.put (e.getAttribute ("bagID"), e); } } public void setTarget (Element e) { m_target = e; } public Element target () { return m_target; } static public String newReificationID () { s_iReificationCounter++; return new String ("genid" + s_iReificationCounter); } public void ID (String sID) { m_sID = sID; } public String ID () { return m_sID; } public void linearize (int indent, PrintStream ps) { for (int x = 0; x < indent; x++) { ps.print (" "); } System.out.println ("Element "+name()); Enumeration e = children(); while (e.hasMoreElements()) { Element ele = (Element)e.nextElement(); ele.linearize (indent + 2, ps); } } public boolean done () { return m_bDone; } public void done (boolean b) { m_bDone = b; } }