Skip to content

Commit bedb669

Browse files
committed
add mail and profiler links to profiler popover menu
1 parent e8c6f59 commit bedb669

File tree

7 files changed

+110
-0
lines changed

7 files changed

+110
-0
lines changed

src/fr/adrienbrault/idea/symfony2plugin/Symfony2Icons.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,8 @@ public class Symfony2Icons {
3636

3737
public static final Icon PARAMETER_OPACITY = IconLoader.getIcon("icons/parameter_opacity.png");
3838

39+
public static final Icon MAIL = IconLoader.getIcon("icons/mail.png");
40+
public static final Icon PROFILER_LINK = IconLoader.getIcon("icons/profiler_link.png");
41+
3942
}
4043

585 Bytes
Loading
1.34 KB
Loading
816 Bytes
Loading
2.01 KB
Loading

src/fr/adrienbrault/idea/symfony2plugin/widget/SymfonyProfilerWidget.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
import com.intellij.openapi.wm.impl.status.EditorBasedWidget;
1313
import com.intellij.ui.popup.PopupFactoryImpl;
1414
import com.intellij.util.Consumer;
15+
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
1516
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
1617
import fr.adrienbrault.idea.symfony2plugin.profiler.ProfilerIndex;
1718
import fr.adrienbrault.idea.symfony2plugin.profiler.ProfilerUtil;
1819
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.DefaultDataCollector;
20+
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.MailCollector;
21+
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.MailMessage;
1922
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.ProfilerRequest;
2023
import fr.adrienbrault.idea.symfony2plugin.widget.action.SymfonyProfilerWidgetActions;
2124
import org.jetbrains.annotations.NotNull;
@@ -70,12 +73,42 @@ public ActionGroup getActions(){
7073
Collection<AnAction> controllerActions = new ArrayList<AnAction>();
7174
Map<String, Integer> controllerActionsMap = new HashMap<String, Integer>();
7275

76+
Collection<AnAction> urlActions = new ArrayList<AnAction>();
77+
78+
Collection<AnAction> mailActions = new ArrayList<AnAction>();
79+
7380
for(ProfilerRequest profilerRequest : requests) {
7481
DefaultDataCollector collector = profilerRequest.getCollector(DefaultDataCollector.class);
7582

83+
String statusCode = collector.getStatusCode();
84+
urlActions.add(new SymfonyProfilerWidgetActions.UrlAction(this.project, profilerRequest, statusCode));
85+
86+
// regular expression fails on current version (because of multiple mailer)
87+
// ArrayList<MailMessage> messages = profilerRequest.getCollector(MailCollector.class).getMessages();
88+
89+
// @TODO: use collector
90+
String content = profilerRequest.getContent();
91+
if(content != null && content.contains("Swift_Mime_Headers_MailboxHeader")) {
92+
mailActions.add(new SymfonyProfilerWidgetActions.UrlAction(this.project, profilerRequest, statusCode).withPanel("swiftmailer").withIcon(Symfony2Icons.MAIL));
93+
}
94+
7695
attachProfileItem(templateActions, templateActionsMap, collector.getTemplate(), ProfilerTarget.TEMPLATE);
7796
attachProfileItem(routeActions, routeActionsMap, collector.getRoute(), ProfilerTarget.ROUTE);
7897
attachProfileItem(controllerActions, controllerActionsMap, collector.getController(), ProfilerTarget.CONTROLLER);
98+
99+
100+
}
101+
102+
// routes
103+
if(urlActions.size() > 0) {
104+
actionGroup.addSeparator("Debug-Url");
105+
actionGroup.addAll(urlActions);
106+
}
107+
108+
// mails send by request
109+
if(mailActions.size() > 0) {
110+
actionGroup.addSeparator("E-Mail");
111+
actionGroup.addAll(mailActions);
79112
}
80113

81114
// routes

src/fr/adrienbrault/idea/symfony2plugin/widget/action/SymfonyProfilerWidgetActions.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,24 @@
22

33
import com.intellij.openapi.actionSystem.AnAction;
44
import com.intellij.openapi.actionSystem.AnActionEvent;
5+
import com.intellij.openapi.actionSystem.Presentation;
56
import com.intellij.openapi.project.Project;
67
import com.intellij.psi.PsiElement;
78
import com.intellij.psi.PsiFile;
89
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
910
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
11+
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.ProfilerRequest;
1012
import fr.adrienbrault.idea.symfony2plugin.routing.RouteHelper;
1113
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
1214
import fr.adrienbrault.idea.symfony2plugin.toolwindow.Symfony2SearchForm;
1315
import icons.TwigIcons;
16+
import org.apache.commons.lang.StringUtils;
1417
import org.jetbrains.annotations.Nullable;
1518

19+
import javax.swing.*;
20+
import java.awt.*;
21+
import java.net.MalformedURLException;
22+
import java.net.URL;
1623
import java.util.Arrays;
1724
import java.util.List;
1825

@@ -83,5 +90,72 @@ public void actionPerformed(AnActionEvent e) {
8390
}
8491
}
8592

93+
public static class UrlAction extends AnAction {
94+
95+
private ProfilerRequest profilerRequest;
96+
private Project project;
97+
private URL url;
98+
private String panel;
99+
100+
public UrlAction(Project project, ProfilerRequest profilerRequest, String statusCode) {
101+
super(String.format("(%s) %s", profilerRequest.getHash(), profilerRequest.getUrl()), "Open Url", Symfony2Icons.PROFILER_LINK);
102+
this.profilerRequest = profilerRequest;
103+
this.project = project;
104+
105+
106+
try {
107+
this.url = new URL(profilerRequest.getUrl());
108+
} catch (MalformedURLException e) {
109+
e.printStackTrace();
110+
return;
111+
}
112+
113+
Presentation presentation = getTemplatePresentation();
114+
presentation.setText(String.format("(%s) %s", statusCode == null ? "n/a" : statusCode, StringUtils.abbreviate(this.url.getPath(), 35)));
115+
116+
}
117+
118+
public UrlAction withPanel(String panel) {
119+
this.panel = panel;
120+
return this;
121+
}
122+
123+
public UrlAction withIcon(Icon icon) {
124+
Presentation presentation = getTemplatePresentation();
125+
presentation.setIcon(icon);
126+
return this;
127+
}
128+
129+
@Override
130+
public void actionPerformed(AnActionEvent event) {
131+
132+
if(this.url == null) {
133+
return;
134+
}
135+
136+
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
137+
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
138+
139+
String portValue = "";
140+
int port = url.getPort();
141+
if(port != -1 && port != 80) {
142+
portValue = ":" + port;
143+
}
144+
145+
String urlProfiler = url.getProtocol() + "://" + url.getHost() + portValue + "/_profiler/" + profilerRequest.getHash();
146+
if(panel != null) {
147+
urlProfiler = urlProfiler + "?panel=" + panel;
148+
}
149+
150+
try {
151+
desktop.browse(new URL(urlProfiler).toURI());
152+
} catch (Exception e) {
153+
e.printStackTrace();
154+
}
155+
}
156+
157+
}
158+
}
159+
86160
}
87161

0 commit comments

Comments
 (0)