package com.seventh7.mybatis.alias; import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author yanglin */ public class AliasFacade { private Project project; private JavaPsiFacade javaPsiFacade; private List<AliasResolver> resolvers; public static final AliasFacade getInstance(@NotNull Project project) { return ServiceManager.getService(project, AliasFacade.class); } public AliasFacade(Project project) { this.project = project; this.resolvers = Lists.newArrayList(); this.javaPsiFacade = JavaPsiFacade.getInstance(project); initResolvers(); } private void initResolvers() { try { Class.forName("com.intellij.spring.model.utils.SpringModelUtils"); this.registerResolver(AliasResolverFactory.createBeanResolver(project)); } catch (ClassNotFoundException e) { } this.registerResolver(AliasResolverFactory.createSingleAliasResolver(project)); this.registerResolver(AliasResolverFactory.createConfigPackageResolver(project)); this.registerResolver(AliasResolverFactory.createAnnotationResolver(project)); this.registerResolver(AliasResolverFactory.createInnerAliasResolver(project)); } @NotNull public Optional<PsiClass> findPsiClass(@Nullable PsiElement element, @NotNull String shortName) { PsiClass clazz = javaPsiFacade.findClass(shortName, GlobalSearchScope.allScope(project)); if (null != clazz) { return Optional.of(clazz); } for (AliasResolver resolver : resolvers) { for (AliasDesc desc : resolver.getClassAliasDescriptions(element)) { if (desc.getAlias().equals(shortName)) { return Optional.of(desc.getClazz()); } } } return Optional.absent(); } @NotNull public Collection<AliasDesc> getAliasDescs(@Nullable PsiElement element) { ArrayList<AliasDesc> result = Lists.newArrayList(); for (AliasResolver resolver : resolvers) { result.addAll(resolver.getClassAliasDescriptions(element)); } return result; } public Optional<AliasDesc> findAliasDesc(@Nullable PsiClass clazz) { if (null == clazz) { return Optional.absent(); } for (AliasResolver resolver : resolvers) { for (AliasDesc desc : resolver.getClassAliasDescriptions(clazz)) { if (desc.getClazz().equals(clazz)) { return Optional.of(desc); } } } return Optional.absent(); } public void registerResolver(@NotNull AliasResolver resolver) { this.resolvers.add(resolver); } }