package com.cfsoft.ofbiz.reference; import com.cfsoft.ofbiz.dom.entity.api.*; import com.cfsoft.ofbiz.reference.entity.*; import com.intellij.psi.*; import com.intellij.psi.xml.XmlAttribute; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; import static com.intellij.patterns.DomPatterns.domElement; import static com.intellij.patterns.DomPatterns.withDom; import static com.intellij.patterns.XmlPatterns.xmlAttribute; import static com.intellij.patterns.XmlPatterns.xmlTag; public class EntityReferenceContributor extends PsiReferenceContributor { @Override public void registerReferenceProviders(PsiReferenceRegistrar registrar) { registerControllerXmlTags(registrar); } PsiReferenceProvider fieldTypeReferenceProvider = new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { return new PsiReference[]{new FieldTypeReference((XmlAttribute) psiElement)}; } }; PsiReferenceProvider fieldReferenceProvider = new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { return new PsiReference[]{new FieldReference((XmlAttribute) psiElement)}; } }; PsiReferenceProvider entityReferenceProvider = new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { return new PsiReference[]{new EntityReference((XmlAttribute) psiElement)}; } }; PsiReferenceProvider relationRelFieldReferenceProvider = new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { return new PsiReference[]{new RelationRelFieldReference((XmlAttribute) psiElement)}; } }; PsiReferenceProvider viewLinkKeyMapFieldReferenceProvider = new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { return new PsiReference[]{new ViewLinkKeyMapRelFieldReference((XmlAttribute) psiElement)}; } }; PsiReferenceProvider aliasReferenceProvider = new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { return new PsiReference[]{new AliasReference((XmlAttribute) psiElement)}; } }; private void registerControllerXmlTags(final PsiReferenceRegistrar registrar) { registrar.registerReferenceProvider(xmlAttribute().withLocalName("type"). withSuperParent(1, withDom(domElement(Field.class))), fieldTypeReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("field"). withSuperParent(1, withDom(domElement(PrimKey.class))), fieldReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("name"). withSuperParent(1, xmlTag().withLocalName("index-field")), fieldReferenceProvider); // <relation type="one" fk-name="PROD_CC_CATALOG" rel-entity-name="ProdCatalog"> // <key-map field-name="prodCatalogId" /> // </relation> registrar.registerReferenceProvider(xmlAttribute().withLocalName("field-name"). withSuperParent(2, xmlTag().withLocalName("relation")), fieldReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("rel-entity-name"). withSuperParent(1, withDom(domElement(Relation.class))), entityReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("entity-name"). withSuperParent(1, xmlTag().withLocalName("member-entity")), entityReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("rel-field-name"). withSuperParent(2, xmlTag().withLocalName("view-link")), viewLinkKeyMapFieldReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("rel-field-name"). withSuperParent(2, xmlTag().withLocalName("relation")), relationRelFieldReferenceProvider); registrar.registerReferenceProvider(xmlAttribute().withLocalName("field-name"). withSuperParent(2, xmlTag().withLocalName("view-link")), viewLinkKeyMapFieldReferenceProvider); registrar.registerReferenceProvider(xmlAttribute(). withSuperParent(1, xmlTag().withLocalName("alias")), aliasReferenceProvider); registrar.registerReferenceProvider(xmlAttribute(). withSuperParent(1, xmlTag().withLocalName("alias-all")), aliasReferenceProvider); registrar.registerReferenceProvider(xmlAttribute("entity-name"). withSuperParent(1, xmlTag().withLocalName("extend-entity")), entityReferenceProvider); } }