package com.seventh7.mybatis.dom; import com.google.common.base.Optional; import com.intellij.psi.PsiClass; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlTag; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomUtil; import com.seventh7.mybatis.dom.model.Association; import com.seventh7.mybatis.dom.model.Collection; import com.seventh7.mybatis.dom.model.ParameterMap; import com.seventh7.mybatis.dom.model.ResultMap; import org.jetbrains.annotations.NotNull; /** * @author yanglin */ public final class MapperBacktrackingUtils { private MapperBacktrackingUtils() { throw new UnsupportedOperationException(); } public static Optional<PsiClass> getPropertyClazz(XmlAttributeValue attributeValue) { DomElement domElement = DomUtil.getDomElement(attributeValue); if (null == domElement) { return Optional.absent(); } Collection collection = DomUtil.getParentOfType(domElement, Collection.class, true); if (null != collection && !isWithinSameTag(collection, attributeValue)) { return Optional.fromNullable(collection.getOfType().getValue()); } Association association = DomUtil.getParentOfType(domElement, Association.class, true); if (null != association && !isWithinSameTag(association, attributeValue)) { return Optional.fromNullable(association.getJavaType().getValue()); } ParameterMap parameterMap = DomUtil.getParentOfType(domElement, ParameterMap.class, true); if (null != parameterMap && !isWithinSameTag(parameterMap, attributeValue)) { return Optional.fromNullable(parameterMap.getType().getValue()); } ResultMap resultMap = DomUtil.getParentOfType(domElement, ResultMap.class, true); if (null != resultMap && !isWithinSameTag(resultMap, attributeValue)) { return Optional.fromNullable(resultMap.getType().getValue()); } return Optional.absent(); } public static boolean isWithinSameTag(@NotNull DomElement domElement, @NotNull XmlElement xmlElement) { XmlTag xmlTag = PsiTreeUtil.getParentOfType(xmlElement, XmlTag.class); return null != xmlElement && domElement.getXmlTag().equals(xmlTag); } }