[ 
https://issues.apache.org/jira/browse/DERBY-5840?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-5840:
--------------------------------------

    Attachment: derby-5840-08-aa-jdbc3-embedded.diff

Attaching another patch (derby-5840-08-aa-jdbc3-embedded.diff) to compile the 
JDBC 3-specific classes in the embedded driver with source and target level 1.5.

Source and target level was changed to 1.5 for the JDBC 3 targets in the 
java/engine sub-tree.

Since we don't produce a separate JDBC 2 driver anymore, the patch folds the 
JDBC 2 build targets into the JDBC 3 build targets, so that the JDBC 2 classes 
are also compiled with level 1.5.

In addition to the usual updates to use generics where we get unchecked 
conversion warnings, the patch fixes a deprecation warning that popped up in 
EmbeddedDriver.boot(). The warning was about the use of 
DriverManager.getLogStream(), which is deprecated in favour of 
DriverManager.getLogWriter(). The patch makes it use getLogWriter(), and 
changes the signatures of the methods that receive the log writer to expect a 
PrintWriter instead of a PrintStream. Some places where System.err is passed to 
those methods, we now have to wrap System.err in a PrintWriter instance because 
of this.

Changing the target level revealed that our build doesn't properly isolate the 
JSR-169 implementation classes from the JDBC 3.0 implementation classes, 
something that manifested itself as failure to boot the engine on J2ME 
platforms because it tried to load classes that were compiled with a higher 
target level than the JVM understood. These things had to be fixed to get the 
engine to load again on J2ME:

1) EmbedConnection30 and EmbedSavepoint30 are used by the JSR-169 
implementation, but the classes are compiled by the compile_jdbc3 target, 
because that target picks up every file whose name matches *30.java. This was 
addressed by renaming EmbedSavepoint30 to EmbedSavepoint, move all of 
EmbedConnection30's methods to the super-class (EmbedConnection), and remove 
the EmbedConnection30 class. Since the class names no longer indicated that 
this was JDBC 3-specific code (which it wasn't), it was correctly compiled for 
JSR-169.

2) The XactFactory class failed to load on J2ME because it had a field 
(xa_resource) whose type was XAResourceManager. We don't support XA in our 
JSR-169 driver, so XAResourceManager is compiled with target level 1.5, and 
this prevented the XactFactory class from loading. The fix was to change the 
type of the field to Object. Using Object instead of XAResourceManager is an 
existing strategy in XactFactory, as can be seen for example in this method 
declaration:

    public /* XAResourceManager */ Object getXAResourceManager()

(Note XAResourceManager is commented out.) I assume this was done for a similar 
reason, perhaps back when JDBC 3 was compiled with target level 1.4, and we 
still supported Foundation Profile 1.0, which only supported level 1.3.

3) ResourceAdapter (another XA class) is loaded as an optional component, as 
seen in BasicDatabase.bootResourceAdapter():

                try
                {
                        resourceAdapter = 
                                Monitor.bootServiceModule(create, this,
                                                                                
 org.apache.derby.iapi.reference.Module.ResourceAdapter,
                                                                                
 allParams);
                }
                catch (StandardException mse)
                {
                        // OK, resourceAdapter is an optional module
                }

However, even though it was prepared for failure to load the class, this code 
didn't see a StandardException on J2ME after ResourceAdapter's target level 
changed to 1.5. Instead, it saw a raw UnsupportedClassVersionError. The fix was 
to change ProtocolKey.create() to wrap LinkageError (a super-class of 
UnsupportedClassVersionError) in a StandardException. That method was already 
prepared for class loading to fail, but not because of wrong class version. 
When the error came out as a StandardException, 
BasicDatabase.bootResourceAdapter() knew how to handle it.

I ran suites.All on Oracle Java ME Embedded Client 1.1 to verify that the 
JSR-169 driver still works. I also ran derbyall and suites.All on Java 5 and 
Java 7. All the tests passed.
                
> Clean up compiler warnings introduced by using Java 5 language features
> -----------------------------------------------------------------------
>
>                 Key: DERBY-5840
>                 URL: https://issues.apache.org/jira/browse/DERBY-5840
>             Project: Derby
>          Issue Type: Improvement
>          Components: Miscellaneous
>    Affects Versions: 10.10.0.0
>            Reporter: Rick Hillegas
>         Attachments: derby-5840-01-aa-compatibilityTests.diff, 
> derby-5840-02-aa-compatibilityTests-again.diff.txt, 
> derby-5840-03-aa-drda.diff, derby-5840-03-ab-drda.diff, 
> derby-5840-04-aa-client-level.diff, derby-5840-05-aa-client-deprecation.diff, 
> derby-5840-06-aa-jdbc3-stubs.diff, derby-5840-07-aa-drda-for-each.diff, 
> derby-5840-08-aa-jdbc3-embedded.diff
>
>
> Using Java 5 language features forces us to compile code at level 5 or 
> higher. At this level, the compiler raises warnings not seen at lower levels. 
> This issue is a place to discuss and attach cleanup to eliminate these 
> warnings.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to