22
33import com .tagtraum .perf .gcviewer .model .GCResource ;
44import com .tagtraum .perf .gcviewer .model .GcResourceFile ;
5+ import com .tagtraum .perf .gcviewer .model .GcResourceSeries ;
56
7+ import java .io .File ;
68import java .net .MalformedURLException ;
9+ import java .net .URL ;
710import java .util .ArrayList ;
8- import java .util .Collections ;
911import java .util .List ;
12+ import java .util .StringJoiner ;
13+ import java .util .logging .Level ;
14+ import java .util .logging .Logger ;
1015import 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 */
1925public 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