summaryrefslogtreecommitdiff
path: root/jvmaccess/source
diff options
context:
space:
mode:
Diffstat (limited to 'jvmaccess/source')
-rw-r--r--jvmaccess/source/classpath.cxx177
-rw-r--r--jvmaccess/source/makefile.mk45
-rw-r--r--jvmaccess/source/unovirtualmachine.cxx99
-rw-r--r--jvmaccess/source/virtualmachine.cxx127
4 files changed, 448 insertions, 0 deletions
diff --git a/jvmaccess/source/classpath.cxx b/jvmaccess/source/classpath.cxx
new file mode 100644
index 000000000000..61d3fc9d4eae
--- /dev/null
+++ b/jvmaccess/source/classpath.cxx
@@ -0,0 +1,177 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: classpath.cxx,v $
+ * $Revision: 1.4 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include "sal/config.h"
+
+#include "jvmaccess/classpath.hxx"
+
+#include <vector>
+
+#include "com/sun/star/lang/IllegalArgumentException.hpp"
+#include "com/sun/star/uno/Any.hxx"
+#include "com/sun/star/uno/Reference.hxx"
+#include "com/sun/star/uno/RuntimeException.hpp"
+#include "com/sun/star/uno/XComponentContext.hpp"
+#include "com/sun/star/uno/XInterface.hpp"
+#include "com/sun/star/uri/UriReferenceFactory.hpp"
+#include "com/sun/star/uri/XVndSunStarExpandUrlReference.hpp"
+#include "com/sun/star/util/XMacroExpander.hpp"
+#include "osl/diagnose.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+
+#if defined SOLAR_JAVA
+#include "jni.h"
+#endif
+
+namespace {
+
+namespace css = ::com::sun::star;
+
+}
+
+void * ::jvmaccess::ClassPath::doTranslateToUrls(
+ css::uno::Reference< css::uno::XComponentContext > const & context,
+ void * environment, ::rtl::OUString const & classPath)
+{
+ OSL_ASSERT(context.is() && environment != 0);
+#if defined SOLAR_JAVA
+ ::JNIEnv * const env = static_cast< ::JNIEnv * >(environment);
+ jclass classUrl(env->FindClass("java/net/URL"));
+ if (classUrl == 0) {
+ return 0;
+ }
+ jmethodID ctorUrl(
+ env->GetMethodID(classUrl, "<init>", "(Ljava/lang/String;)V"));
+ if (ctorUrl == 0) {
+ return 0;
+ }
+ ::std::vector< jobject > urls;
+ for (::sal_Int32 i = 0; i != -1;) {
+ ::rtl::OUString url(classPath.getToken(0, ' ', i));
+ if (url.getLength() != 0) {
+ css::uno::Reference< css::uri::XVndSunStarExpandUrlReference >
+ expUrl(
+ css::uri::UriReferenceFactory::create(context)->parse(url),
+ css::uno::UNO_QUERY);
+ if (expUrl.is()) {
+ css::uno::Reference< css::util::XMacroExpander > expander(
+ context->getValueByName(
+ ::rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "/singletons/"
+ "com.sun.star.util.theMacroExpander"))),
+ css::uno::UNO_QUERY_THROW);
+ try {
+ url = expUrl->expand(expander);
+ } catch (css::lang::IllegalArgumentException & e) {
+ throw css::uno::RuntimeException(
+ (::rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "com.sun.star.lang.IllegalArgumentException: "))
+ + e.Message),
+ css::uno::Reference< css::uno::XInterface >());
+ }
+ }
+ jvalue arg;
+ arg.l = env->NewString(
+ static_cast< jchar const * >(url.getStr()),
+ static_cast< jsize >(url.getLength()));
+ if (arg.l == 0) {
+ return 0;
+ }
+ jobject o(env->NewObjectA(classUrl, ctorUrl, &arg));
+ if (o == 0) {
+ return 0;
+ }
+ urls.push_back(o);
+ }
+ }
+ jobjectArray result = env->NewObjectArray(
+ static_cast< jsize >(urls.size()), classUrl, 0);
+ // static_cast is ok, as each element of urls occupied at least one
+ // character of the ::rtl::OUString classPath
+ if (result == 0) {
+ return 0;
+ }
+ jsize idx = 0;
+ for (std::vector< jobject >::iterator i(urls.begin()); i != urls.end(); ++i)
+ {
+ env->SetObjectArrayElement(result, idx++, *i);
+ }
+ return result;
+#else
+ return 0;
+#endif
+}
+
+void * ::jvmaccess::ClassPath::doLoadClass(
+ css::uno::Reference< css::uno::XComponentContext > const & context,
+ void * environment, ::rtl::OUString const & classPath,
+ ::rtl::OUString const & name)
+{
+ OSL_ASSERT(context.is() && environment != 0);
+#if defined SOLAR_JAVA
+ ::JNIEnv * const env = static_cast< ::JNIEnv * >(environment);
+ jclass classLoader(env->FindClass("java/net/URLClassLoader"));
+ if (classLoader == 0) {
+ return 0;
+ }
+ jmethodID ctorLoader(
+ env->GetMethodID(classLoader, "<init>", "([Ljava/net/URL;)V"));
+ if (ctorLoader == 0) {
+ return 0;
+ }
+ jvalue arg;
+ arg.l = translateToUrls(context, env, classPath);
+ if (arg.l == 0) {
+ return 0;
+ }
+ jobject cl = env->NewObjectA(classLoader, ctorLoader, &arg);
+ if (cl == 0) {
+ return 0;
+ }
+ jmethodID methLoadClass(
+ env->GetMethodID(
+ classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"));
+ if (methLoadClass == 0) {
+ return 0;
+ }
+ arg.l = env->NewString(
+ static_cast< jchar const * >(name.getStr()),
+ static_cast< jsize >(name.getLength()));
+ if (arg.l == 0) {
+ return 0;
+ }
+ return env->CallObjectMethodA(cl, methLoadClass, &arg);
+#else
+ return 0;
+#endif
+}
diff --git a/jvmaccess/source/makefile.mk b/jvmaccess/source/makefile.mk
new file mode 100644
index 000000000000..af04b79645d8
--- /dev/null
+++ b/jvmaccess/source/makefile.mk
@@ -0,0 +1,45 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.12 $
+#
+# 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.
+#
+#*************************************************************************
+
+PRJ = ..
+PRJNAME = jvmaccess
+TARGET = $(PRJNAME)
+
+ENABLE_EXCEPTIONS = TRUE
+
+.INCLUDE: settings.mk
+
+SLOFILES = \
+ $(SLO)$/classpath.obj \
+ $(SLO)$/unovirtualmachine.obj \
+ $(SLO)$/virtualmachine.obj
+
+.INCLUDE: target.mk
diff --git a/jvmaccess/source/unovirtualmachine.cxx b/jvmaccess/source/unovirtualmachine.cxx
new file mode 100644
index 000000000000..0f91ecaa4018
--- /dev/null
+++ b/jvmaccess/source/unovirtualmachine.cxx
@@ -0,0 +1,99 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: unovirtualmachine.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include "sal/config.h"
+
+#include "jvmaccess/unovirtualmachine.hxx"
+
+#include "osl/diagnose.h"
+
+#include "jvmaccess/virtualmachine.hxx"
+
+#if defined SOLAR_JAVA
+#include "jni.h"
+#endif
+
+namespace jvmaccess {
+
+UnoVirtualMachine::CreationException::CreationException() {}
+
+UnoVirtualMachine::CreationException::CreationException(
+ CreationException const &)
+{}
+
+UnoVirtualMachine::CreationException::~CreationException() {}
+
+UnoVirtualMachine::CreationException &
+UnoVirtualMachine::CreationException::operator =(CreationException const &) {
+ return *this;
+}
+
+UnoVirtualMachine::UnoVirtualMachine(
+ rtl::Reference< jvmaccess::VirtualMachine > const & virtualMachine,
+ void * classLoader):
+ m_virtualMachine(virtualMachine),
+ m_classLoader(0)
+{
+#if defined SOLAR_JAVA
+ try {
+ m_classLoader =
+ jvmaccess::VirtualMachine::AttachGuard(m_virtualMachine).
+ getEnvironment()->NewGlobalRef(static_cast< jobject >(classLoader));
+ } catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) {}
+#endif
+ if (m_classLoader == 0) {
+ throw CreationException();
+ }
+}
+
+rtl::Reference< jvmaccess::VirtualMachine >
+UnoVirtualMachine::getVirtualMachine() const {
+ return m_virtualMachine;
+}
+
+void * UnoVirtualMachine::getClassLoader() const {
+ return m_classLoader;
+}
+
+UnoVirtualMachine::~UnoVirtualMachine() {
+#if defined SOLAR_JAVA
+ try {
+ jvmaccess::VirtualMachine::AttachGuard(m_virtualMachine).
+ getEnvironment()->DeleteGlobalRef(
+ static_cast< jobject >(m_classLoader));
+ } catch (jvmaccess::VirtualMachine::AttachGuard::CreationException &) {
+ OSL_TRACE(
+ "jvmaccess::UnoVirtualMachine::~UnoVirtualMachine:"
+ " jvmaccess::VirtualMachine::AttachGuard::CreationException" );
+ }
+#endif
+}
+
+}
diff --git a/jvmaccess/source/virtualmachine.cxx b/jvmaccess/source/virtualmachine.cxx
new file mode 100644
index 000000000000..b6d6043e1e6a
--- /dev/null
+++ b/jvmaccess/source/virtualmachine.cxx
@@ -0,0 +1,127 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: virtualmachine.cxx,v $
+ * $Revision: 1.8 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include "jvmaccess/virtualmachine.hxx"
+
+#include "osl/diagnose.h"
+
+using jvmaccess::VirtualMachine;
+
+VirtualMachine::AttachGuard::CreationException::CreationException()
+{}
+
+VirtualMachine::AttachGuard::CreationException::CreationException(
+ CreationException const &)
+{}
+
+VirtualMachine::AttachGuard::CreationException::~CreationException()
+{}
+
+VirtualMachine::AttachGuard::CreationException &
+VirtualMachine::AttachGuard::CreationException::operator =(
+ CreationException const &)
+{
+ return *this;
+}
+
+VirtualMachine::AttachGuard::AttachGuard(
+ rtl::Reference< VirtualMachine > const & rMachine):
+ m_xMachine(rMachine)
+{
+ OSL_ENSURE(m_xMachine.is(), "bad parameter");
+ m_pEnvironment = m_xMachine->attachThread(&m_bDetach);
+ if (m_pEnvironment == 0)
+ throw CreationException();
+}
+
+VirtualMachine::AttachGuard::~AttachGuard()
+{
+ if (m_bDetach)
+ m_xMachine->detachThread();
+}
+
+VirtualMachine::VirtualMachine(JavaVM * pVm, int nVersion, bool bDestroy,
+ JNIEnv * pMainThreadEnv):
+ m_pVm(pVm), m_nVersion(nVersion), m_bDestroy(bDestroy)
+{
+ (void) pMainThreadEnv; // avoid warnings
+#ifdef SOLAR_JAVA
+ OSL_ENSURE(pVm != 0 && nVersion >= JNI_VERSION_1_2 && pMainThreadEnv != 0,
+ "bad parameter");
+#endif
+}
+
+VirtualMachine::~VirtualMachine()
+{
+ if (m_bDestroy)
+ {
+ // Do not destroy the VM. Under Java 1.3, the AWT event loop thread is
+ // not a daemon thread and is never terminated, so that calling
+ // DestroyJavaVM (waiting for all non-daemon threads to terminate) hangs
+ // forever.
+/*
+ jint n = m_pVm->DestroyJavaVM();
+ OSL_ENSURE(n == JNI_OK, "JNI: DestroyJavaVM failed");
+*/
+ }
+}
+
+JNIEnv * VirtualMachine::attachThread(bool * pAttached) const
+{
+#ifndef SOLAR_JAVA
+ return 0;
+#else
+ OSL_ENSURE(pAttached != 0, "bad parameter");
+ JNIEnv * pEnv;
+ jint n = m_pVm->GetEnv(reinterpret_cast< void ** >(&pEnv), m_nVersion);
+ if (n != JNI_OK && n != JNI_EDETACHED) {
+ OSL_ENSURE(false, "JNI: GetEnv failed");
+ }
+ if (pEnv == 0)
+ {
+ if (m_pVm->AttachCurrentThread(reinterpret_cast< void ** >(&pEnv), 0)
+ != JNI_OK)
+ return 0;
+ *pAttached = true;
+ }
+ else
+ *pAttached = false;
+ return pEnv;
+#endif
+}
+
+void VirtualMachine::detachThread() const
+{
+#ifdef SOLAR_JAVA
+ if (m_pVm->DetachCurrentThread() != JNI_OK) {
+ OSL_ENSURE(false, "JNI: DetachCurrentThread failed");
+ }
+#endif
+}