- Timestamp:
- 2015-05-10T13:27:54+02:00 (10 years ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/data/maps.xsd
r8063 r8344 671 671 </xs:complexType> 672 672 </xs:element> 673 <xs:element name="no-tile-header" minOccurs="0" maxOccurs="unbounded"> 674 <xs:complexType> 675 <xs:attribute name="name" type="xs:string" /> 676 <xs:attribute name="value" type="xs:string" /> 677 </xs:complexType> 678 </xs:element> 673 679 </xs:choice> 674 680 </xs:sequence> -
trunk/src/org/openstreetmap/josm/data/Preferences.java
r8339 r8344 14 14 import java.io.PrintWriter; 15 15 import java.io.Reader; 16 import java.io.StringReader; 17 import java.io.StringWriter; 16 18 import java.lang.annotation.Retention; 17 19 import java.lang.annotation.RetentionPolicy; … … 22 24 import java.util.Collection; 23 25 import java.util.Collections; 26 import java.util.HashMap; 24 27 import java.util.HashSet; 25 28 import java.util.Iterator; … … 38 41 import java.util.regex.Pattern; 39 42 43 import javax.json.Json; 44 import javax.json.JsonObject; 45 import javax.json.JsonObjectBuilder; 46 import javax.json.JsonReader; 47 import javax.json.JsonValue; 48 import javax.json.JsonWriter; 40 49 import javax.swing.JOptionPane; 41 50 import javax.swing.UIManager; … … 1266 1275 } 1267 1276 1277 @SuppressWarnings("rawtypes") 1278 private static String mapToJson(Map map) { 1279 StringWriter stringWriter = new StringWriter(); 1280 try (JsonWriter writer = Json.createWriter(stringWriter)) { 1281 JsonObjectBuilder object = Json.createObjectBuilder(); 1282 for(Object o: map.entrySet()) { 1283 Entry e = (Entry) o; 1284 object.add(e.getKey().toString(), e.getValue().toString()); 1285 } 1286 writer.writeObject(object.build()); 1287 } 1288 return stringWriter.toString(); 1289 } 1290 1291 @SuppressWarnings({ "rawtypes", "unchecked" }) 1292 private static Map mapFromJson(String s) { 1293 Map ret = null; 1294 try (JsonReader reader = Json.createReader(new StringReader(s))) { 1295 JsonObject object = reader.readObject(); 1296 ret = new HashMap(object.size()); 1297 for (Entry<String, JsonValue> e: object.entrySet()) { 1298 ret.put(e.getKey(), e.getValue().toString()); 1299 } 1300 } 1301 return ret; 1302 } 1303 1268 1304 public static <T> Map<String,String> serializeStruct(T struct, Class<T> klass) { 1269 1305 T structPrototype; … … 1285 1321 if (fieldValue != null) { 1286 1322 if (f.getAnnotation(writeExplicitly.class) != null || !Objects.equals(fieldValue, defaultFieldValue)) { 1287 hash.put(f.getName().replace("_", "-"), fieldValue.toString()); 1323 String key = f.getName().replace("_", "-"); 1324 if (fieldValue instanceof Map) { 1325 hash.put(key, mapToJson((Map) fieldValue)); 1326 } else { 1327 hash.put(key, fieldValue.toString()); 1328 } 1288 1329 } 1289 1330 } … … 1332 1373 } else if (f.getType() == String.class) { 1333 1374 value = key_value.getValue(); 1334 } else 1375 } else if (f.getType().isAssignableFrom(Map.class)) { 1376 value = mapFromJson(key_value.getValue()); 1377 } 1378 else 1335 1379 throw new RuntimeException("unsupported preference primitive type"); 1336 1380 -
trunk/src/org/openstreetmap/josm/data/cache/BufferedImageCacheEntry.java
r8168 r8344 43 43 return img; 44 44 byte[] content = getContent(); 45 if (content != null) { 45 if (content != null && content.length > 0) { 46 46 img = ImageIO.read(new ByteArrayInputStream(content)); 47 47 -
trunk/src/org/openstreetmap/josm/data/cache/ICachedLoaderListener.java
r8176 r8344 20 20 * 21 21 * @param data 22 * @param attributes 22 23 * @param result 23 24 */ 24 public void loadingFinished(CacheEntry data, LoadResult result); 25 public void loadingFinished(CacheEntry data, CacheEntryAttributes attributes, LoadResult result); 25 26 26 27 } -
trunk/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
r8326 r8344 10 10 import java.net.URLConnection; 11 11 import java.util.HashSet; 12 import java.util.List; 12 13 import java.util.Map; 13 14 import java.util.Random; … … 224 225 * @return cache object as empty, regardless of what remote resource has returned (ex. based on headers) 225 226 */ 226 protected boolean cacheAsEmpty() { 227 protected boolean cacheAsEmpty(Map<String, List<String>> headers, int statusCode, byte[] content) { 227 228 return false; 228 229 } … … 280 281 try { 281 282 for (ICachedLoaderListener l: listeners) { 282 l.loadingFinished(cacheData, result); 283 l.loadingFinished(cacheData, attributes, result); 283 284 } 284 285 } catch (Exception e) { … … 286 287 Main.warn(e); 287 288 for (ICachedLoaderListener l: listeners) { 288 l.loadingFinished(cacheData, LoadResult.FAILURE); 289 l.loadingFinished(cacheData, attributes, LoadResult.FAILURE); 289 290 } 290 291 … … 329 330 return true; 330 331 } 331 URLConnection urlConn = getURLConnection(); 332 HttpURLConnection urlConn = getURLConnection(); 332 333 333 334 if (isObjectLoadable() && … … 338 339 urlConn.addRequestProperty("If-None-Match", attributes.getEtag()); 339 340 } 340 if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 304) {341 if (urlConn.getResponseCode() == 304) { 341 342 // If isModifiedSince or If-None-Match has been set 342 343 // and the server answers with a HTTP 304 = "Not Modified" … … 359 360 360 361 for (int i = 0; i < 5; ++i) { 361 if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 503) {362 if (urlConn.getResponseCode() == 503) { 362 363 Thread.sleep(5000+(new Random()).nextInt(5000)); 363 364 continue; … … 365 366 byte[] raw = read(urlConn); 366 367 367 if (!cacheAsEmpty() && raw != null && raw.length > 0) { 368 if (!cacheAsEmpty(urlConn.getHeaderFields(), urlConn.getResponseCode(), raw) && 369 raw != null && raw.length > 0) { 368 370 cacheData = createCacheEntry(raw); 369 371 cache.put(getCacheKey(), cacheData, attributes); … … 400 402 private CacheEntryAttributes parseHeaders(URLConnection urlConn) { 401 403 CacheEntryAttributes ret = new CacheEntryAttributes(); 402 ret.setNoTileAtZoom("no-tile".equals(urlConn.getHeaderField("X-VE-Tile-Info")));403 404 404 405 Long lng = urlConn.getExpiration(); -
trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
r8093 r8344 10 10 import java.util.Collections; 11 11 import java.util.List; 12 import java.util.Map; 12 13 import java.util.Objects; 13 14 import java.util.TreeSet; … … 21 22 import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTileSource; 22 23 import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource.Mapnik; 24 import org.openstreetmap.gui.jmapviewer.tilesources.TileSourceInfo; 23 25 import org.openstreetmap.josm.Main; 24 26 import org.openstreetmap.josm.data.Bounds; … … 35 37 * @author Frederik Ramm 36 38 */ 37 public class ImageryInfo implements Comparable<ImageryInfo>, Attributed { 39 public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInfo>, Attributed { 38 40 39 41 /** … … 53 55 /** A WMS endpoint entry only stores the WMS server info, without layer, which are chosen later by the user. **/ 54 56 WMS_ENDPOINT("wms_endpoint"); 57 55 58 56 59 private final String typeString; … … 151 154 } 152 155 153 /** name of the imagery entry (gets translated by josm usually) */ 154 private String name; 156 155 157 /** original name of the imagery entry in case of translation call, for multiple languages English when possible */ 156 158 private String origName; 157 159 /** (original) language of the translated name entry */ 158 160 private String langName; 159 /** id for this imagery entry, optional at the moment */160 private String id;161 /** URL of the imagery service */162 private String url = null;163 161 /** whether this is a entry activated by default or not */ 164 162 private boolean defaultEntry = false; … … 199 197 private String icon; 200 198 // when adding a field, also adapt the ImageryInfo(ImageryInfo) constructor 199 private Map<String, String> noTileHeaders; 201 200 202 201 /** … … 225 224 @pref String icon; 226 225 @pref String description; 226 @pref Map<String, String> noTileHeaders; 227 227 228 228 /** … … 278 278 projections = val.toString(); 279 279 } 280 if (i.noTileHeaders != null && !i.noTileHeaders.isEmpty()) { 281 noTileHeaders = i.noTileHeaders; 282 } 280 283 } 281 284 … … 295 298 */ 296 299 public ImageryInfo() { 300 super(); 297 301 } 298 302 … … 302 306 */ 303 307 public ImageryInfo(String name) { 304 this.name=name;308 super(name); 305 309 } 306 310 … … 311 315 */ 312 316 public ImageryInfo(String name, String url) { 313 this .name=name;317 this(name); 314 318 setExtendedUrl(url); 315 319 } … … 322 326 */ 323 327 public ImageryInfo(String name, String url, String eulaAcceptanceRequired) { 324 this .name=name;328 this(name); 325 329 setExtendedUrl(url); 326 330 this.eulaAcceptanceRequired = eulaAcceptanceRequired; … … 337 341 */ 338 342 public ImageryInfo(String name, String url, String type, String eulaAcceptanceRequired, String cookies) { 339 this .name=name;343 this(name); 340 344 setExtendedUrl(url); 341 345 ImageryType t = ImageryType.fromString(type); … … 347 351 throw new IllegalArgumentException("unknown type: "+type); 348 352 } 353 } 354 355 public ImageryInfo(String name, String url, String type, String eulaAcceptanceRequired, String cookies, String id) { 356 this(name, url, type, eulaAcceptanceRequired, cookies); 357 setId(id); 349 358 } 350 359 … … 390 399 countryCode = e.country_code; 391 400 icon = e.icon; 401 if (e.noTileHeaders != null) { 402 noTileHeaders = e.noTileHeaders; 403 } 392 404 } 393 405 … … 688 700 * @return The entry name 689 701 */ 702 @Override 690 703 public String getName() { 691 704 return this.name; … … 759 772 * @return The entry URL 760 773 */ 774 @Override 761 775 public String getUrl() { 762 776 return this.url; … … 791 805 * @return the cookie data part 792 806 */ 807 @Override 793 808 public String getCookies() { 794 809 return this.cookies; … … 803 818 * @return The maximum zoom level 804 819 */ 820 @Override 805 821 public int getMaxZoom() { 806 822 return this.defaultMaxZoom; … … 811 827 * @return The minimum zoom level 812 828 */ 829 @Override 813 830 public int getMinZoom() { 814 831 return this.defaultMinZoom; … … 1026 1043 return capabilities != null && capabilities.isOnImageryBlacklist(this.url); 1027 1044 } 1045 1046 public void setNoTileHeaders(Map<String, String> noTileHeaders) { 1047 this.noTileHeaders = noTileHeaders; 1048 } 1049 1050 @Override 1051 public Map<String, String> getNoTileHeaders() { 1052 return noTileHeaders; 1053 } 1028 1054 } -
trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
r8130 r8344 149 149 Collection<String> newKnownDefaults = new TreeSet<>(knownDefaults); 150 150 for (ImageryInfo def : defaultLayers) { 151 // temporary migration code, so all user preferences will get updated with new settings from JOSM site (can be removed ~Dez. 2015) 152 if (def.getNoTileHeaders() != null) { 153 for (ImageryInfo i: layers) { 154 if (isSimilar(def, i)) { 155 i.setNoTileHeaders(def.getNoTileHeaders()); 156 changed = true; 157 } 158 } 159 } 160 151 161 if (def.isDefaultEntry()) { 152 162 boolean isKnownDefault = false; -
trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
r8326 r8344 6 6 import java.net.URL; 7 7 import java.util.HashSet; 8 import java.util.List; 8 9 import java.util.Map; 9 10 import java.util.Set; … … 27 28 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry; 28 29 import org.openstreetmap.josm.data.cache.CacheEntry; 30 import org.openstreetmap.josm.data.cache.CacheEntryAttributes; 29 31 import org.openstreetmap.josm.data.cache.ICachedLoaderListener; 30 32 import org.openstreetmap.josm.data.cache.JCSCachedTileLoaderJob; … … 194 196 byte[] content = cacheData.getContent(); 195 197 try { 196 return content != null || cacheData.getImage() != null || cacheAsEmpty();198 return content != null || cacheData.getImage() != null || isNoTileAtZoom(); 197 199 } catch (IOException e) { 198 200 log.log(Level.WARNING, "JCS TMS - error loading from cache for tile {0}: {1}", new Object[] {tile.getKey(), e.getMessage()}); … … 203 205 204 206 private boolean isNoTileAtZoom() { 207 if (attributes == null) { 208 log.warning("Cache attributes are null"); 209 } 205 210 return attributes != null && attributes.isNoTileAtZoom(); 206 211 } 207 212 208 213 @Override 209 protected boolean cacheAsEmpty() { 210 return isNoTileAtZoom(); 214 protected boolean cacheAsEmpty(Map<String, List<String>> headers, int statusCode, byte[] content) { 215 if (tile.getTileSource().isNoTileAtZoom(headers, statusCode, content)) { 216 attributes.setNoTileAtZoom(true); 217 return true; 218 } 219 return false; 211 220 } 212 221 … … 242 251 243 252 @Override 244 public void loadingFinished(CacheEntry object, LoadResult result) { 253 public void loadingFinished(CacheEntry object, CacheEntryAttributes attributes, LoadResult result) { 254 this.attributes = attributes; // as we might get notification from other object than our selfs, pass attributes along 245 255 Set<TileLoaderListener> listeners; 246 256 synchronized (inProgress) { … … 316 326 @Override 317 327 protected boolean handleNotFound() { 318 tile.setError("No tile at this zoom level"); 319 tile.putValue("tile-info", "no-tile"); 320 return true; 328 if (tile.getSource().isNoTileAtZoom(null, 404, null)) { 329 tile.setError("No tile at this zoom level"); 330 tile.putValue("tile-info", "no-tile"); 331 return true; 332 } 333 return false; 321 334 } 322 335 -
trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
r8318 r8344 278 278 private static class CachedAttributionBingAerialTileSource extends BingAerialTileSource { 279 279 280 public CachedAttributionBingAerialTileSource( String id) {281 super(i d);280 public CachedAttributionBingAerialTileSource(ImageryInfo info) { 281 super(info); 282 282 } 283 283 … … 337 337 if (info.getImageryType() == ImageryType.TMS) { 338 338 checkUrl(info.getUrl()); 339 TMSTileSource t = new TemplatedTMSTileSource(info.getName(), info.getUrl(), info.getId(), info.getMinZoom(), info.getMaxZoom(), 340 info.getCookies()); 339 TMSTileSource t = new TemplatedTMSTileSource(info); 341 340 info.setAttribution(t); 342 341 return t; 343 } else if (info.getImageryType() == ImageryType.BING) 344 return new CachedAttributionBingAerialTileSource(info.getId()); 345 else if (info.getImageryType() == ImageryType.SCANEX) { 346 return new ScanexTileSource(info.getName(), info.getUrl(), info.getId(), info.getMaxZoom()); 342 } else if (info.getImageryType() == ImageryType.BING) { 343 //return new CachedAttributionBingAerialTileSource(info.getId()); 344 return new CachedAttributionBingAerialTileSource(info); 345 } else if (info.getImageryType() == ImageryType.SCANEX) { 346 //return new ScanexTileSource(info.getName(), info.getUrl(), info.getId(), info.getMaxZoom()); 347 return new ScanexTileSource(info); 347 348 } 348 349 return null; -
trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
r8287 r8344 6 6 import java.util.ArrayList; 7 7 import java.util.Arrays; 8 import java.util.HashMap; 8 9 import java.util.List; 10 import java.util.Map; 9 11 import java.util.Objects; 10 12 import java.util.Stack; … … 39 41 BOUNDS, 40 42 SHAPE, 43 NO_TILE, 41 44 UNKNOWN, // element is not recognized in the current context 42 45 } … … 84 87 private String lang; 85 88 private List<String> projections; 89 private Map<String, String> noTileHeaders; 86 90 87 91 @Override … … 95 99 bounds = null; 96 100 projections = null; 101 noTileHeaders = null; 97 102 } 98 103 … … 150 155 projections = new ArrayList<>(); 151 156 newState = State.PROJECTIONS; 157 } else if ("no-tile-header".equals(qName)) { 158 noTileHeaders = new HashMap<>(); 159 noTileHeaders.put(atts.getValue("name"), atts.getValue("value")); 160 newState = State.NO_TILE; 152 161 } 153 162 break; … … 308 317 projections = null; 309 318 break; 319 case NO_TILE: 320 entry.setNoTileHeaders(noTileHeaders); 321 noTileHeaders = null; 322 break; 323 310 324 } 311 325 }
Note:
See TracChangeset
for help on using the changeset viewer.