[ 
http://issues.apache.org/jira/browse/JDO-194?page=comments#action_12365084 ] 

Martin Zaun commented on JDO-194:
---------------------------------

> JDO implementations should behave defensively and treat both 
> NoClassDefFoundError and ClassNotFoundException as "class does not exist". 

In fact, this does not only include NoClassDefFoundErrors but LinkageErrors in 
general, see below.

>We are going to file a bug on the JRE saying that behavior for classes that 
>don't exist is inconsistent based on the platform and the name. Specifically, 
>it seems that Windows platforms get confused trying to resolve class names 
>that differ in capitalization from real class names.

The JRE's behaviour doesn't strike me as inconsistent with the Java specs after 
consulting the Java Language Specification (3rd edition)
    http://java.sun.com/docs/books/jls/index.html
and, more detailed, the revised chapter 5 "Loading, Linking and Initializing" 
of the the Java VM Specification (2nd edition + latest amendments):
    http://java.sun.com/docs/books/vmspec/2nd-edition/ConstantPool.pdf

In a nutshell:
1) A ClassNotFoundException is thrown when no binary representation of a class 
could be found at all; a LinkageError, including NoClassDefFoundError, is 
thrown when some representation was found but it's "content" turns out not to 
be a feasible or the required class.

2) ClassLoader.loadClass() is a place where LinkageErrors may occur.  (There 
are rules about when classloaders, which may employ an eager or lazy loading 
strategy, may throw such errors).

3) The process of finding of a binary representation of a class is specified as 
platform-dependent -- even for the bootstrap classloader. Note that 
user-defined classloaders have all freedom anyway (for instance, loading 
classes over the net).

So, a classloader may, by its rules, report to have located a binary 
representation for a class name, which then turns out not to be the required 
class, thus, resulting in a LinkageError.

The VM spec is explicit on this:

5.3.1 Loading Using the Bootstrap Class Loader
The following steps are used to load and thereby create the nonarray class or 
interface C denoted by N using the bootstrap class loader.
...
1. The Java virtual machine searches for a purported representation of C in a 
platform- dependent manner. Note that there is no guarantee that a purported 
representation found is valid or is a representation of C.

   Typically, a class or interface will be represented using a file in a 
hierarchical file system. The name of the class or interface will usually be 
encoded in the pathname of the file.

   This phase of loading must detect the following error:
   * If no purported representation of C is found, loading throws an instance 
of NoClassDefFoundError or an instance of one of its subclasses.


> JPOX does not support implicit variables.
> -----------------------------------------
>
>          Key: JDO-194
>          URL: http://issues.apache.org/jira/browse/JDO-194
>      Project: JDO
>         Type: Bug
>   Components: tck20
>     Reporter: Michael Watzek
>     Assignee: Michael Bouschen

>
> JPOX throws an exception executing queries having implicit parameters (see 
> below). The bug may be reproduced executing test case 
> org.apache.jdo.tck.query.jdoql.variables.VariablesAndFields.
> Query: SELECT FROM org.apache.jdo.tck.pc.company.Employee WHERE 
> team.contains(employee) & employee.firstname == 'emp1First' 
> org.jpox.store.exceptions.NoSuchPersistentFieldException: Field "employee" 
> does not exist in org.apache.jdo.tck.pc.company.Person or is not persistent
>       at 
> org.jpox.store.rdbms.table.ClassTable.getFieldMapping(ClassTable.java:1790)
>       at 
> org.jpox.store.expression.TableExpression.newFieldExpression(TableExpression.java:183)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileIdentifier(JDOQLQuery.java:1534)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compilePrimary(JDOQLQuery.java:1299)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpressionNotPlusMinus(JDOQLQuery.java:1245)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpression(JDOQLQuery.java:1226)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileMultiplicativeExpression(JDOQLQuery.java:1179)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileAdditiveExpression(JDOQLQuery.java:1156)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileRelationalExpression(JDOQLQuery.java:1125)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileEqualityExpression(JDOQLQuery.java:1102)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileAndExpression(JDOQLQuery.java:1090)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileExclusiveOrExpression(JDOQLQuery.java:1078)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileInclusiveOrExpression(JDOQLQuery.java:1066)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalAndExpression(JDOQLQuery.java:1054)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalOrExpression(JDOQLQuery.java:1036)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileExpression(JDOQLQuery.java:1013)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compilePrimary(JDOQLQuery.java:1346)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpressionNotPlusMinus(JDOQLQuery.java:1245)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpression(JDOQLQuery.java:1226)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileMultiplicativeExpression(JDOQLQuery.java:1179)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileAdditiveExpression(JDOQLQuery.java:1156)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileRelationalExpression(JDOQLQuery.java:1125)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileEqualityExpression(JDOQLQuery.java:1102)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileAndExpression(JDOQLQuery.java:1090)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileExclusiveOrExpression(JDOQLQuery.java:1078)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileInclusiveOrExpression(JDOQLQuery.java:1066)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalAndExpression(JDOQLQuery.java:1054)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalOrExpression(JDOQLQuery.java:1036)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileExpression(JDOQLQuery.java:1013)
>       at 
> org.jpox.store.query.JDOQLQuery$Compiler.compileQueryStatement(JDOQLQuery.java:891)
>       at org.jpox.store.query.JDOQLQuery.compile(JDOQLQuery.java:569)
>       at org.jpox.store.query.JDOQLQuery.performExecute(JDOQLQuery.java:639)
>       at org.jpox.store.query.Query.executeWithMap(Query.java:907)
>       at org.jpox.store.query.Query.executeWithArray(Query.java:887)
>       at org.jpox.store.query.Query.execute(Query.java:819)
>       at org.apache.jdo.tck.query.QueryTest.execute(QueryTest.java:706)
>       at 
> org.apache.jdo.tck.query.QueryTest.executeAPIQuery(QueryTest.java:625)
>       at 
> org.apache.jdo.tck.query.QueryTest.executeAPIQuery(QueryTest.java:601)
>       at 
> org.apache.jdo.tck.query.jdoql.variables.VariablesAndFields.testPositive(VariablesAndFields.java:148)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:324)
>       at junit.framework.TestCase.runTest(TestCase.java:154)
>       at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:204)
>       at junit.framework.TestResult$1.protect(TestResult.java:106)
>       at junit.framework.TestResult.runProtected(TestResult.java:124)
>       at junit.framework.TestResult.run(TestResult.java:109)
>       at junit.framework.TestCase.run(TestCase.java:118)
>       at junit.framework.TestSuite.runTest(TestSuite.java:208)
>       at junit.framework.TestSuite.run(TestSuite.java:203)
>       at junit.framework.TestSuite.runTest(TestSuite.java:208)
>       at junit.framework.TestSuite.run(TestSuite.java:203)
>       at junit.textui.TestRunner.doRun(TestRunner.java:116)
>       at junit.textui.TestRunner.doRun(TestRunner.java:109)
>       at 
> org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:120)
>       at org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:95)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to