I'm going nuts over trying to figure out what I'm doing wrong. I am
getting the error
java.lang.ClassNotFoundException:
com.callistacti.callwatch.database.PasswordReset
(see full log trace below) when I'm simply trying to retrieve the
associated PasswordReset object - which I don't always expect to exist.
Here's the offending line of code:
PasswordReset pr = user.getPasswordReset();
from
try {
//Find the User
User user = User.findUser(username);
if (user == null){
return token;
}
PasswordReset pr = user.getPasswordReset();
try {
if (pr == null ) {
pr = newPasswordReset(username);
} else {
if (pr.getExpireDT().before(DateTime.now().toDate())) {
DataContext dc = DataContext.createDataContext();
token = Password.getEncryptPW(username +
DateTime.now().toString());
pr.setToken(token);
dc.commitChanges();
} else {
token = pr.getToken();
}
}
} catch (CayenneRuntimeException e) {
CCommon.getInstance().logInfo("PasswordReset::getPasswordResetToken::" +
e.getMessage(),e);
}
} finally {
CCommon.getInstance().logInfo("PasswordReset::getPasswordResetToken::Complete
for " + username + "Result=" + token);
}
I don't understand why is the classnotfound happening? Both the source
code and the class is generated as far as I can tell. Are some of my
dependencies out-of-whack?
Here is the extraction from my map.xml file
<db-entity name="Password" catalog="BlueCrane">
<db-attribute name="EmailPassword" type="VARCHAR" length="32"/>
<db-attribute name="Password" type="VARCHAR" isMandatory="true"
length="128"/>
<db-attribute name="UserID" type="INTEGER" isMandatory="true"
length="10"/>
<db-attribute name="password_id" type="INTEGER"
isPrimaryKey="true" isMandatory="true" length="10"/>
<db-attribute name="salt" type="VARBINARY" isMandatory="true"
length="8"/>
</db-entity>
<db-entity name="PasswordReset" catalog="BlueCrane">
<db-attribute name="UserID" type="INTEGER" isMandatory="true"/>
<db-attribute name="expireDT" type="TIMESTAMP" isMandatory="true"/>
<db-attribute name="passwordreset_id" type="INTEGER"
isPrimaryKey="true" isMandatory="true"/>
<db-attribute name="token" type="VARCHAR" isMandatory="true"
length="128"/>
</db-entity>
<db-entity name="User" catalog="BlueCrane">
<db-attribute name="AccessLevel" type="SMALLINT"
isMandatory="true" length="5"/>
<db-attribute name="ExpireDate" type="DATE"/>
<db-attribute name="Status" type="SMALLINT" isMandatory="true"
length="5"/>
<db-attribute name="company_id" type="INTEGER"
isMandatory="true" length="10"/>
<db-attribute name="contact_id" type="INTEGER"
isMandatory="true" length="10"/>
<db-attribute name="user_id" type="INTEGER" isPrimaryKey="true"
isMandatory="true"/>
<db-attribute name="username" type="VARCHAR" length="128"/>
</db-entity>
<obj-entity name="Password"
className="com.callistacti.callwatch.database.Password"
dbEntityName="Password">
<obj-attribute name="emailPassword" type="java.lang.String"
db-attribute-path="EmailPassword"/>
<obj-attribute name="id" type="java.lang.Integer"
db-attribute-path="password_id"/>
<obj-attribute name="password" type="java.lang.String"
db-attribute-path="Password"/>
<obj-attribute name="salt" type="byte[]" db-attribute-path="salt"/>
</obj-entity>
<obj-entity name="PasswordReset"
className="com.callistacti.callwatch.database.PasswordReset"
dbEntityName="PasswordReset">
<obj-attribute name="expireDT" type="java.util.Date"
db-attribute-path="expireDT"/>
<obj-attribute name="token" type="java.lang.String"
db-attribute-path="token"/>
</obj-entity>
<obj-entity name="User"
className="com.callistacti.callwatch.database.User" dbEntityName="User">
<obj-attribute name="accessLevel" type="java.lang.Short"
db-attribute-path="AccessLevel"/>
<obj-attribute name="expireDate" type="java.util.Date"
db-attribute-path="ExpireDate"/>
<obj-attribute name="status" type="java.lang.Short"
db-attribute-path="Status"/>
<obj-attribute name="userID" type="java.lang.Integer"
db-attribute-path="user_id"/>
<obj-attribute name="username" type="java.lang.String"
db-attribute-path="username"/>
<pre-persist method-name="onPrePersist"/>
</obj-entity>
<db-relationship name="User" source="Password" target="User"
toMany="false">
<db-attribute-pair source="UserID" target="user_id"/>
</db-relationship>
<db-relationship name="User" source="PasswordReset" target="User"
toMany="false">
<db-attribute-pair source="UserID" target="user_id"/>
</db-relationship>
<db-relationship name="Password" source="User" target="Password"
toMany="false">
<db-attribute-pair source="user_id" target="UserID"/>
</db-relationship>
<db-relationship name="PasswordReset" source="User"
target="PasswordReset" toMany="false">
<db-attribute-pair source="user_id" target="UserID"/>
</db-relationship>
<obj-relationship name="user" source="Password" target="User"
deleteRule="Nullify" db-relationship-path="User"/>
<obj-relationship name="user" source="PasswordReset" target="User"
deleteRule="Nullify" db-relationship-path="User"/>
<obj-relationship name="password" source="User" target="Password"
deleteRule="Nullify" db-relationship-path="Password"/>
<obj-relationship name="passwordReset" source="User"
target="PasswordReset" deleteRule="Nullify"
db-relationship-path="PasswordReset"/>
And here is the log trace:
2013-06-20 12:06:37,025 [http-bio-8080-exec-16] INFO CallWatch -
0F1E2D->PasswordReset::getPasswordResetToken::Start for callista
2013-06-20 12:06:37,041 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - --- will run 1 query.
2013-06-20 12:06:37,043 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - --- transaction started.
2013-06-20 12:06:37,045 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - SELECT t0.user_id, t0.Status,
t0.AccessLevel, t0.contact_id, t0.username, t0.ExpireDate, t0.company_id
FROM User t0 WHERE t0.username = ? [bind: 1->username:'callista']
2013-06-20 12:06:37,047 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - === returned 1 row. - took 2 ms.
2013-06-20 12:06:37,049 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - +++ transaction committed.
2013-06-20 12:06:37,052 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - --- will run 1 query.
2013-06-20 12:06:37,053 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - --- transaction started.
2013-06-20 12:06:37,055 [http-bio-8080-exec-16] INFO
org.apache.cayenne.access.QueryLogger - *** error.
2013-06-20 12:06:37,087 [http-bio-8080-exec-16] INFO CallWatch -
0F1E2D->PasswordReset::getPasswordResetToken::Complete for
callistaResult=null
Jun 20, 2013 12:06:37 PM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE:
Caused by: org.apache.cayenne.CayenneRuntimeException: [v.3.0.2 Jun 11
2011 09:26:09] Query exception.
at
org.apache.cayenne.access.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java:549)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:276)
at
org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:422)
at
org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:69)
at
org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:395)
at
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:850)
at
org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:392)
at
org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:121)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:743)
at
org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:334)
at
org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:104)
at
org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:91)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1293)
at
org.apache.cayenne.access.DataContext.performQuery(DataContext.java:1282)
at
org.apache.cayenne.access.ToOneFault.doResolveFault(ToOneFault.java:81)
at
org.apache.cayenne.access.ToOneFault.resolveFault(ToOneFault.java:54)
at
org.apache.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:225)
at
com.callistacti.callwatch.database.auto._User.getPasswordReset(_User.java:153)
at
com.callistacti.callwatch.database.PasswordReset.getPasswordResetToken(PasswordReset.java:30)
at
com.callistacti.callwatch.Windows.WindowLogin$2.buttonClick(WindowLogin.java:135)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at
com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
... 34 more
Caused by: java.lang.ClassNotFoundException:
com.callistacti.callwatch.database.PasswordReset
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:266)
at org.apache.cayenne.util.Util.getJavaClass(Util.java:588)
at org.apache.cayenne.map.ObjEntity.getJavaClass(ObjEntity.java:286)
at
org.apache.cayenne.reflect.PersistentDescriptorFactory.getDescriptor(PersistentDescriptorFactory.java:57)
at
org.apache.cayenne.reflect.ClassDescriptorMap.createDescriptor(ClassDescriptorMap.java:128)
at
org.apache.cayenne.reflect.LazyClassDescriptorDecorator.checkDescriptorInitialized(LazyClassDescriptorDecorator.java:59)
at
org.apache.cayenne.reflect.LazyClassDescriptorDecorator.getEntity(LazyClassDescriptorDecorator.java:83)
at
org.apache.cayenne.access.trans.SelectTranslator.appendQueryColumns(SelectTranslator.java:327)
at
org.apache.cayenne.access.trans.SelectTranslator.buildResultColumns(SelectTranslator.java:290)
at
org.apache.cayenne.access.trans.SelectTranslator.createSqlString(SelectTranslator.java:126)
at
org.apache.cayenne.access.trans.QueryAssembler.createStatement(QueryAssembler.java:194)
at
org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:70)
at
org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:269)
... 57 more