Mercurial Hosting > nabble
view 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 source
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(); } }