001// License: GPL. For details, see Readme.txt file. 002package org.openstreetmap.gui.jmapviewer; 003 004import java.awt.Desktop; 005import java.awt.image.BufferedImage; 006import java.io.IOException; 007import java.net.URI; 008import java.net.URISyntaxException; 009import java.net.URL; 010import java.text.MessageFormat; 011import java.util.Objects; 012import java.util.logging.Logger; 013 014import javax.imageio.ImageIO; 015 016public final class FeatureAdapter { 017 018 private static BrowserAdapter browserAdapter = new DefaultBrowserAdapter(); 019 private static ImageAdapter imageAdapter = new DefaultImageAdapter(); 020 private static TranslationAdapter translationAdapter = new DefaultTranslationAdapter(); 021 private static LoggingAdapter loggingAdapter = new DefaultLoggingAdapter(); 022 023 private FeatureAdapter() { 024 // private constructor for utility classes 025 } 026 027 public interface BrowserAdapter { 028 void openLink(String url); 029 } 030 031 public interface TranslationAdapter { 032 String tr(String text, Object... objects); 033 // TODO: more i18n functions 034 } 035 036 public interface LoggingAdapter { 037 Logger getLogger(String name); 038 } 039 040 public interface ImageAdapter { 041 BufferedImage read(URL input, boolean readMetadata, boolean enforceTransparency) throws IOException; 042 } 043 044 public static void registerBrowserAdapter(BrowserAdapter browserAdapter) { 045 FeatureAdapter.browserAdapter = Objects.requireNonNull(browserAdapter); 046 } 047 048 public static void registerImageAdapter(ImageAdapter imageAdapter) { 049 FeatureAdapter.imageAdapter = Objects.requireNonNull(imageAdapter); 050 } 051 052 public static void registerTranslationAdapter(TranslationAdapter translationAdapter) { 053 FeatureAdapter.translationAdapter = Objects.requireNonNull(translationAdapter); 054 } 055 056 public static void registerLoggingAdapter(LoggingAdapter loggingAdapter) { 057 FeatureAdapter.loggingAdapter = Objects.requireNonNull(loggingAdapter); 058 } 059 060 public static void openLink(String url) { 061 browserAdapter.openLink(url); 062 } 063 064 public static BufferedImage readImage(URL url) throws IOException { 065 return imageAdapter.read(url, false, false); 066 } 067 068 public static String tr(String text, Object... objects) { 069 return translationAdapter.tr(text, objects); 070 } 071 072 public static Logger getLogger(String name) { 073 return loggingAdapter.getLogger(name); 074 } 075 076 public static class DefaultBrowserAdapter implements BrowserAdapter { 077 @Override 078 public void openLink(String url) { 079 if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { 080 try { 081 Desktop.getDesktop().browse(new URI(url)); 082 } catch (IOException e) { 083 e.printStackTrace(); 084 } catch (URISyntaxException e) { 085 e.printStackTrace(); 086 } 087 } else { 088 System.err.println(tr("Opening link not supported on current platform (''{0}'')", url)); 089 } 090 } 091 } 092 093 public static class DefaultImageAdapter implements ImageAdapter { 094 @Override 095 public BufferedImage read(URL input, boolean readMetadata, boolean enforceTransparency) throws IOException { 096 return ImageIO.read(input); 097 } 098 } 099 100 public static class DefaultTranslationAdapter implements TranslationAdapter { 101 @Override 102 public String tr(String text, Object... objects) { 103 return MessageFormat.format(text, objects); 104 } 105 } 106 107 public static class DefaultLoggingAdapter implements LoggingAdapter { 108 @Override 109 public Logger getLogger(String name) { 110 return Logger.getLogger(name); 111 } 112 } 113}