Skip to content

Commit c2eb646

Browse files
Added generation of inner resource tags
1 parent 00b363e commit c2eb646

File tree

3 files changed

+214
-5
lines changed

3 files changed

+214
-5
lines changed

src/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGenerator.java

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,23 @@
77

88
import com.google.common.collect.Lists;
99
import com.intellij.openapi.command.WriteCommandAction;
10-
import com.intellij.openapi.project.Project;
1110
import com.intellij.openapi.editor.Document;
11+
import com.intellij.openapi.project.Project;
1212
import com.intellij.psi.PsiDocumentManager;
1313
import com.intellij.psi.PsiFile;
14+
import com.intellij.psi.xml.XmlAttribute;
1415
import com.intellij.psi.xml.XmlFile;
1516
import com.intellij.psi.xml.XmlTag;
17+
import com.intellij.util.indexing.FileBasedIndex;
1618
import com.magento.idea.magento2plugin.actions.generation.data.AclXmlData;
1719
import com.magento.idea.magento2plugin.actions.generation.generator.util.FindOrCreateAclXml;
1820
import com.magento.idea.magento2plugin.magento.files.ModuleAclXml;
21+
import com.magento.idea.magento2plugin.util.magento.GetAclResourcesTreeUtil;
1922
import java.util.HashMap;
2023
import java.util.LinkedList;
24+
import java.util.List;
2125
import java.util.Map;
2226
import java.util.Properties;
23-
import java.util.List;
2427
import org.jetbrains.annotations.NotNull;
2528

2629
public class AclXmlGenerator extends FileGenerator {
@@ -43,7 +46,7 @@ public AclXmlGenerator(
4346
final @NotNull AclXmlData aclXmlData,
4447
final String moduleName,
4548
final Project project
46-
) {
49+
) {
4750
super(project);
4851
this.project = project;
4952
this.moduleName = moduleName;
@@ -60,7 +63,9 @@ public PsiFile generate(final String actionName) {
6063
actionName,
6164
moduleName
6265
);
63-
if (aclXml == null) {
66+
if (aclXml == null
67+
|| aclXmlData.getResourceId() == null
68+
|| aclXmlData.getResourceTitle() == null) {
6469
return null;
6570
}
6671

@@ -80,9 +85,71 @@ public PsiFile generate(final String actionName) {
8085
addSubTagsQueue.add(resourcesTag);
8186
childParentRelationMap.put(resourcesTag, aclTag);
8287
}
83-
return commitAclXmlFile(aclXml);
88+
89+
final List<AclXmlData> tree = GetAclResourcesTreeUtil.getInstance().execute(
90+
project,
91+
aclXmlData.getParentResourceId()
92+
);
93+
XmlTag parent = resourcesTag;
94+
for (final AclXmlData resourceTagData : tree) {
95+
if (resourceTagData.getParentResourceId() != null) {
96+
parent = resourcesTag.createChildTag(
97+
ModuleAclXml.XML_TAG_RESOURCE,
98+
null,
99+
"",
100+
false
101+
);
102+
parent.setAttribute(ModuleAclXml.XML_ATTR_ID, resourceTagData.getResourceId());
103+
}
104+
parent = createOrGetResourceTag(parent, resourceTagData.getResourceId());
105+
}
106+
final XmlTag targetTag = parent.createChildTag(
107+
ModuleAclXml.XML_TAG_RESOURCE,
108+
null,
109+
null,
110+
false
111+
);
112+
targetTag.setAttribute(ModuleAclXml.XML_ATTR_ID, aclXmlData.getResourceId());
113+
targetTag.setAttribute(ModuleAclXml.XML_ATTR_TITLE, aclXmlData.getResourceTitle());
114+
115+
addSubTagsQueue.add(targetTag);
116+
childParentRelationMap.put(targetTag, parent);
117+
commitAclXmlFile(aclXml);
118+
FileBasedIndex.getInstance().requestReindex(aclXml.getVirtualFile());
119+
120+
return aclXml;
84121
}
85122

123+
/**
124+
* Create new tag or get existing one.
125+
*
126+
* @param parent XmlTag
127+
* @param targetResourceId String
128+
*
129+
* @return XmlTag
130+
*/
131+
private XmlTag createOrGetResourceTag(final XmlTag parent, final String targetResourceId) {
132+
for (final XmlTag tag : parent.getSubTags()) {
133+
final XmlAttribute idAttribute = tag.getAttribute(ModuleAclXml.XML_ATTR_ID);
134+
if (idAttribute != null && idAttribute.getValue().equals(targetResourceId)) {
135+
return tag;
136+
}
137+
}
138+
final XmlTag newTag = parent.createChildTag(ModuleAclXml.XML_TAG_RESOURCE, null, "", false);
139+
newTag.setAttribute(ModuleAclXml.XML_ATTR_ID, targetResourceId);
140+
addSubTagsQueue.add(newTag);
141+
childParentRelationMap.put(newTag, parent);
142+
143+
return newTag;
144+
}
145+
146+
/**
147+
* Save XML file.
148+
*
149+
* @param aclXml XmlFile
150+
*
151+
* @return XmlFile
152+
*/
86153
private XmlFile commitAclXmlFile(final XmlFile aclXml) {
87154
WriteCommandAction.runWriteCommandAction(project, () -> {
88155
for (final XmlTag tag : Lists.reverse(addSubTagsQueue)) {
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.util.magento;
7+
8+
import com.google.common.collect.Lists;
9+
import com.intellij.openapi.project.Project;
10+
import com.intellij.openapi.vfs.VirtualFile;
11+
import com.intellij.psi.PsiManager;
12+
import com.intellij.psi.search.GlobalSearchScope;
13+
import com.intellij.psi.xml.XmlFile;
14+
import com.intellij.psi.xml.XmlTag;
15+
import com.intellij.util.indexing.FileBasedIndex;
16+
import com.magento.idea.magento2plugin.actions.generation.data.AclXmlData;
17+
import com.magento.idea.magento2plugin.magento.files.ModuleAclXml;
18+
import com.magento.idea.magento2plugin.stubs.indexes.xml.AclResourceIndex;
19+
import com.magento.idea.magento2plugin.util.xml.XmlPsiTreeUtil;
20+
import java.util.Collection;
21+
import java.util.LinkedList;
22+
import java.util.List;
23+
24+
public class GetAclResourcesTreeUtil {
25+
private static final GetAclResourcesTreeUtil INSTANCE = new GetAclResourcesTreeUtil();
26+
27+
/**
28+
* Get GetAclResourcesTreeUtil instance.
29+
*
30+
* @return GetAclResourcesUtil
31+
*/
32+
public static GetAclResourcesTreeUtil getInstance() {
33+
return INSTANCE;
34+
}
35+
36+
/**
37+
* Get acl resources tree list for specified acl resource id.
38+
*
39+
* @return List
40+
*/
41+
public List<AclXmlData> execute(final Project project, final String targetAclResourceId) {
42+
final Collection<VirtualFile> virtualFiles =
43+
FileBasedIndex.getInstance().getContainingFiles(
44+
AclResourceIndex.KEY,
45+
targetAclResourceId,
46+
GlobalSearchScope.allScope(project)
47+
);
48+
final VirtualFile virtualFile = virtualFiles.iterator().next();
49+
50+
if (virtualFile == null) {
51+
return null;
52+
}
53+
final XmlFile aclXml = (XmlFile) PsiManager.getInstance(project).findFile(virtualFile);
54+
final XmlTag rootTag = aclXml.getRootTag();
55+
final List<AclXmlData> aclXmlDataList = new LinkedList<>();
56+
57+
if (rootTag != null) {
58+
final XmlTag aclTag = rootTag.findFirstSubTag(ModuleAclXml.XML_TAG_ACL);
59+
final XmlTag resourcesTag = aclTag.findFirstSubTag(ModuleAclXml.XML_TAG_RESOURCES);
60+
61+
List<XmlTag> resourceTagsList = new LinkedList<>();
62+
resourceTagsList = addAclXmlDataRecursively(
63+
targetAclResourceId,
64+
resourcesTag,
65+
resourceTagsList
66+
);
67+
68+
for (final XmlTag resourceTag : Lists.reverse(resourceTagsList)) {
69+
final String parentTagId =
70+
resourcesTag.getParentTag().getAttributeValue(ModuleAclXml.XML_ATTR_ID);
71+
72+
final AclXmlData resourceTagData = new AclXmlData(//NOPMD
73+
parentTagId,
74+
resourceTag.getAttributeValue(ModuleAclXml.XML_ATTR_ID),
75+
resourceTag.getAttributeValue(ModuleAclXml.XML_ATTR_TITLE)
76+
);
77+
aclXmlDataList.add(resourceTagData);
78+
}
79+
}
80+
return aclXmlDataList;
81+
}
82+
83+
/**
84+
* Add acl xml data for resource tags to list recursively.
85+
*
86+
* @param targetAclResourceId String
87+
* @param parentTag XmlTag
88+
* @param resourceTagsList List
89+
*
90+
* @return List
91+
*/
92+
private List<XmlTag> addAclXmlDataRecursively(
93+
final String targetAclResourceId,
94+
final XmlTag parentTag,
95+
List<XmlTag> resourceTagsList//NOPMD
96+
) {
97+
final List<XmlTag> resourceTags = XmlPsiTreeUtil.findSubTagsOfParent(
98+
parentTag,
99+
ModuleAclXml.XML_TAG_RESOURCE
100+
);
101+
for (final XmlTag tag : resourceTags) {
102+
if (tag.getAttributeValue(ModuleAclXml.XML_ATTR_ID).equals(targetAclResourceId)) {
103+
resourceTagsList.add(tag);
104+
break;
105+
} else {
106+
resourceTagsList = addAclXmlDataRecursively(
107+
targetAclResourceId,
108+
tag,
109+
resourceTagsList
110+
);
111+
if (!resourceTagsList.isEmpty()) {
112+
final XmlTag lastAdded = resourceTagsList.get(resourceTagsList.size() - 1);
113+
if (lastAdded.getParentTag()
114+
.getAttributeValue(ModuleAclXml.XML_ATTR_ID)
115+
.equals(tag.getAttributeValue(ModuleAclXml.XML_ATTR_ID))) {
116+
resourceTagsList.add(tag);
117+
break;
118+
}
119+
}
120+
}
121+
}
122+
return resourceTagsList;
123+
}
124+
}

src/com/magento/idea/magento2plugin/util/xml/XmlPsiTreeUtil.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
import com.intellij.psi.xml.XmlTag;
1414
import com.magento.idea.magento2plugin.magento.files.ModuleDiXml;
1515
import gnu.trove.THashSet;
16+
import java.util.Arrays;
1617
import java.util.Collection;
18+
import java.util.LinkedList;
19+
import java.util.List;
1720
import java.util.Objects;
1821
import org.jetbrains.annotations.Nullable;
1922

@@ -165,4 +168,19 @@ private static Collection<XmlAttributeValue> iterateArgumentsNode(
165168

166169
return psiElements;
167170
}
171+
172+
/**
173+
* Get child tags of parent.
174+
*
175+
* @param parentTag XmlTag
176+
* @param subTagsName String
177+
*
178+
* @return List
179+
*/
180+
public static List<XmlTag> findSubTagsOfParent(
181+
final XmlTag parentTag,
182+
final String subTagsName
183+
) {
184+
return new LinkedList<>(Arrays.asList(parentTag.findSubTags(subTagsName)));
185+
}
168186
}

0 commit comments

Comments
 (0)