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

}