Skip to content

Commit 2709820

Browse files
author
Serhiy Zhovnir
committed
#issue-179 Adjust the logic for validation
1 parent 26f7c1c commit 2709820

File tree

6 files changed

+177
-49
lines changed

6 files changed

+177
-49
lines changed

src/com/magento/idea/magento2plugin/actions/generation/NewEmailTemplateAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import com.intellij.openapi.actionSystem.LangDataKeys;
1414
import com.intellij.openapi.project.Project;
1515
import com.intellij.psi.PsiDirectory;
16-
import com.magento.idea.magento2plugin.actions.generation.dialog.NewEmailTemplateDialog;
1716
import com.magento.idea.magento2plugin.MagentoIcons;
17+
import com.magento.idea.magento2plugin.actions.generation.dialog.NewEmailTemplateDialog;
1818

1919
@SuppressWarnings({"PMD.OnlyOneReturn", "PMD.FieldNamingConventions"})
2020
public class NewEmailTemplateAction extends AnAction {

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
import com.magento.idea.magento2plugin.actions.generation.NewEmailTemplateAction;
1111
import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplateHtmlData;
1212
import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplatesXmlData;
13-
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleEmailTemplateHtmlGenerator;
14-
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleEmailTemplatesXmlGenerator;
1513
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.FieldValidation;
1614
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.RuleRegistry;
15+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.dialog.NewEmailTemplateDialogValidator;
1716
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.IdentifierRule;
1817
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.NotEmptyRule;
18+
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleEmailTemplateHtmlGenerator;
19+
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleEmailTemplatesXmlGenerator;
1920
import com.magento.idea.magento2plugin.magento.files.EmailTemplateHtml;
2021
import com.magento.idea.magento2plugin.magento.packages.Areas;
2122
import com.magento.idea.magento2plugin.ui.FilteredComboBox;
@@ -37,6 +38,7 @@
3738
public class NewEmailTemplateDialog extends AbstractDialog {
3839
private final String moduleName;
3940
private final Project project;
41+
private final NewEmailTemplateDialogValidator validator;
4042
private static final String ID = "id";
4143
private static final String LABEL = "label";
4244
private static final String FILENAME = "file name";
@@ -71,6 +73,7 @@ public NewEmailTemplateDialog(final Project project, final PsiDirectory director
7173
setModal(true);
7274
getRootPane().setDefaultButton(buttonOK);
7375
this.project = project;
76+
this.validator = new NewEmailTemplateDialogValidator(project);
7477
this.moduleName = GetModuleNameByDirectoryUtil.execute(directory, project);
7578

7679
buttonOK.addActionListener(e -> onOK());
@@ -199,7 +202,8 @@ private String getModuleName() {
199202
}
200203

201204
private void onOK() {
202-
if (!validateFormFields()) {
205+
final boolean emailTemplateCanBeDeclared = !this.validator.validate(this);
206+
if (!validateFormFields() || emailTemplateCanBeDeclared) {
203207
return;
204208
}
205209

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.generation.dialog.validator.dialog;
7+
8+
import com.intellij.openapi.project.Project;
9+
import com.intellij.psi.PsiFile;
10+
import com.intellij.psi.util.PsiTreeUtil;
11+
import com.intellij.psi.xml.XmlAttributeValue;
12+
import com.intellij.psi.xml.XmlFile;
13+
import com.intellij.psi.xml.XmlTag;
14+
import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplateHtmlData;
15+
import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplatesXmlData;
16+
import com.magento.idea.magento2plugin.actions.generation.dialog.NewEmailTemplateDialog;
17+
import com.magento.idea.magento2plugin.bundles.CommonBundle;
18+
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
19+
import com.magento.idea.magento2plugin.magento.files.EmailTemplatesXml;
20+
import com.magento.idea.magento2plugin.magento.packages.Areas;
21+
import com.magento.idea.magento2plugin.magento.packages.Package;
22+
import com.magento.idea.magento2plugin.util.magento.FileBasedIndexUtil;
23+
import com.magento.idea.magento2plugin.util.xml.XmlPsiTreeUtil;
24+
import java.util.Collection;
25+
import javax.swing.JOptionPane;
26+
27+
public class NewEmailTemplateDialogValidator {
28+
private final ValidatorBundle validatorBundle;
29+
private final CommonBundle commonBundle;
30+
private final Project project;
31+
32+
/**
33+
* Constructor.
34+
*/
35+
public NewEmailTemplateDialogValidator(final Project project) {
36+
this.validatorBundle = new ValidatorBundle();
37+
this.commonBundle = new CommonBundle();
38+
this.project = project;
39+
}
40+
41+
/**
42+
* Validate dialog.
43+
*
44+
* @param dialog NewEmailTemplateDialog
45+
* @return boolean
46+
*/
47+
public boolean validate(final NewEmailTemplateDialog dialog) {
48+
final EmailTemplatesXmlData emailTemplatesXmlData = dialog.getEmailTemplateData();
49+
final String errorTitle = commonBundle.message("common.error");
50+
51+
if (isTemplateTagAlreadyExists(emailTemplatesXmlData)) {
52+
final String errorMessage = this.validatorBundle.message(
53+
"validator.alreadyDeclared",
54+
String.format("%s Email Template", emailTemplatesXmlData.getId()),
55+
emailTemplatesXmlData.getModule()
56+
);
57+
JOptionPane.showMessageDialog(
58+
null,
59+
errorMessage,
60+
errorTitle,
61+
JOptionPane.ERROR_MESSAGE
62+
);
63+
64+
return false;
65+
}
66+
67+
final EmailTemplateHtmlData emailTemplateHtmlData = dialog.getEmailTemplateHtmlData();
68+
69+
if (isTemplateFileAlreadyExists(emailTemplateHtmlData)) {
70+
final String errorMessage = this.validatorBundle.message(
71+
"validator.alreadyDeclared",
72+
String.format("%s Email Template File", emailTemplatesXmlData.getTemplateFileName()),
73+
emailTemplatesXmlData.getModule()
74+
);
75+
JOptionPane.showMessageDialog(
76+
null,
77+
errorMessage,
78+
errorTitle,
79+
JOptionPane.ERROR_MESSAGE
80+
);
81+
82+
return false;
83+
}
84+
85+
return true;
86+
}
87+
88+
/**
89+
* Is template tag already exists.
90+
*
91+
* @param emailTemplatesXmlData email templates XML data
92+
*
93+
* @return bool
94+
*/
95+
private boolean isTemplateTagAlreadyExists(final EmailTemplatesXmlData emailTemplatesXmlData) {
96+
final EmailTemplatesXml emailTemplatesXml = new EmailTemplatesXml();
97+
final XmlFile emailTemplatesFile = (XmlFile) FileBasedIndexUtil.findModuleConfigFile(
98+
emailTemplatesXml.getFileName(),
99+
Areas.base,
100+
emailTemplatesXmlData.getModule(),
101+
project
102+
);
103+
final Collection<XmlAttributeValue> attributes = XmlPsiTreeUtil.findAttributeValueElements(
104+
emailTemplatesFile,
105+
EmailTemplatesXml.TEMPLATE_TAG,
106+
EmailTemplatesXml.TEMPLATE_ID_ATTRIBUTE,
107+
emailTemplatesXmlData.getId()
108+
);
109+
110+
for (final XmlAttributeValue emailTemplateAttribute: attributes) {
111+
final XmlTag templateXmlTag = PsiTreeUtil.getParentOfType(
112+
emailTemplateAttribute,
113+
XmlTag.class
114+
);
115+
final String existingTemplateArea = templateXmlTag.getAttribute("area").getValue();
116+
117+
if (existingTemplateArea.equals(emailTemplatesXmlData.getArea())) {
118+
return true;
119+
}
120+
}
121+
122+
return false;
123+
}
124+
125+
/**
126+
* Is template file already exists.
127+
*
128+
* @param emailTemplateData EmailTemplateHtmlData
129+
* @return boolean
130+
*/
131+
private boolean isTemplateFileAlreadyExists(
132+
final EmailTemplateHtmlData emailTemplateData
133+
) {
134+
PsiFile templateFile = FileBasedIndexUtil.findModuleViewFile(
135+
emailTemplateData.getFileName(),
136+
getArea(emailTemplateData.getArea()),
137+
emailTemplateData.getModule(),
138+
project,
139+
Package.moduleViewEmailDir
140+
);
141+
142+
return templateFile != null;
143+
}
144+
145+
private Areas getArea(final String area) {
146+
return Areas.getAreaByString(area);
147+
}
148+
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
1414
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
1515
import com.magento.idea.magento2plugin.magento.files.EmailTemplateHtml;
16+
import com.magento.idea.magento2plugin.magento.packages.Areas;
1617
import com.magento.idea.magento2plugin.magento.packages.Package;
18+
import com.magento.idea.magento2plugin.util.magento.FileBasedIndexUtil;
1719
import java.util.ArrayList;
1820
import java.util.Properties;
1921

@@ -22,6 +24,7 @@ public class ModuleEmailTemplateHtmlGenerator extends FileGenerator {
2224
private final FileFromTemplateGenerator fileFromTemplateGenerator;
2325
private final ModuleIndex moduleIndex;
2426
private final DirectoryGenerator directoryGenerator;
27+
private final Project project;
2528

2629
/**
2730
* Constructor.
@@ -36,6 +39,7 @@ public ModuleEmailTemplateHtmlGenerator(
3639
super(project);
3740

3841
this.emailTemplateData = emailTemplateData;
42+
this.project = project;
3943
this.fileFromTemplateGenerator = FileFromTemplateGenerator.getInstance(project);
4044
this.directoryGenerator = DirectoryGenerator.getInstance();
4145
this.moduleIndex = ModuleIndex.getInstance(project);
@@ -48,6 +52,18 @@ public ModuleEmailTemplateHtmlGenerator(
4852
* @return PsiFile
4953
*/
5054
public PsiFile generate(String actionName) {
55+
PsiFile templateFile = FileBasedIndexUtil.findModuleViewFile(
56+
this.emailTemplateData.getFileName(),
57+
getArea(this.emailTemplateData.getArea()),
58+
this.emailTemplateData.getModule(),
59+
this.project,
60+
Package.moduleViewEmailDir
61+
);
62+
63+
if (templateFile != null) {
64+
return null;
65+
}
66+
5167
PsiDirectory parentDirectory = this.moduleIndex.getModuleDirectoryByModuleName(
5268
this.emailTemplateData.getModule()
5369
);
@@ -84,4 +100,8 @@ protected void fillAttributes(Properties attributes) {
84100
attributes.setProperty("HTML_TYPE", "true");
85101
}
86102
}
103+
104+
private Areas getArea(final String area) {
105+
return Areas.getAreaByString(area);
106+
}
87107
}

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

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,15 @@
1111
import com.intellij.psi.PsiDocumentManager;
1212
import com.intellij.psi.PsiFile;
1313
import com.intellij.psi.codeStyle.CodeStyleManager;
14-
import com.intellij.psi.util.PsiTreeUtil;
15-
import com.intellij.psi.xml.XmlAttributeValue;
1614
import com.intellij.psi.xml.XmlFile;
17-
import com.intellij.psi.xml.XmlTag;
1815
import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplatesXmlData;
1916
import com.magento.idea.magento2plugin.actions.generation.generator.util.FindOrCreateEmailTemplatesXml;
2017
import com.magento.idea.magento2plugin.actions.generation.generator.util.GetCodeTemplate;
2118
import com.magento.idea.magento2plugin.actions.generation.generator.util.XmlFilePositionUtil;
2219
import com.magento.idea.magento2plugin.bundles.CommonBundle;
2320
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
2421
import com.magento.idea.magento2plugin.magento.files.EmailTemplatesXml;
25-
import com.magento.idea.magento2plugin.util.xml.XmlPsiTreeUtil;
2622
import java.io.IOException;
27-
import java.util.Collection;
2823
import java.util.Properties;
2924
import javax.swing.JOptionPane;
3025

@@ -75,22 +70,6 @@ public PsiFile generate(final String actionName) {
7570
actionName,
7671
moduleName
7772
);
78-
final String groupName = this.emailTemplatesData.getId();
79-
final XmlTag emailTemplateTag = this.getTemplateTag(emailTemplateXmlFile, groupName);
80-
81-
if (emailTemplateTag != null) {
82-
final String errorMessage = this.validatorBundle.message(
83-
"validator.alreadyDeclared",
84-
String.format("%s Email Template", groupName),
85-
moduleName
86-
);
87-
JOptionPane.showMessageDialog(
88-
null,
89-
errorMessage,
90-
commonBundle.message("common.error"),
91-
JOptionPane.ERROR_MESSAGE
92-
);
93-
}
9473

9574
WriteCommandAction.runWriteCommandAction(project, () -> {
9675
final StringBuffer textBuf = new StringBuffer();
@@ -168,27 +147,4 @@ protected void fillAttributes(final Properties attributes) {
168147
attributes.setProperty("MODULE", emailTemplatesData.getModule());
169148
attributes.setProperty("AREA", emailTemplatesData.getArea());
170149
}
171-
172-
/**
173-
* Retrieve template tag with email template id if it registered in email_templates.xml file.
174-
*
175-
* @param emailTemplatesXmlFile email templates XML file
176-
* @param id Email template ID
177-
* @return XmlTag
178-
*/
179-
private XmlTag getTemplateTag(final XmlFile emailTemplatesXmlFile, final String id) {
180-
final Collection<XmlAttributeValue> attributes = XmlPsiTreeUtil.findAttributeValueElements(
181-
emailTemplatesXmlFile,
182-
EmailTemplatesXml.TEMPLATE_TAG,
183-
EmailTemplatesXml.TEMPLATE_ID_ATTRIBUTE
184-
);
185-
186-
for (final XmlAttributeValue emailTemplateAttribute: attributes) {
187-
if (emailTemplateAttribute.getValue().equals(id)) {
188-
return PsiTreeUtil.getParentOfType(emailTemplateAttribute, XmlTag.class);
189-
}
190-
}
191-
192-
return null;
193-
}
194150
}

src/com/magento/idea/magento2plugin/magento/files/EmailTemplatesXml.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class EmailTemplatesXml implements ModuleFileInterface {
1616
public static final String EMAIL_TEMPLATE_REGISTRATION = "Magento Module Email Template Xml";
1717

1818
// XML definitions
19-
public static final String TEMPLATE_TAG = "templates";
19+
public static final String TEMPLATE_TAG = "template";
2020
public static final String TEMPLATE_ID_ATTRIBUTE = "id";
2121

2222
private static EmailTemplatesXml INSTANCE = null;

0 commit comments

Comments
 (0)