1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
// Copyright (C) 2001-2003 Jon A. Maxwell (JAM)
// Copyright (C) 2009 Red Hat, Inc.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
package net.sourceforge.jnlp;
import java.net.*;
import java.util.*;
/**
* The information element.<p>
*
* @author <a href="mailto:jmaxwell@users.sourceforge.net">Jon A. Maxwell (JAM)</a> - initial author
* @version $Revision: 1.9 $
*/
public class InformationDesc {
// There is an understanding between this class and the parser
// that description and icon types are keyed by "icon-"+kind and
// "description-"+kind, and that other types are keyed by their
// specification name.
/** one-line description */
/**http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html**/
public static final Object ONE_LINE = "one-line";
/** short description */
public static final Object SHORT = "short";
/** tooltip description */
public static final Object TOOLTIP = "tooltip";
/** default description */
public static final Object DEFAULT = "default";
/** the locales for the information */
private Locale locales[];
/** the data as list of key,value pairs */
private List<Object> info;
/**
* Create an information element object.
*
* @param locales the locales the information is for
*/
public InformationDesc(Locale locales[]) {
this.locales = locales;
}
/**
* Returns the application's title.
*/
public String getTitle() {
return (String) getItem("title");
}
/**
* Returns the application's vendor.
*/
public String getVendor() {
return (String) getItem("vendor");
}
/**
* Returns the application's homepage.
*/
public URL getHomepage() {
return (URL) getItem("homepage");
}
/**
* Returns the default description for the application.
*/
public String getDescription() {
String result = getDescription(DEFAULT);
// try to find any description if default is null
if (result == null)
result = getDescription(ONE_LINE);
if (result == null)
result = getDescription(SHORT);
if (result == null)
result = getDescription(TOOLTIP);
return result;
}
/**
* Returns the application's description of the specified type.
*
* @param kind one of Information.SHORT, Information.ONE_LINE,
* Information.TOOLTIP, Information.DEFAULT
*/
public String getDescription(Object kind) {
String result = getDescriptionStrict(kind);
if (result == null)
return (String) getItem("description-" + DEFAULT);
else
return result;
}
/**
* Returns the application's description of the specified type.
*
* @param kind one of Information.SHORT, Information.ONE_LINE,
* Information.TOOLTIP, Information.DEFAULT
*/
public String getDescriptionStrict(Object kind) {
return (String) getItem("description-" + kind);
}
/**
* Returns the icons specified by the JNLP file.
*
* @param kind one of IconDesc.SELECTED, IconDesc.DISABLED,
* IconDesc.ROLLOVER, IconDesc.SPLASH, IconDesc.DEFAULT
* @return an array of zero of more IconDescs of the specified icon type
*/
public IconDesc[] getIcons(Object kind) {
List<Object> icons = getItems("icon-" + kind);
return icons.toArray(new IconDesc[icons.size()]);
};
/**
* Returns the URL of the icon closest to the specified size and
* kind. This method will not return an icon smaller than the
* specified width and height unless there are no other icons
* available.
*
* @param kind the kind of icon to get
* @param width desired width of icon
* @param height desired height of icon
* @return the closest icon by size or null if no icons declared
*/
public URL getIconLocation(Object kind, int width, int height) {
IconDesc icons[] = getIcons(kind);
if (icons.length == 0)
return null;
IconDesc best = null;
for (int i = 0; i < icons.length; i++) {
if (icons[i].getWidth() >= width &&
icons[i].getHeight() >= height) {
if (best == null)
best = icons[i];
if (icons[i].getWidth() <= best.getWidth() && // Use <= so last specified of
icons[i].getHeight() <= best.getHeight()) // equivalent icons is chosen.
best = icons[i];
}
}
// FIXME if there's no larger icon, choose the closest smaller icon
// instead of the first
if (best == null)
best = icons[0];
return best.getLocation();
}
/**
* Returns the locales for the information.
*/
public Locale[] getLocales() {
return locales;
}
/**
* Returns whether offline execution allowed.
*/
public boolean isOfflineAllowed() {
return null != getItem("offline-allowed");
}
/**
* Returns whether the resources specified in the JNLP file may
* be shared by more than one instance in the same JVM
* (JNLP extension). This is an extension to the JNLP spec and
* will always return false for standard JNLP files.
*/
public boolean isSharingAllowed() {
return null != getItem("sharing-allowed");
}
/**
* Returns the associations specified in the JNLP file
*/
public AssociationDesc[] getAssociations() {
List<Object> associations = getItems("association");
return associations.toArray(new AssociationDesc[associations.size()]);
}
/**
* Returns the shortcut specified by this JNLP file
*/
public ShortcutDesc getShortcut() {
return (ShortcutDesc) getItem("shortcut");
}
/**
* Returns the related-contents specified by this JNLP file
*/
public RelatedContentDesc[] getRelatedContents() {
List<Object> relatedContents = getItems("related-content");
return relatedContents.toArray(new RelatedContentDesc[relatedContents.size()]);
}
/**
* Returns the last item matching the specified key.
*/
protected Object getItem(Object key) {
List<Object> items = getItems(key);
if (items.size() == 0)
return null;
else
return items.get(items.size() - 1);
}
/**
* Returns all items matching the specified key.
*/
protected List<Object> getItems(Object key) {
if (info == null)
return Collections.emptyList();
List<Object> result = new ArrayList<Object>();
for (int i = 0; i < info.size(); i += 2)
if (info.get(i).equals(key))
result.add(info.get(i + 1));
return result;
}
/**
* Add an information item (description, icon, etc) under a
* specified key name.
*/
protected void addItem(String key, Object value) {
if (info == null)
info = new ArrayList<Object>();
info.add(key);
info.add(value);
}
}
|