Skip to content

Commit b240fac

Browse files
authored
Merge pull request #447 from drpayyne/issue-443
Issue 443
2 parents 1eef554 + 852db12 commit b240fac

File tree

7 files changed

+129
-42
lines changed

7 files changed

+129
-42
lines changed

resources/fileTemplates/internal/Magento Preference Class.php.ft

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ namespace ${NAMESPACE};
99
use ${USE};
1010
#end
1111

12-
class ${NAME} #if (${EXTENDS})extends ${EXTENDS}#end {
12+
#if (${INTERFACE})interface#else class#end ${NAME} #if (${EXTENDS})extends ${EXTENDS}#end {
1313

1414
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
public class OverrideClassByAPreferenceAction extends DumbAwareAction {
2323
public static final String ACTION_NAME = "Override this class by a new Preference";
2424
public static final String ACTION_DESCRIPTION = "Create a new Magento 2 Preference";
25+
public static final String INTERFACE_ACTION = "Override this interface by a new Preference";
2526
private final GetFirstClassOfFile getFirstClassOfFile;
2627
private PhpClass targetClass;
2728

@@ -44,6 +45,9 @@ public void update(final AnActionEvent event) {
4445
targetClass = phpClass;
4546
if (psiFile instanceof PhpFile && phpClass != null) {
4647
this.setStatus(event, true);
48+
if (phpClass.isInterface()) {
49+
event.getPresentation().setText(INTERFACE_ACTION);
50+
}
4751
} else {
4852
this.setStatus(event, false);
4953
}

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

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,33 @@
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
5+
56
package com.magento.idea.magento2plugin.actions.generation.data;
67

78
import com.jetbrains.php.lang.psi.elements.PhpClass;
89

910
public class PreferenceFileData {
10-
private String preferenceDirectory;
11-
private String preferenceClassName;
12-
private String preferenceModule;
13-
private PhpClass targetClass;
14-
private String preferenceFqn;
15-
private String namespace;
16-
private boolean inheritClass;
11+
private final String preferenceDirectory;
12+
private final String preferenceClassName;
13+
private final String preferenceModule;
14+
private final PhpClass targetClass;
15+
private final String preferenceFqn;
16+
private final String namespace;
17+
private final boolean inheritClass;
18+
private final boolean isAnInterface;
1719

20+
/**
21+
* Constructor.
22+
*/
1823
public PreferenceFileData(
19-
String preferenceDirectory,
20-
String preferenceClassName,
21-
String preferenceModule,
22-
PhpClass targetClass,
23-
String preferenceFqn,
24-
String namespace,
25-
boolean inheritClass
24+
final String preferenceDirectory,
25+
final String preferenceClassName,
26+
final String preferenceModule,
27+
final PhpClass targetClass,
28+
final String preferenceFqn,
29+
final String namespace,
30+
final boolean inheritClass,
31+
final boolean isAnInterface
2632
) {
2733
this.preferenceDirectory = preferenceDirectory;
2834
this.preferenceClassName = preferenceClassName;
@@ -31,6 +37,7 @@ public PreferenceFileData(
3137
this.preferenceFqn = preferenceFqn;
3238
this.namespace = namespace;
3339
this.inheritClass = inheritClass;
40+
this.isAnInterface = isAnInterface;
3441
}
3542

3643
public String getPreferenceClassName() {
@@ -60,4 +67,8 @@ public String getNamespace() {
6067
public boolean isInheritClass() {
6168
return inheritClass;
6269
}
70+
71+
public boolean isInterface() {
72+
return isAnInterface;
73+
}
6374
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class OverrideClassByAPreferenceDialog extends AbstractDialog { //NOPMD
4848
@NotNull
4949
private final Project project;
5050
private final PhpClass targetClass;
51+
private boolean isInterface;
5152
private JPanel contentPane;
5253
private JButton buttonOK;
5354
private JButton buttonCancel;
@@ -98,6 +99,7 @@ public OverrideClassByAPreferenceDialog(
9899
this.targetClass = targetClass;
99100
this.validatorBundle = new ValidatorBundle();
100101
this.commonBundle = new CommonBundle();
102+
this.isInterface = false;
101103

102104
setContentPane(contentPane);
103105
setModal(true);
@@ -108,6 +110,9 @@ public OverrideClassByAPreferenceDialog(
108110
inheritClass.setVisible(false);
109111
inheritClassLabel.setVisible(false);
110112
}
113+
if (targetClass.isInterface()) {
114+
this.isInterface = true;
115+
}
111116
suggestPreferenceClassName(targetClass);
112117
suggestPreferenceDirectory(targetClass);
113118

@@ -188,7 +193,8 @@ protected void onOK() {
188193
targetClass,
189194
getPreferenceClassFqn(),
190195
getNamespace(),
191-
isInheritClass()
196+
isInheritClass(),
197+
isInterface
192198
), project).generate(OverrideClassByAPreferenceAction.ACTION_NAME, true);
193199

194200
this.setVisible(false);

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

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
5+
56
package com.magento.idea.magento2plugin.actions.generation.generator;
67

78
import com.intellij.openapi.project.Project;
@@ -13,26 +14,32 @@
1314
import com.magento.idea.magento2plugin.actions.generation.generator.util.DirectoryGenerator;
1415
import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
1516
import com.magento.idea.magento2plugin.bundles.CommonBundle;
17+
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
1618
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
1719
import com.magento.idea.magento2plugin.magento.files.PhpPreference;
20+
import com.magento.idea.magento2plugin.magento.packages.File;
1821
import com.magento.idea.magento2plugin.util.GetFirstClassOfFile;
1922
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
20-
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
21-
import org.jetbrains.annotations.NotNull;
22-
import javax.swing.*;
23-
import com.magento.idea.magento2plugin.magento.packages.File;
2423
import java.util.Properties;
24+
import javax.swing.JOptionPane;
25+
import org.jetbrains.annotations.NotNull;
2526

2627
public class PreferenceClassGenerator extends FileGenerator {
27-
private PreferenceFileData preferenceFileData;
28-
private Project project;
29-
private ValidatorBundle validatorBundle;
30-
private CommonBundle commonBundle;
28+
private final PreferenceFileData preferenceFileData;
29+
private final Project project;
30+
private final ValidatorBundle validatorBundle;
31+
private final CommonBundle commonBundle;
3132
private final DirectoryGenerator directoryGenerator;
3233
private final FileFromTemplateGenerator fileFromTemplateGenerator;
3334
private final GetFirstClassOfFile getFirstClassOfFile;
3435

35-
public PreferenceClassGenerator(@NotNull PreferenceFileData preferenceFileData, Project project) {
36+
/**
37+
* Constructor.
38+
*/
39+
public PreferenceClassGenerator(
40+
@NotNull final PreferenceFileData preferenceFileData,
41+
final Project project
42+
) {
3643
super(project);
3744
this.directoryGenerator = DirectoryGenerator.getInstance();
3845
this.fileFromTemplateGenerator = FileFromTemplateGenerator.getInstance(project);
@@ -43,46 +50,70 @@ public PreferenceClassGenerator(@NotNull PreferenceFileData preferenceFileData,
4350
this.commonBundle = new CommonBundle();
4451
}
4552

46-
public PsiFile generate(String actionName) {
47-
PhpClass pluginClass = GetPhpClassByFQN.getInstance(project).execute(preferenceFileData.getPreferenceFqn());
53+
54+
@Override
55+
public PsiFile generate(final String actionName) {
56+
PhpClass pluginClass = GetPhpClassByFQN.getInstance(project).execute(
57+
preferenceFileData.getPreferenceFqn()
58+
);
4859

4960
if (pluginClass == null) {
5061
pluginClass = createPluginClass(actionName);
5162
}
5263

5364
if (pluginClass == null) {
54-
String errorMessage = validatorBundle.message("validator.file.cantBeCreated", "Preference Class");
55-
JOptionPane.showMessageDialog(null, errorMessage, commonBundle.message("common.error"), JOptionPane.ERROR_MESSAGE);
65+
final String errorMessage = validatorBundle.message(
66+
"validator.file.cantBeCreated",
67+
"Preference Class"
68+
);
69+
JOptionPane.showMessageDialog(
70+
null,
71+
errorMessage,
72+
commonBundle.message("common.error"),
73+
JOptionPane.ERROR_MESSAGE
74+
);
5675

5776
return null;
5877
}
5978

6079
return pluginClass.getContainingFile();
6180
}
6281

63-
private PhpClass createPluginClass(String actionName) {
64-
PsiDirectory parentDirectory = ModuleIndex.getInstance(project).getModuleDirectoryByModuleName(getPreferenceModule());
65-
String[] pluginDirectories = preferenceFileData.getPreferenceDirectory().split(File.separator);
66-
for (String pluginDirectory: pluginDirectories) {
67-
parentDirectory = directoryGenerator.findOrCreateSubdirectory(parentDirectory, pluginDirectory);
82+
private PhpClass createPluginClass(final String actionName) {
83+
PsiDirectory parentDirectory = ModuleIndex.getInstance(project)
84+
.getModuleDirectoryByModuleName(getPreferenceModule());
85+
final String[] pluginDirectories = preferenceFileData.getPreferenceDirectory()
86+
.split(File.separator);
87+
for (final String pluginDirectory: pluginDirectories) {
88+
parentDirectory = directoryGenerator
89+
.findOrCreateSubdirectory(parentDirectory, pluginDirectory);
6890
}
6991

70-
Properties attributes = getAttributes();
71-
PsiFile pluginFile = fileFromTemplateGenerator.generate(PhpPreference.getInstance(preferenceFileData.getPreferenceClassName()), attributes, parentDirectory, actionName);
92+
final Properties attributes = getAttributes();
93+
final PsiFile pluginFile = fileFromTemplateGenerator.generate(
94+
PhpPreference.getInstance(preferenceFileData.getPreferenceClassName()),
95+
attributes,
96+
parentDirectory,
97+
actionName
98+
);
7299
if (pluginFile == null) {
73100
return null;
74101
}
75102
return getFirstClassOfFile.execute((PhpFile) pluginFile);
76103
}
77104

78-
protected void fillAttributes(Properties attributes) {
79-
String preferenceClassName = preferenceFileData.getPreferenceClassName();
105+
@Override
106+
protected void fillAttributes(final Properties attributes) {
107+
final String preferenceClassName = preferenceFileData.getPreferenceClassName();
80108
attributes.setProperty("NAME", preferenceClassName);
81109
attributes.setProperty("NAMESPACE", preferenceFileData.getNamespace());
110+
if (preferenceFileData.isInterface()) {
111+
attributes.setProperty("INTERFACE", "interface");
112+
}
82113
if (!preferenceFileData.isInheritClass()) {
83114
return;
84115
}
85-
String parentClassName = preferenceFileData.getTargetClass().getName();
116+
final String parentClassName = preferenceFileData.getTargetClass().getName();
86117
if (!parentClassName.equals(preferenceClassName)) {
87118
attributes.setProperty("USE", preferenceFileData.getTargetClass().getPresentableFQN());
88119
attributes.setProperty("EXTENDS", parentClassName);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Foo\Bar\Model;
4+
5+
interface InterfaceOverride
6+
{
7+
8+
}

tests/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void testGeneratePreferenceClassFile() {
2626
"SimpleModelOneOverride",
2727
"Foo\\Bar\\Model\\Override\\SimpleModelOneOverride",
2828
"Foo\\Bar\\Model\\Override",
29+
false,
2930
false
3031
);
3132
final String filePath = this.getFixturePath("SimpleModelOneOverride.php");
@@ -38,6 +39,29 @@ public void testGeneratePreferenceClassFile() {
3839
);
3940
}
4041

42+
/**
43+
* Test preference class file generation.
44+
*/
45+
public void testGeneratePreferenceInterfaceFile() {
46+
final PsiFile preferenceClassFile = createPreferenceClassFile(
47+
TARGET_MODEL_ONE_CLASS_FQN,
48+
"Model",
49+
"InterfaceOverride",
50+
"Foo\\Bar\\Model\\InterfaceOverride",
51+
"Foo\\Bar\\Model",
52+
false,
53+
true
54+
);
55+
final String filePath = this.getFixturePath("InterfaceOverride.php");
56+
final PsiFile expectedFile = myFixture.configureByFile(filePath);
57+
58+
assertGeneratedFileIsCorrect(
59+
expectedFile,
60+
"src/app/code/Foo/Bar/Model",
61+
preferenceClassFile
62+
);
63+
}
64+
4165
/**
4266
* Test preference class file generation with inheritance.
4367
*/
@@ -48,7 +72,8 @@ public void testGeneratePreferenceClassFileWithInheritance() {
4872
"SimpleModelTwoOverride",
4973
"Foo\\Bar\\Model\\Override\\SimpleModelTwoOverride",
5074
"Foo\\Bar\\Model\\Override",
51-
true
75+
true,
76+
false
5277
);
5378
final String filePath = this.getFixturePath("SimpleModelTwoOverride.php");
5479
final PsiFile expectedFile = myFixture.configureByFile(filePath);
@@ -77,7 +102,8 @@ private PsiFile createPreferenceClassFile(
77102
final String preferenceClassName,
78103
final String preferenceFqn,
79104
final String namespace,
80-
final Boolean inheritClass
105+
final Boolean inheritClass,
106+
final Boolean isInterface
81107
) {
82108
final Project project = myFixture.getProject();
83109
final PhpClass targetClass = GetPhpClassByFQN.getInstance(project).execute(targetClassFnq);
@@ -88,7 +114,8 @@ private PsiFile createPreferenceClassFile(
88114
targetClass,
89115
preferenceFqn,
90116
namespace,
91-
inheritClass
117+
inheritClass,
118+
isInterface
92119
);
93120
final PreferenceClassGenerator preferenceClassGenerator = new PreferenceClassGenerator(
94121
preferenceFileData,

0 commit comments

Comments
 (0)