package org.eclipse.xtext.xdoc;
import java.util.Collection;
import java.util.Hashtable;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.util.PolymorphicDispatcher;
import org.eclipse.xtext.xdoc.xdoc.Anchor;
import org.eclipse.xtext.xdoc.xdoc.ChapterRef;
import org.eclipse.xtext.xdoc.xdoc.Document;
import org.eclipse.xtext.xdoc.xdoc.Emphasize;
import org.eclipse.xtext.xdoc.xdoc.Identifiable;
import org.eclipse.xtext.xdoc.xdoc.LangDef;
import org.eclipse.xtext.xdoc.xdoc.MarkUp;
import org.eclipse.xtext.xdoc.xdoc.Ref;
import org.eclipse.xtext.xdoc.xdoc.Section2Ref;
import org.eclipse.xtext.xdoc.xdoc.SectionRef;
import org.eclipse.xtext.xdoc.xdoc.TextOrMarkup;
import org.eclipse.xtext.xdoc.xdoc.TextPart;
public class XdocUtil {
public static class ToString {
private PolymorphicDispatcher<Void> toString = PolymorphicDispatcher.createForSingleTarget("_toString",2,2, this);
protected void _toString(StringBuilder sb, TextOrMarkup tom) {
toString.invoke(sb,tom.getContents());
}
protected void _toString(StringBuilder sb, LangDef ld){
sb.append(ld.getName());
for(String keyword: ld.getKeywords()) {
sb.append(keyword);
}
}
protected void _toString(StringBuilder sb, Collection<? extends EObject> col) {
for (Object contents : col) {
toString.invoke(sb,contents);
}
}
protected void _toString(StringBuilder sb, TextPart part) {
sb.append(part.getText());
}
protected void _toString(StringBuilder sb, Emphasize emph) {
toString.invoke(sb,emph.getContents());
}
protected void _toString(StringBuilder sb, MarkUp markup) {
toString.invoke(sb,markup.eContents());
}
protected void _toString(StringBuilder sb, Document doc) {
if(doc.getName() != null){
sb.append(doc.getName());
}
toString.invoke(sb, doc.getTitle());
toString.invoke(sb, doc.getSubtitle());
toString.invoke(sb, doc.getAuthors());
toString.invoke(sb, doc.getLangDefs());
toString.invoke(sb, doc.getContents());
toString.invoke(sb, doc.getChapters());
}
protected void _toString(StringBuilder sb, EList<?> list) {
for (Object obj : list) {
toString.invoke(sb, obj);
}
}
protected void _toString(StringBuilder sb, Object obj) {
// do nothing
}
public String toString(Object obj) {
StringBuilder stringBuilder = new StringBuilder();
toString.invoke(stringBuilder,obj);
return stringBuilder.toString();
}
}
private static ToString TO_STRING = new ToString();
public static String toString(Object markup) {
return TO_STRING.toString(markup);
}
public static class Hash {
PolymorphicDispatcher<Integer> hash = PolymorphicDispatcher.createForSingleTarget("_hash", 1, 1, this);
private static Logger log = Logger.getLogger(Hash.class);
private static Hashtable<Object, Integer> cache = new Hashtable<Object, Integer>();
protected synchronized int hash(Object obj) {
try {
int ret = hash.invoke(obj);
cache.clear();
return ret;
} catch(Exception e) {
log.info("Unable to hash "+obj.toString(), e);
}
return 0;
}
protected Integer _hash(Anchor a) {
return a.getName().hashCode();
}
protected Integer _hash(MarkUp m) {
return m.getClass().getName().hashCode() ^ hash.invoke(m.eContents());
}
protected Integer _hash(Ref ref) {
EList<TextOrMarkup> contents = ref.getContents();
return hash.invoke(contents);
}
protected Integer _hash(EList<?> list) {
int ret = 0;
for (Object object : list) {
ret ^= hash.invoke(object);
}
return ret;
}
protected Integer _hash(Section2Ref ref) {
return hash.invoke(ref.getSection2());
}
protected Integer _hash(SectionRef ref) {
return hash.invoke(ref.getSection());
}
protected Integer _hash(ChapterRef ref) {
return hash.invoke(ref.getChapter());
}
protected Integer _hash(Identifiable i) {
String name = i.getName();
return (name != null? name.hashCode(): 0) ^ hash.invoke(i.eContents());
}
protected Integer _hash(TextPart tp) {
return hash.invoke(tp.getText());
}
protected Integer _hash(EObject obj) {
return hash.invoke(obj.eContents());
}
protected Integer _hash(String arg) {
return arg != null ? arg.hashCode() : 0;
}
protected Integer _hash(Object arg) {
// return 0 so other hashes don't get destroyed
return 0;
}
}
public static int hash(Object tree) {
return tree.hashCode();//HASH.hash(tree);
}
}