package com.seventh7.mybatis.alias;
import com.google.common.collect.Sets;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.spring.CommonSpringModel;
import com.intellij.spring.SpringManager;
import com.intellij.spring.model.SpringBeanPointer;
import com.intellij.spring.model.utils.SpringPropertyUtils;
import com.intellij.spring.model.xml.beans.SpringPropertyDefinition;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Set;
/**
* @author yanglin
*/
public class BeanAliasResolver extends PackageAliasResolver{
private static final String MAPPER_ALIAS_PACKAGE_CLASS = "org.mybatis.spring.SqlSessionFactoryBean";
private static final String MAPPER_ALIAS_PROPERTY = "typeAliasesPackage";
private ModuleManager moduleManager;
private SpringManager springManager;
public BeanAliasResolver(Project project) {
super(project);
this.moduleManager = ModuleManager.getInstance(project);
this.springManager = SpringManager.getInstance(project);
}
@NotNull @Override
public Collection<String> getPackages(@Nullable PsiElement element) {
Set<String> res = Sets.newHashSet();
for (Module module : moduleManager.getModules()) {
for (CommonSpringModel springModel : springManager.getCombinedModel(module).getModelsToProcess()) {
addPackages(res, springModel);
}
}
return res;
}
private void addPackages(Set<String> res, CommonSpringModel springModel) {
for (SpringBeanPointer springBaseBeanPointer : springModel.findBeansByPsiClassWithInheritance(MAPPER_ALIAS_PACKAGE_CLASS)) {
SpringPropertyDefinition basePackages = SpringPropertyUtils.findPropertyByName(springBaseBeanPointer.getSpringBean(), MAPPER_ALIAS_PROPERTY);
if (basePackages != null) {
final String value = basePackages.getValueElement().getStringValue();
if (value != null) {
res.add(value);
}
}
}
}
}