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
>