You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2011/11/04 02:11:34 UTC
svn commit: r1197378 - in
/myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/
api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/
impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
Author: gpetracek
Date: Fri Nov 4 01:11:33 2011
New Revision: 1197378
URL: http://svn.apache.org/viewvc?rev=1197378&view=rev
Log:
EXTCDI-236 AbstractConfigurableDataSource and refactoring to existing util-methods
Added:
myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java (contents, props changed)
- copied, changed from r1197347, myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
Removed:
myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
Modified:
myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml?rev=1197378&r1=1197377&r2=1197378&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml Fri Nov 4 01:11:33 2011
@@ -36,18 +36,6 @@
<groupId>org.apache.myfaces.extensions.cdi.core</groupId>
<artifactId>myfaces-extcdi-core-api</artifactId>
</dependency>
- <dependency>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils-core</artifactId>
- <version>1.8.3</version>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- <optional>true</optional>
- </dependency>
</dependencies>
<build>
@@ -66,39 +54,6 @@
</execution>
</executions>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <createSourcesJar>true</createSourcesJar>
- <createDependencyReducedPom>false</createDependencyReducedPom>
- <minimizeJar>true</minimizeJar>
- <artifactSet>
- <includes>
- <include>commons-beanutils:commons-beanutils</include>
- <include>commons-logging:commons-logging</include>
- </includes>
- </artifactSet>
- <relocations>
- <relocation>
- <pattern>org.apache.commons.beanutils</pattern>
- <shadedPattern>org.apache.myfaces.codi.shaded.commons.beanutils</shadedPattern>
- </relocation>
- <relocation>
- <pattern>org.apache.commons.logging</pattern>
- <shadedPattern>org.apache.myfaces.codi.shaded.commons.logging</shadedPattern>
- </relocation>
- </relocations>
- </configuration>
- </plugin>
</plugins>
</build>
Added: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java?rev=1197378&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java Fri Nov 4 01:11:33 2011
@@ -0,0 +1,191 @@
+/*
+ * 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.myfaces.extensions.cdi.jpa.api.datasource;
+
+import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
+
+import javax.sql.DataSource;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.logging.Logger;
+
+/**
+ * <p>This class can be used instead of a real DataSource.
+ * It is a simple wrapper to hide any database configuration details
+ * and make it configurable via CDI.</p>
+ * <p/>
+ * <p>The configuration itself will be provided via CDI mechanics.
+ * To distinguish different databases, users can specify a
+ * <code>connectionId</code>. If no <code>connectionId</code> is set,
+ * the String <code>default</code> will be used</p>
+ */
+public abstract class AbstractConfigurableDataSource implements DataSource
+{
+ /**
+ * config and settings are loaded only once.
+ */
+ private boolean loaded;
+
+ /**
+ * The connectionId allows to configure multiple databases.
+ * This can e.g. be used to distinguish between a 'customer' and 'admin'
+ * database.
+ */
+ protected String connectionId = "default";
+
+ /**
+ * The underlying configuration of the datasource
+ */
+ private DataSourceConfig dataSourceConfig;
+
+ private volatile DataSource wrappedDataSource;
+
+ public AbstractConfigurableDataSource()
+ {
+ loaded = false;
+ dataSourceConfig = BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
+ }
+
+ public void setConnectionId(String connectionId)
+ {
+ if (loaded)
+ {
+ throw new IllegalStateException("connectionId must not get changed after the DataSource was established");
+ }
+ this.connectionId = connectionId;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Connection getConnection() throws SQLException
+ {
+ return getConnection(null, null);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Connection getConnection(String userName, String password) throws SQLException
+ {
+ if (wrappedDataSource == null)
+ {
+ initDataSource();
+ }
+
+ if (userName == null && password == null)
+ {
+ return wrappedDataSource.getConnection();
+ }
+ return wrappedDataSource.getConnection(userName, password);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public PrintWriter getLogWriter() throws SQLException
+ {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setLogWriter(PrintWriter printWriter) throws SQLException
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setLoginTimeout(int loginTimeout) throws SQLException
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLoginTimeout() throws SQLException
+ {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public <T> T unwrap(Class<T> iface) throws SQLException
+ {
+ if (isWrapperFor(iface))
+ {
+ return (T) this;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isWrapperFor(Class<?> iface) throws SQLException
+ {
+ return iface.isAssignableFrom(getClass());
+ }
+
+ /**
+ * NEW JDK1.7 signature.
+ * This makes sure that CODI can also get compiled using java-7.
+ * This method is not actively used though.
+ */
+ public Logger getParentLogger() throws SQLFeatureNotSupportedException
+ {
+ throw new SQLFeatureNotSupportedException();
+ }
+
+ protected void initDataSource() throws SQLException
+ {
+ // double check lock idiom on volatile member is ok as of Java5
+ if (wrappedDataSource != null)
+ {
+ return;
+ }
+
+ this.wrappedDataSource = resolveDataSource();
+
+ if(this.wrappedDataSource == null)
+ {
+ throw new IllegalStateException("No DataSource found.");
+ }
+
+ configureDataSource(this.wrappedDataSource);
+ }
+
+ public DataSourceConfig getDataSourceConfig()
+ {
+ return dataSourceConfig;
+ }
+
+ protected abstract DataSource resolveDataSource() throws SQLException;
+
+ protected abstract void configureDataSource(DataSource dataSource);
+}
Copied: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java (from r1197347, myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java&r1=1197347&r2=1197378&rev=1197378&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java Fri Nov 4 01:11:33 2011
@@ -16,206 +16,94 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.myfaces.extensions.cdi.jpa.api.datasource;
+package org.apache.myfaces.extensions.cdi.jpa.impl.datasource;
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
+import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
+import org.apache.myfaces.extensions.cdi.core.impl.util.JndiUtils;
+import org.apache.myfaces.extensions.cdi.jpa.api.datasource.AbstractConfigurableDataSource;
-import javax.naming.InitialContext;
import javax.sql.DataSource;
-import java.io.PrintWriter;
-import java.sql.Connection;
+import java.lang.reflect.Method;
import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
import java.util.Map;
+import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.naming.Context;
-/**
- * <p>This class can be used instead of a real DataSource.
- * It is a simple wrapper to hide any database configuration details
- * and make it configurable via CDI.</p>
- *
- * <p>The configuration itself will be provided via CDI mechanics.
- * To distinguish different databases, users can specify a
- * <code>connectionId</code>. If no <code>connectionId</code> is set,
- * the String <code>default</code> will be used</p>
- */
-public class ConfigurableDataSource implements DataSource
+public class DefaultConfigurableDataSource extends AbstractConfigurableDataSource
{
/**
- * config and settings are loaded only once.
- */
- private boolean loaded;
-
- /**
- * The connectionId allows to configure multiple databases.
- * This can e.g. be used to distinguish between a 'customer' and 'admin'
- * database.
- */
- private String connectionId = "default";
-
- /**
- * The underlying configuration of the datasource
- */
- private DataSourceConfig dataSourceConfig;
-
- /**
- *
+ * {@inheritDoc}
*/
- private volatile DataSource wrappedDataSource;
-
- public ConfigurableDataSource()
- {
- loaded = false;
- dataSourceConfig = BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
- }
-
- public void setConnectionId(String connectionId)
- {
- if (loaded)
- {
- throw new IllegalStateException("connectionId must not get changed after the DataSource was established");
- }
- this.connectionId = connectionId;
- }
-
- public Connection getConnection() throws SQLException
+ protected DataSource resolveDataSource() throws SQLException
{
- return getConnection(null, null);
- }
+ String jndiLookupName = getDataSourceConfig().getJndiResourceName(connectionId);
- public Connection getConnection(String userName, String password) throws SQLException
- {
- if (wrappedDataSource == null)
+ if (jndiLookupName != null && jndiLookupName.length() > 0)
{
- initDataSource();
+ return JndiUtils.lookup(jndiLookupName, DataSource.class);
}
- if (userName == null && password == null)
+ // no JNDI, so we take the direct JDBC route.
+ String jdbcDriverClass = getDataSourceConfig().getDriverClassName(connectionId);
+ if (jdbcDriverClass == null || jdbcDriverClass.length() == 0)
{
- return wrappedDataSource.getConnection();
+ throw new SQLException("Neither a JNDI location nor a JDBC driver class name is configured!");
}
- return wrappedDataSource.getConnection(userName, password);
- }
-
-
- public PrintWriter getLogWriter() throws SQLException
- {
- return null;
- }
- public void setLogWriter(PrintWriter printWriter) throws SQLException
- {
+ return ClassUtils.tryToInstantiateClassForName(jdbcDriverClass, DataSource.class);
}
- public void setLoginTimeout(int loginTimeout) throws SQLException
- {
- }
-
- public int getLoginTimeout() throws SQLException
+ /**
+ * {@inheritDoc}
+ */
+ protected void configureDataSource(DataSource dataSource)
{
- return 0;
- }
+ Map<String, String> config = getDataSourceConfig().getConnectionProperties(connectionId);
- public <T> T unwrap(Class<T> iface) throws SQLException
- {
- if (isWrapperFor(iface))
- {
- return (T) this;
- }
- else
+ for (Map.Entry<String, String> configOption : config.entrySet())
{
- return null;
+ setProperty(dataSource, configOption);
}
}
- public boolean isWrapperFor(Class<?> iface) throws SQLException
+ protected void setProperty(DataSource dataSource, Map.Entry<String, String> configOption)
{
- return iface.isAssignableFrom(ConfigurableDataSource.class);
- }
-
- /**
- * NEW JDK1.7 signature.
- * This makes sure that CODI can also get compiled using java-7.
- * This method is not actively used though.
- */
- public Logger getParentLogger() throws SQLFeatureNotSupportedException
- {
- throw new SQLFeatureNotSupportedException();
- }
+ Method setterMethod = findSetterForProperty(dataSource, configOption);
- /**
- *
- */
- protected void initDataSource() throws SQLException
- {
- // double check lock idiom on volatile member is ok as of Java5
- if (wrappedDataSource != null)
+ if(setterMethod == null)
{
- return;
- }
+ Logger logger = Logger.getLogger(getClass().getName());
- String jndiLookupName = dataSourceConfig.getJndiResourceName(connectionId);
- if (jndiLookupName != null && jndiLookupName.length() > 0)
- {
- wrappedDataSource = resolveDataSourceViaJndi(jndiLookupName);
+ if(logger.isLoggable(Level.WARNING))
+ {
+ logger.warning(dataSource.getClass().getName() +
+ " has no setter for property '" + configOption.getKey() + "'. Property gets ignored.");
+ }
return;
}
-
- // no JNDI, so we take the direct JDBC route.
- String jdbcDriverClass = dataSourceConfig.getDriverClassName(connectionId);
- if (jdbcDriverClass == null && jdbcDriverClass.length() == 0)
- {
- throw new SQLException("Neither a JNDI location nor a JDBC driver class name is configured!");
- }
-
try
{
- Class clazz = Class.forName(jdbcDriverClass);
-
- // the given driver classname must be a DataSource
- if (!DataSource.class.isAssignableFrom(clazz))
- {
- throw new SQLException("Configured DriverClassName is not a javax.sql.DataSource: "
- + jdbcDriverClass);
- }
-
- wrappedDataSource = (DataSource) clazz.newInstance();
-
- Map<String, String> config = dataSourceConfig.getConnectionProperties(connectionId);
- for (Map.Entry<String, String> configOption : config.entrySet())
- {
- BeanUtils.setProperty(wrappedDataSource, configOption.getKey(), configOption.getValue());
- }
+ setterMethod.invoke(dataSource, configOption.getValue());
}
catch (Exception e)
{
- wrappedDataSource = null;
-
- if (e instanceof SQLException)
- {
- throw (SQLException) e;
- }
- throw new SQLException(e);
+ throw new IllegalStateException(setterMethod.getDeclaringClass().getName() + "#" + setterMethod.getName() +
+ " failed", e);
}
}
- protected DataSource resolveDataSourceViaJndi(String jndiLookupName)
+ protected Method findSetterForProperty(DataSource dataSource, Map.Entry<String, String> configOption)
{
- DataSource ds = null;
- try
- {
- Context jndiContext = new InitialContext();
- ds = (DataSource) jndiContext.lookup(jndiLookupName);
- }
- catch (Exception e)
+ for (Method method : dataSource.getClass().getMethods())
{
- throw new IllegalArgumentException("Could not lookup DataSource from JNDI using " + jndiLookupName);
+ if (method.getParameterTypes().length == 1 &&
+ String.class.isAssignableFrom(method.getParameterTypes()[0]) &&
+ method.getName().equalsIgnoreCase("set" + configOption.getKey())) //simple detection
+ {
+ return method;
+ }
}
-
- return ds;
+ return null;
}
-
}
Propchange: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
------------------------------------------------------------------------------
svn:eol-style = native
Re: svn commit: r1197378 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/ api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
Posted by Mark Struberg <st...@yahoo.de>.
In general renaming or moving classes around the codebase in a SVN repo should be done via
svn copy origfile newfile
+
change newfile
+
svn delete origfile
+
svn commit newfile
This way all the history will be retained.
Sadly most IDEs (using svnkit) just make a svn delete orig + svn add newfile which just trashes all the version history
And yes, this is a general problem with svn. GIT for example does just fine by detecting such diffs as logical move
LieGrue,
strub
----- Original Message -----
> From: Gerhard Petracek <ge...@gmail.com>
> To: MyFaces Development <de...@myfaces.apache.org>
> Cc:
> Sent: Friday, November 4, 2011 11:18 AM
> Subject: Re: svn commit: r1197378 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/ api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>
> hi mark,
>
> there is no need to use a different client. it's just the order of doing it.
> originally i planned something different which would have resulted in the same.
> at the end of the refactoring it was more like the original version,
> but i didn't revert the whole work just for a simpler diff of 2
> classes.
> if we need to do it, we should discuss it for myfaces as a whole.
>
> regards,
> gerhard
>
> http://www.irian.at
>
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>
>
>
> 2011/11/4 Mark Struberg <st...@yahoo.de>:
>> I'll revert that and do it cleanly.
>>
>> And you should check your svn client, Idea apparently trashes the svn
> history...
>>
>> LieGrue,
>> strub
>>
>>
>>
>> ----- Original Message -----
>>> From: "gpetracek@apache.org" <gp...@apache.org>
>>> To: commits@myfaces.apache.org
>>> Cc:
>>> Sent: Friday, November 4, 2011 2:11 AM
>>> Subject: svn commit: r1197378 - in
> /myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/
> api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/
> impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>>>
>>> Author: gpetracek
>>> Date: Fri Nov 4 01:11:33 2011
>>> New Revision: 1197378
>>>
>>> URL: http://svn.apache.org/viewvc?rev=1197378&view=rev
>>> Log:
>>> EXTCDI-236 AbstractConfigurableDataSource and refactoring to existing
>>> util-methods
>>>
>>> Added:
>>>
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>>>
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>>>
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>>> (contents, props changed)
>>> - copied, changed from r1197347,
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
>>> Removed:
>>>
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
>>> Modified:
>>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
>>>
>>> Modified:
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
>>> URL:
>>>
> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml?rev=1197378&r1=1197377&r2=1197378&view=diff
>>>
> ==============================================================================
>>> --- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
> (original)
>>> +++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml Fri
> Nov 4
>>> 01:11:33 2011
>>> @@ -36,18 +36,6 @@
>>>
>>> <groupId>org.apache.myfaces.extensions.cdi.core</groupId>
>>>
> <artifactId>myfaces-extcdi-core-api</artifactId>
>>> </dependency>
>>> - <dependency>
>>> - <groupId>commons-beanutils</groupId>
>>> -
> <artifactId>commons-beanutils-core</artifactId>
>>> - <version>1.8.3</version>
>>> - <optional>true</optional>
>>> - </dependency>
>>> - <dependency>
>>> - <groupId>commons-logging</groupId>
>>> - <artifactId>commons-logging</artifactId>
>>> - <version>1.1.1</version>
>>> - <optional>true</optional>
>>> - </dependency>
>>> </dependencies>
>>>
>>> <build>
>>> @@ -66,39 +54,6 @@
>>> </execution>
>>> </executions>
>>> </plugin>
>>> - <plugin>
>>> -
> <groupId>org.apache.maven.plugins</groupId>
>>> -
> <artifactId>maven-shade-plugin</artifactId>
>>> - <executions>
>>> - <execution>
>>> - <phase>package</phase>
>>> - <goals>
>>> - <goal>shade</goal>
>>> - </goals>
>>> - </execution>
>>> - </executions>
>>> - <configuration>
>>> -
> <createSourcesJar>true</createSourcesJar>
>>> -
>>>
> <createDependencyReducedPom>false</createDependencyReducedPom>
>>> - <minimizeJar>true</minimizeJar>
>>> - <artifactSet>
>>> - <includes>
>>> -
>>> <include>commons-beanutils:commons-beanutils</include>
>>> -
>>> <include>commons-logging:commons-logging</include>
>>> - </includes>
>>> - </artifactSet>
>>> - <relocations>
>>> - <relocation>
>>> -
>>> <pattern>org.apache.commons.beanutils</pattern>
>>> -
>>>
> <shadedPattern>org.apache.myfaces.codi.shaded.commons.beanutils</shadedPattern>
>>> - </relocation>
>>> - <relocation>
>>> -
>>> <pattern>org.apache.commons.logging</pattern>
>>> -
>>>
> <shadedPattern>org.apache.myfaces.codi.shaded.commons.logging</shadedPattern>
>>> - </relocation>
>>> - </relocations>
>>> - </configuration>
>>> - </plugin>
>>> </plugins>
>>> </build>
>>>
>>>
>>> Added:
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>>> URL:
>>>
> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java?rev=1197378&view=auto
>>>
> ==============================================================================
>>> ---
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>>> (added)
>>> +++
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>>> Fri Nov 4 01:11:33 2011
>>> @@ -0,0 +1,191 @@
>>> +/*
>>> + * 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.myfaces.extensions.cdi.jpa.api.datasource;
>>> +
>>> +import
> org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
>>> +
>>> +import javax.sql.DataSource;
>>> +import java.io.PrintWriter;
>>> +import java.sql.Connection;
>>> +import java.sql.SQLException;
>>> +import java.sql.SQLFeatureNotSupportedException;
>>> +import java.util.logging.Logger;
>>> +
>>> +/**
>>> + * <p>This class can be used instead of a real DataSource.
>>> + * It is a simple wrapper to hide any database configuration details
>>> + * and make it configurable via CDI.</p>
>>> + * <p/>
>>> + * <p>The configuration itself will be provided via CDI
> mechanics.
>>> + * To distinguish different databases, users can specify a
>>> + * <code>connectionId</code>. If no
>>> <code>connectionId</code> is set,
>>> + * the String <code>default</code> will be used</p>
>>> + */
>>> +public abstract class AbstractConfigurableDataSource implements
> DataSource
>>> +{
>>> + /**
>>> + * config and settings are loaded only once.
>>> + */
>>> + private boolean loaded;
>>> +
>>> + /**
>>> + * The connectionId allows to configure multiple databases.
>>> + * This can e.g. be used to distinguish between a
> 'customer' and
>>> 'admin'
>>> + * database.
>>> + */
>>> + protected String connectionId = "default";
>>> +
>>> + /**
>>> + * The underlying configuration of the datasource
>>> + */
>>> + private DataSourceConfig dataSourceConfig;
>>> +
>>> + private volatile DataSource wrappedDataSource;
>>> +
>>> + public AbstractConfigurableDataSource()
>>> + {
>>> + loaded = false;
>>> + dataSourceConfig =
>>>
> BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
>>> + }
>>> +
>>> + public void setConnectionId(String connectionId)
>>> + {
>>> + if (loaded)
>>> + {
>>> + throw new IllegalStateException("connectionId must
> not get
>>> changed after the DataSource was established");
>>> + }
>>> + this.connectionId = connectionId;
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public Connection getConnection() throws SQLException
>>> + {
>>> + return getConnection(null, null);
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public Connection getConnection(String userName, String password)
> throws
>>> SQLException
>>> + {
>>> + if (wrappedDataSource == null)
>>> + {
>>> + initDataSource();
>>> + }
>>> +
>>> + if (userName == null && password == null)
>>> + {
>>> + return wrappedDataSource.getConnection();
>>> + }
>>> + return wrappedDataSource.getConnection(userName, password);
>>> + }
>>> +
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public PrintWriter getLogWriter() throws SQLException
>>> + {
>>> + return null;
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public void setLogWriter(PrintWriter printWriter) throws
> SQLException
>>> + {
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public void setLoginTimeout(int loginTimeout) throws SQLException
>>> + {
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public int getLoginTimeout() throws SQLException
>>> + {
>>> + return 0;
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public <T> T unwrap(Class<T> iface) throws
> SQLException
>>> + {
>>> + if (isWrapperFor(iface))
>>> + {
>>> + return (T) this;
>>> + }
>>> + else
>>> + {
>>> + return null;
>>> + }
>>> + }
>>> +
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + public boolean isWrapperFor(Class<?> iface) throws
> SQLException
>>> + {
>>> + return iface.isAssignableFrom(getClass());
>>> + }
>>> +
>>> + /**
>>> + * NEW JDK1.7 signature.
>>> + * This makes sure that CODI can also get compiled using java-7.
>>> + * This method is not actively used though.
>>> + */
>>> + public Logger getParentLogger() throws
> SQLFeatureNotSupportedException
>>> + {
>>> + throw new SQLFeatureNotSupportedException();
>>> + }
>>> +
>>> + protected void initDataSource() throws SQLException
>>> + {
>>> + // double check lock idiom on volatile member is ok as of
> Java5
>>> + if (wrappedDataSource != null)
>>> + {
>>> + return;
>>> + }
>>> +
>>> + this.wrappedDataSource = resolveDataSource();
>>> +
>>> + if(this.wrappedDataSource == null)
>>> + {
>>> + throw new IllegalStateException("No DataSource
> found.");
>>> + }
>>> +
>>> + configureDataSource(this.wrappedDataSource);
>>> + }
>>> +
>>> + public DataSourceConfig getDataSourceConfig()
>>> + {
>>> + return dataSourceConfig;
>>> + }
>>> +
>>> + protected abstract DataSource resolveDataSource() throws
> SQLException;
>>> +
>>> + protected abstract void configureDataSource(DataSource
> dataSource);
>>> +}
>>>
>>> Copied:
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>>> (from r1197347,
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java)
>>> URL:
>>>
> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java&r1=1197347&r2=1197378&rev=1197378&view=diff
>>>
> ==============================================================================
>>> ---
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
>>> (original)
>>> +++
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>>> Fri Nov 4 01:11:33 2011
>>> @@ -16,206 +16,94 @@
>>> * specific language governing permissions and limitations
>>> * under the License.
>>> */
>>> -package org.apache.myfaces.extensions.cdi.jpa.api.datasource;
>>> +package org.apache.myfaces.extensions.cdi.jpa.impl.datasource;
>>>
>>> -import org.apache.commons.beanutils.BeanUtils;
>>> -import
> org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
>>> +import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
>>> +import org.apache.myfaces.extensions.cdi.core.impl.util.JndiUtils;
>>> +import
>>>
> org.apache.myfaces.extensions.cdi.jpa.api.datasource.AbstractConfigurableDataSource;
>>>
>>> -import javax.naming.InitialContext;
>>> import javax.sql.DataSource;
>>> -import java.io.PrintWriter;
>>> -import java.sql.Connection;
>>> +import java.lang.reflect.Method;
>>> import java.sql.SQLException;
>>> -import java.sql.SQLFeatureNotSupportedException;
>>> import java.util.Map;
>>> +import java.util.logging.Level;
>>> import java.util.logging.Logger;
>>> -import javax.naming.Context;
>>>
>>> -/**
>>> - * <p>This class can be used instead of a real DataSource.
>>> - * It is a simple wrapper to hide any database configuration details
>>> - * and make it configurable via CDI.</p>
>>> - *
>>> - * <p>The configuration itself will be provided via CDI
> mechanics.
>>> - * To distinguish different databases, users can specify a
>>> - * <code>connectionId</code>. If no
>>> <code>connectionId</code> is set,
>>> - * the String <code>default</code> will be used</p>
>>> - */
>>> -public class ConfigurableDataSource implements DataSource
>>> +public class DefaultConfigurableDataSource extends
>>> AbstractConfigurableDataSource
>>> {
>>> /**
>>> - * config and settings are loaded only once.
>>> - */
>>> - private boolean loaded;
>>> -
>>> - /**
>>> - * The connectionId allows to configure multiple databases.
>>> - * This can e.g. be used to distinguish between a
> 'customer' and
>>> 'admin'
>>> - * database.
>>> - */
>>> - private String connectionId = "default";
>>> -
>>> - /**
>>> - * The underlying configuration of the datasource
>>> - */
>>> - private DataSourceConfig dataSourceConfig;
>>> -
>>> - /**
>>> - *
>>> + * {@inheritDoc}
>>> */
>>> - private volatile DataSource wrappedDataSource;
>>> -
>>> - public ConfigurableDataSource()
>>> - {
>>> - loaded = false;
>>> - dataSourceConfig =
>>>
> BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
>>> - }
>>> -
>>> - public void setConnectionId(String connectionId)
>>> - {
>>> - if (loaded)
>>> - {
>>> - throw new IllegalStateException("connectionId must
> not get
>>> changed after the DataSource was established");
>>> - }
>>> - this.connectionId = connectionId;
>>> - }
>>> -
>>> - public Connection getConnection() throws SQLException
>>> + protected DataSource resolveDataSource() throws SQLException
>>> {
>>> - return getConnection(null, null);
>>> - }
>>> + String jndiLookupName =
>>> getDataSourceConfig().getJndiResourceName(connectionId);
>>>
>>> - public Connection getConnection(String userName, String password)
> throws
>>> SQLException
>>> - {
>>> - if (wrappedDataSource == null)
>>> + if (jndiLookupName != null && jndiLookupName.length()
>> 0)
>>> {
>>> - initDataSource();
>>> + return JndiUtils.lookup(jndiLookupName, DataSource.class);
>>> }
>>>
>>> - if (userName == null && password == null)
>>> + // no JNDI, so we take the direct JDBC route.
>>> + String jdbcDriverClass =
>>> getDataSourceConfig().getDriverClassName(connectionId);
>>> + if (jdbcDriverClass == null || jdbcDriverClass.length() == 0)
>>> {
>>> - return wrappedDataSource.getConnection();
>>> + throw new SQLException("Neither a JNDI location nor a
> JDBC
>>> driver class name is configured!");
>>> }
>>> - return wrappedDataSource.getConnection(userName, password);
>>> - }
>>> -
>>> -
>>> - public PrintWriter getLogWriter() throws SQLException
>>> - {
>>> - return null;
>>> - }
>>>
>>> - public void setLogWriter(PrintWriter printWriter) throws
> SQLException
>>> - {
>>> + return
> ClassUtils.tryToInstantiateClassForName(jdbcDriverClass,
>>> DataSource.class);
>>> }
>>>
>>> - public void setLoginTimeout(int loginTimeout) throws SQLException
>>> - {
>>> - }
>>> -
>>> - public int getLoginTimeout() throws SQLException
>>> + /**
>>> + * {@inheritDoc}
>>> + */
>>> + protected void configureDataSource(DataSource dataSource)
>>> {
>>> - return 0;
>>> - }
>>> + Map<String, String> config =
>>> getDataSourceConfig().getConnectionProperties(connectionId);
>>>
>>> - public <T> T unwrap(Class<T> iface) throws
> SQLException
>>> - {
>>> - if (isWrapperFor(iface))
>>> - {
>>> - return (T) this;
>>> - }
>>> - else
>>> + for (Map.Entry<String, String> configOption :
> config.entrySet())
>>> {
>>> - return null;
>>> + setProperty(dataSource, configOption);
>>> }
>>> }
>>>
>>> - public boolean isWrapperFor(Class<?> iface) throws
> SQLException
>>> + protected void setProperty(DataSource dataSource,
> Map.Entry<String,
>>> String> configOption)
>>> {
>>> - return iface.isAssignableFrom(ConfigurableDataSource.class);
>>> - }
>>> -
>>> - /**
>>> - * NEW JDK1.7 signature.
>>> - * This makes sure that CODI can also get compiled using java-7.
>>> - * This method is not actively used though.
>>> - */
>>> - public Logger getParentLogger() throws
> SQLFeatureNotSupportedException
>>> - {
>>> - throw new SQLFeatureNotSupportedException();
>>> - }
>>> + Method setterMethod = findSetterForProperty(dataSource,
> configOption);
>>>
>>> - /**
>>> - *
>>> - */
>>> - protected void initDataSource() throws SQLException
>>> - {
>>> - // double check lock idiom on volatile member is ok as of
> Java5
>>> - if (wrappedDataSource != null)
>>> + if(setterMethod == null)
>>> {
>>> - return;
>>> - }
>>> + Logger logger = Logger.getLogger(getClass().getName());
>>>
>>> - String jndiLookupName =
>>> dataSourceConfig.getJndiResourceName(connectionId);
>>> - if (jndiLookupName != null && jndiLookupName.length()
>> 0)
>>> - {
>>> - wrappedDataSource =
> resolveDataSourceViaJndi(jndiLookupName);
>>> + if(logger.isLoggable(Level.WARNING))
>>> + {
>>> + logger.warning(dataSource.getClass().getName() +
>>> + " has no setter for property '"
> +
>>> configOption.getKey() + "'. Property gets ignored.");
>>> + }
>>> return;
>>> }
>>>
>>> -
>>> - // no JNDI, so we take the direct JDBC route.
>>> - String jdbcDriverClass =
>>> dataSourceConfig.getDriverClassName(connectionId);
>>> - if (jdbcDriverClass == null &&
> jdbcDriverClass.length() == 0)
>>> - {
>>> - throw new SQLException("Neither a JNDI location nor a
> JDBC
>>> driver class name is configured!");
>>> - }
>>> -
>>> try
>>> {
>>> - Class clazz = Class.forName(jdbcDriverClass);
>>> -
>>> - // the given driver classname must be a DataSource
>>> - if (!DataSource.class.isAssignableFrom(clazz))
>>> - {
>>> - throw new SQLException("Configured
> DriverClassName is not
>>> a javax.sql.DataSource: "
>>> - + jdbcDriverClass);
>>> - }
>>> -
>>> - wrappedDataSource = (DataSource) clazz.newInstance();
>>> -
>>> - Map<String, String> config =
>>> dataSourceConfig.getConnectionProperties(connectionId);
>>> - for (Map.Entry<String, String> configOption :
>>> config.entrySet())
>>> - {
>>> - BeanUtils.setProperty(wrappedDataSource,
> configOption.getKey(),
>>> configOption.getValue());
>>> - }
>>> + setterMethod.invoke(dataSource, configOption.getValue());
>>> }
>>> catch (Exception e)
>>> {
>>> - wrappedDataSource = null;
>>> -
>>> - if (e instanceof SQLException)
>>> - {
>>> - throw (SQLException) e;
>>> - }
>>> - throw new SQLException(e);
>>> + throw new
>>> IllegalStateException(setterMethod.getDeclaringClass().getName() +
> "#"
>>> + setterMethod.getName() +
>>> + " failed", e);
>>> }
>>> }
>>>
>>> - protected DataSource resolveDataSourceViaJndi(String
> jndiLookupName)
>>> + protected Method findSetterForProperty(DataSource dataSource,
>>> Map.Entry<String, String> configOption)
>>> {
>>> - DataSource ds = null;
>>> - try
>>> - {
>>> - Context jndiContext = new InitialContext();
>>> - ds = (DataSource) jndiContext.lookup(jndiLookupName);
>>> - }
>>> - catch (Exception e)
>>> + for (Method method : dataSource.getClass().getMethods())
>>> {
>>> - throw new IllegalArgumentException("Could not lookup
>>> DataSource from JNDI using " + jndiLookupName);
>>> + if (method.getParameterTypes().length == 1 &&
>>> +
>>> String.class.isAssignableFrom(method.getParameterTypes()[0]) &&
>>> + method.getName().equalsIgnoreCase("set"
> +
>>> configOption.getKey())) //simple detection
>>> + {
>>> + return method;
>>> + }
>>> }
>>> -
>>> - return ds;
>>> + return null;
>>> }
>>> -
>>> }
>>>
>>> Propchange:
>>>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>>>
> ------------------------------------------------------------------------------
>>> svn:eol-style = native
>>>
>>
>
Re: svn commit: r1197378 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module:
api/ api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
Posted by Gerhard Petracek <ge...@gmail.com>.
hi mark,
there is no need to use a different client. it's just the order of doing it.
originally i planned something different which would have resulted in the same.
at the end of the refactoring it was more like the original version,
but i didn't revert the whole work just for a simpler diff of 2
classes.
if we need to do it, we should discuss it for myfaces as a whole.
regards,
gerhard
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
2011/11/4 Mark Struberg <st...@yahoo.de>:
> I'll revert that and do it cleanly.
>
> And you should check your svn client, Idea apparently trashes the svn history...
>
> LieGrue,
> strub
>
>
>
> ----- Original Message -----
>> From: "gpetracek@apache.org" <gp...@apache.org>
>> To: commits@myfaces.apache.org
>> Cc:
>> Sent: Friday, November 4, 2011 2:11 AM
>> Subject: svn commit: r1197378 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/ api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>>
>> Author: gpetracek
>> Date: Fri Nov 4 01:11:33 2011
>> New Revision: 1197378
>>
>> URL: http://svn.apache.org/viewvc?rev=1197378&view=rev
>> Log:
>> EXTCDI-236 AbstractConfigurableDataSource and refactoring to existing
>> util-methods
>>
>> Added:
>>
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>>
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>>
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>> (contents, props changed)
>> - copied, changed from r1197347,
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
>> Removed:
>>
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
>> Modified:
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
>>
>> Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
>> URL:
>> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml?rev=1197378&r1=1197377&r2=1197378&view=diff
>> ==============================================================================
>> --- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml (original)
>> +++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml Fri Nov 4
>> 01:11:33 2011
>> @@ -36,18 +36,6 @@
>>
>> <groupId>org.apache.myfaces.extensions.cdi.core</groupId>
>> <artifactId>myfaces-extcdi-core-api</artifactId>
>> </dependency>
>> - <dependency>
>> - <groupId>commons-beanutils</groupId>
>> - <artifactId>commons-beanutils-core</artifactId>
>> - <version>1.8.3</version>
>> - <optional>true</optional>
>> - </dependency>
>> - <dependency>
>> - <groupId>commons-logging</groupId>
>> - <artifactId>commons-logging</artifactId>
>> - <version>1.1.1</version>
>> - <optional>true</optional>
>> - </dependency>
>> </dependencies>
>>
>> <build>
>> @@ -66,39 +54,6 @@
>> </execution>
>> </executions>
>> </plugin>
>> - <plugin>
>> - <groupId>org.apache.maven.plugins</groupId>
>> - <artifactId>maven-shade-plugin</artifactId>
>> - <executions>
>> - <execution>
>> - <phase>package</phase>
>> - <goals>
>> - <goal>shade</goal>
>> - </goals>
>> - </execution>
>> - </executions>
>> - <configuration>
>> - <createSourcesJar>true</createSourcesJar>
>> -
>> <createDependencyReducedPom>false</createDependencyReducedPom>
>> - <minimizeJar>true</minimizeJar>
>> - <artifactSet>
>> - <includes>
>> -
>> <include>commons-beanutils:commons-beanutils</include>
>> -
>> <include>commons-logging:commons-logging</include>
>> - </includes>
>> - </artifactSet>
>> - <relocations>
>> - <relocation>
>> -
>> <pattern>org.apache.commons.beanutils</pattern>
>> -
>> <shadedPattern>org.apache.myfaces.codi.shaded.commons.beanutils</shadedPattern>
>> - </relocation>
>> - <relocation>
>> -
>> <pattern>org.apache.commons.logging</pattern>
>> -
>> <shadedPattern>org.apache.myfaces.codi.shaded.commons.logging</shadedPattern>
>> - </relocation>
>> - </relocations>
>> - </configuration>
>> - </plugin>
>> </plugins>
>> </build>
>>
>>
>> Added:
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>> URL:
>> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java?rev=1197378&view=auto
>> ==============================================================================
>> ---
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>> (added)
>> +++
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>> Fri Nov 4 01:11:33 2011
>> @@ -0,0 +1,191 @@
>> +/*
>> + * 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.myfaces.extensions.cdi.jpa.api.datasource;
>> +
>> +import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
>> +
>> +import javax.sql.DataSource;
>> +import java.io.PrintWriter;
>> +import java.sql.Connection;
>> +import java.sql.SQLException;
>> +import java.sql.SQLFeatureNotSupportedException;
>> +import java.util.logging.Logger;
>> +
>> +/**
>> + * <p>This class can be used instead of a real DataSource.
>> + * It is a simple wrapper to hide any database configuration details
>> + * and make it configurable via CDI.</p>
>> + * <p/>
>> + * <p>The configuration itself will be provided via CDI mechanics.
>> + * To distinguish different databases, users can specify a
>> + * <code>connectionId</code>. If no
>> <code>connectionId</code> is set,
>> + * the String <code>default</code> will be used</p>
>> + */
>> +public abstract class AbstractConfigurableDataSource implements DataSource
>> +{
>> + /**
>> + * config and settings are loaded only once.
>> + */
>> + private boolean loaded;
>> +
>> + /**
>> + * The connectionId allows to configure multiple databases.
>> + * This can e.g. be used to distinguish between a 'customer' and
>> 'admin'
>> + * database.
>> + */
>> + protected String connectionId = "default";
>> +
>> + /**
>> + * The underlying configuration of the datasource
>> + */
>> + private DataSourceConfig dataSourceConfig;
>> +
>> + private volatile DataSource wrappedDataSource;
>> +
>> + public AbstractConfigurableDataSource()
>> + {
>> + loaded = false;
>> + dataSourceConfig =
>> BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
>> + }
>> +
>> + public void setConnectionId(String connectionId)
>> + {
>> + if (loaded)
>> + {
>> + throw new IllegalStateException("connectionId must not get
>> changed after the DataSource was established");
>> + }
>> + this.connectionId = connectionId;
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public Connection getConnection() throws SQLException
>> + {
>> + return getConnection(null, null);
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public Connection getConnection(String userName, String password) throws
>> SQLException
>> + {
>> + if (wrappedDataSource == null)
>> + {
>> + initDataSource();
>> + }
>> +
>> + if (userName == null && password == null)
>> + {
>> + return wrappedDataSource.getConnection();
>> + }
>> + return wrappedDataSource.getConnection(userName, password);
>> + }
>> +
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public PrintWriter getLogWriter() throws SQLException
>> + {
>> + return null;
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public void setLogWriter(PrintWriter printWriter) throws SQLException
>> + {
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public void setLoginTimeout(int loginTimeout) throws SQLException
>> + {
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public int getLoginTimeout() throws SQLException
>> + {
>> + return 0;
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public <T> T unwrap(Class<T> iface) throws SQLException
>> + {
>> + if (isWrapperFor(iface))
>> + {
>> + return (T) this;
>> + }
>> + else
>> + {
>> + return null;
>> + }
>> + }
>> +
>> + /**
>> + * {@inheritDoc}
>> + */
>> + public boolean isWrapperFor(Class<?> iface) throws SQLException
>> + {
>> + return iface.isAssignableFrom(getClass());
>> + }
>> +
>> + /**
>> + * NEW JDK1.7 signature.
>> + * This makes sure that CODI can also get compiled using java-7.
>> + * This method is not actively used though.
>> + */
>> + public Logger getParentLogger() throws SQLFeatureNotSupportedException
>> + {
>> + throw new SQLFeatureNotSupportedException();
>> + }
>> +
>> + protected void initDataSource() throws SQLException
>> + {
>> + // double check lock idiom on volatile member is ok as of Java5
>> + if (wrappedDataSource != null)
>> + {
>> + return;
>> + }
>> +
>> + this.wrappedDataSource = resolveDataSource();
>> +
>> + if(this.wrappedDataSource == null)
>> + {
>> + throw new IllegalStateException("No DataSource found.");
>> + }
>> +
>> + configureDataSource(this.wrappedDataSource);
>> + }
>> +
>> + public DataSourceConfig getDataSourceConfig()
>> + {
>> + return dataSourceConfig;
>> + }
>> +
>> + protected abstract DataSource resolveDataSource() throws SQLException;
>> +
>> + protected abstract void configureDataSource(DataSource dataSource);
>> +}
>>
>> Copied:
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>> (from r1197347,
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java)
>> URL:
>> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java&r1=1197347&r2=1197378&rev=1197378&view=diff
>> ==============================================================================
>> ---
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
>> (original)
>> +++
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>> Fri Nov 4 01:11:33 2011
>> @@ -16,206 +16,94 @@
>> * specific language governing permissions and limitations
>> * under the License.
>> */
>> -package org.apache.myfaces.extensions.cdi.jpa.api.datasource;
>> +package org.apache.myfaces.extensions.cdi.jpa.impl.datasource;
>>
>> -import org.apache.commons.beanutils.BeanUtils;
>> -import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
>> +import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
>> +import org.apache.myfaces.extensions.cdi.core.impl.util.JndiUtils;
>> +import
>> org.apache.myfaces.extensions.cdi.jpa.api.datasource.AbstractConfigurableDataSource;
>>
>> -import javax.naming.InitialContext;
>> import javax.sql.DataSource;
>> -import java.io.PrintWriter;
>> -import java.sql.Connection;
>> +import java.lang.reflect.Method;
>> import java.sql.SQLException;
>> -import java.sql.SQLFeatureNotSupportedException;
>> import java.util.Map;
>> +import java.util.logging.Level;
>> import java.util.logging.Logger;
>> -import javax.naming.Context;
>>
>> -/**
>> - * <p>This class can be used instead of a real DataSource.
>> - * It is a simple wrapper to hide any database configuration details
>> - * and make it configurable via CDI.</p>
>> - *
>> - * <p>The configuration itself will be provided via CDI mechanics.
>> - * To distinguish different databases, users can specify a
>> - * <code>connectionId</code>. If no
>> <code>connectionId</code> is set,
>> - * the String <code>default</code> will be used</p>
>> - */
>> -public class ConfigurableDataSource implements DataSource
>> +public class DefaultConfigurableDataSource extends
>> AbstractConfigurableDataSource
>> {
>> /**
>> - * config and settings are loaded only once.
>> - */
>> - private boolean loaded;
>> -
>> - /**
>> - * The connectionId allows to configure multiple databases.
>> - * This can e.g. be used to distinguish between a 'customer' and
>> 'admin'
>> - * database.
>> - */
>> - private String connectionId = "default";
>> -
>> - /**
>> - * The underlying configuration of the datasource
>> - */
>> - private DataSourceConfig dataSourceConfig;
>> -
>> - /**
>> - *
>> + * {@inheritDoc}
>> */
>> - private volatile DataSource wrappedDataSource;
>> -
>> - public ConfigurableDataSource()
>> - {
>> - loaded = false;
>> - dataSourceConfig =
>> BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
>> - }
>> -
>> - public void setConnectionId(String connectionId)
>> - {
>> - if (loaded)
>> - {
>> - throw new IllegalStateException("connectionId must not get
>> changed after the DataSource was established");
>> - }
>> - this.connectionId = connectionId;
>> - }
>> -
>> - public Connection getConnection() throws SQLException
>> + protected DataSource resolveDataSource() throws SQLException
>> {
>> - return getConnection(null, null);
>> - }
>> + String jndiLookupName =
>> getDataSourceConfig().getJndiResourceName(connectionId);
>>
>> - public Connection getConnection(String userName, String password) throws
>> SQLException
>> - {
>> - if (wrappedDataSource == null)
>> + if (jndiLookupName != null && jndiLookupName.length() > 0)
>> {
>> - initDataSource();
>> + return JndiUtils.lookup(jndiLookupName, DataSource.class);
>> }
>>
>> - if (userName == null && password == null)
>> + // no JNDI, so we take the direct JDBC route.
>> + String jdbcDriverClass =
>> getDataSourceConfig().getDriverClassName(connectionId);
>> + if (jdbcDriverClass == null || jdbcDriverClass.length() == 0)
>> {
>> - return wrappedDataSource.getConnection();
>> + throw new SQLException("Neither a JNDI location nor a JDBC
>> driver class name is configured!");
>> }
>> - return wrappedDataSource.getConnection(userName, password);
>> - }
>> -
>> -
>> - public PrintWriter getLogWriter() throws SQLException
>> - {
>> - return null;
>> - }
>>
>> - public void setLogWriter(PrintWriter printWriter) throws SQLException
>> - {
>> + return ClassUtils.tryToInstantiateClassForName(jdbcDriverClass,
>> DataSource.class);
>> }
>>
>> - public void setLoginTimeout(int loginTimeout) throws SQLException
>> - {
>> - }
>> -
>> - public int getLoginTimeout() throws SQLException
>> + /**
>> + * {@inheritDoc}
>> + */
>> + protected void configureDataSource(DataSource dataSource)
>> {
>> - return 0;
>> - }
>> + Map<String, String> config =
>> getDataSourceConfig().getConnectionProperties(connectionId);
>>
>> - public <T> T unwrap(Class<T> iface) throws SQLException
>> - {
>> - if (isWrapperFor(iface))
>> - {
>> - return (T) this;
>> - }
>> - else
>> + for (Map.Entry<String, String> configOption : config.entrySet())
>> {
>> - return null;
>> + setProperty(dataSource, configOption);
>> }
>> }
>>
>> - public boolean isWrapperFor(Class<?> iface) throws SQLException
>> + protected void setProperty(DataSource dataSource, Map.Entry<String,
>> String> configOption)
>> {
>> - return iface.isAssignableFrom(ConfigurableDataSource.class);
>> - }
>> -
>> - /**
>> - * NEW JDK1.7 signature.
>> - * This makes sure that CODI can also get compiled using java-7.
>> - * This method is not actively used though.
>> - */
>> - public Logger getParentLogger() throws SQLFeatureNotSupportedException
>> - {
>> - throw new SQLFeatureNotSupportedException();
>> - }
>> + Method setterMethod = findSetterForProperty(dataSource, configOption);
>>
>> - /**
>> - *
>> - */
>> - protected void initDataSource() throws SQLException
>> - {
>> - // double check lock idiom on volatile member is ok as of Java5
>> - if (wrappedDataSource != null)
>> + if(setterMethod == null)
>> {
>> - return;
>> - }
>> + Logger logger = Logger.getLogger(getClass().getName());
>>
>> - String jndiLookupName =
>> dataSourceConfig.getJndiResourceName(connectionId);
>> - if (jndiLookupName != null && jndiLookupName.length() > 0)
>> - {
>> - wrappedDataSource = resolveDataSourceViaJndi(jndiLookupName);
>> + if(logger.isLoggable(Level.WARNING))
>> + {
>> + logger.warning(dataSource.getClass().getName() +
>> + " has no setter for property '" +
>> configOption.getKey() + "'. Property gets ignored.");
>> + }
>> return;
>> }
>>
>> -
>> - // no JNDI, so we take the direct JDBC route.
>> - String jdbcDriverClass =
>> dataSourceConfig.getDriverClassName(connectionId);
>> - if (jdbcDriverClass == null && jdbcDriverClass.length() == 0)
>> - {
>> - throw new SQLException("Neither a JNDI location nor a JDBC
>> driver class name is configured!");
>> - }
>> -
>> try
>> {
>> - Class clazz = Class.forName(jdbcDriverClass);
>> -
>> - // the given driver classname must be a DataSource
>> - if (!DataSource.class.isAssignableFrom(clazz))
>> - {
>> - throw new SQLException("Configured DriverClassName is not
>> a javax.sql.DataSource: "
>> - + jdbcDriverClass);
>> - }
>> -
>> - wrappedDataSource = (DataSource) clazz.newInstance();
>> -
>> - Map<String, String> config =
>> dataSourceConfig.getConnectionProperties(connectionId);
>> - for (Map.Entry<String, String> configOption :
>> config.entrySet())
>> - {
>> - BeanUtils.setProperty(wrappedDataSource, configOption.getKey(),
>> configOption.getValue());
>> - }
>> + setterMethod.invoke(dataSource, configOption.getValue());
>> }
>> catch (Exception e)
>> {
>> - wrappedDataSource = null;
>> -
>> - if (e instanceof SQLException)
>> - {
>> - throw (SQLException) e;
>> - }
>> - throw new SQLException(e);
>> + throw new
>> IllegalStateException(setterMethod.getDeclaringClass().getName() + "#"
>> + setterMethod.getName() +
>> + " failed", e);
>> }
>> }
>>
>> - protected DataSource resolveDataSourceViaJndi(String jndiLookupName)
>> + protected Method findSetterForProperty(DataSource dataSource,
>> Map.Entry<String, String> configOption)
>> {
>> - DataSource ds = null;
>> - try
>> - {
>> - Context jndiContext = new InitialContext();
>> - ds = (DataSource) jndiContext.lookup(jndiLookupName);
>> - }
>> - catch (Exception e)
>> + for (Method method : dataSource.getClass().getMethods())
>> {
>> - throw new IllegalArgumentException("Could not lookup
>> DataSource from JNDI using " + jndiLookupName);
>> + if (method.getParameterTypes().length == 1 &&
>> +
>> String.class.isAssignableFrom(method.getParameterTypes()[0]) &&
>> + method.getName().equalsIgnoreCase("set" +
>> configOption.getKey())) //simple detection
>> + {
>> + return method;
>> + }
>> }
>> -
>> - return ds;
>> + return null;
>> }
>> -
>> }
>>
>> Propchange:
>> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
>> ------------------------------------------------------------------------------
>> svn:eol-style = native
>>
>
Re: svn commit: r1197378 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/ api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
Posted by Mark Struberg <st...@yahoo.de>.
I'll revert that and do it cleanly.
And you should check your svn client, Idea apparently trashes the svn history...
LieGrue,
strub
----- Original Message -----
> From: "gpetracek@apache.org" <gp...@apache.org>
> To: commits@myfaces.apache.org
> Cc:
> Sent: Friday, November 4, 2011 2:11 AM
> Subject: svn commit: r1197378 - in /myfaces/extensions/cdi/trunk/jee-modules/jpa-module: api/ api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>
> Author: gpetracek
> Date: Fri Nov 4 01:11:33 2011
> New Revision: 1197378
>
> URL: http://svn.apache.org/viewvc?rev=1197378&view=rev
> Log:
> EXTCDI-236 AbstractConfigurableDataSource and refactoring to existing
> util-methods
>
> Added:
>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/
>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
> (contents, props changed)
> - copied, changed from r1197347,
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
> Removed:
>
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
> Modified:
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
>
> Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml
> URL:
> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml?rev=1197378&r1=1197377&r2=1197378&view=diff
> ==============================================================================
> --- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml (original)
> +++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml Fri Nov 4
> 01:11:33 2011
> @@ -36,18 +36,6 @@
>
> <groupId>org.apache.myfaces.extensions.cdi.core</groupId>
> <artifactId>myfaces-extcdi-core-api</artifactId>
> </dependency>
> - <dependency>
> - <groupId>commons-beanutils</groupId>
> - <artifactId>commons-beanutils-core</artifactId>
> - <version>1.8.3</version>
> - <optional>true</optional>
> - </dependency>
> - <dependency>
> - <groupId>commons-logging</groupId>
> - <artifactId>commons-logging</artifactId>
> - <version>1.1.1</version>
> - <optional>true</optional>
> - </dependency>
> </dependencies>
>
> <build>
> @@ -66,39 +54,6 @@
> </execution>
> </executions>
> </plugin>
> - <plugin>
> - <groupId>org.apache.maven.plugins</groupId>
> - <artifactId>maven-shade-plugin</artifactId>
> - <executions>
> - <execution>
> - <phase>package</phase>
> - <goals>
> - <goal>shade</goal>
> - </goals>
> - </execution>
> - </executions>
> - <configuration>
> - <createSourcesJar>true</createSourcesJar>
> -
> <createDependencyReducedPom>false</createDependencyReducedPom>
> - <minimizeJar>true</minimizeJar>
> - <artifactSet>
> - <includes>
> -
> <include>commons-beanutils:commons-beanutils</include>
> -
> <include>commons-logging:commons-logging</include>
> - </includes>
> - </artifactSet>
> - <relocations>
> - <relocation>
> -
> <pattern>org.apache.commons.beanutils</pattern>
> -
> <shadedPattern>org.apache.myfaces.codi.shaded.commons.beanutils</shadedPattern>
> - </relocation>
> - <relocation>
> -
> <pattern>org.apache.commons.logging</pattern>
> -
> <shadedPattern>org.apache.myfaces.codi.shaded.commons.logging</shadedPattern>
> - </relocation>
> - </relocations>
> - </configuration>
> - </plugin>
> </plugins>
> </build>
>
>
> Added:
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
> URL:
> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java?rev=1197378&view=auto
> ==============================================================================
> ---
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
> (added)
> +++
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java
> Fri Nov 4 01:11:33 2011
> @@ -0,0 +1,191 @@
> +/*
> + * 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.myfaces.extensions.cdi.jpa.api.datasource;
> +
> +import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
> +
> +import javax.sql.DataSource;
> +import java.io.PrintWriter;
> +import java.sql.Connection;
> +import java.sql.SQLException;
> +import java.sql.SQLFeatureNotSupportedException;
> +import java.util.logging.Logger;
> +
> +/**
> + * <p>This class can be used instead of a real DataSource.
> + * It is a simple wrapper to hide any database configuration details
> + * and make it configurable via CDI.</p>
> + * <p/>
> + * <p>The configuration itself will be provided via CDI mechanics.
> + * To distinguish different databases, users can specify a
> + * <code>connectionId</code>. If no
> <code>connectionId</code> is set,
> + * the String <code>default</code> will be used</p>
> + */
> +public abstract class AbstractConfigurableDataSource implements DataSource
> +{
> + /**
> + * config and settings are loaded only once.
> + */
> + private boolean loaded;
> +
> + /**
> + * The connectionId allows to configure multiple databases.
> + * This can e.g. be used to distinguish between a 'customer' and
> 'admin'
> + * database.
> + */
> + protected String connectionId = "default";
> +
> + /**
> + * The underlying configuration of the datasource
> + */
> + private DataSourceConfig dataSourceConfig;
> +
> + private volatile DataSource wrappedDataSource;
> +
> + public AbstractConfigurableDataSource()
> + {
> + loaded = false;
> + dataSourceConfig =
> BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
> + }
> +
> + public void setConnectionId(String connectionId)
> + {
> + if (loaded)
> + {
> + throw new IllegalStateException("connectionId must not get
> changed after the DataSource was established");
> + }
> + this.connectionId = connectionId;
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public Connection getConnection() throws SQLException
> + {
> + return getConnection(null, null);
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public Connection getConnection(String userName, String password) throws
> SQLException
> + {
> + if (wrappedDataSource == null)
> + {
> + initDataSource();
> + }
> +
> + if (userName == null && password == null)
> + {
> + return wrappedDataSource.getConnection();
> + }
> + return wrappedDataSource.getConnection(userName, password);
> + }
> +
> +
> + /**
> + * {@inheritDoc}
> + */
> + public PrintWriter getLogWriter() throws SQLException
> + {
> + return null;
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public void setLogWriter(PrintWriter printWriter) throws SQLException
> + {
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public void setLoginTimeout(int loginTimeout) throws SQLException
> + {
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public int getLoginTimeout() throws SQLException
> + {
> + return 0;
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public <T> T unwrap(Class<T> iface) throws SQLException
> + {
> + if (isWrapperFor(iface))
> + {
> + return (T) this;
> + }
> + else
> + {
> + return null;
> + }
> + }
> +
> + /**
> + * {@inheritDoc}
> + */
> + public boolean isWrapperFor(Class<?> iface) throws SQLException
> + {
> + return iface.isAssignableFrom(getClass());
> + }
> +
> + /**
> + * NEW JDK1.7 signature.
> + * This makes sure that CODI can also get compiled using java-7.
> + * This method is not actively used though.
> + */
> + public Logger getParentLogger() throws SQLFeatureNotSupportedException
> + {
> + throw new SQLFeatureNotSupportedException();
> + }
> +
> + protected void initDataSource() throws SQLException
> + {
> + // double check lock idiom on volatile member is ok as of Java5
> + if (wrappedDataSource != null)
> + {
> + return;
> + }
> +
> + this.wrappedDataSource = resolveDataSource();
> +
> + if(this.wrappedDataSource == null)
> + {
> + throw new IllegalStateException("No DataSource found.");
> + }
> +
> + configureDataSource(this.wrappedDataSource);
> + }
> +
> + public DataSourceConfig getDataSourceConfig()
> + {
> + return dataSourceConfig;
> + }
> +
> + protected abstract DataSource resolveDataSource() throws SQLException;
> +
> + protected abstract void configureDataSource(DataSource dataSource);
> +}
>
> Copied:
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
> (from r1197347,
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java)
> URL:
> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java&r1=1197347&r2=1197378&rev=1197378&view=diff
> ==============================================================================
> ---
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java
> (original)
> +++
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
> Fri Nov 4 01:11:33 2011
> @@ -16,206 +16,94 @@
> * specific language governing permissions and limitations
> * under the License.
> */
> -package org.apache.myfaces.extensions.cdi.jpa.api.datasource;
> +package org.apache.myfaces.extensions.cdi.jpa.impl.datasource;
>
> -import org.apache.commons.beanutils.BeanUtils;
> -import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;
> +import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
> +import org.apache.myfaces.extensions.cdi.core.impl.util.JndiUtils;
> +import
> org.apache.myfaces.extensions.cdi.jpa.api.datasource.AbstractConfigurableDataSource;
>
> -import javax.naming.InitialContext;
> import javax.sql.DataSource;
> -import java.io.PrintWriter;
> -import java.sql.Connection;
> +import java.lang.reflect.Method;
> import java.sql.SQLException;
> -import java.sql.SQLFeatureNotSupportedException;
> import java.util.Map;
> +import java.util.logging.Level;
> import java.util.logging.Logger;
> -import javax.naming.Context;
>
> -/**
> - * <p>This class can be used instead of a real DataSource.
> - * It is a simple wrapper to hide any database configuration details
> - * and make it configurable via CDI.</p>
> - *
> - * <p>The configuration itself will be provided via CDI mechanics.
> - * To distinguish different databases, users can specify a
> - * <code>connectionId</code>. If no
> <code>connectionId</code> is set,
> - * the String <code>default</code> will be used</p>
> - */
> -public class ConfigurableDataSource implements DataSource
> +public class DefaultConfigurableDataSource extends
> AbstractConfigurableDataSource
> {
> /**
> - * config and settings are loaded only once.
> - */
> - private boolean loaded;
> -
> - /**
> - * The connectionId allows to configure multiple databases.
> - * This can e.g. be used to distinguish between a 'customer' and
> 'admin'
> - * database.
> - */
> - private String connectionId = "default";
> -
> - /**
> - * The underlying configuration of the datasource
> - */
> - private DataSourceConfig dataSourceConfig;
> -
> - /**
> - *
> + * {@inheritDoc}
> */
> - private volatile DataSource wrappedDataSource;
> -
> - public ConfigurableDataSource()
> - {
> - loaded = false;
> - dataSourceConfig =
> BeanManagerProvider.getInstance().getContextualReference(DataSourceConfig.class);
> - }
> -
> - public void setConnectionId(String connectionId)
> - {
> - if (loaded)
> - {
> - throw new IllegalStateException("connectionId must not get
> changed after the DataSource was established");
> - }
> - this.connectionId = connectionId;
> - }
> -
> - public Connection getConnection() throws SQLException
> + protected DataSource resolveDataSource() throws SQLException
> {
> - return getConnection(null, null);
> - }
> + String jndiLookupName =
> getDataSourceConfig().getJndiResourceName(connectionId);
>
> - public Connection getConnection(String userName, String password) throws
> SQLException
> - {
> - if (wrappedDataSource == null)
> + if (jndiLookupName != null && jndiLookupName.length() > 0)
> {
> - initDataSource();
> + return JndiUtils.lookup(jndiLookupName, DataSource.class);
> }
>
> - if (userName == null && password == null)
> + // no JNDI, so we take the direct JDBC route.
> + String jdbcDriverClass =
> getDataSourceConfig().getDriverClassName(connectionId);
> + if (jdbcDriverClass == null || jdbcDriverClass.length() == 0)
> {
> - return wrappedDataSource.getConnection();
> + throw new SQLException("Neither a JNDI location nor a JDBC
> driver class name is configured!");
> }
> - return wrappedDataSource.getConnection(userName, password);
> - }
> -
> -
> - public PrintWriter getLogWriter() throws SQLException
> - {
> - return null;
> - }
>
> - public void setLogWriter(PrintWriter printWriter) throws SQLException
> - {
> + return ClassUtils.tryToInstantiateClassForName(jdbcDriverClass,
> DataSource.class);
> }
>
> - public void setLoginTimeout(int loginTimeout) throws SQLException
> - {
> - }
> -
> - public int getLoginTimeout() throws SQLException
> + /**
> + * {@inheritDoc}
> + */
> + protected void configureDataSource(DataSource dataSource)
> {
> - return 0;
> - }
> + Map<String, String> config =
> getDataSourceConfig().getConnectionProperties(connectionId);
>
> - public <T> T unwrap(Class<T> iface) throws SQLException
> - {
> - if (isWrapperFor(iface))
> - {
> - return (T) this;
> - }
> - else
> + for (Map.Entry<String, String> configOption : config.entrySet())
> {
> - return null;
> + setProperty(dataSource, configOption);
> }
> }
>
> - public boolean isWrapperFor(Class<?> iface) throws SQLException
> + protected void setProperty(DataSource dataSource, Map.Entry<String,
> String> configOption)
> {
> - return iface.isAssignableFrom(ConfigurableDataSource.class);
> - }
> -
> - /**
> - * NEW JDK1.7 signature.
> - * This makes sure that CODI can also get compiled using java-7.
> - * This method is not actively used though.
> - */
> - public Logger getParentLogger() throws SQLFeatureNotSupportedException
> - {
> - throw new SQLFeatureNotSupportedException();
> - }
> + Method setterMethod = findSetterForProperty(dataSource, configOption);
>
> - /**
> - *
> - */
> - protected void initDataSource() throws SQLException
> - {
> - // double check lock idiom on volatile member is ok as of Java5
> - if (wrappedDataSource != null)
> + if(setterMethod == null)
> {
> - return;
> - }
> + Logger logger = Logger.getLogger(getClass().getName());
>
> - String jndiLookupName =
> dataSourceConfig.getJndiResourceName(connectionId);
> - if (jndiLookupName != null && jndiLookupName.length() > 0)
> - {
> - wrappedDataSource = resolveDataSourceViaJndi(jndiLookupName);
> + if(logger.isLoggable(Level.WARNING))
> + {
> + logger.warning(dataSource.getClass().getName() +
> + " has no setter for property '" +
> configOption.getKey() + "'. Property gets ignored.");
> + }
> return;
> }
>
> -
> - // no JNDI, so we take the direct JDBC route.
> - String jdbcDriverClass =
> dataSourceConfig.getDriverClassName(connectionId);
> - if (jdbcDriverClass == null && jdbcDriverClass.length() == 0)
> - {
> - throw new SQLException("Neither a JNDI location nor a JDBC
> driver class name is configured!");
> - }
> -
> try
> {
> - Class clazz = Class.forName(jdbcDriverClass);
> -
> - // the given driver classname must be a DataSource
> - if (!DataSource.class.isAssignableFrom(clazz))
> - {
> - throw new SQLException("Configured DriverClassName is not
> a javax.sql.DataSource: "
> - + jdbcDriverClass);
> - }
> -
> - wrappedDataSource = (DataSource) clazz.newInstance();
> -
> - Map<String, String> config =
> dataSourceConfig.getConnectionProperties(connectionId);
> - for (Map.Entry<String, String> configOption :
> config.entrySet())
> - {
> - BeanUtils.setProperty(wrappedDataSource, configOption.getKey(),
> configOption.getValue());
> - }
> + setterMethod.invoke(dataSource, configOption.getValue());
> }
> catch (Exception e)
> {
> - wrappedDataSource = null;
> -
> - if (e instanceof SQLException)
> - {
> - throw (SQLException) e;
> - }
> - throw new SQLException(e);
> + throw new
> IllegalStateException(setterMethod.getDeclaringClass().getName() + "#"
> + setterMethod.getName() +
> + " failed", e);
> }
> }
>
> - protected DataSource resolveDataSourceViaJndi(String jndiLookupName)
> + protected Method findSetterForProperty(DataSource dataSource,
> Map.Entry<String, String> configOption)
> {
> - DataSource ds = null;
> - try
> - {
> - Context jndiContext = new InitialContext();
> - ds = (DataSource) jndiContext.lookup(jndiLookupName);
> - }
> - catch (Exception e)
> + for (Method method : dataSource.getClass().getMethods())
> {
> - throw new IllegalArgumentException("Could not lookup
> DataSource from JNDI using " + jndiLookupName);
> + if (method.getParameterTypes().length == 1 &&
> +
> String.class.isAssignableFrom(method.getParameterTypes()[0]) &&
> + method.getName().equalsIgnoreCase("set" +
> configOption.getKey())) //simple detection
> + {
> + return method;
> + }
> }
> -
> - return ds;
> + return null;
> }
> -
> }
>
> Propchange:
> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>