001 package com.thaiopensource.xml.sax;
002
003 import com.thaiopensource.util.Uri;
004 import org.xml.sax.Locator;
005
006 public class XmlBaseHandler {
007 private int depth = 0;
008 private Locator loc;
009 private Entry stack = null;
010
011 private static class Entry {
012 private Entry parent;
013 private String attValue;
014 private String systemId;
015 private int depth;
016 }
017
018 public void setLocator(Locator loc) {
019 this.loc = loc;
020 }
021
022 public void startElement() {
023 ++depth;
024 }
025
026 public void endElement() {
027 if (stack != null && stack.depth == depth)
028 stack = stack.parent;
029 --depth;
030 }
031
032 public void xmlBaseAttribute(String value) {
033 Entry entry = new Entry();
034 entry.parent = stack;
035 stack = entry;
036 entry.attValue = Uri.escapeDisallowedChars(value);
037 entry.systemId = getSystemId();
038 entry.depth = depth;
039 }
040
041 private String getSystemId() {
042 return loc == null ? null : loc.getSystemId();
043 }
044
045 public String getBaseUri() {
046 return getBaseUri1(getSystemId(), stack);
047 }
048
049 private static String getBaseUri1(String baseUri, Entry stack) {
050 if (stack == null
051 || (baseUri != null && !baseUri.equals(stack.systemId)))
052 return baseUri;
053 baseUri = stack.attValue;
054 if (Uri.isAbsolute(baseUri))
055 return baseUri;
056 return Uri.resolve(getBaseUri1(stack.systemId, stack.parent), baseUri);
057 }
058 }