You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/12/07 09:00:17 UTC
[02/24] cayenne git commit: CAY-2372 Extracted OSGI module from
server module
CAY-2372 Extracted OSGI module from server module
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/b3a065f2
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/b3a065f2
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/b3a065f2
Branch: refs/heads/master
Commit: b3a065f27bc27f0e2f30a9518cd7c31388c9a305
Parents: 066d176
Author: Maxim Petrusevich <ma...@gmail.com>
Authored: Tue Oct 31 08:55:24 2017 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Nov 22 10:10:19 2017 +0300
----------------------------------------------------------------------
cayenne-osgi/pom.xml | 35 ++++++++
.../cayenne/osgi/OsgiClassLoaderManager.java | 75 +++++++++++++++++
.../cayenne/osgi/OsgiDataDomainProvider.java | 78 ++++++++++++++++++
.../org/apache/cayenne/osgi/OsgiModule.java | 61 ++++++++++++++
.../apache/cayenne/osgi/OsgiModuleBuilder.java | 86 ++++++++++++++++++++
.../osgi/OsgiClassLoaderManagerTest.java | 59 ++++++++++++++
.../osgi/OsgiClassLoaderManager.java | 74 -----------------
.../osgi/OsgiDataDomainProvider.java | 77 ------------------
.../cayenne/configuration/osgi/OsgiModule.java | 60 --------------
.../configuration/osgi/OsgiModuleBuilder.java | 85 -------------------
.../osgi/OsgiClassLoaderManagerTest.java | 59 --------------
pom.xml | 4 +
12 files changed, 398 insertions(+), 355 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-osgi/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-osgi/pom.xml b/cayenne-osgi/pom.xml
new file mode 100644
index 0000000..724df7e
--- /dev/null
+++ b/cayenne-osgi/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>cayenne-parent</artifactId>
+ <groupId>org.apache.cayenne</groupId>
+ <version>4.1.M2-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>cayenne-osgi</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.cayenne</groupId>
+ <artifactId>cayenne-server</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <!-- TEST DEPENDENCIES -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiClassLoaderManager.java
----------------------------------------------------------------------
diff --git a/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiClassLoaderManager.java b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiClassLoaderManager.java
new file mode 100644
index 0000000..eeb7cf9
--- /dev/null
+++ b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiClassLoaderManager.java
@@ -0,0 +1,75 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ ****************************************************************/
+
+package org.apache.cayenne.osgi;
+
+import java.util.Map;
+
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.Injector;
+
+/**
+ * @since 4.0
+ */
+public class OsgiClassLoaderManager implements ClassLoaderManager {
+
+ private static final String CAYENNE_PACKAGE = "org/apache/cayenne";
+ private static final String CAYENNE_DI_PACKAGE_SUFFIX = "/di";
+
+ private ClassLoader applicationClassLoader;
+ private ClassLoader cayenneServerClassLoader;
+ private ClassLoader cayenneDiClassLoader;
+ private Map<String, ClassLoader> perResourceClassLoaders;
+
+ public OsgiClassLoaderManager(ClassLoader applicationClassLoader, Map<String, ClassLoader> perResourceClassLoaders) {
+ this.applicationClassLoader = applicationClassLoader;
+ this.cayenneDiClassLoader = Injector.class.getClassLoader();
+ this.cayenneServerClassLoader = OsgiClassLoaderManager.class.getClassLoader();
+ this.perResourceClassLoaders = perResourceClassLoaders;
+ }
+
+ @Override
+ public ClassLoader getClassLoader(String resourceName) {
+ if (resourceName == null || resourceName.length() < 2) {
+ return resourceClassLoader(resourceName);
+ }
+
+ String normalizedName = resourceName.charAt(0) == '/' ? resourceName.substring(1) : resourceName;
+ if (normalizedName.startsWith(CAYENNE_PACKAGE)) {
+
+ return (normalizedName.substring(CAYENNE_PACKAGE.length()).startsWith(CAYENNE_DI_PACKAGE_SUFFIX)) ? cayenneDiClassLoader()
+ : cayenneServerClassLoader();
+ }
+
+ return resourceClassLoader(resourceName);
+ }
+
+ protected ClassLoader resourceClassLoader(String resourceName) {
+ ClassLoader cl = perResourceClassLoaders.get(resourceName);
+ return cl != null ? cl : applicationClassLoader;
+ }
+
+ protected ClassLoader cayenneDiClassLoader() {
+ return cayenneDiClassLoader;
+ }
+
+ protected ClassLoader cayenneServerClassLoader() {
+ return cayenneServerClassLoader;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiDataDomainProvider.java
----------------------------------------------------------------------
diff --git a/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiDataDomainProvider.java b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiDataDomainProvider.java
new file mode 100644
index 0000000..2981102
--- /dev/null
+++ b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiDataDomainProvider.java
@@ -0,0 +1,78 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ ****************************************************************/
+
+package org.apache.cayenne.osgi;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.configuration.server.DataDomainProvider;
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.ObjEntity;
+
+/**
+ * @since 4.0
+ */
+// TODO: this is really a hack until we can have fully injectable class loading
+// at the EntityResolver level per CAY-1887
+public class OsgiDataDomainProvider extends DataDomainProvider {
+
+ private ClassLoaderManager classLoaderManager;
+
+ public OsgiDataDomainProvider(@Inject ClassLoaderManager classLoaderManager) {
+ this.classLoaderManager = classLoaderManager;
+ }
+
+ @Override
+ public DataDomain get() throws ConfigurationException {
+
+ // here goes the class loading hack, temporarily setting application
+ // bundle ClassLoader to be a thread ClassLoader for runtime to start.
+
+ Thread thread = Thread.currentThread();
+ ClassLoader activeCl = thread.getContextClassLoader();
+ try {
+
+ // using fake package name... as long as it is not
+ // org.apache.cayenne, this do the right trick
+ thread.setContextClassLoader(classLoaderManager.getClassLoader("com/"));
+
+ DataDomain domain = super.get();
+ EntityResolver entityResolver = domain.getEntityResolver();
+ for (ObjEntity e : entityResolver.getObjEntities()) {
+
+ // it is not enough to just call 'getObjectClass()' on
+ // ClassDescriptor - there's an optimization that prevents full
+ // descriptor resolving... so calling some other method...
+ entityResolver.getClassDescriptor(e.getName()).getProperty("__dummy__");
+ entityResolver.getCallbackRegistry();
+ }
+
+ // this triggers callbacks initialization using thread class loader
+ entityResolver.getCallbackRegistry();
+
+ return domain;
+
+ } finally {
+ thread.setContextClassLoader(activeCl);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModule.java
----------------------------------------------------------------------
diff --git a/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModule.java b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModule.java
new file mode 100644
index 0000000..7dd40d3
--- /dev/null
+++ b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModule.java
@@ -0,0 +1,61 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ ****************************************************************/
+
+package org.apache.cayenne.osgi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.Module;
+
+/**
+ * A DI module that helps to bootstrap Cayenne in OSGi environment.
+ *
+ * @since 4.0
+ */
+public class OsgiModule implements Module {
+
+ private Class<?> typeFromProjectBundle;
+ private Map<String, ClassLoader> perTypeClassLoaders;
+
+ OsgiModule() {
+ this.perTypeClassLoaders = new HashMap<>();
+ }
+
+ void setTypeFromProjectBundle(Class<?> typeFromProjectBundle) {
+ this.typeFromProjectBundle = typeFromProjectBundle;
+ }
+
+ void putClassLoader(String type, ClassLoader classLoader) {
+ perTypeClassLoaders.put(type, classLoader);
+ }
+
+ @Override
+ public void configure(Binder binder) {
+ binder.bind(ClassLoaderManager.class).toInstance(createClassLoaderManager());
+ binder.bind(DataDomain.class).toProvider(OsgiDataDomainProvider.class);
+ }
+
+ private ClassLoaderManager createClassLoaderManager() {
+ return new OsgiClassLoaderManager(typeFromProjectBundle.getClassLoader(), perTypeClassLoaders);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModuleBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModuleBuilder.java b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModuleBuilder.java
new file mode 100644
index 0000000..cb0377b
--- /dev/null
+++ b/cayenne-osgi/src/main/java/org/apache/cayenne/osgi/OsgiModuleBuilder.java
@@ -0,0 +1,86 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ ****************************************************************/
+
+package org.apache.cayenne.osgi;
+
+import java.sql.Driver;
+
+import org.apache.cayenne.di.Module;
+
+/**
+ * A builder of a DI module that helps to bootstrap Cayenne in OSGi environment.
+ *
+ * @since 4.0
+ */
+public class OsgiModuleBuilder {
+
+ private OsgiModule module;
+
+ public static OsgiModuleBuilder forProject(Class<?> typeFromProjectBundle) {
+
+ if (typeFromProjectBundle == null) {
+ throw new NullPointerException("Null 'typeFromProjectBundle'");
+ }
+
+ return new OsgiModuleBuilder(typeFromProjectBundle);
+ }
+
+ private OsgiModuleBuilder(Class<?> typeFromProjectBundle) {
+ this.module = new OsgiModule();
+ module.setTypeFromProjectBundle(typeFromProjectBundle);
+ }
+
+ /**
+ * Registers a JDBC driver class used by Cayenne. This is an optional piece
+ * of information used by Cayenne to find JDBC driver in case of Cayenne
+ * managed DataSource. E.g. don't use this when you are using a JNDI
+ * DataSource.
+ */
+ public OsgiModuleBuilder withDriver(Class<? extends Driver> driverType) {
+ return withType(driverType);
+ }
+
+ /**
+ * Registers an arbitrary Java class. If Cayenne tries to load it via
+ * reflection later on, it will be using ClassLoader attached to the class
+ * passed to this method.
+ */
+ public OsgiModuleBuilder withType(Class<?> type) {
+ module.putClassLoader(type.getName(), type.getClassLoader());
+ return this;
+ }
+
+ /**
+ * Registers an arbitrary Java class. If Cayenne tries to load it via
+ * reflection later on, it will be using ClassLoader attached to the class
+ * passed to this method.
+ */
+ public OsgiModuleBuilder withTypes(Class<?>... types) {
+ if (types != null) {
+ for (Class<?> type : types) {
+ module.putClassLoader(type.getName(), type.getClassLoader());
+ }
+ }
+ return this;
+ }
+
+ public Module module() {
+ return module;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-osgi/src/test/java/org/apache/cayenne/osgi/OsgiClassLoaderManagerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-osgi/src/test/java/org/apache/cayenne/osgi/OsgiClassLoaderManagerTest.java b/cayenne-osgi/src/test/java/org/apache/cayenne/osgi/OsgiClassLoaderManagerTest.java
new file mode 100644
index 0000000..b3d267d
--- /dev/null
+++ b/cayenne-osgi/src/test/java/org/apache/cayenne/osgi/OsgiClassLoaderManagerTest.java
@@ -0,0 +1,59 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ ****************************************************************/
+
+package org.apache.cayenne.osgi;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.Collections;
+
+public class OsgiClassLoaderManagerTest {
+
+ @Test
+ public void testGetClassLoader() {
+
+ final ClassLoader appCl = Mockito.mock(ClassLoader.class);
+ final ClassLoader diCl = Mockito.mock(ClassLoader.class);
+ final ClassLoader serverCl = Mockito.mock(ClassLoader.class);
+
+ OsgiClassLoaderManager manager = new OsgiClassLoaderManager(appCl, Collections.<String, ClassLoader> emptyMap()) {
+ @Override
+ protected ClassLoader cayenneDiClassLoader() {
+ return diCl;
+ }
+
+ @Override
+ protected ClassLoader cayenneServerClassLoader() {
+ return serverCl;
+ }
+ };
+
+ Assert.assertSame(appCl, manager.getClassLoader(null));
+ Assert.assertSame(appCl, manager.getClassLoader(""));
+ Assert.assertSame(appCl, manager.getClassLoader("org/example/test"));
+ Assert.assertSame(appCl, manager.getClassLoader("/org/example/test"));
+ Assert.assertSame(serverCl, manager.getClassLoader("/org/apache/cayenne/access/DataContext.class"));
+ Assert.assertSame(diCl, manager.getClassLoader("/org/apache/cayenne/di/Injector.class"));
+ Assert.assertSame(diCl, manager.getClassLoader("org/apache/cayenne/di/Injector.class"));
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java
deleted file mode 100644
index a1b9714..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
-
-import java.util.Map;
-
-import org.apache.cayenne.di.ClassLoaderManager;
-import org.apache.cayenne.di.Injector;
-
-/**
- * @since 4.0
- */
-public class OsgiClassLoaderManager implements ClassLoaderManager {
-
- private static final String CAYENNE_PACKAGE = "org/apache/cayenne";
- private static final String CAYENNE_DI_PACKAGE_SUFFIX = "/di";
-
- private ClassLoader applicationClassLoader;
- private ClassLoader cayenneServerClassLoader;
- private ClassLoader cayenneDiClassLoader;
- private Map<String, ClassLoader> perResourceClassLoaders;
-
- public OsgiClassLoaderManager(ClassLoader applicationClassLoader, Map<String, ClassLoader> perResourceClassLoaders) {
- this.applicationClassLoader = applicationClassLoader;
- this.cayenneDiClassLoader = Injector.class.getClassLoader();
- this.cayenneServerClassLoader = OsgiClassLoaderManager.class.getClassLoader();
- this.perResourceClassLoaders = perResourceClassLoaders;
- }
-
- @Override
- public ClassLoader getClassLoader(String resourceName) {
- if (resourceName == null || resourceName.length() < 2) {
- return resourceClassLoader(resourceName);
- }
-
- String normalizedName = resourceName.charAt(0) == '/' ? resourceName.substring(1) : resourceName;
- if (normalizedName.startsWith(CAYENNE_PACKAGE)) {
-
- return (normalizedName.substring(CAYENNE_PACKAGE.length()).startsWith(CAYENNE_DI_PACKAGE_SUFFIX)) ? cayenneDiClassLoader()
- : cayenneServerClassLoader();
- }
-
- return resourceClassLoader(resourceName);
- }
-
- protected ClassLoader resourceClassLoader(String resourceName) {
- ClassLoader cl = perResourceClassLoaders.get(resourceName);
- return cl != null ? cl : applicationClassLoader;
- }
-
- protected ClassLoader cayenneDiClassLoader() {
- return cayenneDiClassLoader;
- }
-
- protected ClassLoader cayenneServerClassLoader() {
- return cayenneServerClassLoader;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java
deleted file mode 100644
index fafe4d5..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
-
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.access.DataDomain;
-import org.apache.cayenne.configuration.server.DataDomainProvider;
-import org.apache.cayenne.di.ClassLoaderManager;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * @since 4.0
- */
-// TODO: this is really a hack until we can have fully injectable class loading
-// at the EntityResolver level per CAY-1887
-public class OsgiDataDomainProvider extends DataDomainProvider {
-
- private ClassLoaderManager classLoaderManager;
-
- public OsgiDataDomainProvider(@Inject ClassLoaderManager classLoaderManager) {
- this.classLoaderManager = classLoaderManager;
- }
-
- @Override
- public DataDomain get() throws ConfigurationException {
-
- // here goes the class loading hack, temporarily setting application
- // bundle ClassLoader to be a thread ClassLoader for runtime to start.
-
- Thread thread = Thread.currentThread();
- ClassLoader activeCl = thread.getContextClassLoader();
- try {
-
- // using fake package name... as long as it is not
- // org.apache.cayenne, this do the right trick
- thread.setContextClassLoader(classLoaderManager.getClassLoader("com/"));
-
- DataDomain domain = super.get();
- EntityResolver entityResolver = domain.getEntityResolver();
- for (ObjEntity e : entityResolver.getObjEntities()) {
-
- // it is not enough to just call 'getObjectClass()' on
- // ClassDescriptor - there's an optimization that prevents full
- // descriptor resolving... so calling some other method...
- entityResolver.getClassDescriptor(e.getName()).getProperty("__dummy__");
- entityResolver.getCallbackRegistry();
- }
-
- // this triggers callbacks initialization using thread class loader
- entityResolver.getCallbackRegistry();
-
- return domain;
-
- } finally {
- thread.setContextClassLoader(activeCl);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java
deleted file mode 100644
index 7b1a602..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.access.DataDomain;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.ClassLoaderManager;
-import org.apache.cayenne.di.Module;
-
-/**
- * A DI module that helps to bootstrap Cayenne in OSGi environment.
- *
- * @since 4.0
- */
-public class OsgiModule implements Module {
-
- private Class<?> typeFromProjectBundle;
- private Map<String, ClassLoader> perTypeClassLoaders;
-
- OsgiModule() {
- this.perTypeClassLoaders = new HashMap<>();
- }
-
- void setTypeFromProjectBundle(Class<?> typeFromProjectBundle) {
- this.typeFromProjectBundle = typeFromProjectBundle;
- }
-
- void putClassLoader(String type, ClassLoader classLoader) {
- perTypeClassLoaders.put(type, classLoader);
- }
-
- @Override
- public void configure(Binder binder) {
- binder.bind(ClassLoaderManager.class).toInstance(createClassLoaderManager());
- binder.bind(DataDomain.class).toProvider(OsgiDataDomainProvider.class);
- }
-
- private ClassLoaderManager createClassLoaderManager() {
- return new OsgiClassLoaderManager(typeFromProjectBundle.getClassLoader(), perTypeClassLoaders);
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModuleBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModuleBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModuleBuilder.java
deleted file mode 100644
index 481f220..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModuleBuilder.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
-
-import java.sql.Driver;
-
-import org.apache.cayenne.di.Module;
-
-/**
- * A builder of a DI module that helps to bootstrap Cayenne in OSGi environment.
- *
- * @since 4.0
- */
-public class OsgiModuleBuilder {
-
- private OsgiModule module;
-
- public static OsgiModuleBuilder forProject(Class<?> typeFromProjectBundle) {
-
- if (typeFromProjectBundle == null) {
- throw new NullPointerException("Null 'typeFromProjectBundle'");
- }
-
- return new OsgiModuleBuilder(typeFromProjectBundle);
- }
-
- private OsgiModuleBuilder(Class<?> typeFromProjectBundle) {
- this.module = new OsgiModule();
- module.setTypeFromProjectBundle(typeFromProjectBundle);
- }
-
- /**
- * Registers a JDBC driver class used by Cayenne. This is an optional piece
- * of information used by Cayenne to find JDBC driver in case of Cayenne
- * managed DataSource. E.g. don't use this when you are using a JNDI
- * DataSource.
- */
- public OsgiModuleBuilder withDriver(Class<? extends Driver> driverType) {
- return withType(driverType);
- }
-
- /**
- * Registers an arbitrary Java class. If Cayenne tries to load it via
- * reflection later on, it will be using ClassLoader attached to the class
- * passed to this method.
- */
- public OsgiModuleBuilder withType(Class<?> type) {
- module.putClassLoader(type.getName(), type.getClassLoader());
- return this;
- }
-
- /**
- * Registers an arbitrary Java class. If Cayenne tries to load it via
- * reflection later on, it will be using ClassLoader attached to the class
- * passed to this method.
- */
- public OsgiModuleBuilder withTypes(Class<?>... types) {
- if (types != null) {
- for (Class<?> type : types) {
- module.putClassLoader(type.getName(), type.getClassLoader());
- }
- }
- return this;
- }
-
- public Module module() {
- return module;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java
deleted file mode 100644
index bf06086..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
-
-import org.junit.Test;
-
-import java.util.Collections;
-
-import static org.junit.Assert.assertSame;
-import static org.mockito.Mockito.mock;
-
-public class OsgiClassLoaderManagerTest {
-
- @Test
- public void testGetClassLoader() {
-
- final ClassLoader appCl = mock(ClassLoader.class);
- final ClassLoader diCl = mock(ClassLoader.class);
- final ClassLoader serverCl = mock(ClassLoader.class);
-
- OsgiClassLoaderManager manager = new OsgiClassLoaderManager(appCl, Collections.<String, ClassLoader> emptyMap()) {
- @Override
- protected ClassLoader cayenneDiClassLoader() {
- return diCl;
- }
-
- @Override
- protected ClassLoader cayenneServerClassLoader() {
- return serverCl;
- }
- };
-
- assertSame(appCl, manager.getClassLoader(null));
- assertSame(appCl, manager.getClassLoader(""));
- assertSame(appCl, manager.getClassLoader("org/example/test"));
- assertSame(appCl, manager.getClassLoader("/org/example/test"));
- assertSame(serverCl, manager.getClassLoader("/org/apache/cayenne/access/DataContext.class"));
- assertSame(diCl, manager.getClassLoader("/org/apache/cayenne/di/Injector.class"));
- assertSame(diCl, manager.getClassLoader("org/apache/cayenne/di/Injector.class"));
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b3a065f2/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 8ac1e2c..b890722 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,7 +79,11 @@
<module>tutorials</module>
<module>docs</module>
<module>assembly</module>
+<<<<<<< HEAD
<module>cayenne-web</module>
+=======
+ <module>cayenne-osgi</module>
+>>>>>>> e8768c6e3... CAY-2372 Extracted OSGI module from server module
</modules>
<issueManagement>
<system>jira</system>