summaryrefslogtreecommitdiff
path: root/jurt/com/sun/star/lib/util/NativeLibraryLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'jurt/com/sun/star/lib/util/NativeLibraryLoader.java')
-rw-r--r--jurt/com/sun/star/lib/util/NativeLibraryLoader.java118
1 files changed, 118 insertions, 0 deletions
diff --git a/jurt/com/sun/star/lib/util/NativeLibraryLoader.java b/jurt/com/sun/star/lib/util/NativeLibraryLoader.java
new file mode 100644
index 000000000000..05455a87814d
--- /dev/null
+++ b/jurt/com/sun/star/lib/util/NativeLibraryLoader.java
@@ -0,0 +1,118 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package com.sun.star.lib.util;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/** Helper functions to locate and load native files.
+
+ The methods in this class are designed to find the requested resources in as
+ many cases as possible. They search various places, roughly from most
+ specific to most general. This works well if a component is known to bring
+ with it a certain resource, and that resource has to be found. However, it
+ might not work very well in cases where you want to check whether a
+ component brings with it a certain resource or not: a similarly named
+ resource from another component might be found by the eager search
+ algorithm.
+ */
+public final class NativeLibraryLoader {
+ /** Load a system library, using a given class loader to locate the library.
+
+ This is similar to System.loadLibrary.
+
+ @param loader a class loader; may be null
+
+ @param libname the library name; how this name is mapped to a system
+ library name is system dependent
+ */
+ public static void loadLibrary(ClassLoader loader, String libname) {
+ File path = getResource(loader, System.mapLibraryName(libname));
+ if (path == null) {
+ // If the library cannot be found as a class loader resource, try
+ // the global System.loadLibrary as a last resort:
+ System.loadLibrary(libname);
+ } else {
+ System.load(path.getAbsolutePath());
+ }
+ }
+
+ /** Locate a system resource, using a given class loader.
+
+ This is similar to ClassLoader.getResource, but only works for local
+ resources (local files), and adds additional functionality for
+ URLClassLoaders.
+
+ @param loader a class loader; may be null
+
+ @param name a resource name (that is, the name of a file)
+
+ @return a File locating the resource, or null if the resource was not
+ found
+ */
+ public static File getResource(ClassLoader loader, String name) {
+ if (loader != null) {
+ File path = UrlToFileMapper.mapUrlToFile(loader.getResource(name));
+ if (path != null) {
+ return path;
+ }
+ }
+ // URLClassLoaders work on lists of URLs, which are typically URLs
+ // locating JAR files (scheme://auth/dir1/dir2/some.jar). The following
+ // code looks for resource name beside the JAR file
+ // (scheme://auth/dir1/dir2/name) and one directory up
+ // (scheme://auth/dir1/name). The second step is important in a typical
+ // OOo installation, where the JAR files are in the program/classes
+ // directory while the shared libraries are in the program directory.
+ if (loader instanceof URLClassLoader) {
+ URL[] urls = ((URLClassLoader) loader).getURLs();
+ for (int i = 0; i < urls.length; ++i) {
+ File path = UrlToFileMapper.mapUrlToFile(urls[i]);
+ if (path != null) {
+ File dir = path.isDirectory() ? path : path.getParentFile();
+ if (dir != null) {
+ path = new File(dir, name);
+ if (path.exists()) {
+ return path;
+ }
+ dir = dir.getParentFile();
+ if (dir != null) {
+ path = new File(dir, name);
+ if (path.exists()) {
+ return path;
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private NativeLibraryLoader() {} // do not instantiate
+}