package com.cfsoft.ofbiz.reference.entity;
import com.cfsoft.ofbiz.OfbizUtils;
import com.cfsoft.ofbiz.dom.entity.api.*;
import com.cfsoft.ofbiz.facet.OfbizFacet;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
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.psi.xml.XmlTag;
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.List;
public class ViewLinkKeyMapRelFieldReference extends PsiReferenceBase<XmlAttribute> {
public ViewLinkKeyMapRelFieldReference(@NotNull final XmlAttribute xmlTag) {
super(xmlTag, false);
}
@SuppressWarnings({"unchecked"})
public PsiElement resolve() {
if (OfbizFacet.getInstance(myElement) == null) {
return myElement;
}
XmlAttribute attribute;
if (myElement.getLocalName().equals("field-name")) {
attribute = myElement.getParent().getParentTag().getAttribute("entity-alias");
} else {
attribute = myElement.getParent().getParentTag().getAttribute("rel-entity-alias");
}
Entity entity = findEntity(attribute);
if (entity != null) {
Field field = ContainerUtil.find(entity.getAllFields(), new Condition<Field>() {
@Override
public boolean value(Field field) {
return field.getName().getValue().equals(myElement.getValue());
}
});
if (field != null) {
return field.getXmlElement();
}
}
return null;
}
@NotNull
@SuppressWarnings({"unchecked"})
public Object[] getVariants() {
if (OfbizFacet.getInstance(myElement) == null) {
return new Object[0];
}
XmlAttribute attribute;
if (myElement.getLocalName().equals("field-name")) {
attribute = myElement.getParent().getParentTag().getAttribute("entity-alias");
} else {
attribute = myElement.getParent().getParentTag().getAttribute("rel-entity-alias");
}
final Entity entity = findEntity(attribute);
if (entity != null) {
return ContainerUtil.map2Array(entity.getAllFields(),new Function<Field, Object>() {
@Override
public Object fun(Field field) {
return LookupElementBuilder.create(field.getName().getValue()).setTypeText(entity.getName().getValue());
}
});
}else{
return new Object[0];
}
}
private Entity findEntity(XmlAttribute xmlAttribute) {
XmlFile xmlFile = (XmlFile) xmlAttribute.getContainingFile();
if (!xmlFile.getRootTag().getLocalName().equals("entitymodel")) {
return null;
}
XmlTag xmlTag = xmlAttribute.getParent();
if (xmlTag.getLocalName().equals("relation")) {
XmlTag entitytTag = xmlTag.getParentTag();
return (Entity) DomManager.getDomManager(xmlAttribute.getProject()).getDomElement(entitytTag);
} else if (xmlTag.getLocalName().equals("view-link")) {
ViewEntity viewEntity = (ViewEntity) DomManager.getDomManager
(xmlAttribute.getProject()).getDomElement(xmlTag.getParentTag());
final String alias = xmlAttribute.getValue().trim();
List<MemberEntity> list = viewEntity.getmMemberEntitys();
final MemberEntity memberEntity = ContainerUtil.find(list, new Condition<MemberEntity>() {
@Override
public boolean value(MemberEntity memberEntity) {
return memberEntity.getEntityAlias().getValue().equals(alias);
}
});
if (memberEntity == null) {
return null;
}
//find current first
EntityModel entityModel = DomManager.getDomManager(xmlAttribute.getProject()).
getFileElement(xmlFile, EntityModel.class).getRootElement();
Entity entity = ContainerUtil.find(entityModel.getEntities(), new Condition<Entity>() {
@Override
public boolean value(Entity entity) {
return entity.getName().getValue().equals(memberEntity.getEntityName().getValue());
}
});
if (entity != null) {
return entity;
}
//not found
List<EntityModel> models = OfbizUtils.getDomFileElements(EntityModel.class,
xmlAttribute.getProject(), GlobalSearchScope.projectScope(myElement.getProject()));
for (EntityModel model : models) {
entity = ContainerUtil.find(model.getEntities(), new Condition<Entity>() {
@Override
public boolean value(Entity entity) {
return entity.getName().getValue().equals(memberEntity.getEntityName().getValue());
}
});
if (entity != null) {
return entity;
}
}
}
return null;
}
}