TEIWordImpl.java 2.51 KB
package ipipan.clarin.tei.impl.entities;

import ipipan.clarin.tei.api.entities.TEIGroup;
import ipipan.clarin.tei.api.entities.TEIInterpretation;
import ipipan.clarin.tei.api.entities.TEIMorph;
import ipipan.clarin.tei.api.entities.TEIWord;
import ipipan.clarin.tei.api.entities.TEIWordChild;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import com.google.common.collect.Lists;

/**
 *
 * @author mlenart
 */
class TEIWordImpl extends TEIAbstractEntity implements TEIWord {
	private String orth;
	private TEIInterpretation interp;
	private final List<TEIWordChild> children;
	private final List<TEIMorph> leaves;

	public TEIWordImpl(String id, String orth, TEIInterpretation interp,
			List<TEIWordChild> children) {
		super(id);
		this.orth = orth;
		this.interp = interp;
		this.children = children;

		this.leaves = new ArrayList<TEIMorph>();
		for (TEIWordChild child : children) {
			if (child.isMorph())
				leaves.add((TEIMorph) child);
			else
				leaves.addAll(((TEIWord) child).getLeaves());
		}
	}

	@Override
	public String getOrth() {
		return orth;
	}

	@Override
	public TEIInterpretation getInterpretation() {
		return interp;
	}

	@Override
	public List<TEIWordChild> getChildren() {
		return children;
	}

	@Override
	public List<TEIMorph> getLeaves() {
		List<TEIMorph> res = new LinkedList<TEIMorph>();
		for (TEIWordChild child : children) {
			if (child.isMorph())
				res.add((TEIMorph) child);
			else
				res.addAll(((TEIWord) child).getLeaves());
		}
		return res;
	}

	@Override
	public boolean isWord() {
		return true;
	}

	@Override
	public boolean isMorph() {
		return false;
	}

	@Override
	public boolean isGroup() {
		return false;
	}

	@Override
	public List<TEIMorph> getAllMorphs() {
		List<TEIMorph> res = new LinkedList<TEIMorph>();
		for (TEIWordChild child : getChildren()) {
			if (child.isMorph())
				res.add((TEIMorph) child);
			else
				res.addAll(((TEIWord) child).getAllMorphs());
		}
		return res;
	}

	@Override
	public TEIWord asWord() {
		return this;
	}

	@Override
	public TEIGroup asGroup() {
		throw new UnsupportedOperationException("Cannot treat word as group");
	}

	@Override
	public TEIMorph asMorph() {
		throw new UnsupportedOperationException("Cannot treat word as morph");
	}

	@Override
	public List<TEIWord> getAllDescendingWords() {
		List<TEIWord> res = Lists.newLinkedList();
		for (TEIWordChild child : getChildren()) {
			if (child.isWord()) {
				res.add(child.asWord());
				res.addAll(child.asWord().getAllDescendingWords());
			}
		}
		return res;
	}
}