/* * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.media.sound; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.ServiceLoader; /** * Historically this class managed ensuring privileges to access resources * it is still used to get those resources but no longer does checks. * * @author Matthias Pfisterer */ final class JSSecurityManager { /** Prevent instantiation. */ private JSSecurityManager() { } /** * Load properties from a file. *

* This method tries to load properties from the filename give into the * passed properties object. If the file cannot be found or something else * goes wrong, the method silently fails. *

* If the file referenced in "javax.sound.config.file" property exists and * the user has an access to it, then it will be loaded, otherwise default * configuration file "JAVA_HOME/conf/sound.properties" will be loaded. * * @param properties the properties bundle to store the values of the * properties file */ static void loadProperties(final Properties properties) { final String customFile = System.getProperty("javax.sound.config.file"); if (customFile != null) { if (loadPropertiesImpl(properties, customFile)) { return; } } final String home = System.getProperty("java.home"); if (home == null) { throw new Error("Can't find java.home ??"); } loadPropertiesImpl(properties, home, "conf", "sound.properties"); } private static boolean loadPropertiesImpl(final Properties properties, String first, String... more) { final Path fname = Paths.get(first, more); try (final Reader reader = Files.newBufferedReader(fname)) { properties.load(reader); return true; } catch (final Throwable t) { return false; } } /** Create a Thread in the current ThreadGroup. */ static Thread createThread(final Runnable runnable, final String threadName, final boolean isDaemon, final int priority, final boolean doStart) { Thread thread = new Thread(null, runnable, threadName, 0, false); thread.setDaemon(isDaemon); if (priority >= 0) { thread.setPriority(priority); } if (doStart) { thread.start(); } return thread; } static synchronized List getProviders(final Class providerClass) { List p = new ArrayList<>(7); final Iterator ps = ServiceLoader.load(providerClass).iterator(); while (ps.hasNext()) { try { // the iterator's next() method creates instances of the // providers and it should be called in the current security // context T provider = ps.next(); if (providerClass.isInstance(provider)) { // $$mp 2003-08-22 // Always adding at the beginning reverses the // order of the providers. So we no longer have // to do this in AudioSystem and MidiSystem. p.add(0, provider); } } catch (Throwable t) { //$$fb 2002-11-07: do not fail on SPI not found if (Printer.err) t.printStackTrace(); } } return p; } }