You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by Mark Struberg <st...@yahoo.de> on 2011/11/04 08:41:44 UTC

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/

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>.
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
>>
>