package org.eclipse.dltk.tcl.internal.core.search.mixin.model; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IParent; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.core.mixin.IMixinElement; import org.eclipse.dltk.core.mixin.IMixinRequestor; import org.eclipse.dltk.tcl.internal.core.search.mixin.TclMixinModel; public abstract class TclMixinElement implements ITclMixinElement { public abstract int getType(); private IMixinElement mixinElement = null; private ISourceModule sourceModule = null; private IModelElement modelElement = null; private TclMixinModel model = null; protected abstract boolean isValidModelElement(IModelElement element); /** * Search for module model element from specified module. */ protected IModelElement findElement(ISourceModule module, String key) { String[] split = key.split("\\" + IMixinRequestor.MIXIN_NAME_SEPARATOR); IParent parent = module; int q = 0; if (split[0].equals("")) { q = 1; } for (int i = q; i < split.length; i++) { try { IModelElement[] children = parent.getChildren(); IModelElement e = findElementInChildren(split, parent, i, children); if (e != null) { return e; } } catch (ModelException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } } return null; } private IModelElement findElementInChildren(String[] split, IParent parent, int i, IModelElement[] children) { if (i >= split.length) { return null; } for (int j = 0; j < children.length; j++) { if (children[j].getElementName().equals(split[i])) { IModelElement e = children[j]; if (i == split.length - 1 && isValidModelElement(e)) { return e; } if (e instanceof IParent) { IParent pa = (IParent) e; IModelElement e2 = null; try { e2 = findElementInChildren(split, pa, i + 1, pa .getChildren()); } catch (ModelException e1) { if (DLTKCore.DEBUG) { e1.printStackTrace(); } } if (e2 != null) { return e2; } } } } return null; } public void initialize(IMixinElement element, ISourceModule module, TclMixinModel model) { this.mixinElement = element; this.sourceModule = module; this.model = model; } public IModelElement getModelElement() { if (this.model != null && this.modelElement == null && this.mixinElement != null && this.sourceModule != null) { this.modelElement = findElement(this.sourceModule, this.mixinElement.getKey()); } return this.modelElement; } public String getKey() { if (this.mixinElement != null) { return this.mixinElement.getKey(); } return null; } public String getName() { IModelElement element = this.getModelElement(); if (element != null) { return element.getElementName(); } return null; } protected TclMixinModel getModel() { return this.model; } protected ISourceModule getSourceModule() { return this.sourceModule; } protected IMixinElement getMixinElement() { return this.mixinElement; } public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((mixinElement == null) ? 0 : mixinElement.hashCode()); result = prime * result + ((sourceModule == null) ? 0 : sourceModule.hashCode()); return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final TclMixinElement other = (TclMixinElement) obj; if (mixinElement == null) { if (other.mixinElement != null) return false; } else if (!mixinElement.equals(other.mixinElement)) return false; if (sourceModule == null) { if (other.sourceModule != null) return false; } else if (!sourceModule.equals(other.sourceModule)) return false; return true; } }