Return-Path: X-Original-To: apmail-myfaces-dev-archive@www.apache.org Delivered-To: apmail-myfaces-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 8BF1B9A88 for ; Fri, 4 Nov 2011 10:24:14 +0000 (UTC) Received: (qmail 85438 invoked by uid 500); 4 Nov 2011 10:24:14 -0000 Delivered-To: apmail-myfaces-dev-archive@myfaces.apache.org Received: (qmail 85399 invoked by uid 500); 4 Nov 2011 10:24:14 -0000 Mailing-List: contact dev-help@myfaces.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "MyFaces Development" Delivered-To: mailing list dev@myfaces.apache.org Received: (qmail 85392 invoked by uid 99); 4 Nov 2011 10:24:14 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 04 Nov 2011 10:24:14 +0000 X-ASF-Spam-Status: No, hits=0.7 required=5.0 tests=FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_NEUTRAL X-Spam-Check-By: apache.org Received-SPF: neutral (nike.apache.org: local policy) Received: from [217.146.183.191] (HELO nm17.bullet.mail.ukl.yahoo.com) (217.146.183.191) by apache.org (qpsmtpd/0.29) with SMTP; Fri, 04 Nov 2011 10:24:05 +0000 Received: from [217.146.183.211] by nm17.bullet.mail.ukl.yahoo.com with NNFMP; 04 Nov 2011 10:23:43 -0000 Received: from [217.146.183.43] by tm4.bullet.mail.ukl.yahoo.com with NNFMP; 04 Nov 2011 10:23:43 -0000 Received: from [127.0.0.1] by omp1028.mail.ukl.yahoo.com with NNFMP; 04 Nov 2011 10:23:43 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 725539.92489.bm@omp1028.mail.ukl.yahoo.com Received: (qmail 64566 invoked by uid 60001); 4 Nov 2011 10:23:43 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s1024; t=1320402223; bh=bbCG4OkjR4YqALF+vliFn6R86OF33FAx5TG4fr4yAX0=; h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=XQZwoA4mS8QW9MOdDLn7FwgzxO2GEaGz5Ap7vyrxGPrWaADIwSPTa5xlyJh9a0JI2jcld769lBqPkeJ0OSVJ31bnoILwxBLOSQ+pK0CTgxSsiiVpfheJfxxEHyp6pZau5Vyi/a6SXEVjwqZA4nBbwALnA3NveuoT9J19ZElNGvQ= DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.de; h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=qDTwG+WCA8NmqUVkVJE+54+54O3a2dRxoCo36Z5zKk0hWuzuwNkLUr1UOTcuTJNdyz03XvkRovyv47+kGBpHpzKEoUof23991DMMkADL1Aikdvl9O/ovAYvMS8Cewj4H5IezDs5VniAPgdZDGM1zqwuRDqEWXPSpMkSxLbn4r5g=; X-YMail-OSG: nnl1zz4VM1kHmpnDhjCK2LXUWjJDbI8cLorP0CFBkYUP6xq htQZgB3ktv5Y.vR.gg8LiUGv4WsOoTlEdhV6J_crXb0cyX0LcjsFD4.RyNND 2uaSYSn0_xZyTTDG4L5xHO0sgEbyRztbM_y7htryI.h8UnUuY1O.crbX963T 0Uuq2p8ugNXgIm3SPSUu47FCcvuGX87bKOiu1Xuyj2unIkiz6LT91YdzA.UR GJed8JELvHs8pu4rqigcmLUDU05buIa1KCeXe8zgwJ917rWEdCahjfT3hOz. pwJnSZPeGLslk7RQ5sa7ALULLl9j7uGJboDPa1npdooBZ7uj1RMmqZVCQlHx 2.qylYlyvwseQ71R52qn5iTjGg_pmqKMvsYOdm75VBwqpl.kSlmh2QQ.ysj9 vDzaAzpHoJ6nhRMCRIvRN_mzdb18.jIM5T4GG2QQfIOdI5XN14114f1rMhcx 4vuJJWARxQeErZRBvw4QOuFAhTnESDr9oAgrL4Ds4hrQiM1tcyXB7pNfpQYr .Kxp63u.M Received: from [128.130.32.90] by web27808.mail.ukl.yahoo.com via HTTP; Fri, 04 Nov 2011 10:23:43 GMT X-Mailer: YahooMailWebService/0.8.114.317681 References: <20111104011134.943072388A36@eris.apache.org> <1320392504.82660.YahooMailNeo@web27808.mail.ukl.yahoo.com> Message-ID: <1320402223.62308.YahooMailNeo@web27808.mail.ukl.yahoo.com> Date: Fri, 4 Nov 2011 10:23:43 +0000 (GMT) From: Mark Struberg Reply-To: Mark Struberg 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/ To: MyFaces Development In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Virus-Checked: Checked by ClamAV on apache.org In general renaming or moving classes around the codebase in a SVN repo sho= uld be done via=0A=0Asvn copy origfile newfile=0A=0A+=A0=0Achange newfile= =0A=0A+=0A=0Asvn delete origfile=0A+=0Asvn commit newfile=0A=0A=0AThis way = all the history will be retained.=0ASadly most IDEs (using svnkit) just mak= e a svn delete orig + svn add newfile which just trashes all the version hi= story=0A=0AAnd yes, this is a general problem with svn. GIT for example doe= s just fine by detecting such diffs as logical move=0A=0A=0ALieGrue,=0Astru= b=0A=0A=0A=0A----- Original Message -----=0A> From: Gerhard Petracek =0A> To: MyFaces Development = =0A> Cc: =0A> Sent: Friday, November 4, 2011 11:18 AM=0A> 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/datasourc= e/ impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource= /=0A> =0A> hi mark,=0A> =0A> there is no need to use a different client. it= 's just the order of doing it.=0A> originally i planned something different= which would have resulted in the same.=0A> at the end of the refactoring i= t was more like the original version,=0A> but i didn't revert the whole wor= k just for a simpler diff of 2=0A> classes.=0A> if we need to do it, we sho= uld discuss it for myfaces as a whole.=0A> =0A> regards,=0A> gerhard=0A> = =0A> http://www.irian.at=0A> =0A> Your JSF powerhouse -=0A> JSF Consulting,= Development and=0A> Courses in English and German=0A> =0A> Professional Su= pport for Apache MyFaces=0A> =0A> =0A> =0A> 2011/11/4 Mark Struberg :=0A>> I'll revert that and do it cleanly.=0A>> =0A>> And you= should check your svn client, Idea apparently trashes the svn =0A> history= ...=0A>> =0A>> LieGrue,=0A>> strub=0A>> =0A>> =0A>> =0A>> ----- Original= Message -----=0A>>> From: "gpetracek@apache.org" = =0A>>> To: commits@myfaces.apache.org=0A>>> Cc:=0A>>> Sent: Friday, Nove= mber 4, 2011 2:11 AM=0A>>> Subject: svn commit: r1197378 - in =0A> /myface= s/extensions/cdi/trunk/jee-modules/jpa-module: api/ =0A> api/src/main/java/= org/apache/myfaces/extensions/cdi/jpa/api/datasource/ =0A> impl/src/main/ja= va/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/=0A>>> =0A>>> Aut= hor: gpetracek=0A>>> Date: Fri Nov=A0 4 01:11:33 2011=0A>>> New Revision:= 1197378=0A>>> =0A>>> URL: http://svn.apache.org/viewvc?rev=3D1197378&view= =3Drev=0A>>> Log:=0A>>> EXTCDI-236 AbstractConfigurableDataSource and ref= actoring to existing=0A>>> util-methods=0A>>> =0A>>> Added:=0A>>> =0A>>> = =0A> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/= org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigurableDa= taSource.java=0A>>> =0A>>> =0A> myfaces/extensions/cdi/trunk/jee-modules/jp= a-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/data= source/=0A>>> =0A>>> =0A> myfaces/extensions/cdi/trunk/jee-modules/jpa-modu= le/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource= /DefaultConfigurableDataSource.java=0A>>> (contents, props changed)=0A>>> = =A0 =A0 =A0 - copied, changed from r1197347,=0A>>> =0A> myfaces/extensions= /cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myfaces/exte= nsions/cdi/jpa/api/datasource/ConfigurableDataSource.java=0A>>> Removed:= =0A>>> =0A>>> =0A> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/= src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/Configur= ableDataSource.java=0A>>> Modified:=0A>>> =A0 =A0 myfaces/extensions/cdi/= trunk/jee-modules/jpa-module/api/pom.xml=0A>>> =0A>>> Modified: =0A> myfac= es/extensions/cdi/trunk/jee-modules/jpa-module/api/pom.xml=0A>>> URL:=0A>>= > =0A> http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-module= s/jpa-module/api/pom.xml?rev=3D1197378&r1=3D1197377&r2=3D1197378&view=3Ddif= f=0A>>> =0A> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=0A>>> --- myfaces/extensions/cdi/trunk/jee-module= s/jpa-module/api/pom.xml =0A> (original)=0A>>> +++ myfaces/extensions/cdi/= trunk/jee-modules/jpa-module/api/pom.xml Fri =0A> Nov=A0 4=0A>>> 01:11:33 = 2011=0A>>> @@ -36,18 +36,6 @@=0A>>> =0A>>> org.apache.myfaces.ex= tensions.cdi.core=0A>>> =A0 =A0 =A0 =A0 =A0 =A0 =0A> =A0myfaces-extcdi-core-api=0A>>> =A0 =A0 =A0 =A0 =A0=0A>>> -=A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 = commons-beanutils=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =0A> <= artifactId>commons-beanutils-core=0A>>> -=A0 =A0 =A0 =A0 =A0 = =A0 1.8.3=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 true= =0A>>> -=A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 <= dependency>=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 commons-logging=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 commons-logging=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 1.1.1=0A>>> -=A0 =A0 = =A0 =A0 =A0 =A0 true=0A>>> -=A0 =A0 =A0 =A0 =0A>>> =A0 =A0 =A0=0A>>> =0A>>> =A0 =A0 =A0=0A>= >> @@ -66,39 +54,6 @@=0A>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=0A>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=0A>>> = =A0 =A0 =A0 =A0 =A0 =A0 =A0=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A> org.apache.maven.p= lugins=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A> m= aven-shade-plugin=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> = -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 package=0A= >>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 shade=0A>>= > -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A> true=0A>>> -=0A>>> =0A> false=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 true=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =0A>>> -=0A>>> commons-beanutils:commons-b= eanutils=0A>>> -=0A>>> commons-logging:commons-logging= =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=0A>>> o= rg.apache.commons.beanutils=0A>>> -=0A>>> =0A> or= g.apache.myfaces.codi.shaded.commons.beanutils=0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=0A>>> org.apache.commons.logging=0A>>> -=0A>>> =0A> = org.apache.myfaces.codi.shaded.commons.logging=0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =0A>>= > =A0 =A0 =A0 =A0 =A0=0A>>> =A0 =A0 =A0=0A>>> =0A>>> = =0A>>> Added:=0A>>> =0A> myfaces/extensions/cdi/trunk/jee-modules/jpa-modu= le/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/A= bstractConfigurableDataSource.java=0A>>> URL:=0A>>> =0A> http://svn.apache= .org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/src/mai= n/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractConfigu= rableDataSource.java?rev=3D1197378&view=3Dauto=0A>>> =0A> =3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A>>>= ---=0A>>> =0A> myfaces/extensions/cdi/trunk/jee-modules/jpa-module/api/sr= c/main/java/org/apache/myfaces/extensions/cdi/jpa/api/datasource/AbstractCo= nfigurableDataSource.java=0A>>> (added)=0A>>> +++=0A>>> =0A> myfaces/exte= nsions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/myface= s/extensions/cdi/jpa/api/datasource/AbstractConfigurableDataSource.java=0A>= >> Fri Nov=A0 4 01:11:33 2011=0A>>> @@ -0,0 +1,191 @@=0A>>> +/*=0A>>> += * Licensed to the Apache Software Foundation (ASF) under one=0A>>> + * or= more contributor license agreements.=A0 See the NOTICE file=0A>>> + * dis= tributed with this work for additional information=0A>>> + * regarding cop= yright ownership.=A0 The ASF licenses this file=0A>>> + * to you under the= Apache License, Version 2.0 (the=0A>>> + * "License"); you may not use th= is file except in =0A> compliance=0A>>> + * with the License.=A0 You may o= btain a copy of the License at=0A>>> + *=0A>>> + *=A0 http://www.apache.o= rg/licenses/LICENSE-2.0=0A>>> + *=0A>>> + * Unless required by applicable= law or agreed to in writing,=0A>>> + * software distributed under the Lic= ense is distributed on an=0A>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR C= ONDITIONS OF ANY=0A>>> + * KIND, either express or implied.=A0 See the Lic= ense for the=0A>>> + * specific language governing permissions and limitat= ions=0A>>> + * under the License.=0A>>> + */=0A>>> +package org.apache.m= yfaces.extensions.cdi.jpa.api.datasource;=0A>>> +=0A>>> +import =0A> org.= apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;=0A>>> = +=0A>>> +import javax.sql.DataSource;=0A>>> +import java.io.PrintWriter;= =0A>>> +import java.sql.Connection;=0A>>> +import java.sql.SQLException;= =0A>>> +import java.sql.SQLFeatureNotSupportedException;=0A>>> +import ja= va.util.logging.Logger;=0A>>> +=0A>>> +/**=0A>>> + *

This class can b= e used instead of a real DataSource.=0A>>> + * It is a simple wrapper to h= ide any database configuration details=0A>>> + * and make it configurable = via CDI.

=0A>>> + *

=0A>>> + *

The configuration itself will be= provided via CDI =0A> mechanics.=0A>>> + * To distinguish different datab= ases, users can specify a=0A>>> + * connectionId. If no=0A>>>= connectionId is set,=0A>>> + * the String default will be used

=0A>>> + */=0A>>> +public abstract class AbstractConf= igurableDataSource implements =0A> DataSource=0A>>> +{=0A>>> +=A0 =A0 /**= =0A>>> +=A0 =A0 =A0* config and settings are loaded only once.=0A>>> +=A0= =A0 =A0*/=0A>>> +=A0 =A0 private boolean loaded;=0A>>> +=0A>>> +=A0 =A0= /**=0A>>> +=A0 =A0 =A0* The connectionId allows to configure multiple dat= abases.=0A>>> +=A0 =A0 =A0* This can e.g. be used to distinguish between a= =0A> 'customer' and=0A>>> 'admin'=0A>>> +=A0 =A0 =A0* database.=0A>>> += =A0 =A0 =A0*/=0A>>> +=A0 =A0 protected String connectionId =3D "default";= =0A>>> +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* The underlying configura= tion of the datasource=0A>>> +=A0 =A0 =A0*/=0A>>> +=A0 =A0 private DataSo= urceConfig dataSourceConfig;=0A>>> +=0A>>> +=A0 =A0 private volatile Data= Source wrappedDataSource;=0A>>> +=0A>>> +=A0 =A0 public AbstractConfigura= bleDataSource()=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 loaded =3D false;= =0A>>> +=A0 =A0 =A0 =A0 dataSourceConfig =3D=0A>>> =0A> BeanManagerProvide= r.getInstance().getContextualReference(DataSourceConfig.class);=0A>>> +=A0= =A0 }=0A>>> +=0A>>> +=A0 =A0 public void setConnectionId(String connecti= onId)=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 if (loaded)=0A>>> +=A0 =A0= =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 throw new IllegalStateException(= "connectionId must =0A> not get=0A>>> changed after the DataSource was est= ablished");=0A>>> +=A0 =A0 =A0 =A0 }=0A>>> +=A0 =A0 =A0 =A0 this.connecti= onId =3D connectionId;=0A>>> +=A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 /**=0A>>>= +=A0 =A0 =A0* {@inheritDoc}=0A>>> +=A0 =A0 =A0*/=0A>>> +=A0 =A0 public = Connection getConnection() throws SQLException=0A>>> +=A0 =A0 {=0A>>> += =A0 =A0 =A0 =A0 return getConnection(null, null);=0A>>> +=A0 =A0 }=0A>>> = +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {@inheritDoc}=0A>>> +=A0 =A0 = =A0*/=0A>>> +=A0 =A0 public Connection getConnection(String userName, Stri= ng password) =0A> throws=0A>>> SQLException=0A>>> +=A0 =A0 {=0A>>> +=A0 = =A0 =A0 =A0 if (wrappedDataSource =3D=3D null)=0A>>> +=A0 =A0 =A0 =A0 {=0A= >>> +=A0 =A0 =A0 =A0 =A0 =A0 initDataSource();=0A>>> +=A0 =A0 =A0 =A0 }= =0A>>> +=0A>>> +=A0 =A0 =A0 =A0 if (userName =3D=3D null && password =3D= =3D null)=0A>>> +=A0 =A0 =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 return = wrappedDataSource.getConnection();=0A>>> +=A0 =A0 =A0 =A0 }=0A>>> +=A0 = =A0 =A0 =A0 return wrappedDataSource.getConnection(userName, password);=0A>= >> +=A0 =A0 }=0A>>> +=0A>>> +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {= @inheritDoc}=0A>>> +=A0 =A0 =A0*/=0A>>> +=A0 =A0 public PrintWriter getLo= gWriter() throws SQLException=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 ret= urn null;=0A>>> +=A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 = =A0* {@inheritDoc}=0A>>> +=A0 =A0 =A0*/=0A>>> +=A0 =A0 public void setLog= Writer(PrintWriter printWriter) throws =0A> SQLException=0A>>> +=A0 =A0 {= =0A>>> +=A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {@inhe= ritDoc}=0A>>> +=A0 =A0 =A0*/=0A>>> +=A0 =A0 public void setLoginTimeout(i= nt loginTimeout) throws SQLException=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 }=0A= >>> +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {@inheritDoc}=0A>>> +=A0 = =A0 =A0*/=0A>>> +=A0 =A0 public int getLoginTimeout() throws SQLException= =0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 return 0;=0A>>> +=A0 =A0 }=0A>>= > +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {@inheritDoc}=0A>>> +=A0 =A0= =A0*/=0A>>> +=A0 =A0 public T unwrap(Class iface) throws =0A> SQLE= xception=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 if (isWrapperFor(iface))= =0A>>> +=A0 =A0 =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 return (T) this;= =0A>>> +=A0 =A0 =A0 =A0 }=0A>>> +=A0 =A0 =A0 =A0 else=0A>>> +=A0 =A0 =A0= =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 return null;=0A>>> +=A0 =A0 =A0 =A0= }=0A>>> +=A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {@in= heritDoc}=0A>>> +=A0 =A0 =A0*/=0A>>> +=A0 =A0 public boolean isWrapperFor= (Class iface) throws =0A> SQLException=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0= =A0 =A0 return iface.isAssignableFrom(getClass());=0A>>> +=A0 =A0 }=0A>>>= +=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* NEW JDK1.7 signature.=0A>>> += =A0 =A0 =A0* This makes sure that CODI can also get compiled using java-7.= =0A>>> +=A0 =A0 =A0* This method is not actively used though.=0A>>> +=A0 = =A0 =A0*/=0A>>> +=A0 =A0 public Logger getParentLogger() throws =0A> SQLFe= atureNotSupportedException=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 throw = new SQLFeatureNotSupportedException();=0A>>> +=A0 =A0 }=0A>>> +=0A>>> += =A0 =A0 protected void initDataSource() throws SQLException=0A>>> +=A0 =A0= {=0A>>> +=A0 =A0 =A0 =A0 // double check lock idiom on volatile member is= ok as of =0A> Java5=0A>>> +=A0 =A0 =A0 =A0 if (wrappedDataSource !=3D nul= l)=0A>>> +=A0 =A0 =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 return;=0A>>> = +=A0 =A0 =A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 =A0 =A0 this.wrappedDataSource= =3D resolveDataSource();=0A>>> +=0A>>> +=A0 =A0 =A0 =A0 if(this.wrappedD= ataSource =3D=3D null)=0A>>> +=A0 =A0 =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 = =A0 =A0 throw new IllegalStateException("No DataSource =0A> found.");=0A>>>= +=A0 =A0 =A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 =A0 =A0 configureDataSource(t= his.wrappedDataSource);=0A>>> +=A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 public D= ataSourceConfig getDataSourceConfig()=0A>>> +=A0 =A0 {=0A>>> +=A0 =A0 =A0= =A0 return dataSourceConfig;=0A>>> +=A0 =A0 }=0A>>> +=0A>>> +=A0 =A0 pr= otected abstract DataSource resolveDataSource() throws =0A> SQLException;= =0A>>> +=0A>>> +=A0 =A0 protected abstract void configureDataSource(DataS= ource =0A> dataSource);=0A>>> +}=0A>>> =0A>>> Copied:=0A>>> =0A> myfaces/= extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/m= yfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.jav= a=0A>>> (from r1197347,=0A>>> =0A> myfaces/extensions/cdi/trunk/jee-module= s/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jpa/api/da= tasource/ConfigurableDataSource.java)=0A>>> URL:=0A>>> =0A> http://svn.apa= che.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src= /main/java/org/apache/myfaces/extensions/cdi/jpa/impl/datasource/DefaultCon= figurableDataSource.java?p2=3Dmyfaces/extensions/cdi/trunk/jee-modules/jpa-= module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/dataso= urce/DefaultConfigurableDataSource.java&p1=3Dmyfaces/extensions/cdi/trunk/j= ee-modules/jpa-module/api/src/main/java/org/apache/myfaces/extensions/cdi/j= pa/api/datasource/ConfigurableDataSource.java&r1=3D1197347&r2=3D1197378&rev= =3D1197378&view=3Ddiff=0A>>> =0A> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A>>> ---=0A>>> =0A> myfaces= /extensions/cdi/trunk/jee-modules/jpa-module/api/src/main/java/org/apache/m= yfaces/extensions/cdi/jpa/api/datasource/ConfigurableDataSource.java=0A>>> = (original)=0A>>> +++=0A>>> =0A> myfaces/extensions/cdi/trunk/jee-modules/= jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/da= tasource/DefaultConfigurableDataSource.java=0A>>> Fri Nov=A0 4 01:11:33 20= 11=0A>>> @@ -16,206 +16,94 @@=0A>>> =A0 * specific language governing per= missions and limitations=0A>>> =A0 * under the License.=0A>>> =A0 */=0A>>= > -package org.apache.myfaces.extensions.cdi.jpa.api.datasource;=0A>>> +p= ackage org.apache.myfaces.extensions.cdi.jpa.impl.datasource;=0A>>> =0A>>> = -import org.apache.commons.beanutils.BeanUtils;=0A>>> -import =0A> org.ap= ache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;=0A>>> += import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;=0A>>> += import org.apache.myfaces.extensions.cdi.core.impl.util.JndiUtils;=0A>>> += import=0A>>> =0A> org.apache.myfaces.extensions.cdi.jpa.api.datasource.Abst= ractConfigurableDataSource;=0A>>> =0A>>> -import javax.naming.InitialConte= xt;=0A>>> import javax.sql.DataSource;=0A>>> -import java.io.PrintWriter;= =0A>>> -import java.sql.Connection;=0A>>> +import java.lang.reflect.Metho= d;=0A>>> import java.sql.SQLException;=0A>>> -import java.sql.SQLFeatureN= otSupportedException;=0A>>> import java.util.Map;=0A>>> +import java.util= .logging.Level;=0A>>> import java.util.logging.Logger;=0A>>> -import java= x.naming.Context;=0A>>> =0A>>> -/**=0A>>> - *

This class can be used i= nstead of a real DataSource.=0A>>> - * It is a simple wrapper to hide any = database configuration details=0A>>> - * and make it configurable via CDI.=

=0A>>> - *=0A>>> - *

The configuration itself will be provided via= CDI =0A> mechanics.=0A>>> - * To distinguish different databases, users c= an specify a=0A>>> - * connectionId. If no=0A>>> conne= ctionId is set,=0A>>> - * the String default will be u= sed

=0A>>> - */=0A>>> -public class ConfigurableDataSource implements = DataSource=0A>>> +public class DefaultConfigurableDataSource extends=0A>>>= AbstractConfigurableDataSource=0A>>> {=0A>>> =A0 =A0 =A0/**=0A>>> -=A0= =A0 =A0* config and settings are loaded only once.=0A>>> -=A0 =A0 =A0*/= =0A>>> -=A0 =A0 private boolean loaded;=0A>>> -=0A>>> -=A0 =A0 /**=0A>>>= -=A0 =A0 =A0* The connectionId allows to configure multiple databases.=0A= >>> -=A0 =A0 =A0* This can e.g. be used to distinguish between a =0A> 'cus= tomer' and=0A>>> 'admin'=0A>>> -=A0 =A0 =A0* database.=0A>>> -=A0 =A0 = =A0*/=0A>>> -=A0 =A0 private String connectionId =3D "default";=0A>>> -= =0A>>> -=A0 =A0 /**=0A>>> -=A0 =A0 =A0* The underlying configuration of t= he datasource=0A>>> -=A0 =A0 =A0*/=0A>>> -=A0 =A0 private DataSourceConfi= g dataSourceConfig;=0A>>> -=0A>>> -=A0 =A0 /**=0A>>> -=A0 =A0 =A0*=0A>>>= +=A0 =A0 =A0* {@inheritDoc}=0A>>> =A0 =A0 =A0 */=0A>>> -=A0 =A0 private= volatile DataSource wrappedDataSource;=0A>>> -=0A>>> -=A0 =A0 public Con= figurableDataSource()=0A>>> -=A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 loaded =3D = false;=0A>>> -=A0 =A0 =A0 =A0 dataSourceConfig =3D=0A>>> =0A> BeanManagerP= rovider.getInstance().getContextualReference(DataSourceConfig.class);=0A>>>= -=A0 =A0 }=0A>>> -=0A>>> -=A0 =A0 public void setConnectionId(String co= nnectionId)=0A>>> -=A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 if (loaded)=0A>>> -= =A0 =A0 =A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 throw new IllegalStateExc= eption("connectionId must =0A> not get=0A>>> changed after the DataSource = was established");=0A>>> -=A0 =A0 =A0 =A0 }=0A>>> -=A0 =A0 =A0 =A0 this.c= onnectionId =3D connectionId;=0A>>> -=A0 =A0 }=0A>>> -=0A>>> -=A0 =A0 pu= blic Connection getConnection() throws SQLException=0A>>> +=A0 =A0 protect= ed DataSource resolveDataSource() throws SQLException=0A>>> =A0 =A0 =A0{= =0A>>> -=A0 =A0 =A0 =A0 return getConnection(null, null);=0A>>> -=A0 =A0 = }=0A>>> +=A0 =A0 =A0 =A0 String jndiLookupName =3D=0A>>> getDataSourceCon= fig().getJndiResourceName(connectionId);=0A>>> =0A>>> -=A0 =A0 public Conn= ection getConnection(String userName, String password) =0A> throws=0A>>> S= QLException=0A>>> -=A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 if (wrappedDataSource= =3D=3D null)=0A>>> +=A0 =A0 =A0 =A0 if (jndiLookupName !=3D null && jndiL= ookupName.length() =0A>> 0)=0A>>> =A0 =A0 =A0 =A0 =A0{=0A>>> -=A0 =A0 = =A0 =A0 =A0 =A0 initDataSource();=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 return Jn= diUtils.lookup(jndiLookupName, DataSource.class);=0A>>> =A0 =A0 =A0 =A0 = =A0}=0A>>> =0A>>> -=A0 =A0 =A0 =A0 if (userName =3D=3D null && password = =3D=3D null)=0A>>> +=A0 =A0 =A0 =A0 // no JNDI, so we take the direct JDBC= route.=0A>>> +=A0 =A0 =A0 =A0 String jdbcDriverClass =3D=0A>>> getDataSo= urceConfig().getDriverClassName(connectionId);=0A>>> +=A0 =A0 =A0 =A0 if (= jdbcDriverClass =3D=3D null || jdbcDriverClass.length() =3D=3D 0)=0A>>> = =A0 =A0 =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 return wrappedDataSour= ce.getConnection();=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 throw new SQLException(= "Neither a JNDI location nor a =0A> JDBC=0A>>> driver class name is config= ured!");=0A>>> =A0 =A0 =A0 =A0 =A0}=0A>>> -=A0 =A0 =A0 =A0 return wrapped= DataSource.getConnection(userName, password);=0A>>> -=A0 =A0 }=0A>>> -=0A= >>> -=0A>>> -=A0 =A0 public PrintWriter getLogWriter() throws SQLExceptio= n=0A>>> -=A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 return null;=0A>>> -=A0 =A0 }= =0A>>> =0A>>> -=A0 =A0 public void setLogWriter(PrintWriter printWriter) t= hrows =0A> SQLException=0A>>> -=A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 return = =0A> ClassUtils.tryToInstantiateClassForName(jdbcDriverClass,=0A>>> DataSo= urce.class);=0A>>> =A0 =A0 =A0}=0A>>> =0A>>> -=A0 =A0 public void setLogi= nTimeout(int loginTimeout) throws SQLException=0A>>> -=A0 =A0 {=0A>>> -= =A0 =A0 }=0A>>> -=0A>>> -=A0 =A0 public int getLoginTimeout() throws SQLE= xception=0A>>> +=A0 =A0 /**=0A>>> +=A0 =A0 =A0* {@inheritDoc}=0A>>> +=A0= =A0 =A0*/=0A>>> +=A0 =A0 protected void configureDataSource(DataSource da= taSource)=0A>>> =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 return 0;=0A>>> -=A0= =A0 }=0A>>> +=A0 =A0 =A0 =A0 Map config =3D=0A>>> getDat= aSourceConfig().getConnectionProperties(connectionId);=0A>>> =0A>>> -=A0 = =A0 public T unwrap(Class iface) throws =0A> SQLException=0A>>> -= =A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 if (isWrapperFor(iface))=0A>>> -=A0 =A0 = =A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 return (T) this;=0A>>> -=A0 =A0 = =A0 =A0 }=0A>>> -=A0 =A0 =A0 =A0 else=0A>>> +=A0 =A0 =A0 =A0 for (Map.Ent= ry configOption : =0A> config.entrySet())=0A>>> =A0 =A0 = =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 return null;=0A>>> +=A0 =A0 = =A0 =A0 =A0 =A0 setProperty(dataSource, configOption);=0A>>> =A0 =A0 =A0 = =A0 =A0}=0A>>> =A0 =A0 =A0}=0A>>> =0A>>> -=A0 =A0 public boolean isWrappe= rFor(Class iface) throws =0A> SQLException=0A>>> +=A0 =A0 protected voi= d setProperty(DataSource dataSource, =0A> Map.Entry>> String> = configOption)=0A>>> =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 return iface.isAs= signableFrom(ConfigurableDataSource.class);=0A>>> -=A0 =A0 }=0A>>> -=0A>>= > -=A0 =A0 /**=0A>>> -=A0 =A0 =A0* NEW JDK1.7 signature.=0A>>> -=A0 =A0 = =A0* This makes sure that CODI can also get compiled using java-7.=0A>>> -= =A0 =A0 =A0* This method is not actively used though.=0A>>> -=A0 =A0 =A0*/= =0A>>> -=A0 =A0 public Logger getParentLogger() throws =0A> SQLFeatureNotS= upportedException=0A>>> -=A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 throw new SQLFe= atureNotSupportedException();=0A>>> -=A0 =A0 }=0A>>> +=A0 =A0 =A0 =A0 Met= hod setterMethod =3D findSetterForProperty(dataSource, =0A> configOption);= =0A>>> =0A>>> -=A0 =A0 /**=0A>>> -=A0 =A0 =A0*=0A>>> -=A0 =A0 =A0*/=0A>>= > -=A0 =A0 protected void initDataSource() throws SQLException=0A>>> -=A0= =A0 {=0A>>> -=A0 =A0 =A0 =A0 // double check lock idiom on volatile membe= r is ok as of =0A> Java5=0A>>> -=A0 =A0 =A0 =A0 if (wrappedDataSource !=3D= null)=0A>>> +=A0 =A0 =A0 =A0 if(setterMethod =3D=3D null)=0A>>> =A0 =A0 = =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 return;=0A>>> -=A0 =A0 =A0 = =A0 }=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 Logger logger =3D Logger.getLogger(ge= tClass().getName());=0A>>> =0A>>> -=A0 =A0 =A0 =A0 String jndiLookupName = =3D=0A>>> dataSourceConfig.getJndiResourceName(connectionId);=0A>>> -=A0 = =A0 =A0 =A0 if (jndiLookupName !=3D null && jndiLookupName.length() =0A>> = 0)=0A>>> -=A0 =A0 =A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 wrappedDataSou= rce =3D =0A> resolveDataSourceViaJndi(jndiLookupName);=0A>>> +=A0 =A0 =A0 = =A0 =A0 =A0 if(logger.isLoggable(Level.WARNING))=0A>>> +=A0 =A0 =A0 =A0 = =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 logger.warning(dataSource= .getClass().getName() +=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 " has no setter for property '" =0A> +=0A>>> configOption.getKey() + = "'. Property gets ignored.");=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 }=0A>>> =A0 = =A0 =A0 =A0 =A0 =A0 =A0return;=0A>>> =A0 =A0 =A0 =A0 =A0}=0A>>> =0A>>> -= =0A>>> -=A0 =A0 =A0 =A0 // no JNDI, so we take the direct JDBC route.=0A>>= > -=A0 =A0 =A0 =A0 String jdbcDriverClass =3D=0A>>> dataSourceConfig.getD= riverClassName(connectionId);=0A>>> -=A0 =A0 =A0 =A0 if (jdbcDriverClass = =3D=3D null && =0A> jdbcDriverClass.length() =3D=3D 0)=0A>>> -=A0 =A0 =A0 = =A0 {=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 throw new SQLException("Neither a JND= I location nor a =0A> JDBC=0A>>> driver class name is configured!");=0A>>>= -=A0 =A0 =A0 =A0 }=0A>>> -=0A>>> =A0 =A0 =A0 =A0 =A0try=0A>>> =A0 =A0 = =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 Class clazz =3D=A0 Class.forNa= me(jdbcDriverClass);=0A>>> -=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 // the given = driver classname must be a DataSource=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 if (!= DataSource.class.isAssignableFrom(clazz))=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 {= =0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 throw new SQLException("Configured= =0A> DriverClassName is not=0A>>> a javax.sql.DataSource: "=0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= + jdbcDriverClass);=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 }=0A>>> -=0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 wrappedDataSource =3D (DataSource) clazz.newInstance();= =0A>>> -=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 Map config =3D=0A= >>> dataSourceConfig.getConnectionProperties(connectionId);=0A>>> -=A0 = =A0 =A0 =A0 =A0 =A0 for (Map.Entry configOption :=0A>>> co= nfig.entrySet())=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 BeanUtils.setProperty(wrappedDataSource, =0A> configOption.= getKey(),=0A>>> configOption.getValue());=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 = }=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 setterMethod.invoke(dataSource, configOpt= ion.getValue());=0A>>> =A0 =A0 =A0 =A0 =A0}=0A>>> =A0 =A0 =A0 =A0 =A0catc= h (Exception e)=0A>>> =A0 =A0 =A0 =A0 =A0{=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0= wrappedDataSource =3D null;=0A>>> -=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 if (e= instanceof SQLException)=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 {=0A>>> -=A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 throw (SQLException) e;=0A>>> -=A0 =A0 =A0 =A0 = =A0 =A0 }=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 throw new SQLException(e);=0A>>> = +=A0 =A0 =A0 =A0 =A0 =A0 throw new=0A>>> IllegalStateException(setterMeth= od.getDeclaringClass().getName() + =0A> "#"=0A>>> + setterMethod.getName()= +=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 " failed", e);=0A>>> = =A0 =A0 =A0 =A0 =A0}=0A>>> =A0 =A0 =A0}=0A>>> =0A>>> -=A0 =A0 protected D= ataSource resolveDataSourceViaJndi(String =0A> jndiLookupName)=0A>>> +=A0 = =A0 protected Method findSetterForProperty(DataSource dataSource,=0A>>> Ma= p.Entry configOption)=0A>>> =A0 =A0 =A0{=0A>>> -=A0 =A0 = =A0 =A0 DataSource ds =3D null;=0A>>> -=A0 =A0 =A0 =A0 try=0A>>> -=A0 =A0= =A0 =A0 {=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 Context jndiContext =3D new Init= ialContext();=0A>>> -=A0 =A0 =A0 =A0 =A0 =A0 ds =3D (DataSource) jndiConte= xt.lookup(jndiLookupName);=0A>>> -=A0 =A0 =A0 =A0 }=0A>>> -=A0 =A0 =A0 = =A0 catch (Exception e)=0A>>> +=A0 =A0 =A0 =A0 for (Method method : dataSo= urce.getClass().getMethods())=0A>>> =A0 =A0 =A0 =A0 =A0{=0A>>> -=A0 =A0 = =A0 =A0 =A0 =A0 throw new IllegalArgumentException("Could not lookup=0A>>> = DataSource from JNDI using " + jndiLookupName);=0A>>> +=A0 =A0 =A0 =A0 = =A0 =A0 if (method.getParameterTypes().length =3D=3D 1 &&=0A>>> +=0A>>> S= tring.class.isAssignableFrom(method.getParameterTypes()[0]) &&=0A>>> +=A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 method.getName().equalsIgnoreCase("set"= =0A> +=0A>>> configOption.getKey())) //simple detection=0A>>> +=A0 =A0 = =A0 =A0 =A0 =A0 {=0A>>> +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return method;=0A= >>> +=A0 =A0 =A0 =A0 =A0 =A0 }=0A>>> =A0 =A0 =A0 =A0 =A0}=0A>>> -=0A>>> = -=A0 =A0 =A0 =A0 return ds;=0A>>> +=A0 =A0 =A0 =A0 return null;=0A>>> = =A0 =A0 =A0}=0A>>> -=0A>>> }=0A>>> =0A>>> Propchange:=0A>>> =0A> myfaces= /extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/= myfaces/extensions/cdi/jpa/impl/datasource/DefaultConfigurableDataSource.ja= va=0A>>> =0A> -------------------------------------------------------------= -----------------=0A>>> =A0 =A0 svn:eol-style =3D native=0A>>> =0A>> =0A>