Skip to content

Commit 8f4e226

Browse files
89: Extended validation to form fieldsets and form fields
1 parent ea591c9 commit 8f4e226

23 files changed

+499
-117
lines changed

resources/magento2/validation.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
validator.notEmpty=The `{0}` field must not be empty
1+
validator.notEmpty=The {0} field must not be empty
22
validator.package.validPath=Please specify a valid Magento 2 installation path
33
validator.alphaNumericCharacters={0} must contain letters and numbers only
4+
validator.alphaNumericAndUnderscoreCharacters={0} must contain letters, numbers and underscores only
45
validator.alreadyDeclared={0} is already declared in the {1} module.
56
validator.startWithNumberOrCapitalLetter={0} must start from a number or a capital letter
67
validator.onlyNumbers={0} must contain numbers only
@@ -22,3 +23,6 @@ validator.cronSchedule.invalidExpression={0} has invalid cron schedule expressio
2223
validator.configPath.invalidFormat={0} has invalid config path format (e.g. section/group/field)
2324
validator.moduleNameIsTheSameAsPackage=Module name must be different from the package name
2425
validator.mustNotBeEmptyShouldContainLettersOrNumbers=Must not be empty, should contain letters or numbers
26+
validator.magentoRouteIdInvalid=The route id is invalid
27+
validator.magentoAclResourceIdInvalid=The ACL resource id is invalid
28+
validator.lowercaseCharacters={0} must contain lowercase characters only

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ private void addValidationRulesFromAnnotations() {
9797
getMessageFromAnnotation(validation)
9898
);
9999
} catch (Exception exception) {
100-
// Do nothing.
100+
// NOPMD
101101
}
102102
}
103103
field.setAccessible(false);
@@ -116,16 +116,9 @@ private String getMessageFromAnnotation(FieldValidation validation) {
116116

117117
private ValidationRule getRuleFromAnnotation(FieldValidation validation) throws NoSuchMethodException,
118118
IllegalAccessException, InvocationTargetException, InstantiationException {
119-
ValidationRule rule;
120119
Class<?> ruleType = validation.rule().getRule();
121-
String[] ruleParams = validation.properties();
122120

123-
if (ruleParams.length >= 1 && !ruleParams[0].isEmpty()) {
124-
rule = (ValidationRule)ruleType.getConstructor(String.class).newInstance(ruleParams);
125-
} else {
126-
rule = (ValidationRule)ruleType.getConstructor().newInstance();
127-
}
128-
return rule;
121+
return (ValidationRule) ruleType.getConstructor().newInstance();
129122
}
130123

131124
protected void addValidationRuleToField(Object field, ValidationRule rule, String message) {

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

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@
1818
import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFieldData;
1919
import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFieldsetData;
2020
import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFileData;
21-
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.NewUiComponentFormValidator;
21+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.FieldValidation;
22+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.RuleRegistry;
23+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.*;
24+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.uiComponent.FormButtonsValidator;
25+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.uiComponent.FormFieldsValidator;
26+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.uiComponent.FormFieldsetsValidator;
2227
import com.magento.idea.magento2plugin.actions.generation.generator.LayoutXmlGenerator;
2328
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleControllerClassGenerator;
2429
import com.magento.idea.magento2plugin.actions.generation.generator.RoutesXmlGenerator;
@@ -37,6 +42,8 @@
3742
import com.magento.idea.magento2plugin.ui.table.DeleteRowButton;
3843
import com.magento.idea.magento2plugin.ui.table.TableButton;
3944
import com.magento.idea.magento2plugin.util.magento.GetModuleNameByDirectoryUtil;
45+
46+
import java.awt.*;
4047
import java.awt.event.ActionEvent;
4148
import java.awt.event.ActionListener;
4249
import java.awt.event.KeyEvent;
@@ -65,30 +72,72 @@
6572
"PMD.GodClass"
6673
})
6774
public class NewUiComponentFormDialog extends AbstractDialog {
68-
private final NewUiComponentFormValidator validator;
75+
private final FormButtonsValidator formButtonsValidator;
76+
private final FormFieldsetsValidator formFieldsetsValidator;
77+
private final FormFieldsValidator formFieldsValidator;
6978
private final Project project;
7079
private final String moduleName;
7180
private JPanel contentPane;
7281
private JButton buttonOK;
7382
private JButton buttonCancel;
7483
private FilteredComboBox formAreaSelect;
84+
85+
@FieldValidation(rule = RuleRegistry.NOT_EMPTY, message = {NotEmptyRule.MESSAGE, "Name"})
86+
@FieldValidation(rule = RuleRegistry.IDENTIFIER, message = {IdentifierRule.MESSAGE, "Name"})
7587
private JTextField formName;
88+
89+
@FieldValidation(rule = RuleRegistry.NOT_EMPTY, message = {NotEmptyRule.MESSAGE, "Label"})
7690
private JTextField formLabel;
91+
7792
private JTable formButtons;
7893
private JButton addButton;
7994
private JTable fieldsets;
8095
private JTable fields;
8196
private JButton addFieldset;
8297
private JButton addField;
98+
99+
@FieldValidation(rule = RuleRegistry.ROUTE_ID, message = {RouteIdRule.MESSAGE})
83100
private JTextField route;
101+
102+
@FieldValidation(rule = RuleRegistry.PHP_NAMESPACE_NAME,
103+
message = {PhpNamespaceNameRule.MESSAGE, "View Controller Name"})
84104
private JTextField viewControllerName;
105+
106+
@FieldValidation(rule = RuleRegistry.PHP_CLASS, message = {PhpClassRule.MESSAGE, "View Action Name"})
107+
@FieldValidation(rule = RuleRegistry.NOT_EMPTY, message = {NotEmptyRule.MESSAGE, "View Action Name"})
108+
@FieldValidation(rule = RuleRegistry.ALPHANUMERIC, message = {AlphanumericRule.MESSAGE, "View Action Name"})
109+
@FieldValidation(rule = RuleRegistry.START_WITH_NUMBER_OR_CAPITAL_LETTER,
110+
message = {StartWithNumberOrCapitalLetterRule.MESSAGE, "View Action Name"})
85111
private JTextField viewActionName;
112+
113+
@FieldValidation(rule = RuleRegistry.PHP_NAMESPACE_NAME,
114+
message = {PhpNamespaceNameRule.MESSAGE, "Submit Controller Name"})
86115
private JTextField submitControllerName;
116+
117+
@FieldValidation(rule = RuleRegistry.PHP_CLASS, message = {PhpClassRule.MESSAGE, "Submit Action Name"})
118+
@FieldValidation(rule = RuleRegistry.NOT_EMPTY, message = {NotEmptyRule.MESSAGE, "Submit Action Name"})
119+
@FieldValidation(rule = RuleRegistry.ALPHANUMERIC, message = {AlphanumericRule.MESSAGE, "Submit Action Name"})
120+
@FieldValidation(rule = RuleRegistry.START_WITH_NUMBER_OR_CAPITAL_LETTER,
121+
message = {StartWithNumberOrCapitalLetterRule.MESSAGE, "Submit Action Name"})
87122
private JTextField submitActionName;
123+
124+
@FieldValidation(rule = RuleRegistry.NOT_EMPTY, message = {NotEmptyRule.MESSAGE, "Data Provider class name"})
125+
@FieldValidation(rule = RuleRegistry.PHP_CLASS, message = {PhpClassRule.MESSAGE, "Data Provider class name"})
126+
@FieldValidation(rule = RuleRegistry.ALPHANUMERIC,
127+
message = {AlphanumericRule.MESSAGE, "Data Provider class name"})
88128
private JTextField dataProviderClassName;
129+
130+
@FieldValidation(rule = RuleRegistry.NOT_EMPTY, message = {NotEmptyRule.MESSAGE, "Data Provider directory"})
131+
@FieldValidation(rule = RuleRegistry.DIRECTORY, message = {DirectoryRule.MESSAGE, "Data Provider directory"})
132+
@FieldValidation(rule = RuleRegistry.START_WITH_NUMBER_OR_CAPITAL_LETTER,
133+
message = {AlphanumericRule.MESSAGE, "Data Provider directory"})
89134
private JTextField dataProviderDirectory;
135+
90136
private JLabel aclLabel;
137+
138+
@FieldValidation(rule = RuleRegistry.ACL_RESOURCE_ID, message = {AclResourceIdRule.MESSAGE})
91139
private JTextField acl;
140+
92141
private JLabel formButtonsLabel;//NOPMD
93142
private JLabel formNameLabel;//NOPMD
94143
private JLabel formLabelLabel;//NOPMD
@@ -127,7 +176,10 @@ public class NewUiComponentFormDialog extends AbstractDialog {
127176
public NewUiComponentFormDialog(final Project project, final PsiDirectory directory) {
128177
super();
129178
this.project = project;
130-
this.validator = new NewUiComponentFormValidator(this);
179+
updateDialogSizeToDefaults();
180+
formButtonsValidator = new FormButtonsValidator(this);
181+
formFieldsetsValidator = new FormFieldsetsValidator(this);
182+
formFieldsValidator = new FormFieldsValidator(this);
131183
this.moduleName = GetModuleNameByDirectoryUtil.execute(directory, project);
132184

133185
setContentPane(contentPane);
@@ -338,7 +390,7 @@ public static void open(final Project project, final PsiDirectory directory) {
338390
}
339391

340392
private void onOK() {
341-
if (!validator.validate()) {
393+
if (!validateFormFields()) {
342394
return;
343395
}
344396

@@ -639,4 +691,17 @@ private void toggleAcl() {
639691
acl.setVisible(false);
640692
aclLabel.setVisible(false);
641693
}
694+
695+
@Override
696+
protected boolean validateFormFields() {
697+
return super.validateFormFields()
698+
&& formButtonsValidator.validate()
699+
&& formFieldsetsValidator.validate()
700+
&& formFieldsValidator.validate();
701+
}
702+
703+
private void updateDialogSizeToDefaults() {
704+
Dimension screenSize = getToolkit().getScreenSize();
705+
setPreferredSize(new Dimension(screenSize.width/2, screenSize.height/2));
706+
}
642707
}

src/com/magento/idea/magento2plugin/actions/generation/dialog/validator/annotation/FieldValidation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
@Retention(RetentionPolicy.RUNTIME)
77
@Target(ElementType.FIELD)
88
public @interface FieldValidation {
9-
public RuleRegister rule();
10-
public String[] properties() default "";
9+
public RuleRegistry rule();
1110
public String[] message();
1211
}

src/com/magento/idea/magento2plugin/actions/generation/dialog/validator/annotation/RuleRegister.java

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation;
2+
3+
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.*;
4+
5+
public enum RuleRegistry {
6+
NOT_EMPTY(NotEmptyRule.class),
7+
PHP_CLASS(PhpClassRule.class),
8+
ROUTE_ID(RouteIdRule.class),
9+
ALPHANUMERIC(AlphanumericRule.class),
10+
ALPHANUMERIC_WITH_UNDERSCORE(AlphanumericWithUnderscoreRule.class),
11+
DIRECTORY(DirectoryRule.class),
12+
IDENTIFIER(IdentifierRule.class),
13+
PHP_NAMESPACE_NAME(PhpNamespaceNameRule.class),
14+
START_WITH_NUMBER_OR_CAPITAL_LETTER(StartWithNumberOrCapitalLetterRule.class),
15+
ACL_RESOURCE_ID(AclResourceIdRule.class),
16+
LOWERCASE(Lowercase.class),
17+
NUMERIC(NumericRule.class);
18+
19+
private Class<?> rule;
20+
21+
RuleRegistry(final Class<?> rule) {
22+
this.rule = rule;
23+
}
24+
25+
public Class<?> getRule() {
26+
return rule;
27+
}
28+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule;
2+
3+
import com.magento.idea.magento2plugin.util.RegExUtil;
4+
5+
public class AclResourceIdRule implements ValidationRule {
6+
public static final String MESSAGE = "validator.magentoAclResourceIdInvalid";
7+
private static final ValidationRule instance = new AclResourceIdRule();
8+
9+
@Override
10+
public boolean check(String value) {
11+
return value.matches(RegExUtil.Magento.ACL_RESOURCE_ID);
12+
}
13+
14+
public static ValidationRule getInstance() {
15+
return instance;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule;
2+
3+
import com.magento.idea.magento2plugin.util.RegExUtil;
4+
5+
public class AlphanumericRule implements ValidationRule {
6+
public static final String MESSAGE = "validator.alphaNumericCharacters";
7+
private static final ValidationRule instance = new AlphanumericRule();
8+
9+
@Override
10+
public boolean check(String value) {
11+
return value.matches(RegExUtil.ALPHANUMERIC);
12+
}
13+
14+
public static ValidationRule getInstance() {
15+
return instance;
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule;
2+
3+
import com.magento.idea.magento2plugin.util.RegExUtil;
4+
5+
public class AlphanumericWithUnderscoreRule implements ValidationRule {
6+
public static final String MESSAGE = "validator.alphaNumericAndUnderscoreCharacters";
7+
private static final ValidationRule instance = new AlphanumericWithUnderscoreRule();
8+
9+
@Override
10+
public boolean check(String value) {
11+
return value.matches(RegExUtil.ALPHANUMERIC_WITH_UNDERSCORE);
12+
}
13+
14+
public static ValidationRule getInstance() {
15+
return instance;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule;
2+
3+
import com.magento.idea.magento2plugin.util.RegExUtil;
4+
5+
public class DirectoryRule implements ValidationRule {
6+
public static final String MESSAGE = "validator.directory.isNotValid";
7+
private static final ValidationRule instance = new DirectoryRule();
8+
9+
@Override
10+
public boolean check(String value) {
11+
return value.matches(RegExUtil.DIRECTORY);
12+
}
13+
14+
public static ValidationRule getInstance() {
15+
return instance;
16+
}
17+
}

0 commit comments

Comments
 (0)