You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/11/25 13:48:37 UTC
svn commit: r884078 - in /cayenne/sandbox/cayenne-di/src:
main/java/org/apache/cayenne/di/ main/java/org/apache/cayenne/di/spi/
main/java/org/apache/cayenne/runtime/
main/java/org/apache/cayenne/runtime/access/
main/java/org/apache/cayenne/runtime/conf...
Author: aadamchik
Date: Wed Nov 25 12:48:36 2009
New Revision: 884078
URL: http://svn.apache.org/viewvc?rev=884078&view=rev
Log:
setup Cayenne stack based on DI
- defining ConfigurationProvider based on the existing classes
- fixing the use of uninjected provider
Added:
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvider.java
- copied, changed from r884055, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvidersProvider.java
- copied, changed from r884055, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/CustomProvidersProvider.java
- copied, changed from r884055, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/access/
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/access/DataChannelProvider.java
- copied, changed from r884055, cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/ConfigurationProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/DIConfiguration.java
- copied, changed from r884055, cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java
Removed:
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/spi/DataChannelProvider.java
cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java
Modified:
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/CayenneModule.java
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java?rev=884078&r1=884077&r2=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java Wed Nov 25 12:48:36 2009
@@ -24,7 +24,9 @@
class SingletonProvider<T> implements Provider<T> {
private Provider<T> delegate;
- private T instance;
+
+ // presumably "volatile" works in Java 5 and newer to prevent double-checked locking
+ private volatile T instance;
public SingletonProvider(Provider<T> delegate) {
this.delegate = delegate;
@@ -32,9 +34,6 @@
public T get() {
- // using double-checked locking for lazy initialization, which is not guaranteed
- // to work on all architectures and JVMs. Better alternatives? Synchronizing the
- // entire method?
if (instance == null) {
synchronized (this) {
if (instance == null) {
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvider.java (from r884055, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorProvider.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvider.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvider.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorProvider.java&r1=884055&r2=884078&rev=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvider.java Wed Nov 25 12:48:36 2009
@@ -31,13 +31,13 @@
/**
* @since 3.1
*/
-class ConstructorProvider<T> implements Provider<T> {
+class ConstructorInjectingProvider<T> implements Provider<T> {
private Class<T> interfaceType;
private Constructor<? extends T> constructor;
private DefaultInjector injector;
- ConstructorProvider(Class<T> interfaceType, Class<? extends T> implementation,
+ ConstructorInjectingProvider(Class<T> interfaceType, Class<? extends T> implementation,
DefaultInjector injector) {
initConstructor(implementation);
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvidersProvider.java (from r884055, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvidersProvider.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvidersProvider.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java&r1=884055&r2=884078&rev=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ConstructorInjectingProvidersProvider.java Wed Nov 25 12:48:36 2009
@@ -22,33 +22,27 @@
import org.apache.cayenne.di.Provider;
/**
+ * An injecting provider for custom providers.
+ *
* @since 3.1
*/
-class ProviderConstructorProvider<T> implements Provider<T> {
+class ConstructorInjectingProvidersProvider<T> implements Provider<Provider<? extends T>> {
private Class<? extends Provider<? extends T>> providerType;
- ProviderConstructorProvider(Class<? extends Provider<? extends T>> providerType) {
+ ConstructorInjectingProvidersProvider(
+ Class<? extends Provider<? extends T>> providerType) {
this.providerType = providerType;
}
- public T get() throws DIException {
-
- Provider<? extends T> provider;
+ public Provider<? extends T> get() throws DIException {
try {
- provider = providerType.newInstance();
+ // TODO: constructor injection in provider?
+ return providerType.newInstance();
}
catch (Exception e) {
throw new DIException("Error instantiating provider '%s'", e, providerType
.getName());
}
-
- T object = provider.get();
- if (object == null) {
- throw new DIException("Provider '%s' returned null object", providerType
- .getName());
- }
-
- return object;
}
}
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/CustomProvidersProvider.java (from r884055, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/CustomProvidersProvider.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/CustomProvidersProvider.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java&r1=884055&r2=884078&rev=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ProviderConstructorProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/CustomProvidersProvider.java Wed Nov 25 12:48:36 2009
@@ -22,33 +22,19 @@
import org.apache.cayenne.di.Provider;
/**
+ * A wrapper around a provider that itself generates providers.
+ *
* @since 3.1
*/
-class ProviderConstructorProvider<T> implements Provider<T> {
+class CustomProvidersProvider<T> implements Provider<T> {
- private Class<? extends Provider<? extends T>> providerType;
+ private Provider<Provider<? extends T>> providerOfProviders;
- ProviderConstructorProvider(Class<? extends Provider<? extends T>> providerType) {
- this.providerType = providerType;
+ CustomProvidersProvider(Provider<Provider<? extends T>> providerOfProviders) {
+ this.providerOfProviders = providerOfProviders;
}
public T get() throws DIException {
-
- Provider<? extends T> provider;
- try {
- provider = providerType.newInstance();
- }
- catch (Exception e) {
- throw new DIException("Error instantiating provider '%s'", e, providerType
- .getName());
- }
-
- T object = provider.get();
- if (object == null) {
- throw new DIException("Provider '%s' returned null object", providerType
- .getName());
- }
-
- return object;
+ return providerOfProviders.get().get();
}
}
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java?rev=884078&r1=884077&r2=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java Wed Nov 25 12:48:36 2009
@@ -42,7 +42,7 @@
public BindingBuilder<T> to(Class<? extends T> implementation) throws DIException {
- Provider<T> provider0 = new ConstructorProvider<T>(
+ Provider<T> provider0 = new ConstructorInjectingProvider<T>(
interfaceType,
implementation,
injector);
@@ -57,10 +57,17 @@
public BindingBuilder<T> toProvider(
Class<? extends Provider<? extends T>> providerType) {
- Provider<T> provider0 = new ProviderConstructorProvider<T>(providerType);
- Provider<T> provider1 = new FieldInjectingProvider<T>(provider0, injector, key);
+ Provider<Provider<? extends T>> provider0 = new ConstructorInjectingProvidersProvider<T>(
+ providerType);
+ Provider<Provider<? extends T>> provider1 = new FieldInjectingProvider<Provider<? extends T>>(
+ provider0,
+ injector,
+ key);
- return bindInScope(provider1);
+ Provider<T> provider2 = new CustomProvidersProvider<T>(provider1);
+ Provider<T> provider3 = new FieldInjectingProvider<T>(provider2, injector, key);
+
+ return bindInScope(provider3);
}
public void in(Scope scope) {
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/CayenneModule.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/CayenneModule.java?rev=884078&r1=884077&r2=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/CayenneModule.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/CayenneModule.java Wed Nov 25 12:48:36 2009
@@ -19,12 +19,14 @@
package org.apache.cayenne.runtime;
import org.apache.cayenne.DataChannel;
+import org.apache.cayenne.conf.Configuration;
import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.Module;
import org.apache.cayenne.di.Scopes;
+import org.apache.cayenne.runtime.access.DataChannelProvider;
+import org.apache.cayenne.runtime.configuration.ConfigurationProvider;
import org.apache.cayenne.runtime.resource.ClassLoaderResourceLocator;
import org.apache.cayenne.runtime.resource.ResourceLocator;
-import org.apache.cayenne.runtime.spi.DataChannelProvider;
/**
* A DI module containing all Cayenne framework configurations.
@@ -35,9 +37,10 @@
public void configure(Binder binder) {
- binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocator.class);
-
- // TODO: bogus impl
+ binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocator.class).in(
+ Scopes.SINGLETON);
+ binder.bind(Configuration.class).toProvider(ConfigurationProvider.class).in(
+ Scopes.SINGLETON);
binder.bind(DataChannel.class).toProvider(DataChannelProvider.class).in(
Scopes.SINGLETON);
}
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/access/DataChannelProvider.java (from r884055, cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/access/DataChannelProvider.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/access/DataChannelProvider.java&p1=cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java&r1=884055&r2=884078&rev=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/access/DataChannelProvider.java Wed Nov 25 12:48:36 2009
@@ -16,24 +16,23 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-package org.apache.cayenne.runtime;
-
-import junit.framework.TestCase;
+package org.apache.cayenne.runtime.access;
import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-
-public class CayenneModuleTest extends TestCase {
-
- public void testDataChannelBound() {
- CayenneModule module = new CayenneModule();
-
- Injector injector = DIBootstrap.createInjector(module);
+import org.apache.cayenne.conf.Configuration;
+import org.apache.cayenne.di.DIException;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+
+/**
+ * @since 3.1
+ */
+public class DataChannelProvider implements Provider<DataChannel> {
+
+ @Inject
+ private Configuration configuration;
- DataChannel channel = injector.getInstance(DataChannel.class);
- assertSame("DataChannel must be a singleton", channel, injector
- .getInstance(DataChannel.class));
- // assertTrue(channel instanceof DataDomain);
+ public DataChannel get() throws DIException {
+ return configuration.getDomain();
}
}
Added: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/ConfigurationProvider.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/ConfigurationProvider.java?rev=884078&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/ConfigurationProvider.java (added)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/ConfigurationProvider.java Wed Nov 25 12:48:36 2009
@@ -0,0 +1,108 @@
+/*****************************************************************
+ * 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.runtime.configuration;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
+
+import org.apache.cayenne.conf.ConfigLoader;
+import org.apache.cayenne.conf.ConfigLoaderDelegate;
+import org.apache.cayenne.conf.Configuration;
+import org.apache.cayenne.conf.RuntimeLoadDelegate;
+import org.apache.cayenne.di.DIException;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+import org.apache.cayenne.runtime.resource.Resource;
+import org.apache.cayenne.runtime.resource.ResourceLocator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class ConfigurationProvider implements Provider<Configuration> {
+
+ private static Log logger = LogFactory.getLog(ConfigurationProvider.class);
+
+ @Inject
+ private ResourceLocator resourceLocator;
+
+ protected String getConfigurationName() {
+ return Configuration.DEFAULT_DOMAIN_FILE;
+ }
+
+ public Configuration get() throws DIException {
+
+ logger.debug("starting configuration loading");
+
+ String configurationName = getConfigurationName();
+ Collection<Resource> configurations = resourceLocator
+ .findResources(configurationName);
+
+ if (configurations.isEmpty()) {
+ throw new DIException(
+ "[%s] : Configuration file \"%s\" is not found.",
+ getClass().getName(),
+ configurationName);
+ }
+
+ Resource configurationResource = configurations.iterator().next();
+ URL configurationURL = configurationResource.getURL();
+
+ // no support for multiple configs yet, but this is not a hard error
+ if (configurations.size() > 1) {
+ logger.info(String.format(
+ "found %d Cayenne configurations, will use the first one: %s",
+ configurations.size(),
+ configurationURL));
+ }
+
+ Configuration configuration = new DIConfiguration();
+
+ ConfigLoaderDelegate delegate = new RuntimeLoadDelegate(
+ configuration,
+ configuration.getLoadStatus());
+
+ InputStream in = null;
+ try {
+ in = configurationURL.openStream();
+ new ConfigLoader(delegate).loadDomains(in);
+ }
+ catch (Exception e) {
+ throw new DIException(
+ "Error loading configuration from %s",
+ e,
+ configurationURL);
+ }
+ finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ }
+ catch (IOException ioex) {
+ logger.info(String.format(
+ "failure closing input stream for %s, ignoring",
+ configurationURL), ioex);
+ }
+ }
+
+ logger.debug("finsihed configuration loading");
+ return configuration;
+ }
+}
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/DIConfiguration.java (from r884055, cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/DIConfiguration.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/DIConfiguration.java&p1=cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java&r1=884055&r2=884078&rev=884078&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/runtime/CayenneModuleTest.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/runtime/configuration/DIConfiguration.java Wed Nov 25 12:48:36 2009
@@ -16,24 +16,24 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-package org.apache.cayenne.runtime;
+package org.apache.cayenne.runtime.configuration;
-import junit.framework.TestCase;
+import org.apache.cayenne.conf.Configuration;
+import org.apache.cayenne.conf.ResourceFinder;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-
-public class CayenneModuleTest extends TestCase {
-
- public void testDataChannelBound() {
- CayenneModule module = new CayenneModule();
-
- Injector injector = DIBootstrap.createInjector(module);
+/**
+ * @since 3.1
+ */
+class DIConfiguration extends Configuration {
+
+ @Override
+ protected ResourceFinder getResourceFinder() {
+ throw new UnsupportedOperationException();
+ }
- DataChannel channel = injector.getInstance(DataChannel.class);
- assertSame("DataChannel must be a singleton", channel, injector
- .getInstance(DataChannel.class));
- // assertTrue(channel instanceof DataDomain);
+ @Override
+ public void initialize() throws Exception {
+ throw new UnsupportedOperationException();
}
+
}