Ignore:
Timestamp:
2018-04-19T20:37:16+02:00 (19 months ago)
Author:
Don-vip
Message:

see #16204 - Allow to start and close JOSM in WebStart sandbox mode (where every external access is denied). This was very useful to reproduce some very tricky bugs that occured in real life but were almost impossible to diagnose.

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/GettingStarted.java

    r12846 r13647  
    3333import org.openstreetmap.josm.tools.Logging;
    3434import org.openstreetmap.josm.tools.OpenBrowser;
     35import org.openstreetmap.josm.tools.Utils;
    3536import org.openstreetmap.josm.tools.WikiReader;
    3637
     
    8586
    8687        private final int myVersion = Version.getInstance().getVersion();
    87         private final String myJava = System.getProperty("java.version");
     88        private final String myJava = Utils.getSystemProperty("java.version");
    8889        private final String myLang = LanguageInfo.getWikiLanguagePrefix();
    8990
  • trunk/src/org/openstreetmap/josm/gui/MainApplication.java

    r13445 r13647  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55import static org.openstreetmap.josm.tools.I18n.trn;
     6import static org.openstreetmap.josm.tools.Utils.getSystemProperty;
    67
    78import java.awt.BorderLayout;
     
    357358            ed.setIcon(JOptionPane.WARNING_MESSAGE);
    358359            StringBuilder content = new StringBuilder(tr("You are running version {0} of Java.",
    359                     "<b>"+System.getProperty("java.version")+"</b>")).append("<br><br>");
    360             if ("Sun Microsystems Inc.".equals(System.getProperty("java.vendor")) && !platform.isOpenJDK()) {
     360                    "<b>"+getSystemProperty("java.version")+"</b>")).append("<br><br>");
     361            if ("Sun Microsystems Inc.".equals(getSystemProperty("java.vendor")) && !platform.isOpenJDK()) {
    361362                content.append("<b>").append(tr("This version is no longer supported by {0} since {1} and is not recommended for use.",
    362363                        "Oracle", eolDate)).append("</b><br><br>");
     
    421422                    try {
    422423                        OsmApi.getOsmApi().initialize(null, true);
    423                     } catch (OsmTransferCanceledException | OsmApiInitializationException e) {
     424                    } catch (OsmTransferCanceledException | OsmApiInitializationException | SecurityException e) {
    424425                        Logging.warn(Logging.getErrorMessage(Utils.getRootCause(e)));
    425426                    }
     
    485486    protected void shutdown() {
    486487        if (!GraphicsEnvironment.isHeadless()) {
    487             worker.shutdown();
     488            try {
     489                worker.shutdown();
     490            } catch (SecurityException e) {
     491                Logging.log(Logging.LEVEL_ERROR, "Unable to shutdown worker", e);
     492            }
    488493            JCSCacheManager.shutdown();
    489494        }
     
    498503        super.shutdown();
    499504        if (!GraphicsEnvironment.isHeadless()) {
    500             worker.shutdownNow();
     505            try {
     506                worker.shutdownNow();
     507            } catch (SecurityException e) {
     508                Logging.log(Logging.LEVEL_ERROR, "Unable to shutdown worker", e);
     509            }
    501510        }
    502511    }
     
    872881        I18n.set(language.orElse(null));
    873882
    874         Policy.setPolicy(new Policy() {
    875             // Permissions for plug-ins loaded when josm is started via webstart
    876             private PermissionCollection pc;
    877 
    878             {
    879                 pc = new Permissions();
    880                 pc.add(new AllPermission());
    881             }
    882 
    883             @Override
    884             public PermissionCollection getPermissions(CodeSource codesource) {
    885                 return pc;
    886             }
    887         });
    888 
    889         Thread.setDefaultUncaughtExceptionHandler(new BugReportExceptionHandler());
     883        try {
     884            Policy.setPolicy(new Policy() {
     885                // Permissions for plug-ins loaded when josm is started via webstart
     886                private PermissionCollection pc;
     887
     888                {
     889                    pc = new Permissions();
     890                    pc.add(new AllPermission());
     891                }
     892
     893                @Override
     894                public PermissionCollection getPermissions(CodeSource codesource) {
     895                    return pc;
     896                }
     897            });
     898        } catch (SecurityException e) {
     899            Logging.log(Logging.LEVEL_ERROR, "Unable to set permissions", e);
     900        }
     901
     902        try {
     903            Thread.setDefaultUncaughtExceptionHandler(new BugReportExceptionHandler());
     904        } catch (SecurityException e) {
     905            Logging.log(Logging.LEVEL_ERROR, "Unable to set uncaught exception handler", e);
     906        }
    890907
    891908        // initialize the platform hook, and
     
    917934        }
    918935
    919         Main.pref.init(args.hasOption(Option.RESET_PREFERENCES));
     936        try {
     937            Main.pref.init(args.hasOption(Option.RESET_PREFERENCES));
     938        } catch (SecurityException e) {
     939            Logging.log(Logging.LEVEL_ERROR, "Unable to initialize preferences", e);
     940        }
    920941
    921942        args.getPreferencesToSet().forEach(Main.pref::put);
     
    9791000            Logging.warn(Logging.getErrorMessage(Utils.getRootCause(ex)));
    9801001        }
    981         Authenticator.setDefault(DefaultAuthenticator.getInstance());
    982         DefaultProxySelector proxySelector = new DefaultProxySelector(ProxySelector.getDefault());
    983         ProxySelector.setDefault(proxySelector);
     1002        try {
     1003            Authenticator.setDefault(DefaultAuthenticator.getInstance());
     1004        } catch (SecurityException e) {
     1005            Logging.log(Logging.LEVEL_ERROR, "Unable to set default authenticator", e);
     1006        }
     1007        DefaultProxySelector proxySelector = null;
     1008        try {
     1009            proxySelector = new DefaultProxySelector(ProxySelector.getDefault());
     1010        } catch (SecurityException e) {
     1011            Logging.log(Logging.LEVEL_ERROR, "Unable to get default proxy selector", e);
     1012        }
     1013        try {
     1014            if (proxySelector != null) {
     1015                ProxySelector.setDefault(proxySelector);
     1016            }
     1017        } catch (SecurityException e) {
     1018            Logging.log(Logging.LEVEL_ERROR, "Unable to set default proxy selector", e);
     1019        }
    9841020        OAuthAccessTokenHolder.getInstance().init(CredentialsManager.getInstance());
    9851021
     
    10931129            } catch (ReflectiveOperationException | RuntimeException e) { // NOPMD
    10941130                // Catch RuntimeException in order to catch InaccessibleObjectException, new in Java 9
    1095                 Logging.warn(e);
     1131                Logging.log(Logging.LEVEL_WARN, null, e);
    10961132            }
    10971133        }
     
    11201156        // Workaround for JDK-8180379: crash on Windows 10 1703 with Windows L&F and java < 8u141 / 9+172
    11211157        // To remove during Java 9 migration
    1122         if (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows 10") &&
     1158        if (getSystemProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows 10") &&
    11231159                platform.getDefaultStyle().equals(LafPreference.LAF.get())) {
    11241160            try {
     
    11351171            } catch (NumberFormatException | ReflectiveOperationException | JosmRuntimeException e) {
    11361172                Logging.error(e);
     1173            } catch (ExceptionInInitializerError e) {
     1174                Logging.log(Logging.LEVEL_ERROR, null, e);
    11371175            }
    11381176        }
     
    11961234        }
    11971235
    1198         UIManager.put("OptionPane.okIcon", ImageProvider.get("ok"));
     1236        UIManager.put("OptionPane.okIcon", ImageProvider.getIfAvailable("ok"));
    11991237        UIManager.put("OptionPane.yesIcon", UIManager.get("OptionPane.okIcon"));
    1200         UIManager.put("OptionPane.cancelIcon", ImageProvider.get("cancel"));
     1238        UIManager.put("OptionPane.cancelIcon", ImageProvider.getIfAvailable("cancel"));
    12011239        UIManager.put("OptionPane.noIcon", UIManager.get("OptionPane.cancelIcon"));
    12021240        // Ensures caret color is the same than text foreground color, see #12257
     
    12281266
    12291267        monitor.indeterminateSubTask(tr("Installing updated plugins"));
    1230         PluginHandler.installDownloadedPlugins(pluginsToLoad, true);
     1268        try {
     1269            PluginHandler.installDownloadedPlugins(pluginsToLoad, true);
     1270        } catch (SecurityException e) {
     1271            Logging.log(Logging.LEVEL_ERROR, "Unable to install plugins", e);
     1272        }
    12311273
    12321274        monitor.indeterminateSubTask(tr("Loading early plugins"));
     
    14041446                    }
    14051447                }
    1406                 autosaveTask.schedule();
     1448                try {
     1449                    autosaveTask.schedule();
     1450                } catch (SecurityException e) {
     1451                    Logging.log(Logging.LEVEL_ERROR, "Unable to schedule autosave!", e);
     1452                }
    14071453            }
    14081454        }
     
    14261472
    14271473        private boolean handleProxyErrors() {
    1428             return handleNetworkOrProxyErrors(proxySelector.hasErrors(), tr("Proxy errors occurred"),
     1474            return proxySelector != null &&
     1475                handleNetworkOrProxyErrors(proxySelector.hasErrors(), tr("Proxy errors occurred"),
    14291476                    tr("JOSM tried to access the following resources:<br>" +
    14301477                            "{0}" +
  • trunk/src/org/openstreetmap/josm/gui/MainFrame.java

    r12846 r13647  
    1717import java.util.List;
    1818
     19import javax.swing.ImageIcon;
    1920import javax.swing.JFrame;
    2021import javax.swing.JPanel;
     
    8283        geometry.applySafe(this);
    8384        List<Image> l = new LinkedList<>();
    84         l.add(ImageProvider.get("logo_16x16x32").getImage());
    85         l.add(ImageProvider.get("logo_16x16x8").getImage());
    86         l.add(ImageProvider.get("logo_32x32x32").getImage());
    87         l.add(ImageProvider.get("logo_32x32x8").getImage());
    88         l.add(ImageProvider.get("logo_48x48x32").getImage());
    89         l.add(ImageProvider.get("logo_48x48x8").getImage());
    90         l.add(ImageProvider.get("logo").getImage());
     85        for (String file : new String[] {
     86                "logo_16x16x32", "logo_16x16x8", "logo_32x32x32", "logo_32x32x8", "logo_48x48x32", "logo_48x48x8", "logo"}) {
     87            ImageIcon img = ImageProvider.getIfAvailable(file);
     88            if (img != null) {
     89                l.add(img.getImage());
     90            }
     91        }
    9192        setIconImages(l);
    9293        addWindowListener(new ExitWindowAdapter());
  • trunk/src/org/openstreetmap/josm/gui/bugreport/BugReportDialog.java

    r13330 r13647  
    175175        panel.add(settings);
    176176
    177         JButton sendBugReportButton = new JButton(tr("Report Bug"), ImageProvider.get("bug"));
     177        JButton sendBugReportButton = new JButton(tr("Report Bug"), ImageProvider.getIfAvailable("bug"));
    178178        sendBugReportButton.addActionListener(e -> sendBug());
    179179        panel.add(sendBugReportButton, GBC.eol().insets(0, 0, 0, 0).anchor(GBC.SOUTHEAST));
  • trunk/src/org/openstreetmap/josm/gui/bugreport/JosmUpdatePanel.java

    r13068 r13647  
    9292        add(new JMultilineLabel(tr("Before you file a bug report make sure you have updated to the latest version of JOSM here:")), GBC.eol());
    9393        add(new UrlLabel(Main.getJOSMWebsite(), 2), GBC.eop().insets(8, 0, 0, 0));
    94         JButton updateButton = new JButton(tr("Update JOSM"), ImageProvider.get("download"));
     94        JButton updateButton = new JButton(tr("Update JOSM"), ImageProvider.getIfAvailable("download"));
    9595        updateButton.addActionListener(e -> openJosmUpdateSite());
    9696        add(updateButton, GBC.eol().anchor(GBC.EAST));
  • trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolutionUtil.java

    r12851 r13647  
    2121import org.openstreetmap.josm.data.osm.TagCollection;
    2222import org.openstreetmap.josm.spi.preferences.Config;
     23import org.openstreetmap.josm.tools.JosmRuntimeException;
    2324import org.openstreetmap.josm.tools.Logging;
    2425import org.openstreetmap.josm.tools.Pair;
     
    137138            // make sure the empty value is in the tag set such that we can delete the tag
    138139            // in the conflict dialog if necessary
    139             //
    140140            tc.add(new Tag(key, ""));
    141141        }
     
    149149     */
    150150    public static void applyAutomaticTagConflictResolution(TagCollection tc) {
    151         applyAutomaticTagConflictResolution(tc, getAutomaticTagConflictResolvers());
     151        try {
     152            applyAutomaticTagConflictResolution(tc, getAutomaticTagConflictResolvers());
     153        } catch (JosmRuntimeException e) {
     154            Logging.log(Logging.LEVEL_ERROR, "Unable to automatically resolve tag conflicts", e);
     155        }
    152156    }
    153157
  • trunk/src/org/openstreetmap/josm/gui/datatransfer/ClipboardUtils.java

    r12620 r13647  
    4949            try {
    5050                clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    51             } catch (HeadlessException e) {
    52                 Logging.warn("Headless. Using fake clipboard.", e);
     51            } catch (HeadlessException | SecurityException e) {
     52                Logging.warn("Using fake clipboard.", e);
    5353                clipboard = new Clipboard("fake");
    5454            }
  • trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java

    r13036 r13647  
    450450            final StyleSource s = model.getRow(sel);
    451451
    452             FileChooserManager fcm = new FileChooserManager(false, "mappaint.clone-style.lastDirectory", System.getProperty("user.home"));
     452            FileChooserManager fcm = new FileChooserManager(false, "mappaint.clone-style.lastDirectory", Utils.getSystemProperty("user.home"));
    453453            String suggestion = fcm.getInitialDirectory() + File.separator + s.getFileNamePart();
    454454
  • trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java

    r12846 r13647  
    3434        super(tr("Open Recent"));
    3535        setToolTipText(tr("List of recently opened files"));
    36         setIcon(ImageProvider.get("openrecent", ImageProvider.ImageSizes.MENU));
     36        setIcon(new ImageProvider("openrecent").setOptional(true).setSize(ImageProvider.ImageSizes.MENU).get());
    3737        putClientProperty("help", ht("/Action/OpenRecent"));
    3838
  • trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java

    r13206 r13647  
    5555import org.openstreetmap.josm.tools.GBC;
    5656import org.openstreetmap.josm.tools.ImageProvider;
     57import org.openstreetmap.josm.tools.ImageResource;
    5758import org.openstreetmap.josm.tools.InputMapUtils;
    5859import org.openstreetmap.josm.tools.Logging;
     
    364365            putValue(NAME, tr("Cancel"));
    365366            putValue(SHORT_DESCRIPTION, tr("Close this dialog and resume editing in JOSM"));
    366             new ImageProvider("cancel").getResource().attachImageIcon(this, true);
     367            ImageResource resource = new ImageProvider("cancel").setOptional(true).getResource();
     368            if (resource != null) {
     369                resource.attachImageIcon(this, true);
     370            }
    367371            InputMapUtils.addEscapeAction(getRootPane(), this);
    368372        }
     
    398402                    putValue(NAME, tr("Exit now!"));
    399403                    putValue(SHORT_DESCRIPTION, tr("Exit JOSM without saving. Unsaved changes are lost."));
    400                     new ImageProvider("exit").getResource().attachImageIcon(this, true);
     404                    attachImageIcon(new ImageProvider("exit"));
    401405                    break;
    402406                case RESTART:
    403407                    putValue(NAME, tr("Restart now!"));
    404408                    putValue(SHORT_DESCRIPTION, tr("Restart JOSM without saving. Unsaved changes are lost."));
    405                     new ImageProvider("restart").getResource().attachImageIcon(this, true);
     409                    attachImageIcon(new ImageProvider("restart"));
    406410                    break;
    407411                case DELETE:
    408412                    putValue(NAME, tr("Delete now!"));
    409413                    putValue(SHORT_DESCRIPTION, tr("Delete layers without saving. Unsaved changes are lost."));
    410                     new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);
    411                     break;
    412             }
    413 
     414                    attachImageIcon(new ImageProvider("dialogs", "delete"));
     415                    break;
     416            }
     417        }
     418
     419        private void attachImageIcon(ImageProvider provider) {
     420            ImageResource resource = provider.setOptional(true).getResource();
     421            if (resource != null) {
     422                resource.attachImageIcon(this, true);
     423            }
    414424        }
    415425
     
    465475
    466476        Image getImage(String name, boolean disabled) {
    467             ImageIcon img = new ImageProvider(name).setDisabled(disabled).get();
     477            ImageIcon img = new ImageProvider(name).setDisabled(disabled).setOptional(true).get();
    468478            return img != null ? img.getImage() : null;
    469479        }
     
    474484                    putValue(NAME, tr("Perform actions before exiting"));
    475485                    putValue(SHORT_DESCRIPTION, tr("Exit JOSM with saving. Unsaved changes are uploaded and/or saved."));
    476                     putValue(BASE_ICON, ImageProvider.get("exit"));
     486                    putValue(BASE_ICON, ImageProvider.getIfAvailable("exit"));
    477487                    break;
    478488                case RESTART:
    479489                    putValue(NAME, tr("Perform actions before restarting"));
    480490                    putValue(SHORT_DESCRIPTION, tr("Restart JOSM with saving. Unsaved changes are uploaded and/or saved."));
    481                     putValue(BASE_ICON, ImageProvider.get("restart"));
     491                    putValue(BASE_ICON, ImageProvider.getIfAvailable("restart"));
    482492                    break;
    483493                case DELETE:
    484494                    putValue(NAME, tr("Perform actions before deleting"));
    485495                    putValue(SHORT_DESCRIPTION, tr("Save/Upload layers before deleting. Unsaved changes are not lost."));
    486                     putValue(BASE_ICON, ImageProvider.get("dialogs", "delete"));
     496                    putValue(BASE_ICON, ImageProvider.getIfAvailable("dialogs", "delete"));
    487497                    break;
    488498            }
     
    491501
    492502        public void redrawIcon() {
    493             Image base = ((ImageIcon) getValue(BASE_ICON)).getImage();
     503            ImageIcon base = ((ImageIcon) getValue(BASE_ICON));
    494504            BufferedImage newIco = new BufferedImage(ICON_SIZE*3, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
    495505            Graphics2D g = newIco.createGraphics();
     
    497507            g.drawImage(model.getLayersToUpload().isEmpty() ? upldDis : upld, ICON_SIZE*0, 0, ICON_SIZE, ICON_SIZE, null);
    498508            g.drawImage(model.getLayersToSave().isEmpty()   ? saveDis : save, ICON_SIZE*1, 0, ICON_SIZE, ICON_SIZE, null);
    499             g.drawImage(base,                                                 ICON_SIZE*2, 0, ICON_SIZE, ICON_SIZE, null);
     509            if (base != null) {
     510                g.drawImage(base.getImage(),                                  ICON_SIZE*2, 0, ICON_SIZE, ICON_SIZE, null);
     511            }
    500512            // CHECKSTYLE.ON: SingleSpaceSeparator
    501513            putValue(SMALL_ICON, new ImageIcon(newIco));
  • trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java

    r13114 r13647  
    44import static org.openstreetmap.josm.tools.I18n.marktr;
    55import static org.openstreetmap.josm.tools.I18n.tr;
     6import static org.openstreetmap.josm.tools.Utils.getSystemProperty;
    67
    78import java.io.BufferedReader;
     
    383384    public List<File> getUnsavedLayersFiles() {
    384385        List<File> result = new ArrayList<>();
    385         File[] files = autosaveDir.listFiles((FileFilter)
    386                 pathname -> OsmImporter.FILE_FILTER.accept(pathname) || NoteImporter.FILE_FILTER.accept(pathname));
    387         if (files == null)
    388             return result;
    389         for (File file: files) {
    390             if (file.isFile()) {
    391                 boolean skipFile = false;
    392                 File pidFile = getPidFile(file);
    393                 if (pidFile.exists()) {
    394                     try (BufferedReader reader = Files.newBufferedReader(pidFile.toPath(), StandardCharsets.UTF_8)) {
    395                         String jvmId = reader.readLine();
    396                         if (jvmId != null) {
    397                             String pid = jvmId.split("@")[0];
    398                             skipFile = jvmPerfDataFileExists(pid);
     386        try {
     387            File[] files = autosaveDir.listFiles((FileFilter)
     388                    pathname -> OsmImporter.FILE_FILTER.accept(pathname) || NoteImporter.FILE_FILTER.accept(pathname));
     389            if (files == null)
     390                return result;
     391            for (File file: files) {
     392                if (file.isFile()) {
     393                    boolean skipFile = false;
     394                    File pidFile = getPidFile(file);
     395                    if (pidFile.exists()) {
     396                        try (BufferedReader reader = Files.newBufferedReader(pidFile.toPath(), StandardCharsets.UTF_8)) {
     397                            String jvmId = reader.readLine();
     398                            if (jvmId != null) {
     399                                String pid = jvmId.split("@")[0];
     400                                skipFile = jvmPerfDataFileExists(pid);
     401                            }
     402                        } catch (IOException | SecurityException t) {
     403                            Logging.error(t);
    399404                        }
    400                     } catch (IOException | SecurityException t) {
    401                         Logging.error(t);
    402405                    }
    403                 }
    404                 if (!skipFile) {
    405                     result.add(file);
    406                 }
    407             }
     406                    if (!skipFile) {
     407                        result.add(file);
     408                    }
     409                }
     410            }
     411        } catch (SecurityException e) {
     412            Logging.log(Logging.LEVEL_ERROR, "Unable to list unsaved layers files", e);
    408413        }
    409414        return result;
     
    411416
    412417    private static boolean jvmPerfDataFileExists(final String jvmId) {
    413         File jvmDir = new File(System.getProperty("java.io.tmpdir") + File.separator + "hsperfdata_" + System.getProperty("user.name"));
     418        File jvmDir = new File(getSystemProperty("java.io.tmpdir") + File.separator + "hsperfdata_" + getSystemProperty("user.name"));
    414419        if (jvmDir.exists() && jvmDir.canRead()) {
    415420            File[] files = jvmDir.listFiles((FileFilter) file -> file.getName().equals(jvmId) && file.isFile());
  • trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSource.java

    r12825 r13647  
    223223            i = new ImageProvider(i).addOverlay(new ImageOverlay(new ImageProvider("warning-small"), 0.5, 0.5, 1, 1));
    224224        }
    225         return i;
     225        return i.setOptional(true);
    226226    }
    227227
  • trunk/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java

    r13504 r13647  
    173173            mi.setText(label);
    174174            if (iconName != null && Config.getPref().getBoolean("text.popupmenu.useicons", true)) {
    175                 ImageIcon icon = ImageProvider.get(iconName, ImageProvider.ImageSizes.SMALLICON);
     175                ImageIcon icon = new ImageProvider(iconName).setOptional(true).setSize(ImageProvider.ImageSizes.SMALLICON).get();
    176176                if (icon != null) {
    177177                    mi.setIcon(icon);
Note: See TracChangeset for help on using the changeset viewer.