Skip to content

Commit 1895bd3

Browse files
committed
Allowing opening logfile series from "recent" files (follow up for chewiebug#61)
When a series of logfiles was recently opened, it can now be reopened from the "recent" menu. In order to support this, GCResourceGroup was refactored and now only stores the URL of a Resource instead of the whole resource (as it apparently was already before). This allows to also store GcResourceSeries in the same way as regular GcResources.
1 parent 262dfed commit 1895bd3

File tree

6 files changed

+262
-124
lines changed

6 files changed

+262
-124
lines changed

src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCModelLoaderControllerImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void add(List<GCResource> gcResourceList) {
6868
}
6969

7070
private void addGCResource(GCResource gcResource) {
71-
GCModelLoader loader = new GCModelLoaderImpl(gcResource);
71+
GCModelLoader loader = GCModelLoaderFactory.createFor(gcResource);
7272
GCDocumentController docController = getDocumentController(gcViewerGui.getSelectedGCDocument());
7373
docController.addGCResource(loader, getViewMenuController());
7474

@@ -113,7 +113,7 @@ private ViewMenuController getViewMenuController() {
113113
}
114114

115115
private void openGCResource(GCResource gcResource) {
116-
GCModelLoader loader = new GCModelLoaderImpl(gcResource);
116+
GCModelLoader loader = GCModelLoaderFactory.createFor(gcResource);
117117
openGCResource(gcResource, loader);
118118
}
119119

@@ -150,7 +150,7 @@ public void open(GCResource gcResource) {
150150
@Override
151151
public void open(List<GCResource> gcResourceList) {
152152
for (int i = 0; i < gcResourceList.size(); ++i) {
153-
GCResource gcResource = new GcResourceFile(gcResourceList.get(i).getResourceName());
153+
GCResource gcResource = gcResourceList.get(i);
154154

155155
if (i == 0) {
156156
openGCResource(gcResource);

src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/RecentGCResourcesMenuController.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.tagtraum.perf.gcviewer.ctrl.impl;
22

3-
import javax.swing.JMenu;
4-
import javax.swing.JMenuItem;
5-
63
import com.tagtraum.perf.gcviewer.ctrl.GCModelLoaderController;
74
import com.tagtraum.perf.gcviewer.ctrl.action.OpenRecent;
85
import com.tagtraum.perf.gcviewer.view.RecentGCResourcesMenu;
96
import com.tagtraum.perf.gcviewer.view.model.RecentGCResourcesEvent;
107
import com.tagtraum.perf.gcviewer.view.model.RecentGCResourcesListener;
118
import com.tagtraum.perf.gcviewer.view.model.RecentGCResourcesModel;
129

10+
import javax.swing.*;
11+
1312
/**
1413
* Controller for the {@link RecentGCResourcesMenu} keeping it in sync with the {@link RecentGCResourcesModel}.
1514
*
@@ -41,9 +40,7 @@ public void remove(RecentGCResourcesEvent e) {
4140
*/
4241
@Override
4342
public void add(RecentGCResourcesEvent e) {
44-
// TODO It is not a good idea to store GCResources in the recent menu -> whole model is stored in there!
45-
// TODO should be only URL / string of the resource (as it was in the earlier implementation :-()
46-
menu.add(new JMenuItem(new OpenRecent(controller,
43+
menu.add(new JMenuItem(new OpenRecent(controller,
4744
e.getResourceNameGroup())),
4845
e.getPosition());
4946
}

src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.tagtraum.perf.gcviewer.view;
22

3-
import java.awt.BorderLayout;
3+
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
4+
5+
import javax.swing.*;
6+
import java.awt.*;
47
import java.beans.PropertyVetoException;
8+
import java.util.ArrayList;
9+
import java.util.List;
510
import java.util.Map;
611

7-
import javax.swing.Action;
8-
import javax.swing.JDesktopPane;
9-
import javax.swing.JFrame;
10-
11-
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
12-
1312
/**
1413
* This is the main window of GCViewer.
1514
*
@@ -66,7 +65,18 @@ public RecentGCResourcesMenu getRecentGCResourcesMenu() {
6665
public GCDocument getSelectedGCDocument() {
6766
return (GCDocument)desktopPane.getSelectedFrame();
6867
}
69-
68+
69+
public List<GCDocument> getAllGCDocuments() {
70+
List<GCDocument> documents = new ArrayList<>();
71+
for (JInternalFrame frame : desktopPane.getAllFrames()) {
72+
if (frame instanceof GCDocument) {
73+
GCDocument document = (GCDocument) frame;
74+
documents.add(document);
75+
}
76+
}
77+
return documents;
78+
}
79+
7080
public GCViewerGuiToolBar getToolBar() {
7181
return toolBar;
7282
}

src/main/java/com/tagtraum/perf/gcviewer/view/model/GCResourceGroup.java

Lines changed: 118 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2,111 +2,154 @@
22

33
import com.tagtraum.perf.gcviewer.model.GCResource;
44
import com.tagtraum.perf.gcviewer.model.GcResourceFile;
5+
import com.tagtraum.perf.gcviewer.model.GcResourceSeries;
56

7+
import java.io.File;
68
import java.net.MalformedURLException;
9+
import java.net.URL;
710
import java.util.ArrayList;
8-
import java.util.Collections;
911
import java.util.List;
12+
import java.util.StringJoiner;
13+
import java.util.logging.Level;
14+
import java.util.logging.Logger;
1015
import java.util.stream.Collectors;
1116

1217
/**
1318
* <p>Holds a group of resource names (those displayed in the same GCDocument).</p>
14-
*
19+
* <p>
1520
* <p>This class was refactored from "URLSet".</p>
21+
*
1622
* @author <a href="mailto:[email protected]">Joerg Wuethrich</a>
17-
* <p>created on: 05.03.2014</p>
23+
* <p>created on: 05.03.2014</p>
1824
*/
1925
public class GCResourceGroup {
20-
21-
private List<GCResource> gcResourceList;
26+
private static final Logger logger = Logger.getLogger(GCResourceGroup.class.getName());
27+
public static final String RESOURCE_SEPARATOR = ";";
28+
public static final String SERIES_SEPARATOR = ">";
29+
private List<String> gcResourceList;
2230

2331
public GCResourceGroup(List<GCResource> gcResourceList) {
24-
this.gcResourceList = gcResourceList.stream()
25-
.map(gcResource -> new GcResourceFile(gcResource.getResourceName()))
26-
.collect(Collectors.toList());
32+
this.gcResourceList = gcResourceList.stream().map(this::getResourceUrlString).collect(Collectors.toList());
2733
}
28-
34+
2935
/**
30-
* Initialise a group from a single string consisting of resource names separated by ";"
31-
*
36+
* Initialise a group from a single string consisting of {@link GcResourceFile}s separated by "{@value RESOURCE_SEPARATOR}"
37+
* and contents of a {@link GcResourceSeries} separated by {@value SERIES_SEPARATOR}.
38+
*
3239
* @param resourceNameGroup resource names separated by ";"
3340
*/
3441
public GCResourceGroup(String resourceNameGroup) {
35-
if (resourceNameGroup.indexOf(";") >= 0) {
36-
setGCResourceList(resourceNameGroup.split(";"));
42+
String[] resources = resourceNameGroup.split(RESOURCE_SEPARATOR);
43+
gcResourceList = getResourceUrlString(resources);
44+
}
45+
46+
private List<String> getResourceUrlString(String[] resources) {
47+
List<String> urls = new ArrayList<>();
48+
for (String resource : resources) {
49+
String url = getResourceUrlString(resource);
50+
if (url != null) {
51+
urls.add(url);
52+
}
3753
}
38-
else {
39-
setGCResourceList(new String[]{ resourceNameGroup });
54+
return urls;
55+
}
56+
57+
private String getResourceUrlString(String resource) {
58+
URL url = null;
59+
try {
60+
if (resource.startsWith("http") || resource.startsWith("file")) {
61+
url = new URL(resource);
62+
}
63+
else {
64+
url = new File(resource).toURI().toURL();
65+
}
66+
4067
}
68+
catch (MalformedURLException ex) {
69+
logger.log(Level.WARNING, "Failed to determine URL of " + resource + ". Reason: " + ex.getMessage());
70+
logger.log(Level.FINER, "Details: ", ex);
71+
}
72+
return url != null ? url.toString() : null;
4173
}
42-
43-
@Override
44-
public boolean equals(Object obj) {
45-
if (this == obj)
46-
return true;
47-
if (obj == null)
48-
return false;
49-
if (getClass() != obj.getClass())
50-
return false;
51-
GCResourceGroup other = (GCResourceGroup) obj;
52-
if (gcResourceList == null) {
53-
if (other.gcResourceList != null)
54-
return false;
55-
} else if (!gcResourceList.equals(other.gcResourceList))
56-
return false;
57-
return true;
74+
75+
private String getResourceUrlString(GCResource gcResource) {
76+
if (gcResource instanceof GcResourceFile)
77+
return ((GcResourceFile) gcResource).getResourceNameAsUrlString();
78+
else if (gcResource instanceof GcResourceSeries) {
79+
StringJoiner joiner = new StringJoiner(SERIES_SEPARATOR);
80+
for (GCResource inner : ((GcResourceSeries) gcResource).getResourcesInOrder()) {
81+
joiner.add(((GcResourceFile) inner).getResourceNameAsUrlString());
82+
}
83+
return joiner.toString();
84+
}
85+
else
86+
throw new IllegalArgumentException("Unknown GCResource type!");
5887
}
5988

6089
/**
6190
* Get all resources names as an array of strings.
62-
*
91+
*
6392
* @return resource names as array of strings
6493
*/
6594
public List<GCResource> getGCResourceList() {
66-
return Collections.unmodifiableList(gcResourceList);
95+
List<GCResource> resources = new ArrayList<>();
96+
for (String entry : gcResourceList) {
97+
GCResource resource = getGcResource(entry);
98+
resources.add(resource);
99+
}
100+
101+
return resources;
102+
}
103+
104+
private GCResource getGcResource(String entry) {
105+
GCResource resource;
106+
if (entry.contains(SERIES_SEPARATOR)) {
107+
resource = getGcResourceSeries(entry);
108+
}
109+
else {
110+
resource = new GcResourceFile(entry);
111+
}
112+
return resource;
113+
}
114+
115+
private GCResource getGcResourceSeries(String entry) {
116+
GCResource resource;
117+
List<GCResource> series = new ArrayList<>();
118+
for (String s : entry.split(SERIES_SEPARATOR)) {
119+
series.add(new GcResourceFile(s));
120+
}
121+
122+
resource = new GcResourceSeries(series);
123+
return resource;
67124
}
68125

69126
/**
70127
* Get all resource names of the group formatted as URLs separated by a ";"
71-
*
128+
*
72129
* @return single string with all resource names separated by a ";"
73130
*/
74131
public String getUrlGroupString() {
75132
StringBuilder sb = new StringBuilder();
76-
for (GCResource gcResource : gcResourceList) {
77-
try {
78-
String url;
79-
if(gcResource instanceof GcResourceFile) {
80-
url = ((GcResourceFile) gcResource).getResourceNameAsUrl().toString();
81-
}
82-
else {
83-
// no URL available -> fallback
84-
url = gcResource.getResourceName();
85-
}
86-
sb.append(url).append(";");
87-
}
88-
catch (MalformedURLException e) {
89-
// ignore it
90-
}
133+
for (String resource : gcResourceList) {
134+
sb.append(resource).append(RESOURCE_SEPARATOR);
91135
}
92-
136+
93137
return sb.toString();
94138
}
95-
139+
96140
/**
97141
* Get short version of resource names (only file name without path), if more than one
98142
* resource is in this group.
99-
*
143+
*
100144
* @return get short group name (only file name without path), if there is more than one
101145
* resource
102146
*/
103147
public String getGroupStringShort() {
104148
if (gcResourceList.size() > 1) {
105149
StringBuilder sb = new StringBuilder();
106-
for (GCResource gcResource : gcResourceList) {
150+
for (String resourceName : gcResourceList) {
107151
// test for "/" and "\\" because in Windows you have a "/" in a http url
108152
// but "\\" in file strings
109-
String resourceName = gcResource.getResourceName();
110153
int lastIndexOfPathSeparator = resourceName.lastIndexOf("/");
111154
if (lastIndexOfPathSeparator < 0) {
112155
lastIndexOfPathSeparator = resourceName.lastIndexOf("\\");
@@ -116,36 +159,38 @@ public String getGroupStringShort() {
116159
return sb.toString();
117160
}
118161
else {
119-
GCResource singleResource = gcResourceList.get(0);
120-
if(singleResource instanceof GcResourceFile)
121-
{
122-
return ((GcResourceFile) singleResource).getResourceNameAsUrlString();
123-
}
124-
else
125-
// no URL available -> fallback
126-
return singleResource.getResourceName();
162+
return gcResourceList.get(0);
127163
}
128164
}
129-
165+
166+
@Override
167+
public boolean equals(Object obj) {
168+
if (this == obj)
169+
return true;
170+
if (obj == null)
171+
return false;
172+
if (getClass() != obj.getClass())
173+
return false;
174+
GCResourceGroup other = (GCResourceGroup) obj;
175+
if (gcResourceList == null) {
176+
if (other.gcResourceList != null)
177+
return false;
178+
}
179+
else if (!gcResourceList.equals(other.gcResourceList))
180+
return false;
181+
return true;
182+
}
183+
130184
@Override
131185
public int hashCode() {
132186
final int prime = 31;
133187
int result = 1;
134-
result = prime * result
135-
+ ((gcResourceList == null) ? 0 : gcResourceList.hashCode());
188+
result = prime * result + ((gcResourceList == null) ? 0 : gcResourceList.hashCode());
136189
return result;
137190
}
138191

139-
private void setGCResourceList(String[] resourceNames) {
140-
gcResourceList = new ArrayList<>();
141-
for (String resourceName : resourceNames) {
142-
gcResourceList.add(new GcResourceFile(resourceName));
143-
}
144-
}
145-
146192
@Override
147193
public String toString() {
148194
return "RecentGCResourceGroup [gcResourceList=" + gcResourceList + "]";
149195
}
150-
151196
}

0 commit comments

Comments
 (0)