Skip to content

Commit 18b7370

Browse files
committed
Implemented magento/magento2-phpstorm-plugin/#93: Action/Code Generation. Observer Generation
- added code generation for the XML files
1 parent e858ef2 commit 18b7370

File tree

10 files changed

+269
-37
lines changed

10 files changed

+269
-37
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<event name="${EVENT_NAME}">
2+
<observer name="${OBSERVER_NAME}" instance="${OBSERVER_CLASS}" />
3+
</event>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!--
2+
/*
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
-->
7+
<html>
8+
<body>
9+
</body>
10+
</html>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?xml version="1.0"?>
2+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
3+
</config>
Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,43 @@
11
package com.magento.idea.magento2plugin.actions.generation.data;
22

3-
import com.jetbrains.php.lang.psi.elements.PhpClass;
4-
53
public class ObserverEventsXmlData {
6-
public ObserverEventsXmlData(String observerArea, String pluginModule, PhpClass targetClass, String observerSortOrder, String observerName, String pluginClassFqn) {
7-
//@TODO implement XML file generation
4+
private String area;
5+
private String observerModule;
6+
private String targetEvent;
7+
private String observerName;
8+
private String observerClassFqn;
9+
10+
public ObserverEventsXmlData(
11+
String area,
12+
String observerModule,
13+
String targetEvent,
14+
String observerName,
15+
String observerClassFqn
16+
) {
17+
this.area = area;
18+
this.observerModule = observerModule;
19+
this.targetEvent = targetEvent;
20+
this.observerName = observerName;
21+
this.observerClassFqn = observerClassFqn;
22+
}
23+
24+
public String getObserverModule() {
25+
return observerModule;
26+
}
27+
28+
public String getObserverClassFqn() {
29+
return observerClassFqn;
30+
}
31+
32+
public String getTargetEvent() {
33+
return targetEvent;
34+
}
35+
36+
public String getArea() {
37+
return area;
38+
}
39+
40+
public String getObserverName() {
41+
return observerName;
842
}
943
}

src/com/magento/idea/magento2plugin/actions/generation/data/ObserverFileData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ public class ObserverFileData {
1111
public ObserverFileData(
1212
String observerDirectory,
1313
String observerClassName,
14-
String pluginModule,
14+
String observerModule,
1515
String targetEvent,
1616
String pluginClassFqn,
1717
String namespace
1818
) {
1919
this.observerDirectory = observerDirectory;
2020
this.observerClassName = observerClassName;
21-
this.observerModule = pluginModule;
21+
this.observerModule = observerModule;
2222
this.targetEvent = targetEvent;
2323
this.observerClassFqn = pluginClassFqn;
2424
this.namespace = namespace;

src/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAnObserverDialog.form

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,36 +53,25 @@
5353
</grid>
5454
</children>
5555
</grid>
56-
<grid id="e3588" layout-manager="GridLayoutManager" row-count="2" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
56+
<grid id="e3588" layout-manager="GridLayoutManager" row-count="3" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
5757
<margin top="0" left="0" bottom="0" right="0"/>
5858
<constraints>
5959
<grid row="4" column="0" row-span="1" col-span="3" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
6060
</constraints>
6161
<properties/>
6262
<border type="none"/>
6363
<children>
64-
<component id="ad3ba" class="javax.swing.JTextField" binding="observerClassName">
65-
<constraints>
66-
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
67-
<preferred-size width="150" height="-1"/>
68-
</grid>
69-
</constraints>
70-
<properties/>
71-
<clientProperties>
72-
<html.disable class="java.lang.Boolean" value="true"/>
73-
</clientProperties>
74-
</component>
7564
<component id="3fe2b" class="javax.swing.JLabel" binding="observerClassNameLabel">
7665
<constraints>
77-
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
66+
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
7867
</constraints>
7968
<properties>
8069
<text value="Observer Class Name"/>
8170
</properties>
8271
</component>
8372
<component id="e4858" class="javax.swing.JTextField" binding="observerDirectory">
8473
<constraints>
85-
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
74+
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
8675
<preferred-size width="150" height="-1"/>
8776
</grid>
8877
</constraints>
@@ -97,12 +86,42 @@
9786
</component>
9887
<component id="22b5e" class="javax.swing.JLabel" binding="observerDirectoryName">
9988
<constraints>
100-
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
89+
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
10190
</constraints>
10291
<properties>
10392
<text value="Observer Directory Path"/>
10493
</properties>
10594
</component>
95+
<component id="54e7b" class="javax.swing.JLabel" binding="observerNameLabel">
96+
<constraints>
97+
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
98+
</constraints>
99+
<properties>
100+
<text value="Observer Name"/>
101+
</properties>
102+
</component>
103+
<component id="ad3ba" class="javax.swing.JTextField" binding="observerClassName">
104+
<constraints>
105+
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
106+
<preferred-size width="150" height="-1"/>
107+
</grid>
108+
</constraints>
109+
<properties/>
110+
<clientProperties>
111+
<html.disable class="java.lang.Boolean" value="true"/>
112+
</clientProperties>
113+
</component>
114+
<component id="c6c7a" class="javax.swing.JTextField" binding="observerName">
115+
<constraints>
116+
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
117+
<preferred-size width="150" height="-1"/>
118+
</grid>
119+
</constraints>
120+
<properties/>
121+
<clientProperties>
122+
<html.disable class="java.lang.Boolean" value="true"/>
123+
</clientProperties>
124+
</component>
106125
</children>
107126
</grid>
108127
<component id="5196a" class="javax.swing.JLabel" binding="selectObserverModule">

src/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAnObserverDialog.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public class CreateAnObserverDialog extends AbstractDialog {
4242
private FilteredComboBox observerModule;
4343
private JComboBox observerArea;
4444
private JLabel observerAreaLabel;
45+
private JLabel observerNameLabel;
46+
private JTextField observerName;
4547

4648
public CreateAnObserverDialog(@NotNull Project project, String targetEvent) {
4749
this.project = project;
@@ -99,20 +101,23 @@ private void onOK() {
99101
getNamespace()
100102
), project).generate(CreateAnObserverAction.ACTION_NAME, true);
101103

102-
// new ObserverEventsXmlGenerator(new ObserverEventsXmlData(
103-
// getObserverArea(),
104-
// getObserverModule(),
105-
// targetClass,
106-
// getObserverSortOrder(),
107-
// getObserverName(),
108-
// getObserverClassFqn()
109-
// ), project).generate(CreateAPluginAction.ACTION_NAME);
104+
new ObserverEventsXmlGenerator(new ObserverEventsXmlData(
105+
getObserverArea(),
106+
getObserverModule(),
107+
targetEvent,
108+
getObserverName(),
109+
getObserverClassFqn()
110+
), project).generate(CreateAPluginAction.ACTION_NAME);
110111

111112
this.setVisible(false);
112113
}
113114

114115
public String getObserverClassName() {
115-
return this.observerClassName.getText().trim();
116+
return observerClassName.getText().trim();
117+
}
118+
119+
public String getObserverName() {
120+
return observerName.getText().trim();
116121
}
117122

118123
public String getObserverDirectory() {
Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,71 @@
11
package com.magento.idea.magento2plugin.actions.generation.generator;
22

3-
3+
import com.intellij.openapi.command.WriteCommandAction;
4+
import com.intellij.openapi.editor.Document;
45
import com.intellij.openapi.project.Project;
5-
import com.magento.idea.magento2plugin.actions.generation.data.PluginDiXmlData;
6-
6+
import com.intellij.psi.PsiDocumentManager;
7+
import com.intellij.psi.PsiFile;
8+
import com.intellij.psi.codeStyle.CodeStyleManager;
9+
import com.intellij.psi.xml.XmlFile;
10+
import com.magento.idea.magento2plugin.actions.generation.data.ObserverEventsXmlData;
11+
import com.magento.idea.magento2plugin.actions.generation.generator.util.FindOrCreateEventsXml;
12+
import com.magento.idea.magento2plugin.actions.generation.generator.util.GetCodeTemplate;
13+
import com.magento.idea.magento2plugin.actions.generation.generator.util.XmlFilePositionUtil;
14+
import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml;
15+
import java.io.IOException;
16+
import java.util.Properties;
717

8-
public class ObserverEventsXmlGenerator {
9-
private PluginDiXmlData pluginDiXmlData;
18+
public class ObserverEventsXmlGenerator extends FileGenerator {
19+
private final FindOrCreateEventsXml findOrCreateEventsXml;
20+
private final XmlFilePositionUtil positionUtil;
21+
private final GetCodeTemplate getCodeTemplate;
22+
private ObserverEventsXmlData observerEventsXmlData;
1023
private Project project;
1124

12-
public ObserverEventsXmlGenerator(PluginDiXmlData pluginDiXmlData, Project project) {
13-
this.pluginDiXmlData = pluginDiXmlData;
25+
public ObserverEventsXmlGenerator(ObserverEventsXmlData observerEventsXmlData, Project project) {
26+
super(project);
27+
this.observerEventsXmlData = observerEventsXmlData;
1428
this.project = project;
29+
this.findOrCreateEventsXml = FindOrCreateEventsXml.getInstance(project);
30+
this.positionUtil = XmlFilePositionUtil.getInstance();
31+
this.getCodeTemplate = GetCodeTemplate.getInstance(project);
32+
}
33+
34+
public PsiFile generate(String actionName)
35+
{
36+
PsiFile eventsXmlFile =
37+
findOrCreateEventsXml.execute(
38+
actionName,
39+
observerEventsXmlData.getObserverModule(),
40+
observerEventsXmlData.getArea()
41+
);
42+
43+
WriteCommandAction.runWriteCommandAction(project, () -> {
44+
StringBuffer textBuf = new StringBuffer();
45+
try {
46+
textBuf.append(getCodeTemplate.execute(ModuleEventsXml.TEMPLATE_OBSERVER, getAttributes()));
47+
} catch (IOException e) {
48+
e.printStackTrace();
49+
return;
50+
}
51+
52+
int insertPos = positionUtil.getRootInsertPosition((XmlFile) eventsXmlFile);
53+
if (textBuf.length() > 0 && insertPos >= 0) {
54+
PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project);
55+
Document document = psiDocumentManager.getDocument(eventsXmlFile);
56+
document.insertString(insertPos, textBuf);
57+
int endPos = insertPos + textBuf.length() + 1;
58+
CodeStyleManager.getInstance(project).reformatText(eventsXmlFile, insertPos, endPos);
59+
psiDocumentManager.commitDocument(document);
60+
}
61+
});
62+
63+
return eventsXmlFile;
64+
}
65+
66+
protected void fillAttributes(Properties attributes) {
67+
attributes.setProperty("OBSERVER_NAME", observerEventsXmlData.getObserverName());
68+
attributes.setProperty("EVENT_NAME", observerEventsXmlData.getTargetEvent());
69+
attributes.setProperty("OBSERVER_CLASS", observerEventsXmlData.getObserverClassFqn());
1570
}
1671
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
package com.magento.idea.magento2plugin.actions.generation.generator.util;
6+
7+
import com.intellij.openapi.project.Project;
8+
import com.intellij.psi.PsiDirectory;
9+
import com.intellij.psi.PsiFile;
10+
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
11+
import com.magento.idea.magento2plugin.magento.files.ModuleDiXml;
12+
import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml;
13+
import com.magento.idea.magento2plugin.magento.packages.Package;
14+
import com.magento.idea.magento2plugin.util.magento.FileBasedIndexUtil;
15+
16+
import java.util.ArrayList;
17+
import java.util.Properties;
18+
19+
public class FindOrCreateEventsXml {
20+
private static FindOrCreateEventsXml INSTANCE = null;
21+
private Project project;
22+
23+
public static FindOrCreateEventsXml getInstance(Project project) {
24+
if (null == INSTANCE) {
25+
INSTANCE = new FindOrCreateEventsXml(project);
26+
}
27+
28+
return INSTANCE;
29+
}
30+
31+
FindOrCreateEventsXml(Project project) {
32+
this.project = project;
33+
}
34+
35+
public PsiFile execute(String actionName, String moduleName, String area) {
36+
DirectoryGenerator directoryGenerator = DirectoryGenerator.getInstance();
37+
FileFromTemplateGenerator fileFromTemplateGenerator = FileFromTemplateGenerator.getInstance(project);
38+
PsiDirectory parentDirectory = ModuleIndex.getInstance(project).getModuleDirectoryByModuleName(moduleName);
39+
ArrayList<String> fileDirectories = new ArrayList<>();
40+
fileDirectories.add(Package.MODULE_BASE_AREA_DIR);
41+
if (!getArea(area).equals(Package.Areas.base)) {
42+
fileDirectories.add(getArea(area).toString());
43+
}
44+
for (String fileDirectory: fileDirectories) {
45+
parentDirectory = directoryGenerator.findOrCreateSubdirectory(parentDirectory, fileDirectory);
46+
}
47+
ModuleEventsXml moduleEventsXml = new ModuleEventsXml();
48+
PsiFile eventsXml = FileBasedIndexUtil.findModuleConfigFile(
49+
moduleEventsXml.getFileName(),
50+
getArea(area),
51+
moduleName,
52+
project
53+
);
54+
if (eventsXml == null) {
55+
eventsXml = fileFromTemplateGenerator.generate(moduleEventsXml, new Properties(), parentDirectory, actionName);
56+
}
57+
return eventsXml;
58+
}
59+
60+
private Package.Areas getArea(String area) {
61+
return Package.getAreaByString(area);
62+
}
63+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
package com.magento.idea.magento2plugin.magento.files;
6+
7+
import com.intellij.lang.Language;
8+
import com.intellij.lang.xml.XMLLanguage;
9+
10+
public class ModuleEventsXml implements ModuleFileInterface {
11+
public static String FILE_NAME = "events.xml";
12+
public static String TEMPLATE = "Magento Module Events Xml";
13+
14+
//code templates
15+
public static String TEMPLATE_OBSERVER = "Magento Module Events Xml Observer";
16+
17+
private static ModuleEventsXml INSTANCE = null;
18+
19+
public static ModuleEventsXml getInstance() {
20+
if (null == INSTANCE) {
21+
INSTANCE = new ModuleEventsXml();
22+
}
23+
return INSTANCE;
24+
}
25+
26+
@Override
27+
public String getFileName() {
28+
return FILE_NAME;
29+
}
30+
31+
@Override
32+
public String getTemplate() {
33+
return TEMPLATE;
34+
}
35+
36+
@Override
37+
public Language getLanguage() {
38+
return XMLLanguage.INSTANCE;
39+
}
40+
}

0 commit comments

Comments
 (0)