package com.cfsoft.ofbiz.reference.entity; import com.cfsoft.ofbiz.OfbizUtils; import com.cfsoft.ofbiz.dom.component.ComponentManager; import com.cfsoft.ofbiz.dom.component.api.Component; import com.cfsoft.ofbiz.dom.entity.api.Entity; import com.cfsoft.ofbiz.dom.entity.api.EntityModel; import com.cfsoft.ofbiz.facet.OfbizFacet; import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceBase; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomManager; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.List; public class EntityReference extends PsiReferenceBase<XmlAttribute> { public EntityReference(@NotNull final XmlAttribute xmlTag) { super(xmlTag, false); } @SuppressWarnings({"unchecked"}) public PsiElement resolve() { if (OfbizFacet.getInstance(myElement) == null) { return myElement; } EntityModel model = DomManager.getDomManager(myElement.getProject()). getFileElement((XmlFile) myElement.getContainingFile(), EntityModel.class).getRootElement(); final String entityName = myElement.getValue().trim(); Entity entity = ContainerUtil.find(model.getEntities(), new Condition<Entity>() { @Override public boolean value(Entity entity) { return entityName.trim().equals(entity.getName().getValue()); } }); if (entity != null) { return entity.getXmlElement(); } List<EntityModel> models = OfbizUtils.getDomFileElements(EntityModel.class, myElement.getProject(), GlobalSearchScope.projectScope(myElement.getProject())); for (EntityModel entityModel : models) { if(entityModel.getXmlElement().getContainingFile().getVirtualFile().getPath(). equals(model.getXmlElement().getContainingFile().getVirtualFile().getPath())){ continue; }else{ entity = ContainerUtil.find(entityModel.getEntities(), new Condition<Entity>() { @Override public boolean value(Entity entity) { return entity.getName().getValue().equals(entityName); } }); if (entity != null) { return entity.getXmlElement(); } } } return myElement; } @NotNull @SuppressWarnings({"unchecked"}) public Object[] getVariants() { if (OfbizFacet.getInstance(myElement) == null) { return new Object[0]; } final ComponentManager manager = ComponentManager.getInstance(myElement.getProject()); final Component[] components = ComponentManager.getInstance(myElement.getProject()).getAllComponents(); List<Entity> entities = ContainerUtil.concat(components, new Function<Component, Collection<? extends Entity>>() { @Override public Collection<? extends Entity> fun(Component component) { return component.getAllEntities(); } }); return ContainerUtil.map2Array(entities, new Function<Entity, Object>() { @Override public Object fun(Entity entity) { //String url = manager.getComponentUrl(entity.getXmlElement(), components); // return LookupElementBuilder.create(entity.getName().getValue()).setTypeText(url); return entity.getName().getValue(); } }); } }