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();
+	}
+
+}