monetdb-java: default - Corrected implementation of java.sql.Wra...
Changeset: 8e57d20b5e80 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/8e57d20b5e80 Added Files: tests/Test_Wrapper.java Modified Files: ChangeLog src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java tests/build.xml Branch: default Log Message: Corrected implementation of java.sql.Wrapper methods isWrapperFor() and unwrap(). They now properly return expected results instead of always return false or throw an SQLException. Added test program Test_Wrapper.java diffs (276 lines): diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for java # This file is updated with Maddlog +* Thu Oct 13 2016 Martin van Dinther +- Corrected implementation of java.sql.Wrapper methods isWrapperFor() + and unwrap(). They now properly return expected results instead of + always return false or throw an SQLException. + * Thu Oct 6 2016 Martin van Dinther - Corrected return values of DatabaseMetaData methods nullsAreSortedHigh(), nullsAreSortedLow(), getMaxCursorNameLength(), getMaxProcedureNameLength(), diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java @@ -8,66 +8,71 @@ package nl.cwi.monetdb.jdbc; -import java.sql.*; +import java.sql.SQLException; /** - * A Wrapper class that implements nothing. - * - * This Class is used to simply provide JDBC4 Wrapper functions, for as - * long as we don't really understand that they are for and what they - * are supposed to do. Hence the implementations are very stupid and - * non-useful, ignoring any argument and claiming stuff doesn't work, or - * won't work out. + * A Wrapper class which provide the ability to retrieve the delegate instance + * when the instance in question is in fact a proxy class. * - * @author Fabian Groffen - * @version 1.0 + * The wrapper pattern is employed by many JDBC driver implementations to provide + * extensions beyond the traditional JDBC API that are specific to a data source. + * Developers may wish to gain access to these resources that are wrapped (the delegates) + * as proxy class instances representing the the actual resources. + * This class contains a standard mechanism to access these wrapped resources + * represented by their proxy, to permit direct access to the resource delegates. + * + * @author Fabian Groffen, Martin van Dinther + * @version 1.1 */ -public class MonetWrapper implements Wrapper { +public class MonetWrapper implements java.sql.Wrapper { /** * Returns true if this either implements the interface argument or * is directly or indirectly a wrapper for an object that does. * Returns false otherwise. If this implements the interface then * return true, else if this is a wrapper then return the result of -* recursively calling isWrapperFor on the wrapped object. If this -* does not implement the interface and is not a wrapper, return +* recursively calling isWrapperFor on the wrapped object. +* If this does not implement the interface and is not a wrapper, return * false. This method should be implemented as a low-cost operation -* compared to unwrap so that callers can use this method to avoid -* expensive unwrap calls that may fail. If this method returns true -* then calling unwrap with the same argument should succeed. +* compared to unwrap so that callers can use this method to avoid +* expensive unwrap calls that may fail. +* If this method returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. -* @return true if this implements the interface or directly or -* indirectly wraps an object that does. -* @throws SQLException if an error occurs while determining -* whether this is a wrapper for an object with the given -* interface. +* @return true if this implements the interface or directly or indirectly wraps an object that does. +* @throws SQLException if an error occurs while determining whether this is a wrapper +* for an object with the given interface. +* @since 1.6 */ @Override public boolean isWrapperFor(Class iface) throws SQLException { - return false; + return iface != null && iface.isAssignableFrom(getClass()); } /** * Returns an object that implements the given interface to allow -* access to non-standard methods, or standard methods not exposed -* by the proxy. If the receiver implements the interface then the -* result is the receiver or a proxy for the receiver. If the -* recei
monetdb-java: default - Corrected implementation of java.sql.Wra...
Changeset: 8e57d20b5e80 for monetdb-java URL: http://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=8e57d20b5e80 Added Files: tests/Test_Wrapper.java Modified Files: ChangeLog src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java tests/build.xml Branch: default Log Message: Corrected implementation of java.sql.Wrapper methods isWrapperFor() and unwrap(). They now properly return expected results instead of always return false or throw an SQLException. Added test program Test_Wrapper.java diffs (276 lines): diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for java # This file is updated with Maddlog +* Thu Oct 13 2016 Martin van Dinther +- Corrected implementation of java.sql.Wrapper methods isWrapperFor() + and unwrap(). They now properly return expected results instead of + always return false or throw an SQLException. + * Thu Oct 6 2016 Martin van Dinther - Corrected return values of DatabaseMetaData methods nullsAreSortedHigh(), nullsAreSortedLow(), getMaxCursorNameLength(), getMaxProcedureNameLength(), diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetWrapper.java @@ -8,66 +8,71 @@ package nl.cwi.monetdb.jdbc; -import java.sql.*; +import java.sql.SQLException; /** - * A Wrapper class that implements nothing. - * - * This Class is used to simply provide JDBC4 Wrapper functions, for as - * long as we don't really understand that they are for and what they - * are supposed to do. Hence the implementations are very stupid and - * non-useful, ignoring any argument and claiming stuff doesn't work, or - * won't work out. + * A Wrapper class which provide the ability to retrieve the delegate instance + * when the instance in question is in fact a proxy class. * - * @author Fabian Groffen - * @version 1.0 + * The wrapper pattern is employed by many JDBC driver implementations to provide + * extensions beyond the traditional JDBC API that are specific to a data source. + * Developers may wish to gain access to these resources that are wrapped (the delegates) + * as proxy class instances representing the the actual resources. + * This class contains a standard mechanism to access these wrapped resources + * represented by their proxy, to permit direct access to the resource delegates. + * + * @author Fabian Groffen, Martin van Dinther + * @version 1.1 */ -public class MonetWrapper implements Wrapper { +public class MonetWrapper implements java.sql.Wrapper { /** * Returns true if this either implements the interface argument or * is directly or indirectly a wrapper for an object that does. * Returns false otherwise. If this implements the interface then * return true, else if this is a wrapper then return the result of -* recursively calling isWrapperFor on the wrapped object. If this -* does not implement the interface and is not a wrapper, return +* recursively calling isWrapperFor on the wrapped object. +* If this does not implement the interface and is not a wrapper, return * false. This method should be implemented as a low-cost operation -* compared to unwrap so that callers can use this method to avoid -* expensive unwrap calls that may fail. If this method returns true -* then calling unwrap with the same argument should succeed. +* compared to unwrap so that callers can use this method to avoid +* expensive unwrap calls that may fail. +* If this method returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. -* @return true if this implements the interface or directly or -* indirectly wraps an object that does. -* @throws SQLException if an error occurs while determining -* whether this is a wrapper for an object with the given -* interface. +* @return true if this implements the interface or directly or indirectly wraps an object that does. +* @throws SQLException if an error occurs while determining whether this is a wrapper +* for an object with the given interface. +* @since 1.6 */ @Override public boolean isWrapperFor(Class iface) throws SQLException { - return false; + return iface != null && iface.isAssignableFrom(getClass()); } /** * Returns an object that implements the given interface to allow -* access to non-standard methods, or standard methods not exposed -* by the proxy. If the receiver implements the interface then the -* result is the receiver or a proxy for the receiver. If the -