aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.4.3/libjava/classpath/external/relaxngDatatype/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.4.3/libjava/classpath/external/relaxngDatatype/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java')
-rwxr-xr-xgcc-4.4.3/libjava/classpath/external/relaxngDatatype/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java262
1 files changed, 262 insertions, 0 deletions
diff --git a/gcc-4.4.3/libjava/classpath/external/relaxngDatatype/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java b/gcc-4.4.3/libjava/classpath/external/relaxngDatatype/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java
new file mode 100755
index 000000000..43c44382f
--- /dev/null
+++ b/gcc-4.4.3/libjava/classpath/external/relaxngDatatype/org/relaxng/datatype/helpers/DatatypeLibraryLoader.java
@@ -0,0 +1,262 @@
+/**
+ * Copyright (c) 2001, Thai Open Source Software Center Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Thai Open Source Software Center Ltd nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.relaxng.datatype.helpers;
+
+import org.relaxng.datatype.DatatypeLibraryFactory;
+import org.relaxng.datatype.DatatypeLibrary;
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+import java.util.Vector;
+import java.io.Reader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+
+/**
+ * Discovers the datatype library implementation from the classpath.
+ *
+ * <p>
+ * The call of the createDatatypeLibrary method finds an implementation
+ * from a given datatype library URI at run-time.
+ */
+public class DatatypeLibraryLoader implements DatatypeLibraryFactory {
+ private final Service service = new Service(DatatypeLibraryFactory.class);
+
+ public DatatypeLibrary createDatatypeLibrary(String uri) {
+ for (Enumeration e = service.getProviders();
+ e.hasMoreElements();) {
+ DatatypeLibraryFactory factory
+ = (DatatypeLibraryFactory)e.nextElement();
+ DatatypeLibrary library = factory.createDatatypeLibrary(uri);
+ if (library != null)
+ return library;
+ }
+ return null;
+ }
+
+ private static class Service {
+ private final Class serviceClass;
+ private final Enumeration configFiles;
+ private Enumeration classNames = null;
+ private final Vector providers = new Vector();
+ private Loader loader;
+
+ private class ProviderEnumeration implements Enumeration {
+ private int nextIndex = 0;
+
+ public boolean hasMoreElements() {
+ return nextIndex < providers.size() || moreProviders();
+ }
+
+ public Object nextElement() {
+ try {
+ return providers.elementAt(nextIndex++);
+ }
+ catch (ArrayIndexOutOfBoundsException e) {
+ throw new NoSuchElementException();
+ }
+ }
+ }
+
+ private static class Singleton implements Enumeration {
+ private Object obj;
+ private Singleton(Object obj) {
+ this.obj = obj;
+ }
+
+ public boolean hasMoreElements() {
+ return obj != null;
+ }
+
+ public Object nextElement() {
+ if (obj == null)
+ throw new NoSuchElementException();
+ Object tem = obj;
+ obj = null;
+ return tem;
+ }
+ }
+
+ // JDK 1.1
+ private static class Loader {
+ Enumeration getResources(String resName) {
+ ClassLoader cl = Loader.class.getClassLoader();
+ URL url;
+ if (cl == null)
+ url = ClassLoader.getSystemResource(resName);
+ else
+ url = cl.getResource(resName);
+ return new Singleton(url);
+ }
+
+ Class loadClass(String name) throws ClassNotFoundException {
+ return Class.forName(name);
+ }
+ }
+
+ // JDK 1.2+
+ private static class Loader2 extends Loader {
+ private ClassLoader cl;
+
+ Loader2() {
+ cl = Loader2.class.getClassLoader();
+ // If the thread context class loader has the class loader
+ // of this class as an ancestor, use the thread context class
+ // loader. Otherwise, the thread context class loader
+ // probably hasn't been set up properly, so don't use it.
+ ClassLoader clt = Thread.currentThread().getContextClassLoader();
+ for (ClassLoader tem = clt; tem != null; tem = tem.getParent())
+ if (tem == cl) {
+ cl = clt;
+ break;
+ }
+ }
+
+ Enumeration getResources(String resName) {
+ try {
+ return cl.getResources(resName);
+ }
+ catch (IOException e) {
+ return new Singleton(null);
+ }
+ }
+
+ Class loadClass(String name) throws ClassNotFoundException {
+ return Class.forName(name, true, cl);
+ }
+ }
+
+ public Service(Class cls) {
+ try {
+ loader = new Loader2();
+ }
+ catch (NoSuchMethodError e) {
+ loader = new Loader();
+ }
+ serviceClass = cls;
+ String resName = "META-INF/services/" + serviceClass.getName();
+ configFiles = loader.getResources(resName);
+ }
+
+ public Enumeration getProviders() {
+ return new ProviderEnumeration();
+ }
+
+ synchronized private boolean moreProviders() {
+ for (;;) {
+ while (classNames == null) {
+ if (!configFiles.hasMoreElements())
+ return false;
+ classNames = parseConfigFile((URL)configFiles.nextElement());
+ }
+ while (classNames.hasMoreElements()) {
+ String className = (String)classNames.nextElement();
+ try {
+ Class cls = loader.loadClass(className);
+ Object obj = cls.newInstance();
+ if (serviceClass.isInstance(obj)) {
+ providers.addElement(obj);
+ return true;
+ }
+ }
+ catch (ClassNotFoundException e) { }
+ catch (InstantiationException e) { }
+ catch (IllegalAccessException e) { }
+ catch (LinkageError e) { }
+ }
+ classNames = null;
+ }
+ }
+
+ private static final int START = 0;
+ private static final int IN_NAME = 1;
+ private static final int IN_COMMENT = 2;
+
+ private static Enumeration parseConfigFile(URL url) {
+ try {
+ InputStream in = url.openStream();
+ Reader r;
+ try {
+ r = new InputStreamReader(in, "UTF-8");
+ }
+ catch (UnsupportedEncodingException e) {
+ r = new InputStreamReader(in, "UTF8");
+ }
+ r = new BufferedReader(r);
+ Vector tokens = new Vector();
+ StringBuffer tokenBuf = new StringBuffer();
+ int state = START;
+ for (;;) {
+ int n = r.read();
+ if (n < 0)
+ break;
+ char c = (char)n;
+ switch (c) {
+ case '\r':
+ case '\n':
+ state = START;
+ break;
+ case ' ':
+ case '\t':
+ break;
+ case '#':
+ state = IN_COMMENT;
+ break;
+ default:
+ if (state != IN_COMMENT) {
+ state = IN_NAME;
+ tokenBuf.append(c);
+ }
+ break;
+ }
+ if (tokenBuf.length() != 0 && state != IN_NAME) {
+ tokens.addElement(tokenBuf.toString());
+ tokenBuf.setLength(0);
+ }
+ }
+ if (tokenBuf.length() != 0)
+ tokens.addElement(tokenBuf.toString());
+ return tokens.elements();
+ }
+ catch (IOException e) {
+ return null;
+ }
+ }
+ }
+
+}
+