Mercurial Hosting > nabble
diff src/nabble/naml/dom/ElementName.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nabble/naml/dom/ElementName.java Thu Mar 21 19:15:52 2019 -0600 @@ -0,0 +1,109 @@ +package nabble.naml.dom; + +import fschmidt.util.java.Identity; +import fschmidt.util.java.Interner; + +import java.util.ArrayList; +import java.util.List; + + +public final class ElementName { + + public static final class Part extends Text { + private final Identity<Part> identity = new Identity<Part>(); + + public Part(String text) { + super(text); + } + + @Override public boolean equals(Object obj) { + if( !(obj instanceof Part) ) + return false; + Part part = (Part)obj; + return part.text==text; + } + + @Override public int hashCode() { + return text.hashCode(); + } + + private static final Interner<Part> interner = new Interner<Part>(); + + public Part intern() { + return interner.intern(this); + } + + public Identity<Part> identity() { + return identity; + } + } + + private final List<Part> parts; + private final boolean endsWithDot; + private final String stringVal; + private final String lowerCaseStringVal; + + public ElementName(boolean endsWithDot,List<Part> parts) { + this.parts = parts; + this.endsWithDot = endsWithDot; + this.stringVal = stringVal().intern(); + this.lowerCaseStringVal = stringVal.toLowerCase().intern(); + } + + public ElementName(String s) { + this.stringVal = s.intern(); + this.lowerCaseStringVal = stringVal.toLowerCase().intern(); + this.parts = new ArrayList<Part>(); + int i = 0; + int i2; + while( (i2 = s.indexOf('.',i)) != -1 ) { + parts.add( new Part( s.substring(i,i2) ) ); + i = i2 + 1; + } + this.endsWithDot = i == s.length(); + if( !endsWithDot ) + parts.add( new Part( s.substring(i) ) ); + // yuck + Part firstPart = parts.get(0); + if( !firstPart.text.equals("t") ) + parts.set( 0, firstPart.intern() ); + } + + public List<Part> parts() { + return parts; + } + + public boolean endsWithDot() { + return endsWithDot; + } + + private String stringVal() { + StringBuilder buf = new StringBuilder(); + for( Part part : parts ) { + buf.append( part ).append( '.' ); + } + if( !endsWithDot ) + buf.setLength( buf.length() - 1 ); + return buf.toString(); + } + + public String toString() { + return stringVal; + } + + public String toLowerCaseString() { + return lowerCaseStringVal; + } + + @Override public boolean equals(Object obj) { + if( !(obj instanceof ElementName) ) + return false; + ElementName name = (ElementName)obj; + return name.parts.equals(parts) && name.endsWithDot == endsWithDot; + } + + @Override public int hashCode() { + return parts.hashCode(); + } + +}