[ 
https://issues.apache.org/jira/browse/KARAF-3261?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14183035#comment-14183035
 ] 

Guillaume Nodet commented on KARAF-3261:
----------------------------------------

master: 
https://git-wip-us.apache.org/repos/asf?p=karaf.git;a=commit;h=6c68e506d7e9ee6c3ea1a41d7dd1a78601e62dd7

need to be back ported to older versions

> jdbc command (using JdbcConnector.java) does not honour service ranking and 
> throws IllegalArgumentException instead
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: KARAF-3261
>                 URL: https://issues.apache.org/jira/browse/KARAF-3261
>             Project: Karaf
>          Issue Type: Bug
>    Affects Versions: 3.0.1
>            Reporter: Mark Barry
>            Assignee: Guillaume Nodet
>             Fix For: 4.0.0, 3.0.3, 2.4.1, 2.3.9
>
>
> Given two datasources are defined with the same jndi name
> and different service_rankings are defined
> when jdbc:datasources is used on the command line
> then the IllegalArgumentException("Multiple JDBC datasource found for " + 
> name) is thrown
> instead of the highest ranked service being listed
> Requirements:
> Features: jpa, jndi, jdbc
> Bundle: derby library and oracle JDBC drivers
> Datasource 1: Derby (condensed)
> <?xml version="1.0" encoding="UTF-8"?>
> <blueprint>
>     <bean id="dataSource" class="org.apache.derby.jdbc.EmbeddedXADataSource">
>         <property name="databaseName" value="database"/>
>         <property name="createDatabase" value="create" />
>     </bean>
>     <service ref="dataSource" interface="javax.sql.DataSource" >
>         <service-properties>
>             <entry key="osgi.jndi.service.name" value="jdbc/database"/>
>         </service-properties>
>     </service>
> </blueprint>
> Datasource 2: Oracle
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
>            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>            default-activation="eager" >
>         <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource">
>       <property name="URL" value="jdbc:oracle:thin:@localhost:1521/ORCL" />
>       <property name="user" value="scott"/>
>       <property name="password" value="tiger"/>
>         </bean>
>     <service ref="dataSource" interface="javax.sql.DataSource" ranking="90" >
>         <service-properties>
>             <entry key="osgi.jndi.service.name" value="jdbc/database"/>
>         </service-properties>
>     </service>
> </blueprint>
> karaf@root()> service:list javax.sql.DataSource
> [javax.sql.DataSource]
> ----------------------
>  osgi.jndi.service.name = jdbc/database
>  osgi.service.blueprint.compname = dataSource
>  service.id = 802
>  service.ranking = 90
> Provided by :
>  Bundle 167
> Used by:
>  Test Bundle (171)
> [javax.sql.DataSource]
> ----------------------
>  osgi.jndi.service.name = jdbc/database
>  osgi.service.blueprint.compname = dataSource
>  service.id = 804
> Provided by :
>  Test Bundle (171)
> In karaf:
> karaf@root()> jdbc:datasources
> Error executing command: Multiple JDBC datasource found for jdbc/database
> karaf@root()> exception-display
> java.lang.IllegalArgumentException: Multiple JDBC datasource found for 
> jdbc/database
>         at 
> org.apache.karaf.jdbc.internal.JdbcConnector.lookupDataSource(JdbcConnector.java:133)
>         at 
> org.apache.karaf.jdbc.internal.JdbcConnector.connect(JdbcConnector.java:49)
>         at 
> org.apache.karaf.jdbc.internal.JdbcServiceImpl.info(JdbcServiceImpl.java:213)
>         at Proxyd62a7e80_cc25_47ad_b3a2_9976b9f06424.info(Unknown Source)
>         at Proxy3ab1f1e7_eaa9_4281_9b24_3b7d97868ed3.info(Unknown Source)
>         at 
> org.apache.karaf.jdbc.command.DataSourcesCommand.doExecute(DataSourcesCommand.java:38)
>         at 
> org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>         at 
> org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>         at 
> org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>         at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_51]
>         at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_51]
>         at 
> org.apache.aries.proxy.impl.ProxyHandler$1.invoke(ProxyHandler.java:54)
>         at 
> org.apache.aries.proxy.impl.ProxyHandler.invoke(ProxyHandler.java:119)
>         at 
> org.apache.karaf.shell.console.commands.$BlueprintCommand30051229.execute(Unknown
>  Source)[37:org.apache.karaf.shell.console:3.0.1]
> Preferred behaviour would be to return all datasources, including their 
> service ranking.  As a minimum would be to return the message as a warning, 
> and return the highest ranked service.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to