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}