blob: 3732ad5893ac26b3817424cba0c572fa030e41d8 [file] [log] [blame]
/*
* #%L
* Apache Geronimo JAX-RS Spec 2.0
* %%
* Copyright (C) 2003 - 2014 The Apache Software Foundation
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package javax.ws.rs.sse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.ServiceLoader;
import java.util.logging.Logger;
final class SseFinder {
private static final Logger LOGGER = Logger.getLogger(SseFinder.class.getName());
private static final String FACTORY_ID = SseEventSource.Builder.class.getName();
private static final String SERVICE_ID = "META-INF/services/" + FACTORY_ID;
static Object find(final String defaultClazz) throws ClassNotFoundException {
final ClassLoader classLoader = getContextClassLoader();
try {
for (SseEventSource.Builder builder : ServiceLoader.load(SseEventSource.Builder.class)) {
return builder;
}
InputStream is = null;
if (classLoader == null) {
is = ClassLoader.getSystemResourceAsStream(SERVICE_ID);
} else {
is = classLoader.getResourceAsStream(SERVICE_ID);
}
if (is == null) {
final String dottedId = SERVICE_ID.replace('$', '.');
if (classLoader == null) {
is = ClassLoader.getSystemResourceAsStream(dottedId);
} else {
is = classLoader.getResourceAsStream(dottedId);
}
}
if (is != null) {
final BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
final String factoryClassName = rd.readLine();
rd.close();
if (factoryClassName != null && !"".equals(factoryClassName)) {
return newInstance(factoryClassName, classLoader);
}
}
} catch (final Exception ex) {
LOGGER.finest(ex.getMessage());
}
try {
final File f = new File(
System.getProperty("java.home") + File.separator + "lib" + File.separator + "jaxrs.properties");
if (f.exists()) {
final Properties props = new Properties();
props.load(new FileInputStream(f));
final String factoryClassName = props.getProperty(FACTORY_ID);
return newInstance(factoryClassName, classLoader);
}
} catch (final Exception ex) {
LOGGER.finest(ex.getMessage());
}
try {
final String systemProp = System.getProperty(FACTORY_ID);
if (systemProp != null) {
return newInstance(systemProp, classLoader);
}
} catch (final SecurityException se) {
LOGGER.finest(se.getMessage());
}
if (defaultClazz == null) {
throw new ClassNotFoundException(FACTORY_ID + " not found", null);
}
return newInstance(defaultClazz, classLoader);
}
static ClassLoader getContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
private static Object newInstance(final String className, final ClassLoader classLoader) throws ClassNotFoundException {
try {
Class<?> spiClass;
if (classLoader == null) {
spiClass = Class.forName(className);
} else {
try {
spiClass = Class.forName(className, false, classLoader);
} catch (final ClassNotFoundException ex) {
LOGGER.finest(ex.getMessage());
spiClass = Class.forName(className);
}
}
return spiClass.getConstructor().newInstance();
} catch (final ClassNotFoundException x) {
throw x;
} catch (final Exception x) {
throw new ClassNotFoundException(x.getMessage(), x);
}
}
private SseFinder() {
// no-op
}
}