2
2
3
3
import com .tagtraum .perf .gcviewer .model .GCResource ;
4
4
import com .tagtraum .perf .gcviewer .model .GcResourceFile ;
5
+ import com .tagtraum .perf .gcviewer .model .GcResourceSeries ;
5
6
7
+ import java .io .File ;
6
8
import java .net .MalformedURLException ;
9
+ import java .net .URL ;
7
10
import java .util .ArrayList ;
8
- import java .util .Collections ;
9
11
import java .util .List ;
12
+ import java .util .StringJoiner ;
13
+ import java .util .logging .Level ;
14
+ import java .util .logging .Logger ;
10
15
import java .util .stream .Collectors ;
11
16
12
17
/**
13
18
* <p>Holds a group of resource names (those displayed in the same GCDocument).</p>
14
- *
19
+ * <p>
15
20
* <p>This class was refactored from "URLSet".</p>
21
+ *
16
22
* @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>
18
24
*/
19
25
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 ;
22
30
23
31
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 ());
27
33
}
28
-
34
+
29
35
/**
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
+ *
32
39
* @param resourceNameGroup resource names separated by ";"
33
40
*/
34
41
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
+ }
37
53
}
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
+
40
67
}
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 ;
41
73
}
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!" );
58
87
}
59
88
60
89
/**
61
90
* Get all resources names as an array of strings.
62
- *
91
+ *
63
92
* @return resource names as array of strings
64
93
*/
65
94
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 ;
67
124
}
68
125
69
126
/**
70
127
* Get all resource names of the group formatted as URLs separated by a ";"
71
- *
128
+ *
72
129
* @return single string with all resource names separated by a ";"
73
130
*/
74
131
public String getUrlGroupString () {
75
132
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 );
91
135
}
92
-
136
+
93
137
return sb .toString ();
94
138
}
95
-
139
+
96
140
/**
97
141
* Get short version of resource names (only file name without path), if more than one
98
142
* resource is in this group.
99
- *
143
+ *
100
144
* @return get short group name (only file name without path), if there is more than one
101
145
* resource
102
146
*/
103
147
public String getGroupStringShort () {
104
148
if (gcResourceList .size () > 1 ) {
105
149
StringBuilder sb = new StringBuilder ();
106
- for (GCResource gcResource : gcResourceList ) {
150
+ for (String resourceName : gcResourceList ) {
107
151
// test for "/" and "\\" because in Windows you have a "/" in a http url
108
152
// but "\\" in file strings
109
- String resourceName = gcResource .getResourceName ();
110
153
int lastIndexOfPathSeparator = resourceName .lastIndexOf ("/" );
111
154
if (lastIndexOfPathSeparator < 0 ) {
112
155
lastIndexOfPathSeparator = resourceName .lastIndexOf ("\\ " );
@@ -116,36 +159,38 @@ public String getGroupStringShort() {
116
159
return sb .toString ();
117
160
}
118
161
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 );
127
163
}
128
164
}
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
+
130
184
@ Override
131
185
public int hashCode () {
132
186
final int prime = 31 ;
133
187
int result = 1 ;
134
- result = prime * result
135
- + ((gcResourceList == null ) ? 0 : gcResourceList .hashCode ());
188
+ result = prime * result + ((gcResourceList == null ) ? 0 : gcResourceList .hashCode ());
136
189
return result ;
137
190
}
138
191
139
- private void setGCResourceList (String [] resourceNames ) {
140
- gcResourceList = new ArrayList <>();
141
- for (String resourceName : resourceNames ) {
142
- gcResourceList .add (new GcResourceFile (resourceName ));
143
- }
144
- }
145
-
146
192
@ Override
147
193
public String toString () {
148
194
return "RecentGCResourceGroup [gcResourceList=" + gcResourceList + "]" ;
149
195
}
150
-
151
196
}
0 commit comments