package jp.gr.java_conf.abagames.bulletml; import org.w3c.dom.*; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.math.BigDecimal; import java.math.BigInteger; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * RNSContext * * @since Jan. 14, 2001 * @version Apr. 1, 2001 * @author ASAMI, Tomoharu (asami@zeomtech.com) */ public class RNSContext { private IRNode rnode_; private Map prefixByUri_ = new HashMap(); private Map uriByPrefix_ = new HashMap(); public RNSContext(IRNode rnode) { rnode_ = rnode; } // DOM input public void declareNamespace(Element element) { NamedNodeMap attrs = element.getAttributes(); int size = attrs.getLength(); for (int i = 0; i < size; i++) { Attr attr = (Attr) attrs.item(i); String qName = attr.getName(); if (qName.startsWith("xmlns:")) { String uri = attr.getValue(); String prefix = qName.substring("xmlns:".length()); declareNamespace(prefix, uri); } else if (qName.startsWith("xmlns")) { String uri = attr.getValue(); declareNamespace("", uri); } } } // SAX input public void declareNamespace(String prefix, String uri) { prefixByUri_.put(uri, prefix); uriByPrefix_.put(prefix, uri); } // DOM output public void setupNamespace(Element element) { String uri = element.getNamespaceURI(); String myPrefix = getPrefixByUri(uri); element.setPrefix(myPrefix); if (myPrefix != null) { IRNSContainer parent = (IRNSContainer) rnode_.getParentRNode(); if (parent == null) { addPrefixDecl(element, myPrefix, uri); return; } RNSContext parentContext = parent.getRNSContext(); String parentPrefix = parentContext.getPrefixByUri(uri); if (!myPrefix.equals(parentPrefix)) { addPrefixDecl(element, myPrefix, uri); } } } // DOM output public void addPrefixDecl(Element element, String prefix, String uri) { if ("".equals(prefix)) { Document doc = element.getOwnerDocument(); Attr attr = doc.createAttributeNS("http://www.w3.org/XML/2000/xmlns/", "xmlns"); attr.setValue(uri); element.setAttributeNode(attr); } else { Document doc = element.getOwnerDocument(); Attr attr = doc.createAttributeNS("http://www.w3.org/XML/2000/xmlns/", "xmlns:" + prefix); attr.setValue(uri); element.setAttributeNode(attr); } } // SAX output public void startNSMappings(ContentHandler handler) { Set keys = prefixByUri_.keySet(); Iterator iter = keys.iterator(); while (iter.hasNext()) { String uri = (String) iter.next(); String prefix = (String) prefixByUri_.get(uri); try { handler.startPrefixMapping(prefix, uri); } catch (SAXException e) { } } } // SAX output public void endNSMappings(ContentHandler handler) { Set keys = prefixByUri_.keySet(); Iterator iter = keys.iterator(); while (iter.hasNext()) { String uri = (String) iter.next(); String prefix = (String) prefixByUri_.get(uri); try { handler.endPrefixMapping(prefix); } catch (SAXException e) { } } } // Text output public void makeNSMappings(StringBuffer buffer) { Set keys = prefixByUri_.keySet(); Iterator iter = keys.iterator(); while (iter.hasNext()) { String uri = (String) iter.next(); buffer.append(makeNSMapping(uri)); } } public void makeNSMappings(PrintWriter buffer) { Set keys = prefixByUri_.keySet(); Iterator iter = keys.iterator(); while (iter.hasNext()) { String uri = (String) iter.next(); buffer.print(makeNSMapping(uri)); } } public String makeQName(String uri, String localName) { return (URelaxer.getQName(getPrefixByUri(uri), localName)); } public void makeQName(String uri, String localName, StringBuffer buffer) { URelaxer.makeQName(getPrefixByUri(uri), localName, buffer); } public void makeQName(String uri, String localName, PrintWriter buffer) { URelaxer.makeQName(getPrefixByUri(uri), localName, buffer); } public String makeNSMapping(String uri) { String prefix = (String) prefixByUri_.get(uri); if (prefix == null) { return (""); } return (URelaxer.getNSMapping(prefix, uri)); } public String getPrefixByUri(String uri) { if ("http://www.w3.org/XML/1998/namespace".equals(uri)) { return ("xml"); } if ("http://www.w3.org/XML/2000/xmlns/".equals(uri)) { return ("xmlns"); } String prefix = (String) prefixByUri_.get(uri); if (prefix != null) { return (prefix); } IRNSContainer parent = (IRNSContainer) rnode_.getParentRNode(); if (parent == null) { return (null); } return (parent.getRNSContext().getPrefixByUri(uri)); } public String getUriByPrefix(String prefix) { if ("xml".equals(prefix)) { return ("http://www.w3.org/XML/1998/namespace"); } if ("xmlns".equals(prefix)) { return ("http://www.w3.org/XML/2000/xmlns/"); } String uri = (String) uriByPrefix_.get(prefix); if (uri != null) { return (uri); } IRNSContainer parent = (IRNSContainer) rnode_.getParentRNode(); if (parent == null) { return (null); } return (parent.getRNSContext().getUriByPrefix(prefix)); } public String getDefaultNamespace() { return (getUriByPrefix("")); } }