Skip to content

Commit be1d513

Browse files
613: Bug fixing, code refactoring
1 parent 3b569b8 commit be1d513

File tree

4 files changed

+166
-73
lines changed

4 files changed

+166
-73
lines changed

src/com/magento/idea/magento2plugin/actions/comparator/CompareTemplateAction.java

Lines changed: 52 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,9 @@
55

66
package com.magento.idea.magento2plugin.actions.comparator;
77

8-
import com.intellij.diff.DiffContentFactory;
98
import com.intellij.diff.DiffDialogHints;
109
import com.intellij.diff.DiffManager;
11-
import com.intellij.diff.DiffRequestFactory;
12-
import com.intellij.diff.actions.BlankDiffWindowUtil;
13-
import com.intellij.diff.actions.impl.MutableDiffRequestChain;
1410
import com.intellij.diff.chains.DiffRequestChain;
15-
import com.intellij.diff.contents.DiffContent;
16-
import com.intellij.diff.contents.DocumentContent;
1711
import com.intellij.openapi.actionSystem.AnAction;
1812
import com.intellij.openapi.actionSystem.AnActionEvent;
1913
import com.intellij.openapi.actionSystem.PlatformDataKeys;
@@ -23,136 +17,126 @@
2317
import com.intellij.psi.PsiDirectory;
2418
import com.intellij.psi.PsiFile;
2519
import com.magento.idea.magento2plugin.MagentoIcons;
20+
import com.magento.idea.magento2plugin.actions.comparator.util.DiffRequestChainUtil;
2621
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
22+
import com.magento.idea.magento2plugin.magento.packages.Areas;
2723
import com.magento.idea.magento2plugin.project.Settings;
28-
import com.magento.idea.magento2plugin.util.RegExUtil;
2924
import com.magento.idea.magento2plugin.util.magento.GetModuleNameByDirectoryUtil;
25+
import com.magento.idea.magento2plugin.util.magento.area.AreaResolverUtil;
3026
import java.nio.file.Path;
31-
import java.util.regex.Matcher;
32-
import java.util.regex.Pattern;
3327
import org.apache.commons.lang3.StringUtils;
3428
import org.jetbrains.annotations.NotNull;
3529
import org.jetbrains.annotations.Nullable;
3630

3731
public class CompareTemplateAction extends AnAction {
3832

39-
public static final String ACTION_NAME = "Compare Template with Original";
40-
public static final String ACTION_DESCRIPTION = "Compare Template with Original";
33+
public static final String ACTION_NAME = "Compare overridden template with the original one";
34+
public static final String ACTION_DESCRIPTION = "The Magento 2 overridden template comparing";
4135

4236
private static final String PHTML_EXTENSION = "phtml";
4337
protected VirtualFile selectedFile;
4438
protected VirtualFile originalFile;
4539

4640
/**
47-
* Inject constructor argument action constructor.
41+
* Compare template action constructor.
4842
*/
4943
public CompareTemplateAction() {
5044
super(ACTION_NAME, ACTION_DESCRIPTION, MagentoIcons.MODULE);
5145
}
5246

5347
/**
5448
* Updates the state of action.
49+
*
50+
* @param event AnActionEvent
5551
*/
52+
@SuppressWarnings("PMD.NPathComplexity")
5653
@Override
5754
public void update(final @NotNull AnActionEvent event) {
55+
setStatus(event, false);
5856
final Project project = event.getData(PlatformDataKeys.PROJECT);
57+
5958
if (project == null) {
6059
return;
6160
}
6261

6362
if (!Settings.isEnabled(project)) {
64-
this.setStatus(event, false);
6563
return;
6664
}
6765
final PsiFile psiFile = event.getData(PlatformDataKeys.PSI_FILE);
68-
selectedFile = psiFile != null ? psiFile.getVirtualFile() : null;//NOPMD
6966

70-
if (selectedFile != null
71-
&& !PHTML_EXTENSION.equals(selectedFile.getExtension())
72-
) {
73-
this.setStatus(event, false);
67+
if (psiFile == null) {
68+
return;
69+
}
70+
final VirtualFile targetFileCandidate = psiFile.getVirtualFile();
71+
72+
if (targetFileCandidate == null) {
73+
return;
74+
}
75+
76+
if (!PHTML_EXTENSION.equals(targetFileCandidate.getExtension())) {
7477
return;
7578
}
79+
final Areas area = AreaResolverUtil.getForFileInCustomTheme(targetFileCandidate);
7680

77-
final String fullPath = selectedFile.getPath();
78-
final String area = getArea(fullPath);
81+
if (area == null) {
82+
return;
83+
}
7984
final String originalModuleName = getOriginalModuleName(project, psiFile);
8085
final PsiDirectory originalModuleDirectory =
8186
new ModuleIndex(project).getModuleDirectoryByModuleName(originalModuleName);
8287

83-
if (originalModuleDirectory == null
84-
|| area == null
85-
) {
86-
this.setStatus(event, false);
88+
if (originalModuleDirectory == null) {
8789
return;
8890
}
89-
9091
final String originalFilePath = originalModuleDirectory.getVirtualFile().getPath()
9192
+ "/view/"
9293
+ area
93-
+ StringUtils.substringAfter(fullPath, originalModuleName);
94+
+ StringUtils.substringAfter(targetFileCandidate.getPath(), originalModuleName);
9495

95-
originalFile = VfsUtil.findFile(Path.of(originalFilePath), false);
96+
final VirtualFile origFileCandidate = VfsUtil.findFile(Path.of(originalFilePath), false);
9697

97-
if (originalFile != null) {
98-
this.setStatus(event, true);
98+
if (origFileCandidate == null) {
9999
return;
100100
}
101-
102-
this.setStatus(event, false);
101+
selectedFile = targetFileCandidate;
102+
originalFile = origFileCandidate;
103+
this.setStatus(event, true);
103104
}
104105

105106
@Override
106107
public void actionPerformed(final @NotNull AnActionEvent event) {
107108
final Project project = event.getProject();
108-
final DiffRequestChain chain =
109-
createMutableChainFromFiles(project, selectedFile, originalFile);
110-
111-
DiffManager.getInstance().showDiff(project, chain, DiffDialogHints.DEFAULT);
112-
}
113109

114-
@Nullable
115-
private String getArea(final String fullPath) {
116-
final Pattern pattern = Pattern.compile(RegExUtil.ViewArea.AREA);
117-
final Matcher matcher = pattern.matcher(fullPath);
118-
String areaName = null;
119-
if (matcher.find()) {
120-
areaName = matcher.group(1);
110+
if (project == null || selectedFile == null || originalFile == null) {
111+
return;
121112
}
113+
final DiffRequestChain chain = DiffRequestChainUtil.createMutableChain(
114+
project,
115+
selectedFile,
116+
originalFile
117+
);
122118

123-
return areaName;
119+
if (chain == null) {
120+
return;
121+
}
122+
DiffManager.getInstance().showDiff(
123+
project,
124+
chain,
125+
DiffDialogHints.DEFAULT
126+
);
124127
}
125128

126-
private String getOriginalModuleName(final Project project, final PsiFile psiFile) {
129+
private @Nullable String getOriginalModuleName(
130+
final @NotNull Project project,
131+
final @NotNull PsiFile psiFile
132+
) {
127133
final PsiDirectory directory = psiFile.getContainingDirectory();
128134

129135
return GetModuleNameByDirectoryUtil.execute(directory, project);
130136
}
131137

132-
@NotNull
133-
private MutableDiffRequestChain createMutableChainFromFiles(
134-
final @Nullable Project project,
135-
final @NotNull VirtualFile file1,
136-
final @NotNull VirtualFile file2
137-
) {
138-
final DiffContentFactory contentFactory = DiffContentFactory.getInstance();
139-
final DiffRequestFactory requestFactory = DiffRequestFactory.getInstance();
140-
141-
final DiffContent content1 = contentFactory.create(project, file1);
142-
final DiffContent content2 = contentFactory.create(project, file2);
143-
144-
final MutableDiffRequestChain chain = BlankDiffWindowUtil.createBlankDiffRequestChain(
145-
(DocumentContent)content1,
146-
(DocumentContent)content2,
147-
null
148-
);
149-
chain.setWindowTitle(requestFactory.getTitle(file1, file2));
150-
151-
return chain;
152-
}
153-
154138
private void setStatus(final AnActionEvent event, final boolean status) {
155139
event.getPresentation().setVisible(status);
156140
event.getPresentation().setEnabled(status);
157141
}
158-
}
142+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.comparator.util;
7+
8+
import com.intellij.diff.DiffContentFactory;
9+
import com.intellij.diff.DiffRequestFactory;
10+
import com.intellij.diff.actions.BlankDiffWindowUtil;
11+
import com.intellij.diff.actions.impl.MutableDiffRequestChain;
12+
import com.intellij.diff.contents.DiffContent;
13+
import com.intellij.diff.contents.DocumentContent;
14+
import com.intellij.openapi.project.Project;
15+
import com.intellij.openapi.vfs.VirtualFile;
16+
import org.jetbrains.annotations.NotNull;
17+
import org.jetbrains.annotations.Nullable;
18+
19+
public final class DiffRequestChainUtil {
20+
21+
private DiffRequestChainUtil() {}
22+
23+
/**
24+
* Create mutable chain for files comparing.
25+
*
26+
* @param project Project
27+
* @param targetFile VirtualFile
28+
* @param baseFile VirtualFile
29+
*
30+
* @return MutableDiffRequestChain
31+
*/
32+
public static @Nullable MutableDiffRequestChain createMutableChain(
33+
final @NotNull Project project,
34+
final @NotNull VirtualFile targetFile,
35+
final @NotNull VirtualFile baseFile
36+
) {
37+
final DiffContentFactory contentFactory = DiffContentFactory.getInstance();
38+
final DiffContent targetContent = contentFactory.create(project, targetFile);
39+
final DiffContent baseContent = contentFactory.create(project, baseFile);
40+
41+
if (!(targetContent instanceof DocumentContent)
42+
|| !(baseContent instanceof DocumentContent)) {
43+
return null;
44+
}
45+
46+
final MutableDiffRequestChain chain = BlankDiffWindowUtil.createBlankDiffRequestChain(
47+
(DocumentContent) targetContent,
48+
(DocumentContent) baseContent,
49+
null
50+
);
51+
chain.setWindowTitle(DiffRequestFactory.getInstance().getTitle(targetFile, baseFile));
52+
53+
return chain;
54+
}
55+
}

src/com/magento/idea/magento2plugin/util/RegExUtil.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,4 @@ public static class CustomTheme {
107107
public static final String MODULE_NAME =
108108
"app\\/design\\/(adminhtml|frontend)\\/\\w*\\/\\w*\\/\\w*";
109109
}
110-
111-
public static class ViewArea {
112-
public static final String AREA =
113-
"\\/(adminhtml|frontend)\\/";
114-
}
115110
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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.area;
7+
8+
import com.intellij.openapi.vfs.VirtualFile;
9+
import com.magento.idea.magento2plugin.magento.packages.Areas;
10+
import java.util.regex.Matcher;
11+
import java.util.regex.Pattern;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
public final class AreaResolverUtil {
16+
17+
private static final String CUSTOM_THEME_AREA = "\\/design\\/(adminhtml|frontend)\\/";
18+
private static final String MODULE_AREA =
19+
"\\/view\\/(adminhtml|frontend|base|crontab|webapi_rest|webapi_soap|graphql)\\/";
20+
21+
private AreaResolverUtil() {}
22+
23+
/**
24+
* Get Magento 2 area for the specified file (file should be in the custom theme).
25+
*
26+
* @param virtualFile VirtualFile
27+
*
28+
* @return Areas or null if file does not belong to the custom (editable) theme.
29+
*/
30+
public static @Nullable Areas getForFileInCustomTheme(final @NotNull VirtualFile virtualFile) {
31+
return getArea(virtualFile.getPath(), CUSTOM_THEME_AREA);
32+
}
33+
34+
/**
35+
* Get Magento 2 area for the specified file (file should be in the Magento 2 module).
36+
*
37+
* @param virtualFile VirtualFile
38+
*
39+
* @return Areas or null if file does not belong to the Magento 2 module.
40+
*/
41+
public static @Nullable Areas getForFileInModule(final @NotNull VirtualFile virtualFile) {
42+
return getArea(virtualFile.getPath(), MODULE_AREA);
43+
}
44+
45+
private static @Nullable Areas getArea(
46+
final @NotNull String filePath,
47+
final @NotNull String searchingRegex
48+
) {
49+
final Pattern pattern = Pattern.compile(searchingRegex);
50+
final Matcher matcher = pattern.matcher(filePath);
51+
String areaName = null;
52+
53+
if (matcher.find()) {
54+
areaName = matcher.group(1);
55+
}
56+
57+
return areaName == null ? null : Areas.getAreaByString(areaName);
58+
}
59+
}

0 commit comments

Comments
 (0)