001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.harmony.sound.utils;
019:
020: import java.io.File;
021: import java.io.FileInputStream;
022: import java.io.InputStream;
023: import java.io.FileNotFoundException;
024: import java.io.IOException;
025: import java.net.URL;
026: import java.security.AccessController;
027: import java.security.PrivilegedAction;
028: import java.util.ArrayList;
029: import java.util.Enumeration;
030: import java.util.List;
031: import java.util.Properties;
032:
033: public class ProviderService {
034:
035: // Properties from sound.propertie file
036: private static Properties devices;
037:
038: static {
039: devices = new Properties();
040:
041: FileInputStream fstream = AccessController
042: .doPrivileged(new PrivilegedAction<FileInputStream>() {
043:
044: public FileInputStream run() {
045: // obtain the path to the file sound.properties
046: String soundPropertiesPath = System
047: .getProperty("java.home") //$NON-NLS-1$
048: + File.separator
049: + "lib" + File.separator //$NON-NLS-1$
050: + "sound.properties"; //$NON-NLS-1$
051: try {
052: return new FileInputStream(
053: soundPropertiesPath);
054: } catch (FileNotFoundException e) {
055: return null;
056: }
057: }
058: });
059:
060: if (fstream != null) {
061: // reading file sound.properties
062: try {
063: devices.load(fstream);
064: } catch (IOException e) {
065: }
066: }
067: }
068:
069: /**
070: * this method return information about default device
071: *
072: * @param deviceName
073: * @return
074: */
075: public static List<String> getDefaultDeviceDescription(
076: String deviceName) {
077:
078: // variable that contain information about default device
079: List<String> defaultDevice = new ArrayList<String>();
080: String str;
081: int index;
082:
083: /*
084: * obtain the default device that describes by deviceName
085: */
086: str = devices.getProperty(deviceName);
087: /*
088: * if default device doesn't define, than return empty defaultDevice
089: */
090: if (str == null) {
091: return defaultDevice;
092: }
093: /*
094: * the separator between provider and name is '#'; find separator of
095: * provider and name of device in the notation of default device
096: */
097: index = str.indexOf("#"); //$NON-NLS-1$
098: /*
099: * if separator doesn't find, so in the definition of default device
100: * contain only name of provider, and so we add it
101: */
102: if (index == -1) {
103: defaultDevice.add(str);
104: defaultDevice.add(null);
105: /*
106: * if separator is the first symbol, so definition contain only name
107: * of device
108: */
109: } else if (index == 0) {
110: defaultDevice.add(null);
111: defaultDevice.add(str.substring(index + 1));
112: /*
113: * if separator is not the first, so we find provider and name of
114: * device
115: */
116: } else {
117: defaultDevice.add(str.substring(0, index));
118: defaultDevice.add(str.substring(index + 1));
119: }
120: return defaultDevice;
121: }
122:
123: /**
124: * this method return the list of providers
125: *
126: * @param providerName
127: * @return
128: */
129: public static List<?> getProviders(String providerName) {
130: final String name = providerName;
131:
132: return AccessController
133: .doPrivileged(new PrivilegedAction<List<Object>>() {
134:
135: public List<Object> run() {
136: List<Object> providers = new ArrayList<Object>();
137: String className = null;
138: byte[] bytes;
139:
140: ClassLoader cl = ClassLoader
141: .getSystemClassLoader();
142: Enumeration<URL> urls = null;
143: try {
144: urls = cl.getResources(name);
145: } catch (IOException e) {
146: return providers;
147: }
148: for (; urls.hasMoreElements();) {
149: try {
150: InputStream in = urls.nextElement()
151: .openStream();
152: bytes = new byte[in.available()];
153: in.read(bytes);
154: in.close();
155: } catch (IOException e) {
156: continue;
157: }
158: String[] astr = new String(bytes)
159: .split("\r\n"); //$NON-NLS-1$
160: for (String str : astr) {
161: className = str.trim();
162: if (!className.startsWith("#")) { // skip
163: // comments
164: // //$NON-NLS-1$
165: try {
166: providers.add(Class.forName(
167: className.trim(), true,
168: cl).newInstance());
169: } catch (IllegalAccessException e) {
170: } catch (InstantiationException e) {
171: } catch (ClassNotFoundException e) {
172: }
173: }
174: }
175: }
176: return providers;
177: }
178: });
179:
180: }
181:
182: public static Properties getSoundProperties() {
183: return devices;
184: }
185:
186: }
|